RP2 is a privacy-focused, free, open-source US cryptocurrency tax calculator

Overview

RP2 v0.9.6

Static Analysis / Main Branch Documentation Check / Main Branch Unix Unit Tests / Main Branch Windows Unit Tests / Main Branch CodeQL/Main Branch

Table of Contents

Introduction

RP2 is a privacy-focused, free, open-source US cryptocurrency tax calculator, that is up to date for Fiscal Year 2021. Preparing crypto taxes can be a daunting and error-prone task, especially if multiple transactions, coins, exchanges and wallets are involved. This task could be delegated to a crypto tax preparation service, but many crypto users value their privacy and prefer not to send their transaction information to third parties unnecessarily. Additionally, many of these services cost money. RP2 solves all of these problems:

  • it manages the complexity related to coin flows and tax calculation and it generates data that accountants can understand (in the format of form 8949), even if they are not cryptocurrency experts;
  • it prioritizes user privacy by storing crypto transactions and tax results on the user's computer and not sending them anywhere else;
  • it's free and open-source;
  • it supports the FIFO and LIFO accounting methods.

RP2 reads in a user-prepared spreadsheet containing crypto transactions. It then uses high-precision math to calculate long/short term capital gains, cost bases, balances, average price, in/out lot relationships/fractions, and finally it generates output spreadsheets.

It has a programmable plugin architecture for output generators, accounting methods and countries. The builtin plugins are US-specific, but RP2's architecture makes it possible to contribute additional output generators for different countries or for different US-based cases. The builtin plugins are:

  • tax_report_us: generates a tax report meant to be read by tax preparers (in the format of form 8949);
  • rp2_full_report: generates a comprehensive report, with complete transaction history, lot relationships/fractions and computation details.

RP2 has extensive unit test coverage to reduce the risk of regression.

IMPORTANT DISCLAIMERS:

  • RP2 offers no guarantee of correctness (read the license): always verify results with the help of a tax professional.
  • The author of RP2 is not a tax professional, but has used RP2 personally for a few years.

How RP2 Operates

RP2 treats virtual currency as property for tax purposes, as per IRS Virtual Currency Guidance.

RP2 suports the FIFO and LIFO accounting methods: however, in and out lots typically don't have matching amounts, so RP2 fractions them, maps in/out lot fractions and computes the resulting cost bases and capital gains for each lot fraction.

RP2 groups lot fractions into the following taxable event categories, each of which has a specific tax treatment:

  • AIRDROP: gains from airdrops;
  • DONATE: donations to charitable organizations;
  • GIFT: gifts to parties who are not charitable organizations (not tax-deductible).
  • HARDFORK: gains from hard forks;
  • INTEREST: gains from interest;
  • MINING: gains from mining;
  • MOVE: the fee for moving currency between two accounts controlled by the same owner; these may not be taxable or tax deductible but they still affect the accounting method order so they are tracked;
  • SELL: specifically, sale and exchange of one cryptocurrency for another. RP2 splits them in two subcategories:
    • long-term capital gains, if the lot was held for more than 1 year, or
    • short-term capital gains otherwise;
  • STAKING: gains from staking;
  • WAGES: income from crypto wages.

For each of these categories RP2 generates an output spreadsheet with transaction details and computed gains/losses (see Input and Output Files for more details). Users can give this output to their tax preparer with the rest of their tax documentation (see also FAQ on which tax forms to file). Note that buying cryptocurrency using fiat currency is not a taxable event.

NOTE ON NFTs: Read the FAQ on NFTs to learn about how RP2 treats NFTs.

License

RP2 is released under the terms of Apache License Version 2.0. For more information see LICENSE or http://www.apache.org/licenses/LICENSE-2.0.

Download

The latest version of RP2 can be downloaded at: https://pypi.org/project/rp2/

Installation

RP2 has been tested on Ubuntu Linux, macOS and Windows 10 but it should work on all systems that have Python version 3.7.0 or greater.

Installation on Ubuntu Linux

Open a terminal window and enter the following commands:

sudo apt-get update
sudo apt-get install python3 python3-pip

Then install RP2 Python package requirements:

pip install rp2

Installation on macOS

First make sure Homebrew is installed, then open a terminal window and enter the following commands:

brew update
brew install python3

Then install RP2 Python package requirements:

