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
Debugging with Stack Overflow: Web Search Behavior in Novice and Expert Programmers

Debugging with Stack Overflow: ICSE SEET, 2022 This is the GitHub repository associated with the 2022 ICSE SEET paper, Debugging with Stack Overflow:

Madeline Endres 1 Jan 31, 2022
Pycord, a maintained fork of discord.py, is a python wrapper for the Discord API

pycord A fork of discord.py. PyCord is a modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. Key Features Mo

Pycord Development 2.3k Dec 31, 2022
BingBot - A bot that will automate searches on bing

bingBot A bot that will automate searches on bing. To install this just download

Lukas 2 Jul 28, 2022
discord.xp Bot, counts XP for members

discord.xp Bot, counts XP for members. How to setup and run? You must have an mysql database Download libs from the requirements.txt file Configurize

irwing 4 Feb 05, 2022
Mega.nz to GDrive uploader

Mega.nz to GDrive uploader With this telegram bot you can download files from mega.nz and upload those files or telegram uploaded files to GDrive. You

30 Nov 13, 2022
Dynamic Twitter banner, to show off your spotify status. Banner updated every 5 minutes.

Spotify Twitter Banner Dynamic Twitter banner, to show off your spotify status. Banner updated every 5 minutes. Installation and Usage Install the dep

Sunrit Jana 23 Jan 05, 2023
Just another Shiny and Greninja-ash killing preventor for Myuu

Myuu-Anti-Shiny-Discord-Bot Why I made it? Since, I was legit fed up of NebbyBot's lag (not criticising it), I decided to make my own but in python an

5 Nov 12, 2022
A small and fun Discord Bot that is written in Python and discord-interactions (with discord.py)

Articuno (discord-interactions) A small and fun Discord Bot that is written in Python and discord-interactions (with discord.py) Get started If you wa

Blue 8 Dec 26, 2022
Discord.py(disnake) selfbot

Zzee selfbot Discord.py selfbot Version: 1.0 ATTENTION! we are not responsible for your discord account! this program violates the ToS discord rules!

1 Jan 10, 2022
A zero-dependency Python library for getting the Kubernetes token of a AWS EKS cluster

tokeks A zero-dependency Python library for getting the Kubernetes token of a AWS EKS cluster. No AWS CLI, third-party client or library (boto3, botoc

Chris Karageorgiou Kaneen 6 Nov 04, 2022
music recommend chat bot

Your Song A chat bot who can recommend music for you. Project Documents https://drive.google.com/drive/folders/1zbHbuRyrUgMrO-LtDXrXwqycN_ysuAUx Dir I

4 Mar 27, 2022
A simple telegram Bot, Upload Media File| video To telegram using the direct download link. (youtube, Mediafire, google drive, mega drive, etc)

URL-Uploader (Bot) A Bot Upload file|video To Telegram using given Links. Features: 👉 Only Auth Users (AUTH_USERS) Can Use The Bot 👉 Upload YTDL Sup

Hash Minner 18 Dec 17, 2022
⚡TIKTOK BOT - FAST OPTIMIZED ZEFOY SCRIPT

⚡ ZEFOY [ TikTok Zefoy Bot ] Get the script in: discord.gg/onlp !! Official shop: onlp.sellix.io Newest version v.9.0.0 Requirements pip install p

Tekky 186 Dec 31, 2022
A simple telegram voting bot based on the python-telegram-bot api.

A simple telegram voting bot based on the python-telegram-bot api. *To make it more easy to use, I might make a C++ code in the future so you don't ha

3 Sep 13, 2021
An advanced Filter Bot with nearly unlimitted filters

Telegram MTProto API Framework for Python Documentation • Releases • Community Pyrogram from pyrogram import Client, filters app = Client("my_account

Pyrogram 3.2k Jan 05, 2023
Hello i am TELEGRAM GROUP MANAGEMENT BOT MY NAME IS Evil-Inside ⚡ i have both amazing modules

Evil-Inside DEMO BOT - Evil-Inside Hello i am TELEGRAM GROUP MANAGEMENT BOT MY NAME IS Evil-Inside ⚡ i have both amazing modules ℂ𝕆ℕ𝕋𝔸ℂ𝕋 𝕄𝔼 𝕆ℕ

PANDITHAN 52 Nov 20, 2022
Materials to reproduce our findings in our stories, "Amazon Puts Its Own 'Brands' First Above Better-Rated Products" and "When Amazon Takes the Buy Box, it Doesn’t Give it up"

Amazon Brands and Exclusives This repository contains code to reproduce the findings featured in our story "Amazon Puts Its Own 'Brands' First Above B

The Markup 60 Nov 11, 2022
This is a cryptocurrency trading bot that analyses Reddit sentiment and places trades on Binance based on reddit post and comment sentiment. If you like this project please consider donating via brave. Thanks.

This is a cryptocurrency trading bot that analyses Reddit sentiment and places trades on Binance based on reddit post and comment sentiment. The bot f

Andrei 157 Dec 15, 2022
This repository will be a draft of a package about the latest total marine fish production in Indonesia. Data will be collected from PIPP (Pusat Informasi Pelabuhan Perikanan).

indomarinefish This package will give us information about the latest total marine fish production in Indonesia. The Name of the fish is written in In

1 Oct 13, 2021
This Instagram app created as a clone of instagram.Developed during Moringa Core.

Instagram This Instagram app created as a clone of instagram.Developed during Moringa Core. AUTHOR By: Nyagah Isaac Description This web-app allows a

Nyagah Isaac 1 Nov 01, 2021