20 Commits

Author SHA1 Message Date
070a2f9fe8 Merge pull request #338 into master
All checks were successful
docker-finance / all (push) Successful in 36m57s
7565982d CHANGELOG: add 1.4.2 (Aaron Fiore)
ef6f00f0 client: manifest: bump version to v1.4.2 (Aaron Fiore)
2026-03-31 11:26:47 -07:00
7565982d3d CHANGELOG: add 1.4.2 2026-03-30 15:35:18 -07:00
ef6f00f00c client: manifest: bump version to v1.4.2 2026-03-30 14:48:32 -07:00
fc0800b384 Merge pull request #337 into master
All checks were successful
docker-finance / all (push) Successful in 37m24s
58cecec6 container: hledger-flow: gemini: fix transfer method detection (Aaron Fiore)
2026-03-30 14:34:02 -07:00
58cecec63f container: hledger-flow: gemini: fix transfer method detection
if no on-chain transfers occurred for the given year.
2026-03-30 14:19:01 -07:00
e585fc82cb Merge pull request #336 into master
All checks were successful
docker-finance / all (push) Successful in 40m37s
ea64acb4 container: hledger-flow: paypal-business: treat cash back rebate as expense reduction (Aaron Fiore)
2026-03-30 13:34:36 -07:00
ea64acb406 container: hledger-flow: paypal-business: treat cash back rebate as expense reduction
NOTE: since no description is given for *which* tx receives the rebate,
manual intervention is required for per-subaccount calculations (either
with custom rules or calculating outside of flow).
2026-03-30 13:30:16 -07:00
34e786cec7 Merge pull request #334 into master
All checks were successful
docker-finance / all (push) Successful in 37m27s
a5d34866 container: hledger-flow: coinbase: add %taxed_at timestamp for 1099-DA (Aaron Fiore)
f718f8e3 container: hledger-flow: coinbase: refactor %created_at timezone (Aaron Fiore)
2026-03-30 12:48:44 -07:00
a5d3486693 container: hledger-flow: coinbase: add %taxed_at timestamp for 1099-DA 2026-03-26 12:40:40 -07:00
f718f8e3f4 container: hledger-flow: coinbase: refactor %created_at timezone 2026-03-26 12:40:03 -07:00
78f24a2659 Merge pull request #333 into master
All checks were successful
docker-finance / all (push) Successful in 32m27s
d708135c client: Dockerfiles: remote: hledger-suite: bump hledger to 1.52 (Aaron Fiore)
2026-03-23 11:51:43 -07:00
d708135ca1 client: Dockerfiles: remote: hledger-suite: bump hledger to 1.52 2026-03-23 10:53:58 -07:00
6692aa6db0 Merge pull request #331 into master
All checks were successful
docker-finance / all (push) Successful in 32m57s
50245cf0 client/container: completion: add TODOs for `bash-completion` (Aaron Fiore)
8bc196ef client: manifest: archlinux: add `bash-completion` package to base (Aaron Fiore)
65aa5ef9 client: Dockerfiles: remote: archlinux: add `bash-completion` package to base (Aaron Fiore)
2026-03-20 13:29:22 -07:00
50245cf033 client/container: completion: add TODOs for bash-completion 2026-03-20 12:33:57 -07:00
8bc196eff6 client: manifest: archlinux: add bash-completion package to base 2026-03-20 12:33:45 -07:00
65aa5ef9d0 client: Dockerfiles: remote: archlinux: add bash-completion package to base 2026-03-20 12:33:36 -07:00
1ea16ab580 Merge pull request #330 into master
All checks were successful
docker-finance / all (push) Successful in 29m24s
fb4566e3 container: hledger-flow: ethereum-based: compound: fix missing INCOME tag (Aaron Fiore)
2026-03-19 11:19:13 -07:00
fb4566e320 container: hledger-flow: ethereum-based: compound: fix missing INCOME tag 2026-03-19 10:47:15 -07:00
beae62c884 Merge pull request #329 into master
All checks were successful
docker-finance / all (push) Successful in 30m58s
22338eb5 container: hledger-flow: ethereum-based: add to Ethereum spam rules (Aaron Fiore)
2026-03-19 10:45:25 -07:00
22338eb5ac container: hledger-flow: ethereum-based: add to Ethereum spam rules 2026-03-18 14:17:51 -07:00
12 changed files with 176 additions and 46 deletions

View File