pip install rp2

Installation on Windows 10

First make sure Python 3.7 or greater is installed (in the Python installer window be sure to click on "Add Python to PATH"), then open a PowerShell window and enter the following:

pip install rp2

Installation on Other Unix-like Systems

  • install python 3.7 or greater
  • install pip3
  • pip install rp2

Running

Before running RP2, the user must prepare two files:

  • an ODS-format spreadsheet, containing crypto transactions (ODS-format files can be opened and edited with LibreOffice and many other spreadsheet applications);
  • a JSON config file, describing the format of the spreadsheet file: what value each column corresponds to (e.g. timestamp, amount, exchange, fee, etc.) and which cryptocurrencies and exchanges to expect.

The formats of these files are described in detail in the Input Files section of the documentation.

Examples of an input spreadsheet and its respective config file:

After reading the input files, RP2 computes taxes and generates output files, which contain information on long/short capital gains, cost bases, balances, average price, in/out lot relationships and fractions. They are described in detail in the Output Files section of the documentation.

To try RP2 with example files, download crypto_example.ods and crypto_example.config. Let's call the location of the downloaded files.

To generate output for the example files open a terminal window (or PowerShell if on Windows) and enter the following commands:

cd 
   
    
rp2_us -o output -p crypto_example_ crypto_example.config crypto_example.ods

   

Results are generated in the output directory and logs are stored in the log directory.

To print command usage information for the rp2_us command:

rp2_us --help

Input and Output Files

Read the input files and output files documentation.

Reporting Bugs

Read the Contributing document.

Contributing

Read the Contributing document.

Developer Documentation

Read the developer documentation.

Frequently Asked Questions

Read the user FAQ list and the developer FAQ list.

Change Log

Read the Change Log document.

