Salta al contingut principal

Plantilles cripto de Beancount a punt per copiar

Plantilles de Beancount per omplir, cadascuna amb un exemple carregable, per a compres, vendes, intercanvis, transferències, staking, préstecs DeFi, mineria i airdrops de criptomonedes.

Esta guía ofrece plantillas prácticas de Beancount y ejemplos reales para escenarios comunes con criptomonedas. Copia y adapta estas plantillas para tus propias necesidades de contabilidad crypto.

Cómo leer estos bloques​

Cada bloque delimitado a continuación es una de tres cosas, y no son intercambiables:

  • Las plantillas contienen marcadores [ENTRE_CORCHETES] y fechas YYYY-MM-DD. No se cargarán hasta que sustituyas valores reales — los corchetes no son sintaxis de Beancount.
  • Los ejemplos se encuentran justo debajo de su plantilla, llevan fechas y cantidades reales, y están escritos para cargarse. Cada uno sigue necesitando que las cuentas que toca estén abiertas, que es para lo que sirve la Plantilla de estructura de cuentas a continuación. La única excepción es el bloque de conciliación, que afirma saldos que solo tu propio libro mayor puede satisfacer.
  • El bloque de Arbitraje con préstamo flash es pseudocódigo, y se etiqueta como tal donde aparece.

Dos convenciones recorren todos ellos:

  • Las cuentas de ingresos contienen créditos, por lo que son negativas. Una ganancia realizada es un asiento negativo en Income:CapitalGains:…; una pérdida realizada es un asiento positivo en Expenses:CapitalLoss:…. Invertir esto es la forma más común de que un asiento crypto no cuadre.
  • Una comisión se registra una vez como gasto y una vez como reducción del efectivo. El importe bruto va a la cuenta de efectivo, la comisión sale de ella, y la diferencia es lo que realmente llega a tu cuenta.

Explora un libro mayor de ejemplo de criptomonedas en vivo:

Obre Libro mayor de ejemplo de criptomonedas en una pestanya nova

Plantilla de Estructura de Cuentas​

Estructura de Cuentas Básica​

; =============================================================================
; 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"

Plantillas de Trading​

Compra Básica de Criptomonedas​

; 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

Venta de Criptomonedas​

; 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

El lote dispuesto vale 22.500,00 $ a coste, la venta ingresa 24.000,00 $ brutos, y 30,00 $ de eso van al exchange — así que llegan 23.970,00 $ de efectivo y se realizan 1.500,00 $ de ganancia. No netes la comisión en la ganancia: la comisión ya es un gasto, y restarla una segunda vez es lo que deja la transacción descuadrada.

Intercambio de Cripto a Cripto​

; 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 intercambio crypto a crypto dispone de la primera mercancía, por lo que realiza ganancia exactamente igual que una venta por efectivo: 20 ETH adquiridos a 2.400,00 $ son 48.000,00 $ de valor recibido contra 46.000,00 $ de base del BTC. La comisión de 40,00 $ se paga en efectivo y no cambia la ganancia.

Plantillas de Transferencia​

Transferencia de Exchange a Wallet​

; 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}

Una transferencia no es una disposición, así que no realiza nada: el mismo coste {45000.00 USD} viaja con las monedas y la cuenta receptora hereda la base. Se siguen dos consecuencias. La comisión de retirada se paga en BTC y se registra como gasto a ese mismo coste, así que tampoco realiza ganancia — si tu tratamiento dice lo contrario, valora la comisión con @ y añade un asiento de ganancia. Y la cuenta emisora debe contener ya 1,0005 BTC a ese coste exacto, no 1,0, porque la comisión sale del mismo lote. Una reducción sin un lote correspondiente no se registra por bien que cuadren los totales.

Transferencia Entre Exchanges​

; 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}

Plantillas de Staking​

Staking de 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}

Recompensas 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

Una recompensa es un ingreso recibido en especie, así que los dos asientos describen el mismo evento desde ambos lados: llegan 0,08 ETH con una base de 2.600,00 $ por unidad, y el ingreso correspondiente de 208,00 $ es un crédito — negativo. El {2,600.00 USD} es un precio externo que tienes que obtener tú mismo; Beancount lo registra, no lo busca. Anótalo del exchange o índice que realmente uses, y mantén la misma fuente durante todo el año.

Esos 208,00 $ son también la base de coste de la recompensa a partir de aquí. Cuando finalmente vendas los 0,08 ETH, solo el movimiento desde esta fecha es una ganancia — los 208,00 $ ya han tributado como ingreso y no deben reconocerse dos veces. Si el ingreso tributa al recibirse o al disponerse varía según la jurisdicción; el libro mayor registra los hechos en cualquier caso.

Plantillas de DeFi​

Provisión de Liquidez en 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}

Concilia esto una mercancía a la vez: salen 25.000,00 $ de ETH más 25.000,00 $ de USDC, llegan 50.000,00 $ de token LP, y la comisión de gas mueve 50,00 $ de ETH de la cartera a un gasto. La parte de stablecoin lleva @ 1.00 USD porque se mantiene sin base de coste — sin la anotación de precio su peso es 25.000 USDC, que no puede cancelar dólares. En muchas jurisdicciones depositar en un pool es en sí mismo una disposición de ambos tokens; este asiento deliberadamente traslada la base, así que añade los asientos de ganancia si tu tratamiento los requiere.

Préstamo en 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}

Dos cosas hacen que este se cargue. La parte de USDC lleva @ 1.00 USD para que ambos lados del swap pesen en la misma moneda — sin ello Beancount ve 10.000,00 $ de CUSDC apareciendo contra 10.000 unidades de USDC desapareciendo, que son mercancías distintas y no se cancelan. Y el token de recibo es CUSDC, no cUSDC: una primera letra minúscula es un error del analizador léxico tanto en un componente de cuenta como en un símbolo de mercancía, independientemente de cómo lo escriba el protocolo en su propia interfaz.

