cryptoTax 0.1.0.30
Improvements:
- Continued the formatter-hardening pass across
format_CDC_exchange(),format_CDC_exchange_trades(),format_detect(), and related exchange helpers so newer Crypto.com Exchange exports, malformed edge cases, and explicit pricing inputs behave more predictably under the shared formatter contract. - Expanded direct regression coverage around fee modeling, malformed explicit pricing inputs, formatter schema guarantees, and representative exchange outputs, including a guard for newer CDC Exchange all-transactions exports that previously could produce orphaned fee rows with missing core fields.
- Continued the broader fiscal-audit and deterministic-pricing cleanup by tightening correctness coverage around ACB/superficial-loss edge cases and pushing more formatter/reporting paths onto the explicit offline pricing workflow.
cryptoTax 0.1.0.29
Improvements:
- Continued the formatter-architecture cleanup by pushing a broad new batch of wallet and exchange handlers onto the shared formatter helper path, including
format_CDC(),format_CDC_wallet(),format_cronos_pos(),format_exodus(),format_uphold(),format_gemini(),format_coinbase(),format_adalite(), and the remaining CDC/binance helper-based formatter flows. - Consolidated more formatter end-of-pipeline behavior onto the shared finalize/resolve helpers while preserving exchange-specific accounting behavior, including the dedicated raw-input pricing path in CoinSmart and the sparse-output normalization used by Adalite.
- Updated the repo improvement plan to reflect that the formatter normalization track is now effectively in its last special-case stretch rather than the broad-family cleanup phase.
cryptoTax 0.1.0.28
Improvements:
- Continued the fiscal-audit and ACB-hardening pass by expanding the direct and package-level correctness bank around superficial losses, including replacement-share cases acquired before a sale, repeated partial-loss chains, and the transition back to deductible losses once no substituted-property units remain at the end of a later sale window.
- Fixed a superficial-loss carry bug in
ACB()where a denied loss could be added twice when a loss sale already left substituted property in the pool and a later buy happened before the end of the superficial-loss window. - Continued the recent large-history performance work by trimming another layer of superficial-loss overhead and avoiding unnecessary progress-bar setup when
verbose = FALSE, leaving the next meaningful ACB bottleneck in the row-wise core mutation path rather than the superficial-loss prep. - Strengthened user-facing fiscal scope documentation in the ACB vignette and README so the package’s conservative “identical property” policy is clearer for wrapped, bridged, liquid-staked, and exchange-specific crypto variants.
cryptoTax 0.1.0.27
Improvements:
- Continued the formatter cleanup pass by introducing shared internal helpers for common wallet/exchange formatting seams, including fee-amount-to-sell-row conversion, canonical exchange-output finalization, and the standard resolve-prices-plus-fill-missing-totals path.
- Reused those new helpers across multiple formatter families, including Adalite, Exodus, CDC wallet, Uphold, Celsius, Presearch, PoolTool, and Newton, reducing repeated formatter glue while preserving current output contracts and empty-data behavior.
- Added direct helper coverage for the new formatter seams and kept the broader formatter, pricing, and ACB regression suite fully green after the refactor.
cryptoTax 0.1.0.26
Improvements:
- Profiled the large-history
ACB()path after the fiscal-audit hardening work and confirmed that superficial-loss preparation, rather than the base cost-base loop, was the dominant performance bottleneck on realistic synthetic histories. - Reworked the heaviest superficial-loss helper paths in
format_suploss()to use lighter vector-based window summaries and buy-window checks instead of repeated interval/data-frame filtering and per-row flagging. - Cut synthetic
ACB(..., sup.loss = TRUE)timings from roughly6.9s / 34.5s / 71.0sdown to about1.1s / 5.6s / 11.8sat 1k / 5k / 10k rows while keeping the ACB,format_ACB(), and superficial-loss helper correctness regressions green.
cryptoTax 0.1.0.25
Improvements:
- Started a dedicated fiscal-audit track in
PLAN-FISCAL-AUDIT.md, tying the package’s superficial-loss and ACB behavior to named CRA-style rule scenarios and making the remaining audit gaps explicit instead of leaving them implicit across tests and comments. - Documented the current fiscal scope of
ACB()andformat_ACB()more clearly: the engine audits same-pool replacement-property timing from the supplied transaction history, but it does not independently model affiliated-person substitutions or auto-decide difficult “identical property” questions across distinct crypto instruments. - Added and documented a conservative package stance for crypto “identical property” edge cases, keeping different
currencyvalues in separate pools by default rather than automatically merging wrapped, bridged, staked, or exchange-specific variants into the same superficial-loss pool. - Added a worked-example appendix to the fiscal-audit plan so full-loss, partial-loss, and partial-replacement-survival superficial-loss arithmetic can now be inspected outside the test suite.
cryptoTax 0.1.0.24
Improvements:
- Continued the accounting-hardening pass across
format_coinbase(),ACB(), andformat_ACB()by making fee handling more explicit: Coinbase convert buys are now treated as fee-inclusive acquisitions, while representative exchange and wallet paths now have direct regressions documenting when fees stay separate or are modeled as separate disposition rows instead. - Expanded the fiscal-validation bank with more direct numeric superficial-loss edge cases, including partial replacement-share survival through the 30-day window and an explicit guard that nearby replacement-share purchases do not trigger superficial-loss treatment when the original sale realized a gain.
- Mirrored those new rule checks at the package level in
format_ACB()so the full formatter-to-tax-engine path now validates the same replacement-share and gain-versus-loss boundaries as the lower-levelACB()tests.
cryptoTax 0.1.0.23
Improvements:
- Continued a broader ACB and superficial-loss correctness hardening pass across
ACB()andformat_ACB()with direct numeric regressions for revenue-first opening lots, fee-adjusted superficial-loss calculations, replacement shares reacquired on the day-30 boundary, and cases where reacquired shares are later fully disposed before the superficial-loss window ends. - Expanded package-level mixed multi-asset coverage so BTC superficial-loss corrections, fee-adjusted denied-loss amounts, and replacement-share timing all remain isolated to the affected currency pool while unrelated ETH gains and staking revenue continue to behave independently.
- Strengthened the correctness-validation bank with more direct worked edge cases around zero cost base, zero remaining replacement shares, and deductible excess-loss handling, reducing reliance on snapshots alone for the hardest ACB paths.
cryptoTax 0.1.0.22
Improvements:
- Continued a broader deterministic-pricing and reporting cleanup across
USD2CAD(),USD2CAD_crypto2(),USD2CAD_priceR(),pricing_cache(),prepare_list_prices(),prepare_list_prices_slugs(),match_prices(),report_summary(), andreport_overview()so explicit inputs and valid cached tables behave more consistently as first-class offline paths instead of falling through to unnecessary network failures. - Hardened cache reuse by allowing valid legacy compatibility caches to survive malformed package-cache entries during the transition away from workspace state, and by making cached
list.pricesreusable earlier in both direct price matching and current-price report generation. - Expanded focused regressions around cached pricing reuse, offline report-price resolution, slug-preparation shortcuts, and explicit FX-table support for the remaining USD/CAD helper paths.
cryptoTax 0.1.0.21
Improvements:
- Continued a broader formatter-architecture and deterministic-pricing cleanup across
format_CDC(),format_celsius(),format_detect(),format_exchanges(),format_coinsmart(),format_CDC_exchange(),format_CDC_exchange_trades(),format_gemini(),format_blockfi(), andformat_uphold()so explicit pricing/FX inputs are supported more consistently and more formatter paths reuse shared helper behavior instead of hand-rolled branching. - Expanded formatter governance by turning the
format_detect()registry into the source of truth for schema regressions, so every bundled exchange example is now validated against the canonical formatted-transaction contract. - Replaced repeated sell-price propagation logic with a shared formatter helper and added direct regressions for that paired buy/sell pricing behavior, reducing one of the largest remaining duplicated formatter patterns.
cryptoTax 0.1.0.20
Improvements:
- Continued a broader pricing, FX, formatting, and reporting hardening pass across
prepare_list_prices(),match_prices(),USD2CAD(),format_detect(),format_exchanges(),report_summary(),report_overview(),prepare_report(), andprint_report()to make explicit offline inputs the primary safe path while preserving compatibility with the older session-cache workflow. - Hardened malformed-price handling so explicit
list.pricesinputs now fail cleanly and consistently across price matching, formatter entry points, and current-value reporting paths instead of surfacing misleading API/network messages or partial outputs. - Tightened session-cache behavior by validating cached pricing/FX tables before reuse, scoping cache reads explicitly to
.GlobalEnv, and removing a lingeringexists()-driven Bank of Canada FX fetch pattern. - Moved normal in-session pricing cache writes into a package-owned cache with new
pricing_cache()andclear_pricing_cache()helpers, while keeping.GlobalEnvreuse as a deprecated compatibility fallback with explicit migration messaging. - Converted the full report vignette to the built-in offline
list_prices_examplefixture and standardized formatter/report documentation so the publiclist.pricescontract is clearer and more reproducible. - Added canonical formatted-transaction schema validation at the
format_detect()/format_exchanges()boundary and expanded representative formatter tests so malformed formatted inputs or malformed formatter outputs fail early with direct schema errors. - Expanded focused regressions around malformed explicit pricing inputs, cache-reuse behavior, FX fallback behavior, formatter orchestration, report helpers, and the public report-preparation path.
cryptoTax 0.1.0.19
Improvements:
- Added
format_exchanges()as the higher-level public entry point for formatting one or more exchange exports, including mixed raw/formatted inputs, nested lists, empty inputs, and multiple direct arguments. - Shifted the user-facing workflow toward
format_exchanges()across the README, report vignette, higher-level help examples, and utility examples so the package now teaches a more consistent ingest-to-report happy path. - Expanded direct and snapshot coverage around the new public ingest wrapper, including mixed-input behavior and equivalence with the older manual
format_detect()plusmerge_exchanges()path.
cryptoTax 0.1.0.18
Improvements:
- Continued a broader ingestion and orchestration hardening pass across
format_detect(),merge_exchanges(), andcheck_new_transactions()to make top-level list formatting, merge ordering, and transaction-warning behavior more explicit and robust without changing the underlying exchange-specific tax logic. - Hardened the public list path in
format_detect()so nested lists are accepted recursively, empty data frames are skipped cleanly, and whitespace-only description values do not create false detection signals. - Expanded focused tests around nested and empty list inputs, public-path whitespace normalization in transaction warnings, missing-date merge ordering, and the full workflow path that now exercises
format_detect()directly for grouped exchange inputs.
cryptoTax 0.1.0.17
Improvements:
- Continued a broader proceeds, revenues, and superficial-loss cleanup across
get_proceeds(),get_sup_losses(),report_revenues(),report_helpers(),tax_box(), andprint_report()to make summary-table assembly, total-row handling, and report-metric extraction more explicit and less dependent on row order. - Fixed a
report_revenues()regression that was collapsing multi-exchange revenue output down to a single exchange row before totals were added. - Expanded focused tests around empty proceeds/revenue shapes, multi-exchange revenue finalization, total-row selection for revenues and superficial losses, and tax-box/report helpers that now match values by labels instead of row position.
cryptoTax 0.1.0.16
Improvements:
- Continued a broader ingestion and detection hardening pass across
merge_exchanges(),check_new_transactions(), andformat_detect()to make merge behavior, transaction-warning generation, exchange detection, and list dispatch more explicit and robust without changing user-facing behavior. - Expanded focused helper tests around nested merge inputs, schema-preserving empty data frames, factor and blank-string transaction values, format-detect registry lookups, and
NULL/invalid list inputs.
cryptoTax 0.1.0.15
Improvements:
- Continued a broader formatter cleanup across
format_shakepay(),format_celsius(),format_coinbase(),format_adalite(),format_newton(),format_exodus(),format_presearch(), andformat_pooltool()to make wallet and exchange formatting paths more explicit and easier to maintain without changing user-facing behavior. - Added focused helper tests for the new formatter seams, including exchange-specific classification, timestamp parsing, reward mapping, and final output annotation.
cryptoTax 0.1.0.14
Improvements:
- Continued a broader ACB, reporting, and tax-output cleanup across
ACB(),format_ACB(),format_suploss(),get_proceeds(),get_sup_losses(),report_summary(),report_overview(),prepare_report(),print_report(), andtax_box()to make cost-base analysis and report-generation logic more explicit and easier to maintain without changing user-facing behavior. - Expanded focused tests around ACB helper seams, superficial-loss helpers, proceeds and tax-box output contracts, report-summary/report-overview helper behavior, and report timezone propagation.
cryptoTax 0.1.0.13
Improvements:
- Continued a broader ingestion and formatter-entry cleanup across
merge_exchanges(),check_new_transactions(),format_detect(), and a shared post-merge pricing flow used byformat_generic()and many exchange formatters, making merge handling, transaction warnings, exchange dispatch, and price-resolution behavior more explicit and easier to maintain without changing user-facing behavior. - Expanded focused tests around merge flattening, deterministic new-transaction warnings, format-detect helpers, and the shared formatter pricing helpers.
cryptoTax 0.1.0.12
Improvements:
- Continued a broader pricing-core cleanup across
prepare_list_prices(),prepare_list_prices_slugs(),match_prices(), andUSD2CAD()to make slug preparation, missing-price handling, FX-table preparation, and price-resolution flow more explicit and easier to maintain without changing user-facing behavior. - Expanded focused tests around deterministic pricing helpers, FX-table builders, slug-preparation behavior, and shared missing-price paths, and updated the pricing documentation/examples to show the explicit offline-input workflows more clearly.
cryptoTax 0.1.0.11
Improvements:
- Continued the pricing-core cleanup across
prepare_list_prices()and related helper paths to make slug derivation, start-date selection, USD-only rejection, and list-price construction behavior more explicit and easier to maintain without changing user-facing behavior. - Expanded focused tests around price-prep helpers,
match_prices()helper contracts, and deterministic list-price construction from injected history and FX data.
cryptoTax 0.1.0.10
Improvements:
- Continued the shared-utility cleanup across
merge_exchanges(),check_new_transactions(),format_detect(),match_prices(), andformat_generic()to make ingestion, exchange detection, and pricing helper behavior more explicit and easier to maintain without changing user-facing behavior. - Expanded focused tests around merge behavior, new-transaction warnings, exchange-detection helpers, generic formatting helpers, and price-matching helper contracts.
cryptoTax 0.1.0.9
Improvements:
- Continued the ACB and tax-output cleanup across
check_missing_transactions(),format_ACB(),get_latest_transactions(),listby_coin(),tax_box(), andtax_table()to make the ACB analysis helpers and tax-summary outputs more consistent and easier to maintain without changing user-facing behavior. - Added shared internal helpers for ACB/report utilities, expanded focused tests around ACB helper outputs and tax-report formatting, and hardened the reporting path for cases where the superficial-loss summary is empty.
cryptoTax 0.1.0.8
Improvements:
- Continued the reporting and tax-summary cleanup across
format_dollars(),prepare_report(),print_report(),crypto_pie(),get_proceeds(),get_sup_losses(),report_overview(), andreport_summary()to make report generation, current-price handling, and tax-summary helpers more consistent and easier to maintain without changing user-facing behavior. - Added focused report-helper and print-report tests, and simplified the full report template so it reads the current pricing date from prepared report data instead of directly depending on
list.prices.
cryptoTax 0.1.0.7
Improvements:
- Continued a broader formatter-family cleanup across
format_cronos_pos(),format_exodus(),format_newton(),format_pooltool(),format_presearch(),format_shakepay_old(),format_CDC_wallet(), andformat_suploss()to make smaller wallet, rewards, and loss-formatting paths easier to follow and maintain without changing user-facing behavior. - Updated the GitHub Actions coverage workflow to use the supported artifact action version.
cryptoTax 0.1.0.6
Improvements:
- Continued the formatter cleanup across
format_CDC_exchange()andformat_coinbase()to make additional exchange-formatting paths easier to read and maintain without changing user-facing behavior.
cryptoTax 0.1.0.5
Improvements:
- Continued the formatter cleanup across
format_uphold(),format_blockfi(), andformat_CDC_exchange_rewards()to make medium-size exchange-formatting paths easier to maintain without changing user-facing behavior.
cryptoTax 0.1.0.4
Improvements:
- Continued the formatter cleanup across
format_gemini(),format_CDC_exchange_trades(), andformat_CDC()to make larger exchange-formatting paths easier to read and maintain without changing user-facing behavior.
cryptoTax 0.1.0.3
Improvements:
- Continued the formatter cleanup across
format_generic(),format_shakepay(),format_binance(), andformat_coinsmart()to make exchange formatting workflows easier to follow and maintain without changing user-facing behavior. - Continued the reporting-output cleanup by simplifying the internal structure of
tax_box()andtax_table().
cryptoTax 0.1.0.2
Improvements:
- Continued a broader reporting-stack cleanup across
format_ACB(),report_overview(),report_summary(),report_revenues(),prepare_report(), andprint_report()to make report generation and summary logic easier to maintain without changing user-facing behavior. - Simplified workflow and exchange-format tests by introducing a shared example-data helper and removing brittle
eval(parse())test paths.
cryptoTax 0.1.0.1
Improvements:
- Continued the internal maintenance cleanup of
match_prices(),format_detect(), andACB()to make core pricing, formatter dispatch, and cost-base code easier to maintain without changing package behavior.
cryptoTax 0.1.0
Improvements:
- Hardened pricing and FX handling so key workflows can accept explicit pricing inputs instead of relying only on hidden session state.
- Added a built-in offline
list.pricesfixture dataset for examples, reporting, and tests. - Improved offline behavior for reporting, examples, tests, and vignettes when live pricing data is unavailable.
- Expanded deterministic test coverage around
USD2CAD(), price preparation, reporting, exchange formatting, and the full workflow. - Refreshed test snapshots so the main integration paths now run against a deterministic offline pricing baseline.
- Continued the internal pricing and FX cleanup by centralizing
list.pricesandUSD2CAD.tablepreparation paths while preserving compatibility. - Cleaned
R CMD checkissues, updated package metadata, and now declareR (>= 4.1.0)explicitly.
cryptoTax 0.0.7
From the crypto2 package update: > fiat_list() has been modified and no longer delivers all available currencies and precious metals (therefore only USD and Bitcoin are available any more).
Therefore, the USD2CAD() function now relies on the rates from the Bank of Canada, which only provides data for business days. On days which data is not available, the last known value is used instead. The prepare_list_prices() function has also been updated accordingly.
Also, because of too many duplicated symbols, prepare_list_prices() now requires using the unique “slug” name of the coin. You can obtain the correct slug using crypto2::crypto_list(only_active = TRUE) and then filtering for your symbol.
Updated functions due to changes in exchanges transaction history files: - format_CDC_exchange_trades() - format_shakepay()
cryptoTax 0.0.6
Breaking changes:
-
USD2CAD()now uses a different system to convert USD rates to CAD.USD2CAD()used to rely on thepriceR, which depends on exchangerate.host which now requires an API key with very few limited free API calls. The oldpriceRfunction is still available, if you have an API key, withUSD2CAD_priceR(). One alternative is to take the USDC to CAD rate, since USDC is usually pretty closely pegged to the USD. For instance, from 2021 to 2024, the average difference between USD and and USDC is only 0.00003 CAD. Nonetheless, to get an exact rate, the new system compares USD and CAD rates for USDC and calculates the adjusted CAD rate based on this.
New Features:
- New function:
fetch_cronos_pos()(to download data from the CDC DeFi wallet) - New function:
format_cronos_pos()(as a replacement offormat_CDC_wallet()) - New function:
format_coinbase()
Improvements:
- Various improvements to
format_functions (ACB, CDC_wallet, blockfi, presearch) andprepare_report
cryptoTax 0.0.2
CRAN release: 2023-02-20
Breaking changes:
- We get rid of the
format_wealtsimple(),format_BSC(),format_binance_trades(),crypto2fiat(), andfetch_prices()functions, since their goal is better fulfilled by the newformat_generic(),format_binance(),match_prices(), andprepare_list_prices()functions, respectively.
New Features:
- New
pkgdownwebsite with three vignettes: (1) calculating ACB, (2) full tax report, and (3) tax treatments and decisions. - Informative progress bars with
format_ACB()andformat_suploss()since these functions are extremely slow with thousands of transactions. - Added example data sets (ACB, cryptotaxcalculator, coinpanda, koinly, shakepay, CDC, CDC exchange rewards, CDC exchange trades, CDC wallet, adalite, binance, binance withdrawals, blockfi, celsius, coinsmart, exodus, newton, presearch, pooltool, gemini, uphold)
- Now detects new transaction types not accounted for
- New functions:
-
prepare_report()to get all the required information forprint_report()in one go. -
get_sup_losseswas it was the last missing piece to get all the info needed forprepare_report(). -
format_detect(), to automatically detect the right exchange and process it with the corresponding function (also supports lists of exchanges). -
format_generic(), to process most transaction history files not supported by existing functions. -
format_binance(), a general version that works with the general transaction report and includes rewards (but not withdrawal fees). We thus get rid offormat_binance_trades()since the former is superior (as it includes more transaction types). -
get_latest_transactions(): get latest transaction date by exchange -
check_missing_transactions(): show you rows with negative total balances to help identify missing transactions. -
format_dollars(): to format numeric values with comma for thousands separator.
-
Improvements:
-
format_blockfi()andformat_CDC_exchange_trades()now correctly match prices for purchases and sales for trades (instead of relying on their corresponding daily spot rates). - Consistently use plural for reward types.
- Massive improvements in speed by using joins for price lookups (instead of making a new API request for each row) for both prices of coins and USD to CAD conversions.
- When prices are fetched through
priceR(for USD to CAD conversions), now indicates the source of the price accordingly (rate.source = "exchange (USD conversion)") - All
format_*functions: now reorder columns in a consistent fashion + tests for all (andACB()). -
ACB_suploss(): integrates the primaryACB()function, which accordingly gains a new logical argument,suploss. -
format_suploss(): integratesACB()whensuploss = TRUE, and gains a greatly improved code base. -
add_quantities(): switches from a for-loop todplyrcode. -
ACB():- new warning messages:
- when not providing first buy transactions (so no ACB…)
- when more than one currency are provided at a time
- when insufficient columns are provided to calculate ‘total.price’
- new warning messages:
-
report_revenues()andcrypto_pie(): Now support forks and mining. -
format_newton(): updated to the new format -
format_CDC():- new warning message when withdrawal fees could not be detected automatically.
- new transaction types supported: forks (“admin_wallet_credited”), sales (“crypto_viban_exchange”, “card_top_up”, “crypto_wallet_swap_debited”), and supercharger rewards (“supercharger_reward_to_app_credited”)
- On coinmarketcap, after 2022-05-28, LUNA gets renamed to LUNC, and the LUNA2 fork gets renamed to LUNA. This is confusing because on CDC, they use the terms LUNA and LUNC (which are the same), and LUNA2, which is the new LUNA fork. Therefore, we now rename “LUNA” transactions (on CDC) to “LUNC”, and “LUNA2” to “LUNA”.
Bug Fixes:
-
format_shakepay(): now correctly detects CAD referral rewards -
format_binance(): now correctly detects interest rewards -
format_ACB():- fixed a bug whereas a superficial loss of quantity = 0 would prevent the computation of the ACB.
- corrected “Total time elapsed:” time unit to always be minutes
-
ACB(): now correctly accept alternative column names - Fixed a bug for NANO/XNO
- Fixed various R CMD check errors, warnings, and notes.
