Skip to contents

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 roughly 6.9s / 34.5s / 71.0s down to about 1.1s / 5.6s / 11.8s at 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() and format_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 currency values 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(), and format_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-level ACB() tests.

cryptoTax 0.1.0.23

Improvements:

  • Continued a broader ACB and superficial-loss correctness hardening pass across ACB() and format_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(), and report_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.prices reusable 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:

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(), and print_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.prices inputs 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 lingering exists()-driven Bank of Canada FX fetch pattern.
  • Moved normal in-session pricing cache writes into a package-owned cache with new pricing_cache() and clear_pricing_cache() helpers, while keeping .GlobalEnv reuse as a deprecated compatibility fallback with explicit migration messaging.
  • Converted the full report vignette to the built-in offline list_prices_example fixture and standardized formatter/report documentation so the public list.prices contract 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() plus merge_exchanges() path.

cryptoTax 0.1.0.18

Improvements:

  • Continued a broader ingestion and orchestration hardening pass across format_detect(), merge_exchanges(), and check_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(), and print_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(), and format_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:

cryptoTax 0.1.0.14

Improvements:

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 by format_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(), and USD2CAD() 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(), and format_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(), and tax_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:

cryptoTax 0.1.0.7

Improvements:

cryptoTax 0.1.0.6

Improvements:

  • Continued the formatter cleanup across format_CDC_exchange() and format_coinbase() to make additional exchange-formatting paths easier to read and maintain without changing user-facing behavior.

cryptoTax 0.1.0.5

Improvements:

cryptoTax 0.1.0.4

Improvements:

cryptoTax 0.1.0.3

Improvements:

cryptoTax 0.1.0.2

Improvements:

cryptoTax 0.1.0.1

Improvements:

  • Continued the internal maintenance cleanup of match_prices(), format_detect(), and ACB() 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.prices fixture 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.prices and USD2CAD.table preparation paths while preserving compatibility.
  • Cleaned R CMD check issues, updated package metadata, and now declare R (>= 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 the priceR, which depends on exchangerate.host which now requires an API key with very few limited free API calls. The old priceR function is still available, if you have an API key, with USD2CAD_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:

Improvements:

  • Various improvements to format_ functions (ACB, CDC_wallet, blockfi, presearch) and prepare_report

cryptoTax 0.0.5

CRAN release: 2023-03-12

  • Added CRAN requirements

cryptoTax 0.0.4

CRAN release: 2023-03-08

  • Added CRAN requirements

cryptoTax 0.0.3

CRAN release: 2023-03-07

  • Added CRAN requirements

cryptoTax 0.0.2

CRAN release: 2023-02-20

Breaking changes:

New Features:

  • New pkgdown website with three vignettes: (1) calculating ACB, (2) full tax report, and (3) tax treatments and decisions.
  • Informative progress bars with format_ACB() and format_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 for print_report() in one go.
    • get_sup_losses was it was the last missing piece to get all the info needed for prepare_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 of format_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() and format_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 (and ACB()).
  • ACB_suploss(): integrates the primary ACB() function, which accordingly gains a new logical argument, suploss.
  • format_suploss(): integrates ACB() when suploss = TRUE, and gains a greatly improved code base.
  • add_quantities(): switches from a for-loop to dplyr code.
  • 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’
  • report_revenues() and crypto_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.

cryptoTax 0.0.1

New package