Comments
  • Adding HIFO

    Adding HIFO

    I was wondering the possibility of adding HIFO to the existing FIFO and LIFO cost basis structures (https://www.investopedia.com/terms/h/hifo.asp). It is available to use in the USA and would potentially help save a lot on taxes such that you're always selling the highest priced lot.

    Unfortunately, my knowledge of python is more in the scripting/engineering realm, so I'm not sure how much help I would be on the coding aspect...

    Thanks!

    help wanted good first issue 
    opened by YagiOoda 17
  • Crypto fee in OUT table

    Crypto fee in OUT table

    The OUT Table format indicates that "crypto_fee" is required.

    It seems that almost all of my transactions had SELL fees paid in fiat. I can calculate a "crypto_fee" based on "fiat_fee" and "spot_price", but I wonder how RP2 handles this.

    Is RP2 assuming the fee was paid in crypto? And, if so, is it reducing the crypto balance and cost basis remaining by the amount of "crypto_fee" (in addition to the amount of "crypto_out_no_fee")? In my case that would NOT be correct, right?

    Can you help me understand? Thanks!

    opened by gbtorrance 14
  • Open Positions

    Open Positions

    Here is the PR for the Open Positions #32 feature request. This does incorporate the correction regarding the use of an operation inside of the RP2Decimal instantiation, and also I've converted several magic numbers from when I was working on the code to proper defines. For now I've left some of the variable names shortened due to the wrapping that resulted from extending them. At least to these eyes, that reduced readability. Cheers!

    opened by mdavid217 14
  • Example files do not work

    Example files do not work

    Hi, I'm trying to run the example files:

    • crypto_example.config
    • crypto_example.ods

    But upon running, get these errors

    INFO: Country: us
    INFO: Accounting Method: fifo
    INFO: Configuration file: crypto_example.config
    INFO: Input file: crypto_example.ods
    INFO: Processing BTC
    INFO: Processing ETH
    ERROR: Fatal exception occurred:
    Traceback (most recent call last):
      File "/Users/swissarmybox/Desktop/cry/rp2stuff/venv/lib/python3.8/site-packages/rp2/rp2_main.py", line 91, in _rp2_main_internal
        input_data: InputData = parse_ods(configuration=configuration, asset=asset, input_file_handle=input_file_handle)
      File "/Users/swissarmybox/Desktop/cry/rp2stuff/venv/lib/python3.8/site-packages/rp2/ods_parser.py", line 123, in parse_ods
        transaction = _create_transaction(configuration, current_table_type, i + 1, row_values)
      File "/Users/swissarmybox/Desktop/cry/rp2stuff/venv/lib/python3.8/site-packages/rp2/ods_parser.py", line 190, in _create_transaction
        argument_pack: Dict[str, Any] = configuration.get_in_table_constructor_argument_pack(row_values)
      File "/Users/swissarmybox/Desktop/cry/rp2stuff/venv/lib/python3.8/site-packages/rp2/configuration.py", line 163, in get_in_table_constructor_argument_pack
        return self.__get_table_constructor_argument_pack(data, "in", self.__in_header)
      File "/Users/swissarmybox/Desktop/cry/rp2stuff/venv/lib/python3.8/site-packages/rp2/configuration.py", line 154, in __get_table_constructor_argument_pack
        raise RP2ValueError(
    rp2.rp2_error.RP2ValueError: Parameter 'data' has length 13, but required minimum from in-table headers in crypto_example.config is 14: ['2020-06-03T11:23Z', 'Coinbase', 'Bob', 'brown', 'fox', 'Buy', 'ETH', 10.0, 244.0, 2440.0, 2465.0, 25.0, None]
    INFO: Log file: ./log/rp2_2022_02_26_09_58_40_020721.log
    INFO: Generated output directory: output
    INFO: Done
    
    opened by Exegetech 14
  • RP2ValueError(

    RP2ValueError("Total in-transaction value < total taxable entries") from None

    RP2

    Version: RP2 0.9.26 (https://pypi.org/project/rp2/) Command: rp2_us -m fifo -o output/ -p rp2_ output/crypto_data.config output/crypto_data.ods

    Ran DaLI with Coinbase REST API for output ODS file and config file. Logs show:

    2022-04-03 07:34:43,384/rp2/INFO: Country: us
    2022-04-03 07:34:43,384/rp2/INFO: Accounting Method: fifo
    2022-04-03 07:34:43,396/rp2/INFO: Configuration file: output/crypto_data.config
    2022-04-03 07:34:43,396/rp2/INFO: Input file: output/crypto_data.ods
    2022-04-03 07:34:43,513/rp2/INFO: Processing ALGO
    2022-04-03 07:34:43,649/rp2/INFO: Processing AMP
    2022-04-03 07:34:43,713/rp2/INFO: Processing ANKR
    2022-04-03 07:34:43,778/rp2/INFO: Processing AUCTION
    2022-04-03 07:34:43,843/rp2/INFO: Processing BOND
    2022-04-03 07:34:43,908/rp2/INFO: Processing BTC
    2022-04-03 07:34:43,975/rp2/INFO: Processing CGLD
    2022-04-03 07:34:44,039/rp2/INFO: Processing CHZ
    2022-04-03 07:34:44,103/rp2/INFO: Processing CLV
    2022-04-03 07:34:44,168/rp2/INFO: Processing COMP
    2022-04-03 07:34:44,233/rp2/INFO: Processing CTSI
    2022-04-03 07:34:44,297/rp2/INFO: Processing DAI
    2022-04-03 07:34:44,431/rp2/INFO: Processing ETH
    2022-04-03 07:34:44,493/rp2/INFO: Processing ETH2
    2022-04-03 07:34:44,556/rp2/INFO: Processing FET
    2022-04-03 07:34:44,621/rp2/INFO: Processing FORTH
    2022-04-03 07:34:44,685/rp2/INFO: Processing GRT
    2022-04-03 07:34:44,749/rp2/INFO: Processing IOTX
    2022-04-03 07:34:44,813/rp2/INFO: Processing LRC
    2022-04-03 07:34:44,877/rp2/ERROR: Fatal exception occurred:
    Traceback (most recent call last):
      File "/home/james/.local/lib/python3.10/site-packages/rp2/rp2_main.py", line 96, in _rp2_main_internal
        computed_data: ComputedData = compute_tax(configuration=configuration, accounting_method=accounting_method, input_data=input_data)
      File "/home/james/.local/lib/python3.10/site-packages/rp2/tax_engine.py", line 44, in compute_tax
        unfiltered_gain_loss_set: GainLossSet = _create_unfiltered_gain_and_loss_set(configuration, accounting_method, input_data, unfiltered_taxable_event_set)
      File "/home/james/.local/lib/python3.10/site-packages/rp2/tax_engine.py", line 155, in _create_unfiltered_gain_and_loss_set
        raise RP2ValueError("Total in-transaction value < total taxable entries") from None
    rp2.rp2_error.RP2ValueError: Total in-transaction value < total taxable entries
    2022-04-03 07:34:44,877/rp2/INFO: Log file: ./log/rp2_2022_04_03_07_34_43_362639.log
    2022-04-03 07:34:44,877/rp2/INFO: Generated output directory: output/
    2022-04-03 07:34:44,877/rp2/INFO: Done
    

    Looking at LRC table:

    IN |   |   |   |   |   |   |   |   |   |   |   |   |   -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- Timestamp | Asset | Exchange | Holder | Transaction Type |   | Spot Price | Crypto In | Crypto Fee | USD In No Fee | USD In With Fee | USD Fee | Unique ID | Notes 2021-11-04 00:49:31 +0000 | LRC | Coinbase | (name) | Income |   | $1.15 | 0.43489605 |   | $0.50 | $0.50 | $0.00 | XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | Coinbase EARN; Received Loopring 2021-11-04 00:50:20 +0000 | LRC | Coinbase | (name) | Income |   | $1.15 | 0.43378302 |   | $0.50 | $0.50 | $0.00 | XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | Coinbase EARN; Received Loopring 2021-11-04 00:50:50 +0000 | LRC | Coinbase | (name) | Income |   | $1.15 | 0.43449923 |   | $0.50 | $0.50 | $0.00 | XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | Coinbase EARN; Received Loopring TABLE END |   |   |   |   |   |   |   |   |   |   |   |   |     |   |   |   |   |   |   |   |   |   |   |   |   |   OUT |   |   |   |   |   |   |   |   |   |   |   |   |   Timestamp | Asset | Exchange | Holder | Transaction Type |   | Spot Price | Crypto Out No Fee | Crypto Fee | Crypto Out With Fee | USD Out No Fee | USD Fee | Unique ID | Notes 2021-11-04 00:51:21 +0000 | LRC | Coinbase | (name) | Sell |   | $1.15 | 1.30317832 | 0.00000000 | 1.30317832 | $1.50 | $0.00 | XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | Sell side of conversion of 1.30317832 LRC TABLE END |   |   |   |   |   |   |   |   |   |   |   |   |  

    From what I see, it's $1.50 in and $1.50 out. I'm not sure if there's something else I should be looking at.

    opened by jameskupke 13
  • Remainder of acquired lot does not seem to be carried over

    Remainder of acquired lot does not seem to be carried over

    I have some small BTC transactions:

    BUY 0.00032667 crypto_in SELL 0.00032600 crypto_out_with_fee --- Wallet contains 0.00000067 BTC BUY 0.00147452 crypto_in --- Wallet now contains 0.00147519 BTC SELL 0.00147500 crypto_out_with_fee BUY 0.00162737 <- RP2 stops here and complains that the taxable event (previous Sell) is earlier than this acquired lot.

    It appears that RP2 doesn't carry over the remainder. RP2 supports splitting lots right? Maybe I'm misunderstanding tax law.

    opened by macanudo527 12
  • Python 3.10: TypeError: __add__() got an unexpected keyword argument 'context'

    Python 3.10: TypeError: __add__() got an unexpected keyword argument 'context'

    Running the example i'm getting this error (tested with Python3.9 and Python3.10)

     $ rp2_us -m fifo -o output -p crypto_example_ crypto_example.config crypto_example.ods
    INFO: Country: us
    INFO: Accounting Method: fifo
    INFO: Configuration file: crypto_example.config
    INFO: Input file: crypto_example.ods
    INFO: Processing BTC
    ERROR: Fatal exception occurred:
    Traceback (most recent call last):
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/rp2_main.py", line 93, in _rp2_main_internal
        input_data: InputData = parse_ods(configuration=configuration, asset=asset, input_file_handle=input_file_handle)
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/ods_parser.py", line 128, in parse_ods
        _create_and_process_transaction(
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/ods_parser.py", line 168, in _create_and_process_transaction
        transaction: AbstractTransaction = _create_transaction(configuration, current_table_type, internal_id, row_values)
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/ods_parser.py", line 277, in _create_transaction
        transaction = InTransaction(**argument_pack)
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/in_transaction.py", line 52, in __init__
        super().__init__(configuration, timestamp, asset, transaction_type, spot_price, internal_id, unique_id, notes)
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/abstract_transaction.py", line 41, in __init__
        self.__spot_price: RP2Decimal = configuration.type_check_positive_decimal("spot_price", spot_price)
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/configuration.py", line 276, in type_check_positive_decimal
        if result < ZERO:
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/rp2_decimal.py", line 59, in __lt__
        return not self.__ge__(other)
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/rp2_decimal.py", line 48, in __ge__
        return (self - other).quantize(CRYPTO_DECIMAL_MASK).__ge__(ZERO)
      File "/home/rndstr/venv/lib/python3.9/site-packages/rp2/rp2_decimal.py", line 69, in __sub__
        return RP2Decimal(Decimal.__sub__(self, other))
      File "/usr/lib/python3.9/_pydecimal.py", line 1257, in __sub__
        return self.__add__(other.copy_negate(), context=context)
    TypeError: __add__() got an unexpected keyword argument 'context'
    INFO: Log file: ./log/rp2_2022_04_10_15_52_55_045185.log
    INFO: Generated output directory: output
    INFO: Done
    
    opened by rndstr 12
  • RecursionError: maximum recursion depth exceeded in comparison for Decimal.quantize()

    RecursionError: maximum recursion depth exceeded in comparison for Decimal.quantize()

    I'm getting an endless loop which seems to be triggered by Decimal.quantize() calling RP2Decimal.__ne__ which then calls RP2Decimal.__eq__ which then calls Decimal.quantize() again.

    I presume there is something wrong with my numbers, which I have yet to investigate.

    ...
      File "/home/rndstr/venv3/lib/python3.10/site-packages/rp2/rp2_decimal.py", line 40, in __eq__
        return (self - other).quantize(CRYPTO_DECIMAL_MASK).__eq__(ZERO)
      File "/usr/lib/python3.10/_pydecimal.py", line 2588, in quantize
        if ans != self:
      File "/home/rndstr/venv3/lib/python3.10/site-packages/rp2/rp2_decimal.py", line 43, in __ne__
        return not self.__eq__(other)
      File "/home/rndstr/venv3/lib/python3.10/site-packages/rp2/rp2_decimal.py", line 40, in __eq__
        return (self - other).quantize(CRYPTO_DECIMAL_MASK).__eq__(ZERO)
      File "/usr/lib/python3.10/_pydecimal.py", line 2588, in quantize
        if ans != self:
      File "/home/rndstr/venv3/lib/python3.10/site-packages/rp2/rp2_decimal.py", line 43, in __ne__
        return not self.__eq__(other)
      File "/home/rndstr/venv3/lib/python3.10/site-packages/rp2/rp2_decimal.py", line 40, in __eq__
        return (self - other).quantize(CRYPTO_DECIMAL_MASK).__eq__(ZERO)
      File "/home/rndstr/venv3/lib/python3.10/site-packages/rp2/rp2_decimal.py", line 69, in __sub__
        return RP2Decimal(Decimal.__sub__(self, other))
      File "/usr/lib/python3.10/_pydecimal.py", line 1257, in __sub__
        return self.__add__(other.copy_negate(), context=context)
      File "/home/rndstr/venv3/lib/python3.10/site-packages/rp2/rp2_decimal.py", line 64, in __add__
        return RP2Decimal(Decimal.__add__(self, other))
      File "/usr/lib/python3.10/_pydecimal.py", line 1202, in __add__
        ans = self._rescale(exp, context.rounding)
      File "/usr/lib/python3.10/_pydecimal.py", line 2625, in _rescale
        if not self:
      File "/usr/lib/python3.10/_pydecimal.py", line 815, in __bool__
        return self._is_special or self._int != '0'
    RecursionError: maximum recursion depth exceeded in comparison
    
    opened by rndstr 11
  • Add option to specify `fiat_fee` in `out_header` vs just `crypto_fee`

    Add option to specify `fiat_fee` in `out_header` vs just `crypto_fee`

    Some exchanges let you pay fees with their token so the token you see and the token you pay fees with can be different. So in these cases I find my self normalizing all fees to fiat anyways.

    Could this be added a option? Thanks!

    opened by jamesbaber1 8
  • How to enter the swap fee without double counting the deduction?

    How to enter the swap fee without double counting the deduction?

    I have the following 3-step scenario:

    1. Buy Coin1
    2. Swap Coin1 for Coin2, paying a fee in Coin1 currency
    3. Sell Coin2 for USD.

    To enter this scenario in rp2, I split the swap into two separate transactions at the exact same timestamp with each transaction truthfully reporting the fee for the swap. The transactions are OUT(Coin1) and IN(Coin2). When I run rp2 on this scenario, it correctly reports a final position size of zero for both Coin1 and Coin2. However, this approach is double counting the fee -- it reduces the proceeds for the sale of Coin1 and it also increases the cost basis of Coin2. I think this is not allowed.

    Here is what I want to accomplish:

    1. Apply the swap fee towards the cost basis of the purchased asset (Coin2).
    2. Do not double-count the fee deduction, meaning the fee should not be used to reduce the proceeds from the sold asset (Coin1).
    3. Accurately reduce the position size of the sold asset (Coin1) by the total transaction cost including the fee.

    What is the right way to enter these transactions in the input spreadsheet?

    opened by stevendavis 8
  • Deducting sell fees in proceeds

    Deducting sell fees in proceeds

    First off, this is an amazing project, and a big bravo to you for creating this as a DIY alternative. After wrangling the tool for a little bit, one thing I believe I noticed is that fees are not being deducted from proceeds. Source for fee deduction logic is this article.

    As an example, consider some fake currency XYZ.

    I buy 10 XYZ @ $10 with a $1 fee. Total cost of $101, making my cost basis for each XYZ $10.10, as the fee is distributed across all the assets.

    I then sell all my XYZ @ $20 with a $2 fee, netting me $198. Each XYZ sold for $19.8, for a total capital gain of $9.7 per coin = $97.

    However, when running this example case, rp2 returns that the proceed of the sale was $200, for a capital gain of $99. Apologies if I'm missing something!

    As an aside, an option to mark sell fees as fiat instead of crypto would be useful, I think, as some exchanges charge USD off the top.

    Again, thanks so much for putting so much time and energy into an open-source and free solution. Screen Shot 2022-01-30 at 11 07 14 PM

    opened by skasab 6
  • JP Tax Report

    JP Tax Report

    This is the long-awaited Japan Tax Report. It is a modified version of the Excel spreadsheet they distribute to calculate taxes. They actually don't require this at all, but if they sense something fishy they might request it and some people send it in.

    I just worked through and passed 'crypto_example' for now, but I'll be working through the other datasets over this week. I just thought I would submit this for some advice in the meantime. So, the 'test_ods_output_diff_jp.py' is a work in progress at the moment.

    opened by macanudo527 1
  • Per wallet/exchange Specific Identification (FIFO, LIFO, etc...) Resolution

    Per wallet/exchange Specific Identification (FIFO, LIFO, etc...) Resolution

    opened by macanudo527 15
  • Uncertain, but considering making a python wallet reader

    Uncertain, but considering making a python wallet reader

    I have found the current run of tax software to be dismal at best.

    My experience has been:

    • incomplete import of chain or exchange data
    • poor transaction matching
    • poor handling of cross-chain transfers

    These, coupled with some knowledge of chain functionality (more than some crypto tax companies, apparently) have caused me to consider making a CLI, read-only meta-wallet.

    This would be a means of reading and keeping track of your current balances, as well as your past transaction activity. However, I know little to nothing about taxes. ..so RP2 is a decent find.

    That said, I'd rather avoid duplicating work. Is there some similar project out there already using RP2?

    opened by eode 1
  • Few minor suggestions

    Few minor suggestions

    Thank you for this library, I've found it extremely useful. I just have few minor suggestions


    • Fee parameters

    Fee only transactions are introduced to address issues #16 and #4. I was wondering whether something like fee, fee_currency, fee_fiat_value, fee_fiat_value_currency could be used instead. With this, there is no need to create two transactions for a single transaction. Also, I found current fee structure design slightly confusing as if I am correct, one can pass either only crypto_fee or fiat_fee, but not both, which is a deviation from the current library standard. Throughout the library, the keyword fiat is used to address fiat value and both crypto and fiat related params get populated. E.g crypto_in and fiat_in related params all get populated instead of either only crypto_in or fiat_in getting populated. I think using something like fee, fee_currency, fee_fiat_value, fee_fiat_value_currency, will help the fee structure also adhere to the current practice and make the code easier to follow.


    • Using only asset and fiat instead of asset, crypt, and fiat

    Currently there are three main keywords, asset, crypto, and fiat. However, I think using only asset and fiat seems quite fine. So I was wondering whether we could just use asset, asset_in, asset_sent, etc instead of having both asset and crypto_in, crypto_sent, etc. This will also make code easier to follow for a few corner cases where crypto_in or crypto_out gets populated even when asset is a fiat currency

    opened by topcoderasdf 1
  • Add Support for South Africa

    Add Support for South Africa

    RP2 and DaLI have a programmable plugin architecture for countries, accounting methods, report generators and more. Adding support for a new country is a high-impact activity because it allows many new potential users to get access to RP2 and DaLI.

    Here's add support for a new country:

    1. add a new country plugin to RP2;
    2. if the country requires accounting methods that aren't already supported in RP2, add the necessary accounting method plugins;
    3. ensure any newly added accounting methods are reflected in the country plugin's get_default_accounting_method() and get_accounting_methods() methods;
    4. optionally, new country-specific report generators can be added. The built-in report generators (i.e. rp2_full_report and open_positions) are automatically supported;
    5. only for non-English speaking countries: translations for the built-in report generators and for any new report generator can be added;
    6. ensure any newly added report generators are reflected in the country plugin's get_report_generators() method;
    7. add the same country plugin to DaLI. The implementation on the DaLI side is trivial: it's just an entry point instantiating the RP2 country plugin and passing it to the main function;
    8. update the documentation of RP2 and DaLI to reflect the new country, accounting methods (if any) and report generators (if any).

    If you notice the country-specific infrastructure is missing a feature that is required to express taxes for the new country, open an issue to let the RP2 community know.

    help wanted good first issue 
    opened by eprbell 0
  • Add Support for Argentina

    Add Support for Argentina

    RP2 and DaLI have a programmable plugin architecture for countries, accounting methods, report generators and more. Adding support for a new country is a high-impact activity because it allows many new potential users to get access to RP2 and DaLI.

    Here's add support for a new country:

    1. add a new country plugin to RP2;
    2. if the country requires accounting methods that aren't already supported in RP2, add the necessary accounting method plugins;
    3. ensure any newly added accounting methods are reflected in the country plugin's get_default_accounting_method() and get_accounting_methods() methods;
    4. optionally, new country-specific report generators can be added. The built-in report generators (i.e. rp2_full_report and open_positions) are automatically supported;
    5. only for non-English speaking countries: translations for the built-in report generators and for any new report generator can be added;
    6. ensure any newly added report generators are reflected in the country plugin's get_report_generators() method;
    7. add the same country plugin to DaLI. The implementation on the DaLI side is trivial: it's just an entry point instantiating the RP2 country plugin and passing it to the main function;
    8. update the documentation of RP2 and DaLI to reflect the new country, accounting methods (if any) and report generators (if any).

    If you notice the country-specific infrastructure is missing a feature that is required to express taxes for the new country, open an issue to let the RP2 community know.

    help wanted good first issue 
    opened by eprbell 0
Releases(1.3.1)
Owner
eprbell
Bitcoin, Quantum Computing and Investing. BTC address: 34nw7bR4fL6BFLDJXcJP1ga4L6MWDzHAe5
eprbell
A simple Discord Bot that uses the free CryptoCompare API to display cryptocurrency prices

What is this? This is a simple Discord Bot coded in Python that uses the free CryptoCompare API to display cryptocurrency prices Download Use git to c

Kevin 10 Apr 17, 2022
Upbit(업비트) Cryptocurrency Exchange OPEN API Client for Python

Base Repository Python Upbit Client Repository Upbit OPEN API Client @Author: uJhin @GitHub: https://github.com/uJhin/upbit-client/ @Officia

Yu Jhin 37 Nov 6, 2022
Open Resource Calculator Module for Python

Calculator Module for Python By White Night Install #

White_Night_awa 4 Aug 22, 2022
Free and Open Source Machine Translation API. 100% self-hosted, no limits, no ties to proprietary services. Built on top of Argos Translate.

LibreTranslate Try it online! | API Docs Free and Open Source Machine Translation API, entirely self-hosted. Unlike other APIs, it doesn't rely on pro

UAV4GEO 3.5k Jan 3, 2023
A free and open-source discord webhook spammer.

Discord-Webhook-Spammer A free and open-source discord webhook spammer. Usage Depending on your python installation your commands may vary. Below are

null 3 Sep 8, 2021
Free and Open Source Channel/Group Voice chat music player for telegram ❤️ with button support Heroku Commands

ZeusMusic Requirements ?? FFmpeg NodeJS nodesource.com Python 3.7 or higher PyTgCalls MongoDB 2nd Telegram Account (needed for userbot) ?? Get SESSION

ZeusNetwork 4 Jan 3, 2022
Freqtrade is a free and open source crypto trading bot written in Python.

Freqtrade is a free and open source crypto trading bot written in Python. It is designed to support all major exchanges and be controlled via Telegram. It contains backtesting, plotting and money management tools as well as strategy optimization by machine learning.

Kazune Takeda 5 Dec 30, 2021
A free and open-source SMS/Call bombing application

TBOMB V0.1 A free and open-source SMS/Call bombing application NOTE: For Termux To use the bomber type the following commands in Termux: pkg install g

ᴀɴᴋɪᴛ ᴋᴜᴍᴀʀ 2 Dec 7, 2021
Free and Open Source Group Voice chat music player for telegram ❤️ with button support youtube playback support

Free and Open Source Group Voice chat music player for telegram ❤️ with button support youtube playback support

Sehath Perera 1 Jan 8, 2022
WallAlley.bot is an open source and free to use financial discord bot originaly build for WallAlley server's community

WallAlley.bot About WallAlley.bot is an open source and free to use financial discord bot originaly build for WallAlley server's community. All data a

Mohammad KHADDAN 1 Jan 22, 2022
This is a Python bot, which automates logging in, purchasing and planting the seeds. Open source bot and completely free.

?? Sunflower Land Bot ?? ⚠️ Warning I am not responsible for any penalties incurred by those who use the bot, use it at your own risk. This BOT is com

Newerton 18 Aug 31, 2022
The python SDK for Eto, the AI focused data platform for teams bringing AI models to production

Eto Labs Python SDK This is the python SDK for Eto, the AI focused data platform for teams bringing AI models to production. The python SDK makes it e

null 5 Apr 21, 2022
To dynamically change the split direction in I3/Sway so as to split new windows automatically based on the width and height of the focused window

To dynamically change the split direction in I3/Sway so as to split new windows automatically based on the width and height of the focused window Insp

Ritin George 6 Mar 11, 2022
Complete portable pipeline for masking of Aadhaar Number adhering to Govt. Privacy Guidelines.

Aadhaar Number Masking Pipeline Implementation of a complete pipeline that masks the Aadhaar Number in given images to adhere to Govt. of India's Priv

null 1 Nov 6, 2021
An opensource chat service that cares about your privacy.

An opensource chat service that cares about your privacy. Instructions to set up a local testing environment: 1) Clone this repository and navigate to

Aiman Al Masoud 2 Dec 3, 2022
Modern, privacy-friendly, and detailed web analytics that works without cookies or JS.

Modern, privacy-friendly, and cookie-free web analytics. Getting started » Screenshots • Features • Office Hours Motivation There are a lot of web ana

R. Miles McCain 2.1k Jan 3, 2023
(unofficial) Googletrans: Free and Unlimited Google translate API for Python. Translates totally free of charge.

Googletrans Googletrans is a free and unlimited python library that implemented Google Translate API. This uses the Google Translate Ajax API to make

Suhun Han 3.2k Jan 4, 2023
Utilizing the freqtrade high-frequency cryptocurrency trading framework to build and optimize trading strategies. The bot runs nonstop on a Rasberry Pi.

Freqtrade Strategy Repository Please test all scripts and dry run them before using them in live mode Contact me on discord if you have any questions!

Michael Fourie 90 Jan 1, 2023
Trading bot that uses Elon Musk`s tweets to know when to buy cryptocurrency.

Elonbot Trading bot that uses Elon Musk`s tweets to know when to buy cryptocurrency. Here is how it works: Subscribes to someone's (elonmusk?) tweets

null 153 Dec 23, 2022