Перейти до основного вмісту

Шаблони та приклади для криптовалют

Практичні шаблони Beancount та реальні приклади для типових криптовалютних сценаріїв, включаючи торгівлю, майнінг, стейкінг, еірдропи та діяльність у DeFi.

Цей посібник містить практичні шаблони Beancount та реальні приклади для типових криптовалютних сценаріїв. Скопіюйте та адаптуйте ці шаблони для власних потреб криптообліку.

Як читати ці блоки

Кожен блок у коді нижче є одним із трьох типів, і вони не є взаємозамінними:

  • Шаблони містять заповнювачі у [КВАДРАТНИХ ДУЖКАХ] та дати YYYY-MM-DD. Вони не завантажаться, доки ви не підставите реальні значення — дужки не є синтаксисом Beancount.
  • Приклади розташовані безпосередньо під своїм шаблоном, містять реальні дати та суми і написані для завантаження. Кожен з них все одно потребує відкриття рахунків, яких він торкається — саме для цього існує Шаблон структури рахунків нижче. Єдиний виняток — блок звірки, який стверджує баланси, які може задовольнити лише ваш власний облік.
  • Блок Flash Loan Arbitrage є псевдокодом і позначений як такий там, де він з'являється.

Дві умовності проходять через усі блоки:

  • Доходні рахунки містять кредити, тому вони від'ємні. Реалізований прибуток — це від'ємний запис у Income:CapitalGains:…; реалізований збиток — це додатний запис у Expenses:CapitalLoss:…. Помилка тут — найпоширеніша причина, через яку крипто-запис не балансується.
  • Комісія записується один раз як витрата й один раз як зменшення готівки. Валовий дохід надходить на готівковий рахунок, комісія з нього вираховується, і різниця — це те, що фактично потрапляє на ваш рахунок.

Дослідіть живий приклад криптовалютного обліку:

Відкрити Приклад криптовалютного обліку у новій вкладці

Базовий шаблон налаштування

Шаблон структури рахунків

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

Шаблони торгівлі

Базова покупка криптовалюти

; 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

Продаж криптовалюти

; 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

Вибутий лот коштує $22 500.00 за собівартістю, продаж приносить $24 000.00 валового доходу, і $30.00 з цього йде на біржу — отже, надходить $23 970.00 готівки та реалізується $1 500.00 прибутку. Не включайте комісію в прибуток: комісія вже є витратою, і віднімання її вдруге призведе до незбалансованості транзакції.

Обмін криптовалюти на криптовалюту

; 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

Обмін криптовалюти на криптовалюту вибуває перший актив, тому реалізує прибуток точно так само, як продаж за готівку: 20 ETH, придбаних за $2 400.00, становлять $48 000.00 отриманої вартості проти $46 000.00 базису BTC. Комісія $40.00 сплачується готівкою і не змінює прибуток.

Шаблони переказів

Переказ з біржі в гаманець

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

Переказ не є вибуттям, тому він нічого не реалізує: той самий {45000.00 USD} базис подорожує разом з монетами, і рахунок-отримувач успадковує базис. З цього випливають два наслідки. Комісія за виведення сплачується в BTC і витрачається за тією ж собівартістю, тому вона також не реалізує прибуток — якщо ваша методика каже інакше, оцініть комісію через @ і додайте запис про прибуток. І рахунок-відправник повинен вже містити 1.0005 BTC за саме цієї собівартістю, а не 1.0, тому що комісія береться з того самого лота. Зменшення без відповідного лота не буде проведено, якими б правильними не були підсумки.

Переказ між біржами

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

Шаблони стейкінгу

Стейкінг 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}

Винагороди за стейкінг

; 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

Винагорода — це дохід, отриманий у натуральній формі, тому два записи описують одну й ту ж подію з обох сторін: 0.08 ETH надходить з базисом $2 600.00 за одиницю, а відповідні $208.00 доходу є кредитом — від'ємним. {2,600.00 USD} — це зовнішня ціна, яку ви повинні знайти самостійно; Beancount її записує, а не отримує. Фіксуйте її з біржі або індексу, яким ви фактично користуєтеся, і використовуйте те саме джерело протягом року.

Ці $208.00 також є базисом собівартості винагороди надалі. Коли ви зрештою продасте 0.08 ETH, лише рух з цієї дати є прибутком — $208.00 вже були оподатковані як дохід і не повинні бути визнані вдруге. Чи є дохід оподатковуваним на момент отримання чи на момент вибуття, залежить від юрисдикції; облік у будь-якому разі фіксує факти.

Шаблони DeFi

Надання ліквідності в 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}

Звіряйте цей блок по одному активу за раз: $25 000.00 ETH плюс $25 000.00 USDC йдуть, надходить $50 000.00 LP-токенів, а комісія за газ переміщує $50.00 ETH з гаманця у витрати. Складова зі стейблкоїном має @ 1.00 USD, оскільки він утримується без базису собівартості — без анотації ціни його вага становить 25 000 USDC, які не можуть погасити долари. У багатьох юрисдикціях внесення в пул саме по собі є вибуттям обох токенів; цей запис натомість свідомо переносить базис, тому додайте записи про прибуток, якщо ваша методика цього вимагає.

Кредитування через 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}