Plantillas de Minería​

Recompensas de Minería​

; 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

Gastos de Minería​

; 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

Plantillas de Airdrops​

Airdrops de Tokens​

; 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

Como una recompensa de staking, el valor reconocido del airdrop se convierte en su base de coste. Registra el precio que puedas defender — la primera cotización líquida del token, de una fuente que nombres — en lugar de un número redondo.

Plantillas Avanzadas​

Arbitraje Flash Loan​

Este bloque es pseudocódigo, no una plantilla. Esboza la secuencia de movimientos de valor dentro de un préstamo flash. No se cargará ni siquiera después de sustituir valores, porque las líneas en blanco entre los grupos terminan la transacción — Beancount informa de un error de sintaxis en los asientos que siguen a una. Registra un préstamo flash real como una única transacción sin líneas en blanco (etiquetando las partes con comentarios ; indentados), omitiendo las partes intermedias que se anulan a cero dentro del mismo bloque.

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

Todo lo que tocó el préstamo ha desaparecido al final del bloque, así que lo que el libro mayor realmente necesita registrar es el beneficio y la comisión del protocolo. El ejemplo de arbitraje en la guía de seguimiento de cartera muestra la forma de transacción única.

Puente Entre Cadenas​

; 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}

Plantillas Optimizadas para Impuestos​

Cosecha de Pérdidas 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 pérdida es la imagen especular de una ganancia: salen 600,00 $ de base, llegan 450,00 $ de importe bruto, y la diferencia de 150,00 $ es un asiento positivo en una cuenta de gastos. Lo que realmente llega son 445,00 $ de efectivo, tras la comisión de 5,00 $.

Ganancias de Capital a Largo Plazo​

; 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

La ganancia es de 10.000,00 $, no de 9.950,00 $: la comisión de 50,00 $ ya está registrada como gasto, así que netearla en la ganancia la deduciría dos veces. Income:CapitalGains:LongTerm es una cuenta separada de Income:CapitalGains:Crypto solo para que el periodo de tenencia sea visible en un informe — Beancount no calcula los periodos de tenencia por ti, por lo que vale la pena conservar los metadatos date-acquired y holding-period.

Plantillas de Conciliación​

Verificación de Saldo Mensual​

; 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

A diferencia de los otros ejemplos aquí, este no es autocontenido por diseño: las cantidades son las que digan las pantallas de tu propio exchange, y la aserción falla hasta que tus transacciones estén en el libro mayor — que es precisamente su propósito. Ten en cuenta que balance comprueba el saldo al inicio del día indicado, así que fecha la aserción el día posterior al periodo que estás cerrando.

Actualizaciones de Precio​

; 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

Para un libro mayor alojado, Precios en vivo puede mantener automáticamente los precios de valoración de criptomonedas compatibles. Conserva los precios estáticos anteriores para ejemplos reproducibles. Los precios gestionados no rellenan un precio de operación, un ingreso de staking ni una base de coste de airdrop; registra esos valores de transacción explícitamente.

Instrucciones de Uso​

  1. Copia la plantilla relevante para tu tipo de transacción

  2. Sustituye todos los marcadores. Una plantilla no es Beancount válido hasta que YYYY-MM-DD y cada token [ENTRE_CORCHETES] hayan desaparecido — los corchetes no son sintaxis de Beancount, y uno que quede suelto es un error de análisis, no un valor ignorado silenciosamente. La sustitución es mecánica:

    MarcadorSustituir porEjemplo
    YYYY-MM-DDla fecha de la transacción2024-03-20
    [AMOUNT]unidades de la mercancía, sin comillas0.5
    [CRYPTO]el símbolo de la mercancía, en mayúsculasBTC
    [EXCHANGE]el componente de cuenta del lugarCoinbase
    [COST_BASIS]el coste por unidad del lote que estás retirando45000.00
    [SALE_PRICE]el precio por unidad al que vendiste48000.00
    [GROSS_PROCEEDS][AMOUNT] × [SALE_PRICE], antes de comisiones24000.00
    [FEE]la comisión del lugar, en la moneda en que se cobró30.00
    [GAIN][GROSS_PROCEEDS] − [AMOUNT] × [COST_BASIS]1500.00

    Sustituir esa columna en la plantilla de Venta de criptomonedas reproduce el ejemplo resuelto impreso debajo, que es la forma más rápida de comprobar que has leído la plantilla correctamente.

  3. Ajusta los nombres de las cuentas para que coincidan con tu estructura de cuentas, y asegúrate de que cada una esté abierta por la Plantilla de estructura de cuentas — una cuenta que nunca se abre es un error de carga, no una advertencia

  4. Añade metadatos según sea necesario para la declaración fiscal o el seguimiento

  5. Verifica los cálculos con bea --file your-file.bean check antes de finalizar los asientos. Un asiento que no cuadra, o que reduce un lote que no posees, falla ahí en lugar de producir silenciosamente un informe erróneo

Mejores Prácticas​

  • Usa convenciones de nombres coherentes
  • Incluye IDs de transacción en los metadatos
  • Documenta a fondo las transacciones complejas
  • Verifica los tipos de cambio y los precios
  • Mantén copias de seguridad regulares de tus archivos

Estas plantillas proporcionan una base sólida para la contabilidad de criptomonedas en Beancount.io. Personalízalas según tus necesidades específicas y tus patrones de trading.

Font: https://beancount.io/ca/docs/Tips/cryptocurrency-templates-examples