@@ -18,6 +18,44 @@
# Changelog (`docker-finance`) # Changelog (`docker-finance`)
## 1.4.2 - 2026-03-31
In summary; this patch release contains the following:
- Important tax-related fixes for:
* Compound (COMP rewards)
* Coinbase (1099-DA related)
* Ethereum (spam income)
- PayPal Business cash back rewards account fix
- Gemini Exchange transfer method accounting fix (GUSD/USD)
- Small dependency enhancement (`bash-completion`)
- Bump to the latest `hledger` (1.52)
### 1.4.2 - Fixes
- Add to taxable income to Ethereum spam rules ([#329](https://gitea.evergreencrypto.co/EvergreenCrypto/docker-finance/pulls/329))
- Compound (Ethereum): fix missing `INCOME` tag ([#330](https://gitea.evergreencrypto.co/EvergreenCrypto/docker-finance/pulls/330))
- ⚠️ **Potentially breaking** Coinbase: refactor `%created_at`, add `%taxed_at` timestamp for 1099-DA ([#334](https://gitea.evergreencrypto.co/EvergreenCrypto/docker-finance/pulls/334))
* For tax year 2025+, since Coinbase uses Eastern Time for tax reporting (and since `%created_at` returns UTC); `%taxed_at` (and form 8949) must align with 1099-DA.
* **MUST** adjust any custom tax rules by dropping the timezone after `%created_at` and renaming to `%taxed_at` then re-`import` and re-`taxes` as needed.
- PayPal Business: treat cash back rebate as expense reduction ([#336](https://gitea.evergreencrypto.co/EvergreenCrypto/docker-finance/pulls/336))
- Gemini Exchange: fix transfer method detection for Gemini Exchange if no on-chain transfers occurred for the given year ([#337](https://gitea.evergreencrypto.co/EvergreenCrypto/docker-finance/pulls/337))
### 1.4.2 - Enhancements
- Add more spam to Ethereum spam rules ([#329](https://gitea.evergreencrypto.co/EvergreenCrypto/docker-finance/pulls/329))
- Add `bash-completion` to base dependencies ([#331](https://gitea.evergreencrypto.co/EvergreenCrypto/docker-finance/pulls/331))
* Allows completion for supported packages
* Adds TODOs to current `dfi` completion (see [#332](https://gitea.evergreencrypto.co/EvergreenCrypto/docker-finance/issues/332))
### 1.4.2 - Updates
- Bump `hledger` to 1.52 ([#333](https://gitea.evergreencrypto.co/EvergreenCrypto/docker-finance/pulls/333))
### 1.4.2 - Contributors
- Aaron Fiore
## 1.4.1 - 2026-03-18 ## 1.4.1 - 2026-03-18
This patch release fixes broken `import` for Trezor Suite v25.9.1+ by adding new FS support and backward compatibility. This patch release fixes broken `import` for Trezor Suite v25.9.1+ by adding new FS support and backward compatibility.

View File

@@ -49,6 +49,7 @@ RUN pacman -Syu \
# Base packages # Base packages
RUN pacman -Syu \ RUN pacman -Syu \
bash-completion \
bc \ bc \
csvkit \ csvkit \
vim \ vim \

View File

@@ -58,7 +58,7 @@ RUN cabal v1-copy
FROM hledger-iadd AS hledger FROM hledger-iadd AS hledger
WORKDIR /usr/local/src WORKDIR /usr/local/src
RUN git clone --depth=1 https://github.com/simonmichael/hledger -b 1.51.2 RUN git clone --depth=1 https://github.com/simonmichael/hledger -b 1.52
WORKDIR /usr/local/src/hledger WORKDIR /usr/local/src/hledger
RUN stack setup RUN stack setup

View File

@@ -20,7 +20,7 @@
# #
# Release version (tag format) # Release version (tag format)
version: "v1.4.1" version: "v1.4.2"
# Container dependencies (used by `version` command) # Container dependencies (used by `version` command)
# NOTE: this must stay inline with Dockerfiles # NOTE: this must stay inline with Dockerfiles
@@ -36,6 +36,7 @@ container:
commands: commands:
base: base:
packages: packages:
- "bash-completion"
- "bc" - "bc"
- "csvkit" - "csvkit"
- "vim" - "vim"

View File

@@ -17,6 +17,28 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# TODO:
#
# - Refactor using `bash-completion` "library" but keep backward compatibility,
# as this would otherwise break the "no more than 3 dependencies" approach to client-side `dfi`.
#
# - When possible, add completion to existing `dfi` arguments that aren't completing
# * e.g., `dfi archlinux/${USER}:default edit type=` -> `dfi archlinux/${USER}:default edit type=rules...`
#
# The not-so-straightforward resolution to this TODO hinges on the fact that
# the default delim for all `dfi` completion is the `=` character (which also exists in `COMP_WORDBREAKS`).
#
# One resolution can be found in:
#
# - https://github.com/scop/bash-completion/blob/c63826f8678e7d1fd36cf188bf1ba2eccaf2552e/completions-core/dd.bash
#
# See also:
#
# - https://github.com/scop/bash-completion/tree/main/completions-core
# - https://github.com/scop/bash-completion/blob/c63826f8678e7d1fd36cf188bf1ba2eccaf2552e/bash_completion#L1105-L1132
# - https://github.com/scop/bash-completion/blob/c63826f8678e7d1fd36cf188bf1ba2eccaf2552e/bash_completion#L1450-L1454
# - https://github.com/scop/bash-completion/blob/c63826f8678e7d1fd36cf188bf1ba2eccaf2552e/bash_completion#L2964-L2968
# WARNING: because of completion, the docker-finance environment file # WARNING: because of completion, the docker-finance environment file
# is never read. Ergo, for debugging, you'll need to run the following # is never read. Ergo, for debugging, you'll need to run the following
# with log-level 1 or 2: # with log-level 1 or 2:

View File

@@ -2,7 +2,7 @@
# docker-finance | modern accounting for the power-user # docker-finance | modern accounting for the power-user
# #
# Copyright (C) 2024-2025 Aaron Fiore (Founder, Evergreen Crypto LLC) # Copyright (C) 2024-2026 Aaron Fiore (Founder, Evergreen Crypto LLC)
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@@ -17,6 +17,28 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# TODO:
#
# - Refactor using `bash-completion` "library".
# * i.e., remove direct access to COMP* and use what's available, etc.
#
# - Add completion to existing `dfi` arguments that aren't completing.
# * e.g., `dfi profile/subprofile edit type=` -> `dfi profile/subprofile edit type=rules...`
#
# The not-so-straightforward resolution to this TODO hinges on the fact that
# the default delim for all `dfi` completion is the `=` character (which also exists in `COMP_WORDBREAKS`).
#
# One resolution can be found in:
#
# - https://github.com/scop/bash-completion/blob/c63826f8678e7d1fd36cf188bf1ba2eccaf2552e/completions-core/dd.bash
#
# See also:
#
# - https://github.com/scop/bash-completion/tree/main/completions-core
# - https://github.com/scop/bash-completion/blob/c63826f8678e7d1fd36cf188bf1ba2eccaf2552e/bash_completion#L1105-L1132
# - https://github.com/scop/bash-completion/blob/c63826f8678e7d1fd36cf188bf1ba2eccaf2552e/bash_completion#L1450-L1454
# - https://github.com/scop/bash-completion/blob/c63826f8678e7d1fd36cf188bf1ba2eccaf2552e/bash_completion#L2964-L2968
# shellcheck disable=SC2154 # shellcheck disable=SC2154
[ "$DOCKER_FINANCE_DEBUG" == 2 ] && set -xv [ "$DOCKER_FINANCE_DEBUG" == 2 ] && set -xv

View File

@@ -1,6 +1,6 @@
# docker-finance | modern accounting for the power-user # docker-finance | modern accounting for the power-user
# #
# Copyright (C) 2021-2025 Aaron Fiore (Founder, Evergreen Crypto LLC) # Copyright (C) 2021-2026 Aaron Fiore (Founder, Evergreen Crypto LLC)
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@@ -131,6 +131,7 @@ if %to_address (^0x39aa39c021dfbae8fac545936693ac917d5e7563$|^0x4ddc2d193948926d
if %direction ^IN$ if %direction ^IN$
& %contract_address ^0xc00e94cb662c3520282e6f5717214004a7f26888$ & %contract_address ^0xc00e94cb662c3520282e6f5717214004a7f26888$
& %from_address ^0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b$ & %from_address ^0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b$
comment blockchain:%blockchain, type:%type, block:%block_number, blockid:%block_hash, index:%tx_index, subaccount_address:%subaccount_address, contract_address:%contract_address, from_address:%from_address, to_address:%to_address, txid:%tx_hash, direction:%direction, taxed_as:INCOME
account2 income:%account_name:%subaccount_name:%blockchain:%symbol account2 income:%account_name:%subaccount_name:%blockchain:%symbol
comment2 %date +0000,INCOME,%account_name:%subaccount_name:%blockchain,%symbol,%amount_,USD,,COMP rewards comment2 %date +0000,INCOME,%account_name:%subaccount_name:%blockchain,%symbol,%amount_,USD,,COMP rewards

View File

@@ -82,10 +82,12 @@ function __parse()
sub(/^-/, "", $5) sub(/^-/, "", $5)
sub(/^-/, "", $7) sub(/^-/, "", $7)
# Cleanup timestamp # Prepare info_created_at (NOTE: server returns UTC)
sub(/T/, " ", $9); created_at=$9
sub(/Z/, "", $9); sub(/T/, " ", created_at);
sub(/\+.*/, "", $9); sub(/Z/, "", created_at);
sub(/\+.*/, "", created_at);
created_at=created_at " +0000"
# Print [info] object for rules consumption # Print [info] object for rules consumption
printf $1 OFS # account_id (prepended column) printf $1 OFS # account_id (prepended column)
@@ -96,7 +98,7 @@ function __parse()
printf "\"" $6 "\"" OFS # info_amount_currency printf "\"" $6 "\"" OFS # info_amount_currency
printf $7 OFS # info_native_amount_amount printf $7 OFS # info_native_amount_amount
printf "\"" $8 "\"" OFS # info_native_amount_currency printf "\"" $8 "\"" OFS # info_native_amount_currency
printf $9 OFS # info_created_at printf created_at OFS # info_created_at
printf $10 OFS # info_resource printf $10 OFS # info_resource
printf $11 OFS # info_resource_path printf $11 OFS # info_resource_path
printf $12 OFS # info_description printf $12 OFS # info_description
@@ -210,6 +212,25 @@ function __parse()
cost_basis=(direction ~ /^IN$/ ? real_value_amount + $50 : real_value_amount) cost_basis=(direction ~ /^IN$/ ? real_value_amount + $50 : real_value_amount)
printf("%.8f", cost_basis); printf OFS # advanced_trade_fill_cost_basis_amount printf("%.8f", cost_basis); printf OFS # advanced_trade_fill_cost_basis_amount
#
# 1099-DA (2025+): Since Coinbase uses Eastern Time for tax reporting, and
# %created_at returns UTC, %taxed_at (and form 8949) must align with 1099-DA.
#
# Only convert for years 2025+
cmd = "TZ=\"US/Eastern\" date \"+%F %T %z\" --date="$9 | getline date
split(date, year, "-");
if (year[1] <= 2024)
{
cmd = "TZ=\"UTC\" date \"+%F %T %z\" --date="$9 | getline date
}
taxed_at = date
printf taxed_at OFS
#
# Remaining defaults
#
printf direction OFS printf direction OFS
printf global_subaccount printf global_subaccount

View File

@@ -1,6 +1,6 @@
# docker-finance | modern accounting for the power-user # docker-finance | modern accounting for the power-user
# #
# Copyright (C) 2021-2025 Aaron Fiore (Founder, Evergreen Crypto LLC) # Copyright (C) 2021-2026 Aaron Fiore (Founder, Evergreen Crypto LLC)
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
fields account_id,coinbase_id,type,status_,amount_amount,amount_currency,native_amount_amount,native_amount_currency,created_at,resource,resource_path,description,network_status,network_network_name,network_hash,network_transaction_fee_amount,network_transaction_fee_currency,to_resource,to_address,to_email,from_resource,from_resource_path,from_id,from_name,cancelable,idem,buy_total_amount,buy_total_currency,buy_subtotal_amount,buy_subtotal_currency,buy_fee_amount,buy_fee_currency,buy_id,buy_payment_method_name,sell_total_amount,sell_total_currency,sell_subtotal_amount,sell_subtotal_currency,sell_fee_amount,sell_fee_currency,sell_id,sell_payment_method_name,trade_fee_amount,trade_fee_currency,trade_id,trade_payment_method_name,advanced_trade_fill_fill_price,advanced_trade_fill_product_id,advanced_trade_fill_order_id,advanced_trade_fill_commission,advanced_trade_fill_order_side,native_amount_price,native_network_transaction_fee_amount,network_transaction_amount_amount,advanced_trade_fill_real_value_amount,advanced_trade_fill_pair_lhs,advanced_trade_fill_pair_rhs,advanced_trade_fill_cost_basis_amount,direction,subaccount fields account_id,coinbase_id,type,status_,amount_amount,amount_currency,native_amount_amount,native_amount_currency,created_at,resource,resource_path,description,network_status,network_network_name,network_hash,network_transaction_fee_amount,network_transaction_fee_currency,to_resource,to_address,to_email,from_resource,from_resource_path,from_id,from_name,cancelable,idem,buy_total_amount,buy_total_currency,buy_subtotal_amount,buy_subtotal_currency,buy_fee_amount,buy_fee_currency,buy_id,buy_payment_method_name,sell_total_amount,sell_total_currency,sell_subtotal_amount,sell_subtotal_currency,sell_fee_amount,sell_fee_currency,sell_id,sell_payment_method_name,trade_fee_amount,trade_fee_currency,trade_id,trade_payment_method_name,advanced_trade_fill_fill_price,advanced_trade_fill_product_id,advanced_trade_fill_order_id,advanced_trade_fill_commission,advanced_trade_fill_order_side,native_amount_price,native_network_transaction_fee_amount,network_transaction_amount_amount,advanced_trade_fill_real_value_amount,advanced_trade_fill_pair_lhs,advanced_trade_fill_pair_rhs,advanced_trade_fill_cost_basis_amount,taxed_at,direction,subaccount
# The above fields; in order and in human-readable form: # The above fields; in order and in human-readable form:
# #
@@ -77,17 +77,24 @@ fields account_id,coinbase_id,type,status_,amount_amount,amount_currency,native_
# advanced_trade_fill_pair_lhs # advanced_trade_fill_pair_lhs
# advanced_trade_fill_pair_rhs # advanced_trade_fill_pair_rhs
# advanced_trade_fill_cost_basis_amount # advanced_trade_fill_cost_basis_amount
# taxed_at
# direction # direction
# subaccount # subaccount
date %created_at date %created_at
date-format %Y-%m-%d %H:%M:%S date-format %Y-%m-%d %H:%M:%S %z
account1 assets:coinbase:%subaccount:%amount_currency account1 assets:coinbase:%subaccount:%amount_currency
amount %amount_amount "%amount_currency" amount %amount_amount "%amount_currency"
# NOTE: server time is UTC, as are the timestamps. # NOTE:
description %created_at +0000 #
# - Server time is UTC, as are the timestamps. However, their generated 1099-DA is ET (Eastern Time).
#
# - For disposal-related taxable events, use %taxed_at timestamp in tx comment for `taxes`.
# * For years 2025+, the %taxed_at time (ET) will be converted from %created_at (UTC).
#
description %created_at
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id
@@ -164,7 +171,7 @@ if %type ^send$
account4 expenses:coinbase:%subaccount:fees:send:%native_amount_currency account4 expenses:coinbase:%subaccount:fees:send:%native_amount_currency
amount4 %native_network_transaction_fee_amount %native_amount_currency amount4 %native_network_transaction_fee_amount %native_amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, idem:%idem, network_status:%network_status, network_name:%network_network_name, to_address:%to_address, txid:%network_hash, direction:%direction, taxed_as:SPEND comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, idem:%idem, network_status:%network_status, network_name:%network_network_name, to_address:%to_address, txid:%network_hash, direction:%direction, taxed_as:SPEND
comment3 %created_at +0000,SPEND,coinbase:%subaccount,%network_transaction_fee_currency,%network_transaction_fee_amount,%native_amount_currency,%native_network_transaction_fee_amount,FEE comment3 %taxed_at,SPEND,coinbase:%subaccount,%network_transaction_fee_currency,%network_transaction_fee_amount,%native_amount_currency,%native_network_transaction_fee_amount,FEE
# Marked as comment3 in case user-defined rules use comment2 to SPEND/GIFT the non-fee amount # Marked as comment3 in case user-defined rules use comment2 to SPEND/GIFT the non-fee amount
# #
@@ -183,14 +190,14 @@ if %type ^send$
& %to_resource ^email$ & %to_resource ^email$
account2 expenses:coinbase:%subaccount:send_email:%amount_currency account2 expenses:coinbase:%subaccount:send_email:%amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, idem:%idem, network_status:%network_status, to_resource:%to_resource, direction:%direction, taxed_as:SPEND comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, idem:%idem, network_status:%network_status, to_resource:%to_resource, direction:%direction, taxed_as:SPEND
comment2 %created_at +0000,SPEND,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,Send via email comment2 %taxed_at,SPEND,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,Send via email
if %type ^send$ if %type ^send$
& %direction ^OUT$ & %direction ^OUT$
& %to_resource ^email$ & %to_resource ^email$
& %to_email [a-z] & %to_email [a-z]
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, idem:%idem, network_status:%network_status, to_resource:%to_resource, to_email:%to_email, direction:%direction, taxed_as:SPEND comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, idem:%idem, network_status:%network_status, to_resource:%to_resource, to_email:%to_email, direction:%direction, taxed_as:SPEND
comment2 %created_at +0000,SPEND,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,Send to %to_email comment2 %taxed_at,SPEND,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,Send to %to_email
# TODO: phone number support # TODO: phone number support
@@ -276,7 +283,7 @@ if %type ^send$
amount %amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency amount %amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency
account2 income:coinbase:%subaccount:card:%native_amount_currency account2 income:coinbase:%subaccount:card:%native_amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:REBATE comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:REBATE
comment2 %created_at +0000,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,, comment2 %taxed_at,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,,
# Crypto Spend # Crypto Spend
@@ -284,7 +291,7 @@ if %type ^cardspend$
amount -%amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency amount -%amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency
account2 expenses:coinbase:%subaccount:card:%amount_currency account2 expenses:coinbase:%subaccount:card:%amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:SPEND comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:SPEND
comment2 %created_at +0000,SPEND,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,Coinbase Card comment2 %taxed_at,SPEND,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,Coinbase Card
# Cash Spend (Native Fiat Wallet) # Cash Spend (Native Fiat Wallet)
# TODO: any reference to USD should be a backreferenced %native_amount_currency # TODO: any reference to USD should be a backreferenced %native_amount_currency
@@ -307,32 +314,32 @@ if %type ^send$
& %from_name ^Coinbase Earn$ & %from_name ^Coinbase Earn$
account2 income:coinbase:%subaccount:earn:%amount_currency account2 income:coinbase:%subaccount:earn:%amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME
comment2 %created_at +0000,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,REWARD comment2 %taxed_at,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,REWARD
if %type ^earn_payout$ if %type ^earn_payout$
account2 income:coinbase:%subaccount:earn:%amount_currency account2 income:coinbase:%subaccount:earn:%amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME
comment2 %created_at +0000,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,REWARD comment2 %taxed_at,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,REWARD
if %type ^tx$ if %type ^tx$
& %description ^Earn Task$ & %description ^Earn Task$
account2 income:coinbase:%subaccount:earn:%amount_currency account2 income:coinbase:%subaccount:earn:%amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME
comment2 %created_at +0000,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,REWARD comment2 %taxed_at,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,REWARD
# Interest # Interest
if %type ^interest$ if %type ^interest$
account2 income:coinbase:%subaccount:interest:%amount_currency account2 income:coinbase:%subaccount:interest:%amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME
comment2 %created_at +0000,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,INTEREST comment2 %taxed_at,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,INTEREST
# Staking # Staking
if %type (^inflation_reward$|^staking_reward$) if %type (^inflation_reward$|^staking_reward$)
account2 income:coinbase:%subaccount:staking:%amount_currency account2 income:coinbase:%subaccount:staking:%amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:INCOME
comment2 %created_at +0000,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,STAKING comment2 %taxed_at,INCOME,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,STAKING
################################################################################ ################################################################################
# # # #
@@ -358,23 +365,23 @@ if %type ^buy$
amount %amount_amount "%amount_currency" @@ %buy_total_amount "%buy_total_currency" amount %amount_amount "%amount_currency" @@ %buy_total_amount "%buy_total_currency"
account2 assets:coinbase:%subaccount:%buy_total_currency account2 assets:coinbase:%subaccount:%buy_total_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, buy_id:%buy_id, taxed_as:BUY comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, buy_id:%buy_id, taxed_as:BUY
comment2 %created_at +0000,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%buy_total_currency,%buy_total_amount,, comment2 %taxed_at,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%buy_total_currency,%buy_total_amount,,
if %type ^buy$ if %type ^buy$
& %buy_fee_amount [1-9] & %buy_fee_amount [1-9]
comment2 %created_at +0000,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%buy_total_currency,%buy_total_amount,%buy_fee_currency,%buy_fee_amount comment2 %taxed_at,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%buy_total_currency,%buy_total_amount,%buy_fee_currency,%buy_fee_amount
# TODO: HACK: re: #51, FeeCurrency and Fee are added even though cost-basis is calculated (for non-fiat fee disposal, see lib_taxes) # TODO: HACK: re: #51, FeeCurrency and Fee are added even though cost-basis is calculated (for non-fiat fee disposal, see lib_taxes)
# TODO: HACK: see #51 and respective lib_taxes work-around # TODO: HACK: see #51 and respective lib_taxes work-around
if %type ^buy$ if %type ^buy$
& %buy_fee_amount [1-9] & %buy_fee_amount [1-9]
& %buy_fee_currency ^USD$ & %buy_fee_currency ^USD$
comment2 %created_at +0000,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%buy_total_currency,%buy_total_amount,, comment2 %taxed_at,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%buy_total_currency,%buy_total_amount,,
if %type ^buy$ if %type ^buy$
& %buy_total_currency ^USDC$ & %buy_total_currency ^USDC$
amount %amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency amount %amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency
comment2 %created_at +0000,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,, comment2 %taxed_at,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,,
if %type ^buy$ if %type ^buy$
& %buy_fee_amount [1-9] & %buy_fee_amount [1-9]
@@ -413,23 +420,23 @@ if %type ^sell$
amount -%amount_amount "%amount_currency" @@ %sell_total_amount "%sell_total_currency" amount -%amount_amount "%amount_currency" @@ %sell_total_amount "%sell_total_currency"
account2 assets:coinbase:%subaccount:%sell_total_currency account2 assets:coinbase:%subaccount:%sell_total_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, sell_id:%sell_id, taxed_as:SELL comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, sell_id:%sell_id, taxed_as:SELL
comment2 %created_at +0000,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%sell_total_currency,%sell_total_amount,, comment2 %taxed_at,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%sell_total_currency,%sell_total_amount,,
if %type ^sell$ if %type ^sell$
& %sell_fee_amount [1-9] & %sell_fee_amount [1-9]
comment2 %created_at +0000,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%sell_total_currency,%sell_total_amount,%sell_fee_currency,%sell_fee_amount comment2 %taxed_at,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%sell_total_currency,%sell_total_amount,%sell_fee_currency,%sell_fee_amount
# TODO: HACK: re: #51, FeeCurrency and Fee are added even though cost-basis is calculated (for non-fiat fee disposal, see lib_taxes) # TODO: HACK: re: #51, FeeCurrency and Fee are added even though cost-basis is calculated (for non-fiat fee disposal, see lib_taxes)
# TODO: HACK: see #51 and respective lib_taxes work-around # TODO: HACK: see #51 and respective lib_taxes work-around
if %type ^sell$ if %type ^sell$
& %sell_fee_amount [1-9] & %sell_fee_amount [1-9]
& %sell_fee_currency ^USD$ & %sell_fee_currency ^USD$
comment2 %created_at +0000,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%sell_total_currency,%sell_total_amount,, comment2 %taxed_at,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%sell_total_currency,%sell_total_amount,,
if %type ^sell$ if %type ^sell$
& %sell_total_currency ^USDC$ & %sell_total_currency ^USDC$
amount -%amount_amount %amount_currency @@ %native_amount_amount %native_amount_currency amount -%amount_amount %amount_currency @@ %native_amount_amount %native_amount_currency
comment2 %created_at +0000,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,, comment2 %taxed_at,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,,
if %type ^sell$ if %type ^sell$
& %sell_fee_amount [1-9] & %sell_fee_amount [1-9]
@@ -633,7 +640,7 @@ if %type ^trade$
amount -%amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency amount -%amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency
account2 equity:coinbase:%subaccount:conversion:%native_amount_currency account2 equity:coinbase:%subaccount:conversion:%native_amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:SELL comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:SELL
comment2 %created_at +0000,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,, comment2 %taxed_at,SELL,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,,
if %type ^trade$ if %type ^trade$
& %direction ^OUT$ & %direction ^OUT$
@@ -649,7 +656,7 @@ if %type ^trade$
amount %amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency amount %amount_amount "%amount_currency" @@ %native_amount_amount %native_amount_currency
account2 equity:coinbase:%subaccount:conversion:%native_amount_currency account2 equity:coinbase:%subaccount:conversion:%native_amount_currency
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:BUY comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, taxed_as:BUY
comment2 %created_at +0000,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,, comment2 %taxed_at,BUY,coinbase:%subaccount,%amount_currency,%amount_amount,%native_amount_currency,%native_amount_amount,,
if %type ^trade$ if %type ^trade$
& %direction ^IN$ & %direction ^IN$
@@ -707,14 +714,14 @@ if %type ^advanced_trade_fill$
& %direction ^IN$ & %direction ^IN$
amount %amount_amount "%advanced_trade_fill_pair_lhs" @@ %advanced_trade_fill_real_value_amount "%advanced_trade_fill_pair_rhs" amount %amount_amount "%advanced_trade_fill_pair_lhs" @@ %advanced_trade_fill_real_value_amount "%advanced_trade_fill_pair_rhs"
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, advanced_trade_fill_fill_price:%advanced_trade_fill_fill_price, advanced_trade_fill_product_id:%advanced_trade_fill_product_id, advanced_trade_fill_order_id:%advanced_trade_fill_order_id, advanced_trade_fill_order_side:%advanced_trade_fill_order_side, advanced_trade_fill_pair_lhs:%advanced_trade_fill_pair_lhs, advanced_trade_fill_pair_rhs:%advanced_trade_fill_pair_rhs, direction:%direction, taxed_as:BUY comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, advanced_trade_fill_fill_price:%advanced_trade_fill_fill_price, advanced_trade_fill_product_id:%advanced_trade_fill_product_id, advanced_trade_fill_order_id:%advanced_trade_fill_order_id, advanced_trade_fill_order_side:%advanced_trade_fill_order_side, advanced_trade_fill_pair_lhs:%advanced_trade_fill_pair_lhs, advanced_trade_fill_pair_rhs:%advanced_trade_fill_pair_rhs, direction:%direction, taxed_as:BUY
comment2 %created_at +0000,BUY,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,, comment2 %taxed_at,BUY,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,,
if %type ^advanced_trade_fill$ if %type ^advanced_trade_fill$
& %advanced_trade_fill_order_side ^buy$ & %advanced_trade_fill_order_side ^buy$
& %advanced_trade_fill_real_value_amount [1-9] & %advanced_trade_fill_real_value_amount [1-9]
& %advanced_trade_fill_commission [1-9] & %advanced_trade_fill_commission [1-9]
& %direction ^IN$ & %direction ^IN$
comment2 %created_at +0000,BUY,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_commission comment2 %taxed_at,BUY,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_commission
# TODO: HACK: re: #51, FeeCurrency and Fee are added even though cost-basis is calculated (for non-fiat fee disposal, see lib_taxes) # TODO: HACK: re: #51, FeeCurrency and Fee are added even though cost-basis is calculated (for non-fiat fee disposal, see lib_taxes)
# TODO: HACK: see #51 and respective lib_taxes work-around # TODO: HACK: see #51 and respective lib_taxes work-around
@@ -724,7 +731,7 @@ if %type ^advanced_trade_fill$
& %advanced_trade_fill_commission [1-9] & %advanced_trade_fill_commission [1-9]
& %advanced_trade_fill_pair_rhs ^USD$ & %advanced_trade_fill_pair_rhs ^USD$
& %direction ^IN$ & %direction ^IN$
comment2 %created_at +0000,BUY,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,, comment2 %taxed_at,BUY,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,,
# #
# SELL # SELL
@@ -743,14 +750,14 @@ if %type ^advanced_trade_fill$
& %direction ^OUT$ & %direction ^OUT$
amount -%amount_amount "%advanced_trade_fill_pair_lhs" @@ %advanced_trade_fill_real_value_amount "%advanced_trade_fill_pair_rhs" amount -%amount_amount "%advanced_trade_fill_pair_lhs" @@ %advanced_trade_fill_real_value_amount "%advanced_trade_fill_pair_rhs"
comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, advanced_trade_fill_fill_price:%advanced_trade_fill_fill_price, advanced_trade_fill_product_id:%advanced_trade_fill_product_id, advanced_trade_fill_order_id:%advanced_trade_fill_order_id, advanced_trade_fill_order_side:%advanced_trade_fill_order_side, advanced_trade_fill_pair_lhs:%advanced_trade_fill_pair_lhs, advanced_trade_fill_pair_rhs:%advanced_trade_fill_pair_rhs, direction:%direction, taxed_as:SELL comment type:%type, status:%status_, account_id:%account_id, coinbase_id:%coinbase_id, advanced_trade_fill_fill_price:%advanced_trade_fill_fill_price, advanced_trade_fill_product_id:%advanced_trade_fill_product_id, advanced_trade_fill_order_id:%advanced_trade_fill_order_id, advanced_trade_fill_order_side:%advanced_trade_fill_order_side, advanced_trade_fill_pair_lhs:%advanced_trade_fill_pair_lhs, advanced_trade_fill_pair_rhs:%advanced_trade_fill_pair_rhs, direction:%direction, taxed_as:SELL
comment2 %created_at +0000,SELL,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,, comment2 %taxed_at,SELL,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,,
if %type ^advanced_trade_fill$ if %type ^advanced_trade_fill$
& %advanced_trade_fill_order_side ^sell$ & %advanced_trade_fill_order_side ^sell$
& %advanced_trade_fill_real_value_amount [1-9] & %advanced_trade_fill_real_value_amount [1-9]
& %advanced_trade_fill_commission [1-9] & %advanced_trade_fill_commission [1-9]
& %direction ^OUT$ & %direction ^OUT$
comment2 %created_at +0000,SELL,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_commission comment2 %taxed_at,SELL,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_commission
# TODO: HACK: re: #51, FeeCurrency and Fee are added even though cost-basis is calculated (for non-fiat fee disposal, see lib_taxes) # TODO: HACK: re: #51, FeeCurrency and Fee are added even though cost-basis is calculated (for non-fiat fee disposal, see lib_taxes)
# TODO: HACK: see #51 and respective lib_taxes work-around # TODO: HACK: see #51 and respective lib_taxes work-around
@@ -760,6 +767,6 @@ if %type ^advanced_trade_fill$
& %advanced_trade_fill_commission [1-9] & %advanced_trade_fill_commission [1-9]
& %advanced_trade_fill_pair_rhs ^USD$ & %advanced_trade_fill_pair_rhs ^USD$
& %direction ^OUT$ & %direction ^OUT$
comment2 %created_at +0000,SELL,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,, comment2 %taxed_at,SELL,coinbase:%subaccount,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,,
# vim: sw=2 sts=2 si ai et # vim: sw=2 sts=2 si ai et

View File

@@ -71,11 +71,11 @@ function parse_transfers()
next next
# NOTE: If info_method isnt ACH/Wire/SEN then it should be GUSD (exception being CreditCard) # NOTE: If info_method isnt ACH/Wire/SEN then it should be GUSD (exception being CreditCard)
if ($10 == "ACH" || $10 == "Wire" || $10 == "SEN") {$4="USD"} if ($NF == "ACH" || $NF == "Wire" || $NF == "SEN") {$4="USD"}
else {gsub(/,USD,/,",GUSD,")} else {gsub(/,USD,/,",GUSD,")}
# Get/set info_method (if available) # Get/set info_method (if available)
if ($10 == "ACH" || $10 == "Wire" || $10 == "SEN" || $10 == "CreditCard") {$8=$10} if ($NF == "ACH" || $NF == "Wire" || $NF == "SEN" || $NF == "CreditCard") {$8=$NF}
printf $1 OFS # UID (info_eid) printf $1 OFS # UID (info_eid)
printf date OFS # Date printf date OFS # Date

View File

@@ -1,6 +1,6 @@
# docker-finance | modern accounting for the power-user # docker-finance | modern accounting for the power-user
# #
# Copyright (C) 2021-2025 Aaron Fiore (Founder, Evergreen Crypto LLC) # Copyright (C) 2021-2026 Aaron Fiore (Founder, Evergreen Crypto LLC)
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@@ -99,9 +99,10 @@ if %from_email [a-z0-9]
if %direction ^IN$ if %direction ^IN$
account2 income:paypal-business:%subaccount:%currency_ account2 income:paypal-business:%subaccount:%currency_
# TODO: if a rebate is ever a non-fiat asset (e.g., BTC), reconcile the taxable event (cost-basis)
if %direction ^IN$ if %direction ^IN$
& %type ^Debit Card Cash Back Bonus$ & %type ^Debit Card Cash Back Bonus$
account2 income:paypal-business:%subaccount:rebate:%currency_ account2 expenses:paypal-business:%subaccount:%type:%currency_
comment type:%type, balance_impact:%balance_impact, status:%status_, to_email:%to_email, txid:%txid, direction:%direction, taxed_as:REBATE comment type:%type, balance_impact:%balance_impact, status:%status_, to_email:%to_email, txid:%txid, direction:%direction, taxed_as:REBATE
# All non-income considered capital contributions (use custom rules as needed) # All non-income considered capital contributions (use custom rules as needed)