Дві речі забезпечують завантаження цього блоку. Складова USDC має @ 1.00 USD, щоб обидві сторони обміну важили в одній валюті — без цього Beancount бачить $10 000.00 CUSDC, що з'являються проти зникнення 10 000 одиниць USDC, які є різними активами і не погашаються. А токен отримання — це CUSDC, а не cUSDC: мала перша літера є помилкою лексера як у компоненті рахунку, так і в символі активу, незалежно від того, як протокол пише його у своєму інтерфейсі.

Шаблони майнінгу

Винагороди за майнінг

; 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

Витрати на майнінг

; 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

Шаблони еірдропів

Еірдропи токенів

; 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

Як і винагорода за стейкінг, визнана вартість еірдропу стає його базисом собівартості. Записуйте ціну, яку ви можете обґрунтувати — першу ліквідну котирування токена, з джерела, яке ви називаєте — а не кругле число.

Розширені шаблони

Арбітраж Flash Loan

Цей блок є псевдокодом, а не шаблоном. Він описує послідовність рухів вартості всередині flash loan. Він не завантажиться навіть після підстановки значень, оскільки порожні рядки між групами завершують транзакцію — Beancount повідомляє про синтаксичну помилку на записах, що йдуть далі. Записуйте реальний flash loan як одну транзакцію без порожніх рядків (позначаючи складові коментарями з відступом ;), опускаючи проміжні складові, які в межах одного блоку взаємно зводяться до нуля.

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

Усе, чого торкнувся кредит, зникає до кінця блоку, тому обліку фактично потрібно зафіксувати лише прибуток і комісію протоколу. Приклад арбітражу у посібнику з відстеження портфеля показує форму транзакції з одним записом.

Міжмережевий міст

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

Шаблони з оптимізацією податків

Збір податкових збитків

; 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

Збиток — це дзеркальне відображення прибутку: $600.00 базису йдуть, $450.00 валового доходу надходять, а різниця $150.00 — це додатний запис на рахунок витрат. $445.00 готівки фактично надходить після комісії $5.00.

Довгострокові прирости капіталу

; 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

Прибуток становить $10 000.00, а не $9 950.00: комісія $50.00 вже записана як витрата, тому включення її в прибуток призвело б до подвійного відрахування. Income:CapitalGains:LongTerm є окремим рахунком від Income:CapitalGains:Crypto лише для того, щоб період утримання був видимий у звіті — Beancount не обчислює періоди утримання за вас, тому метадані date-acquired та holding-period варто зберігати.

Шаблони звірки

Щомісячна перевірка балансу

; 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

На відміну від інших прикладів тут, цей не є самодостатнім за задумом: суми — це те, що показують екрани ваших власних бірж, і твердження не виконується, доки ваші транзакції не потраплять в облік — саме в цьому його суть. Зверніть увагу, що balance перевіряє баланс на початок вказаного дня, тому датуйте твердження днем після періоду, який ви закриваєте.

Оновлення цін

; 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

Інструкції з використання

  1. Скопіюйте відповідний шаблон для типу вашої транзакції

  2. Замініть кожен заповнювач. Шаблон не є дійсним Beancount, доки YYYY-MM-DD і кожен токен у [КВАДРАТНИХ ДУЖКАХ] не зникнуть — дужки не є синтаксисом Beancount, а залишкова дужка є помилкою парсингу, а не мовчки проігнорованим значенням. Підстановка механічна:

    ЗаповнювачЗамінаПриклад
    YYYY-MM-DDдата транзакції2024-03-20
    [AMOUNT]одиниці активу, без лапок0.5
    [CRYPTO]символ активу, великими літерамиBTC
    [EXCHANGE]компонент рахунку для майданчикаCoinbase
    [COST_BASIS]собівартість за одиницю лота, який ви вибуваєте45000.00
    [SALE_PRICE]ціна за одиницю, за якою ви продали48000.00
    [GROSS_PROCEEDS][AMOUNT] × [SALE_PRICE], до комісій24000.00
    [FEE]комісія майданчика у валюті, в якій вона була стягнена30.00
    [GAIN][GROSS_PROCEEDS][AMOUNT] × [COST_BASIS]1500.00

    Підстановка цієї колонки в шаблон Продаж криптовалюти відтворює опрацьований приклад, надрукований під ним, що є найшвидшим способом перевірити, чи правильно ви прочитали шаблон.

  3. Налаштуйте назви рахунків відповідно до вашої структури рахунків і переконайтеся, що кожен рахунок відкрито Шаблоном структури рахунків — рахунок, який ніколи не відкривався, є помилкою завантаження, а не попередженням

  4. Додайте метадані за потреби для податкової звітності або відстеження

  5. Перевірте розрахунки за допомогою bea --file your-file.bean check перед фіналізацією записів. Запис, який не балансується або зменшує лот, якого ви не маєте, завершується помилкою там, а не мовчки створює неправильний звіт

Рекомендації

  • Використовуйте узгоджені правила найменування
  • Включайте ідентифікатори транзакцій у метадані
  • Документуйте складні транзакції ретельно
  • Перевіряйте обмінні курси та ціни
  • Регулярно створюйте резервні копії файлів

Ці шаблони створюють міцну основу для обліку криптовалют у Beancount.io. Адаптуйте їх відповідно до ваших конкретних потреб і моделей торгівлі.

Джерело: https://beancount.io/uk/docs/Tips/cryptocurrency-templates-examples