diff --git a/container/src/finance/lib/internal/lib_taxes.bash b/container/src/finance/lib/internal/lib_taxes.bash index 282883b..80adfc3 100644 --- a/container/src/finance/lib/internal/lib_taxes.bash +++ b/container/src/finance/lib/internal/lib_taxes.bash @@ -421,8 +421,10 @@ function lib_taxes::__taxes_print() # since it's technically *not* income (such as card cashback rebates) # # - "RAW_TRADE" has no need for a parser/formatter since the comment - # contains all of the trade but *MUST* contain tags found within - # trades tags (BUY/SELL/FEE) in order to be printed and not skipped. + # contains all of the trade but + # * *MUST* contain tags found within trades tags (BUY/SELL/FEE) + # in order to be printed and not skipped. + # * TODO: HACK: *MUST* have cost-basis calculated here (for #51) # TODO: AAVE/Compound income formatter (may be replaced by contract query) @@ -477,11 +479,84 @@ function lib_taxes::__taxes_print() if (Total ~ /\./) {sub("0*$", "", Total); sub("\\.$", "", Total)} if (Fee ~ /\./) {sub("0*$", "", Fee); sub("\\.$", "", Fee)} + # TODO: HACK: cost-basis calculated here (instead of preprocess) for #51 + if (tag == "RAW_TRADE") + { + printf Date OFS Action OFS Account OFS + + switch (Action) + { + case "SELL": + if (FeeCurrency == Symbol) + { + if (Fee ~ /\./) + { + split(Fee, cost_basis, ".") + rhs=length(cost_basis[2]) + CostBasis=sprintf("%." rhs "f", Volume - Fee) + } + else + { + CostBasis=Volume - Fee + } + } + else + { + CostBasis=Volume + } + + printf Currency OFS Total OFS Symbol OFS CostBasis OFS + break + + case "BUY": + if (FeeCurrency == Currency) + { + if (Fee ~ /\./) + { + split(Fee, cost_basis, ".") + rhs=length(cost_basis[2]) + CostBasis=sprintf("%." rhs "f", Total + Fee) + } + else + { + CostBasis=Total + Fee + } + } + else + { + CostBasis=Total + } + + printf Symbol OFS Volume OFS Currency OFS CostBasis OFS + break + + default: + printf "FATAL: unsupported Action: " Action + print $0 + exit + } + + printf OFS # FeeCurrency handled below + # Fee handled below + printf "\n" + } + + # TODO: HACK: print SPEND line for non-fiat fee (see #51) + # NOTE: cost-basis *MUST* be calculated above or within preprocess + if (is_trades && has_fee && FeeCurrency != "USD" && Fee) + { + printf Date OFS "SPEND" OFS Account OFS + printf FeeCurrency OFS Fee OFS "USD" + printf "\n"; + } + # - Drop USD-only spends (such as with Coinbase Card) because they are not needed. # - Do not print empty USD entries or empty symbol (Algorand) entries. # - Do not print testnet symbols. # TODO: regexp optimize - if ((Symbol != "USD" && Symbol != Currency) \ + # TODO: HACK (isolating from RAW_TRADE): see #51 (and related lib_taxes work-around) + if (tag != "RAW_TRADE" \ + && (Symbol != "USD" && Symbol != Currency) \ && Volume != 0 && Volume != "" \ && Symbol != "BTCt" && Symbol != "DOGEt" && Symbol != "tLTC" && Symbol != "LTCTEST") { @@ -492,7 +567,24 @@ function lib_taxes::__taxes_print() printf Volume OFS printf Currency OFS printf Total OFS - printf (has_fee ? FeeCurrency OFS Fee : Memo) + + if (has_fee) + { + # TODO: HACK: see #51 (and related lib_taxes work-around) + # NOTE: cost-basis *MUST* be calculated within preprocess + if (is_trades && Fee && FeeCurrency != "USD") + { + printf "" OFS "" + } + else + { + printf FeeCurrency OFS Fee + } + } + else + { + printf Memo + } printf "\n" } @@ -632,17 +724,77 @@ function lib_taxes::__taxes_print() switch (Action) { case "SELL": + # TODO: HACK: cost-basis calculated here (instead of preprocess) for #51 + if (FeeCurrency == Symbol) + { + if (Fee ~ /\./) + { + split(Fee, cost_basis, ".") + rhs=length(cost_basis[2]) + CostBasis=sprintf("%." rhs "f", Volume - Fee) + } + else + { + CostBasis=Volume - Fee + } + } + else + { + CostBasis=Volume + } + printf Date OFS Action OFS Account OFS - printf Currency OFS Total OFS Symbol OFS Volume OFS - printf FeeCurrency OFS Fee + printf Currency OFS Total OFS Symbol OFS CostBasis OFS + printf OFS # FeeCurrency/Fee handled below + # Fee handled below printf "\n" + + # TODO: HACK: print SPEND line for non-fiat fee (see #51) + # NOTE: cost-basis *MUST* be calculated above or within preprocess + if (FeeCurrency != "USD") + { + printf Date OFS "SPEND" OFS Account OFS + printf FeeCurrency OFS Fee OFS "USD" + printf "\n"; + } break + case "BUY": + # TODO: HACK: cost-basis calculated here (instead of preprocess) for #51 + if (FeeCurrency == Currency) + { + if (Fee ~ /\./) + { + split(Fee, cost_basis, ".") + rhs=length(cost_basis[2]) + CostBasis=sprintf("%." rhs "f", Total + Fee) + } + else + { + CostBasis=Total + Fee + } + } + else + { + CostBasis=Total + } + printf Date OFS Action OFS Account OFS - printf Symbol OFS Volume OFS Currency OFS Total OFS - printf FeeCurrency OFS Fee + printf Symbol OFS Volume OFS Currency OFS CostBasis OFS + printf OFS # FeeCurrency handled below + # Fee handled below printf "\n" + + # TODO: HACK: print SPEND line for non-fiat fee (see #51) + # NOTE: cost-basis *MUST* be calculated above or within preprocess + if (FeeCurrency != "USD") + { + printf Date OFS "SPEND" OFS Account OFS + printf FeeCurrency OFS Fee OFS "USD" + printf "\n"; + } break + case "BORROW": # Reset tail end vars since this is an "INCOME" tag FeeCurrency = $14 @@ -763,17 +915,36 @@ function lib_taxes::__taxes_print() if (Total ~ /\./) {sub("0*$", "", Total); sub("\\.$", "", Total)} if (Fee ~ /\./) {sub("0*$", "", Fee); sub("\\.$", "", Fee)} + # TODO: HACK: cost-basis calculated here (instead of preprocess) for #51 + if (FeeCurrency == Currency) + { + if (Action == "BUY") {CostBasis=Total + Fee} + else {CostBasis=Total - Fee} + } + else + { + CostBasis=Total + } + printf Date OFS printf Action OFS printf Account OFS printf Symbol OFS printf Volume OFS printf Currency OFS - printf Total OFS - printf FeeCurrency OFS - printf Fee - + printf CostBasis OFS + printf OFS # FeeCurrency handled below + # Fee handled below printf "\n"; + + # TODO: HACK: print SPEND line for non-fiat fee (see #51) + # NOTE: cost-basis *MUST* be calculated above + if (FeeCurrency != "USD") + { + printf Date OFS "SPEND" OFS Account OFS + printf FeeCurrency OFS Fee OFS "USD" + printf "\n"; + } }' fi @@ -963,10 +1134,13 @@ function lib_taxes::__reports_patch() # Ensure appropriate tags in respective files # # NOTE: - # # - Due to PARTIAL_TRADES, there may be a lone FEE SPEND straggler # - Due to MATCH, income/spend BORROW/REPAY may be in trades output - # - Bitcoin.tax will allow SPENDS in trades file with error complaints + # - Bitcoin.tax: + # * will allow SPENDS in trades file (though, with error complaints) + # * TODO: HACK: due to #51, trades with non-fiat fees will need a SPEND + # line added for the disposal of said fee until upstream resolves + # their importer. # # WARNING: # - Do *NOT* do a unique sort here! diff --git a/container/src/hledger-flow/accounts/bittrex/bittrex-shared.bash b/container/src/hledger-flow/accounts/bittrex/bittrex-shared.bash index e09889e..075641d 100755 --- a/container/src/hledger-flow/accounts/bittrex/bittrex-shared.bash +++ b/container/src/hledger-flow/accounts/bittrex/bittrex-shared.bash @@ -60,6 +60,7 @@ function parse_deposit() printf("%.8f", $4); printf OFS # Amount printf OFS # Proceeds printf OFS # Fees + printf OFS # Cost-basis printf $5 OFS # Destination printf $6 OFS # TXID printf "IN" OFS # Direction @@ -90,6 +91,22 @@ function parse_trade() # So, turn BTC-USD into two separate columns. sub(/-/, ",", $4) + # TODO: HACK: see #51 and respective lib_taxes work-around + # Calculate cost-basis + switch ($3) + { + case "BUY": + cost_basis=sprintf("%.8f", $6 + $7) + break + case "SELL": + cost_basis=sprintf("%.8f", $6 - $7) + break + default: + printf "FATAL: unsupported order type: " $3 + print $0 + exit + } + printf $1 OFS # UID printf date OFS # Date printf "TRADE" OFS # Type @@ -99,6 +116,7 @@ function parse_trade() printf("%.8f", $5); printf OFS # Amount printf("%.8f", $6); printf OFS # Proceeds printf("%.8f", $7); printf OFS # Fees + printf cost_basis OFS # Cost-basis printf OFS # Destination printf OFS # TXID printf OFS # Direction @@ -129,6 +147,7 @@ function parse_withdrawal() printf("%.8f", $4); printf OFS # Amount printf OFS # Proceeds printf("%.8f", $5); printf OFS # Fees + printf OFS # Cost-basis printf $6 OFS # Destination printf $7 OFS # TXID printf "OUT" OFS # Direction diff --git a/container/src/hledger-flow/accounts/bittrex/bittrex-shared.rules b/container/src/hledger-flow/accounts/bittrex/bittrex-shared.rules index 9477ea7..a990260 100644 --- a/container/src/hledger-flow/accounts/bittrex/bittrex-shared.rules +++ b/container/src/hledger-flow/accounts/bittrex/bittrex-shared.rules @@ -15,7 +15,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -fields code_,date,type,order_type,currency_one,currency_two,amount_,proceeds,fees,destination,txid,direction,subaccount +fields code_,date,type,order_type,currency_one,currency_two,amount_,proceeds,fees,cost_basis,destination,txid,direction,subaccount date-format %Y-%m-%d %H:%M:%S description %date +0000 @@ -59,7 +59,6 @@ if %type ^TRADE$ amount %amount_ %currency_one @@ %proceeds %currency_two account2 assets:bittrex:%subaccount:%currency_two comment type:%type, order_type:%order_type, code:%code_, taxed_as:%order_type - comment2 %date +0000,BUY,bittrex,%currency_one,%amount_,%currency_two,%proceeds,, if %type ^TRADE$ & %fees [1-9] @@ -67,11 +66,48 @@ if %type ^TRADE$ amount3 -%fees %currency_two account4 expenses:bittrex:%subaccount:fees:trades:%currency_two amount4 %fees %currency_two - comment2 %date +0000,BUY,bittrex,%currency_one,%amount_,%currency_two,%proceeds,%currency_two,%fees + +# +# BUY +# + +if %type ^TRADE$ +& %order_type ^BUY$ + comment2 %date +0000,BUY,bittrex,%currency_one,%amount_,%currency_two,%cost_basis,, + +if %type ^TRADE$ +& %order_type ^BUY$ +& %fees [1-9] + comment2 %date +0000,BUY,bittrex,%currency_one,%amount_,%currency_two,%cost_basis,%currency_two,%fees +# 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 +if %type ^TRADE$ +& %order_type ^BUY$ +& %fees [1-9] +& %currency_two ^USD$ + comment2 %date +0000,BUY,bittrex,%currency_one,%amount_,%currency_two,%cost_basis,, + +# +# SELL +# if %type ^TRADE$ & %order_type ^SELL$ amount -%amount_ %currency_one @@ %proceeds %currency_two - comment2 %date +0000,SELL,bittrex,%currency_one,%amount_,%currency_two,%proceeds,%currency_two,%fees + comment2 %date +0000,SELL,bittrex,%currency_one,%amount_,%currency_two,%cost_basis,, + +if %type ^TRADE$ +& %order_type ^SELL$ +& %fees [1-9] + comment2 %date +0000,SELL,bittrex,%currency_one,%amount_,%currency_two,%cost_basis,%currency_two,%fees +# 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 +if %type ^TRADE$ +& %order_type ^SELL$ +& %fees [1-9] +& %currency_two ^USD$ + comment2 %date +0000,SELL,bittrex,%currency_one,%amount_,%currency_two,%cost_basis,, # vim: sw=2 sts=2 si ai et diff --git a/container/src/hledger-flow/accounts/changelly/changelly-shared.rules b/container/src/hledger-flow/accounts/changelly/changelly-shared.rules index aeaa0c0..20364be 100644 --- a/container/src/hledger-flow/accounts/changelly/changelly-shared.rules +++ b/container/src/hledger-flow/accounts/changelly/changelly-shared.rules @@ -26,10 +26,19 @@ account3 assets:changelly:%subaccount:%currency_from amount3 -%currency_from_amount %currency_from @@ %currency_to_amount %currency_to account4 equity:changelly:%subaccount:deposit:%currency_to -# NOTE: fee is not added to cost-basis here because currency_to_amount includes -# that automatically (it deducts the fee and computes into currency_to_amount). -# NOTE: because the fee is considered a facilitation fee for the trade, -# *don't* use the provided %fee and instead use the adjust cost-basis instead. +# NOTE: +# +# - %fee is not added to cost-basis here because %currency_to_amount includes +# the fee (it adjusts the proceeds and computes into %currency_to_amount). +# +# - %fee is considered a facilitation fee for the trade; so *don't* add to +# column (see above). +# +# - %currency_from_amount is fully disposed (as the adjustment happens to +# %currency_to_amount). +# +# - For details, see #51. +# comment rate:%rate, destination:%destination, taxed_as:SELL comment2 %date +0000,SELL,changelly,%currency_from,%currency_from_amount,%currency_to,%currency_to_amount,, diff --git a/container/src/hledger-flow/accounts/coinbase/coinbase-shared.rules b/container/src/hledger-flow/accounts/coinbase/coinbase-shared.rules index 1eb8664..4f7154d 100644 --- a/container/src/hledger-flow/accounts/coinbase/coinbase-shared.rules +++ b/container/src/hledger-flow/accounts/coinbase/coinbase-shared.rules @@ -359,7 +359,17 @@ if %type ^buy$ 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 comment2 %created_at +0000,BUY,coinbase,%amount_currency,%amount_amount,%buy_total_currency,%buy_total_amount,, -# NOTE: cost-basis = proceeds + fee = %buy_total_amount (but do *NOT* include Fee/FeeCurrency column) + +if %type ^buy$ +& %buy_fee_amount [1-9] + comment2 %created_at +0000,BUY,coinbase,%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: see #51 and respective lib_taxes work-around +if %type ^buy$ +& %buy_fee_amount [1-9] +& %buy_fee_currency ^USD$ + comment2 %created_at +0000,BUY,coinbase,%amount_currency,%amount_amount,%buy_total_currency,%buy_total_amount,, if %type ^buy$ & %buy_total_currency ^USDC$ @@ -404,7 +414,17 @@ if %type ^sell$ 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 comment2 %created_at +0000,SELL,coinbase,%amount_currency,%amount_amount,%sell_total_currency,%sell_total_amount,, -# NOTE: cost-basis = sale - fee = %sell_total_amount (but do *NOT* include Fee/FeeCurrency column) + +if %type ^sell$ +& %sell_fee_amount [1-9] + comment2 %created_at +0000,SELL,coinbase,%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: see #51 and respective lib_taxes work-around +if %type ^sell$ +& %sell_fee_amount [1-9] +& %sell_fee_currency ^USD$ + comment2 %created_at +0000,SELL,coinbase,%amount_currency,%amount_amount,%sell_total_currency,%sell_total_amount,, if %type ^sell$ & %sell_total_currency ^USDC$ @@ -689,6 +709,23 @@ if %type ^advanced_trade_fill$ 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,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,, +if %type ^advanced_trade_fill$ +& %advanced_trade_fill_order_side ^buy$ +& %advanced_trade_fill_real_value_amount [1-9] +& %advanced_trade_fill_commission [1-9] +& %direction ^IN$ + comment2 %created_at +0000,BUY,coinbase,%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: see #51 and respective lib_taxes work-around +if %type ^advanced_trade_fill$ +& %advanced_trade_fill_order_side ^buy$ +& %advanced_trade_fill_real_value_amount [1-9] +& %advanced_trade_fill_commission [1-9] +& %advanced_trade_fill_pair_rhs ^USD$ +& %direction ^IN$ + comment2 %created_at +0000,BUY,coinbase,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,, + # # SELL # @@ -708,4 +745,21 @@ if %type ^advanced_trade_fill$ 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,%advanced_trade_fill_pair_lhs,%amount_amount,%advanced_trade_fill_pair_rhs,%advanced_trade_fill_cost_basis_amount,, +if %type ^advanced_trade_fill$ +& %advanced_trade_fill_order_side ^sell$ +& %advanced_trade_fill_real_value_amount [1-9] +& %advanced_trade_fill_commission [1-9] +& %direction ^OUT$ + comment2 %created_at +0000,SELL,coinbase,%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: see #51 and respective lib_taxes work-around +if %type ^advanced_trade_fill$ +& %advanced_trade_fill_order_side ^sell$ +& %advanced_trade_fill_real_value_amount [1-9] +& %advanced_trade_fill_commission [1-9] +& %advanced_trade_fill_pair_rhs ^USD$ +& %direction ^OUT$ + comment2 %created_at +0000,SELL,coinbase,%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 diff --git a/container/src/hledger-flow/accounts/gemini/gemini-exchange-shared.rules b/container/src/hledger-flow/accounts/gemini/gemini-exchange-shared.rules index 7645fa0..6fc31db 100644 --- a/container/src/hledger-flow/accounts/gemini/gemini-exchange-shared.rules +++ b/container/src/hledger-flow/accounts/gemini/gemini-exchange-shared.rules @@ -15,7 +15,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -fields code_,date,type,order_type,currency_one,currency_two,amount_,cost,fees,destination,txid,direction,subaccount +fields code_,date,type,order_type,currency_one,currency_two,amount_,cost,fees,cost_basis,destination,txid,direction,subaccount date-format %Y-%m-%d %H:%M:%S description %date +0000 @@ -92,12 +92,24 @@ if %type ^TRADE$ if %order_type ^Buy$ amount %amount_ %currency_one @@ %cost %currency_two comment type:%type, order_type:%order_type, order_id:%txid, tid:%code_, taxed_as:BUY - comment2 %date +0000,BUY,gemini,%currency_one,%amount_,%currency_two,%cost,%currency_two,%fees + comment2 %date +0000,BUY,gemini,%currency_one,%amount_,%currency_two,%cost_basis,%currency_two,%fees +# 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 +if %order_type ^Buy$ +& %currency_two ^USD$ + comment2 %date +0000,BUY,gemini,%currency_one,%amount_,%currency_two,%cost_basis,, if %order_type ^Sell$ amount -%amount_ %currency_one @@ %cost %currency_two comment type:%type, order_type:%order_type, order_id:%txid, tid:%code_, taxed_as:SELL - comment2 %date +0000,SELL,gemini,%currency_one,%amount_,%currency_two,%cost,%currency_two,%fees + comment2 %date +0000,SELL,gemini,%currency_one,%amount_,%currency_two,%cost_basis,%currency_two,%fees +# 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 +if %order_type ^Sell$ +& %currency_two ^USD$ + comment2 %date +0000,SELL,gemini,%currency_one,%amount_,%currency_two,%cost_basis,, # GUSD/USD workaround (see preprocess) if %type ^TRADE$ diff --git a/container/src/hledger-flow/accounts/gemini/gemini-shared.bash b/container/src/hledger-flow/accounts/gemini/gemini-shared.bash index 1340634..df3c0f5 100755 --- a/container/src/hledger-flow/accounts/gemini/gemini-shared.bash +++ b/container/src/hledger-flow/accounts/gemini/gemini-shared.bash @@ -111,6 +111,7 @@ function parse_transfers() } printf info_feeAmount OFS + printf OFS # Cost-basis (N/A) printf $8 OFS # Destination (info_destination) printf $9 OFS # TXID (info_txHash) @@ -176,6 +177,7 @@ function parse_transfers() printf OFS # Price (N/A) printf OFS # Fees (N/A) + printf OFS # Cost-basis (N/A) printf $6 OFS # Destination (info_destination) printf $7 OFS # TXID (info_txHash) @@ -250,6 +252,23 @@ function parse_trades() } printf fee_amount OFS # Fees + # TODO: HACK: see #51 and respective lib_taxes work-around + # Calculate cost-basis + switch ($5) + { + case "Buy": + cost_basis=sprintf("%.8f", cost + fee_amount) + break + case "Sell": + cost_basis=sprintf("%.8f", cost - fee_amount) + break + default: + printf "FATAL: unsupported order type: " $5 + print $0 + exit + } + printf cost_basis OFS + printf OFS # Destination (N/A) printf $10 OFS # TXID (tid) @@ -309,6 +328,7 @@ function parse_earn() printf priceAmount OFS printf OFS # Fees + printf OFS # Cost-basis printf OFS # Destination printf OFS # TXID