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
Check AWS S3 instances for read/write/delete access

s3sec Test AWS S3 buckets for read/write/delete access This tool was developed to quickly test a list of s3 buckets for public read, write and delete

0xmoot 114 Dec 06, 2022
❤️A next gen powerful telegram group manager bot for manage your groups and have fun with other cool modules

Natsuki Based on Python Telegram Bot Contributors Video Tutorial: Complete guide on deploying @TheNatsukiBot's clone on Heroku. ☆ Video by Sadew Jayas

Pawan Theekshana 8 Oct 06, 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
A python script to acquire multiple aws ec2 instances in a forensically sound-ish way

acquire_ec2.py The script acquire_ec2.py is used to automatically acquire AWS EC2 instances. The script needs to be run on an EC2 instance in the same

Deutsche Telekom Security GmbH 31 Sep 10, 2022
Telegram Bot to store Posts and Documents and it can Access by Special Links.

Telegram Bot to store Posts and Documents and it can Access by Special Links. I Guess This Will Be Usefull For Many People..... 😇 . Features Fully cu

REX BOTZ 1 Dec 23, 2021
Send song lyrics to iMessage users using the Genius lyrics API

pyMessage Send song lyrics to iMessage users using the Genius lyrics API. Setup 1.) Open the main.py file, and add your API key on line 7. 2.) Install

therealkingnull 1 Jan 23, 2022
Unauthenticated enumeration of services, roles, and users in an AWS account or in every AWS account in existence.

Quiet Riot 🎶 C'mon, Feel The Noise 🎶 An enumeration tool for scalable, unauthenticated validation of AWS principals; including AWS Acccount IDs, roo

Wes Ladd 89 Jan 05, 2023
A bot for the [email protected] Discord server.

KittyBot - a sentient Discord bot! Key Notes An open-source, community-powered bot for the [email 

Ollie 11 Dec 06, 2022
Tools used by Ada Health's internal IT team to deploy and manage a serverless Munki setup.

Serverless Munki This repository contains cross platform code to deploy a production ready Munki service, complete with AutoPkg, that runs entirely fr

Ada Health 17 Dec 05, 2022
Asyncevents: a small library to help developers perform asynchronous event handling in Python

asyncevents - Asynchronous event handling for modern Python asyncevents is a small library to help developers perform asynchronous event handling in m

Mattia 5 Aug 07, 2022
SC4.0 - BEST EXPERIENCE · HEX EDITOR · Discord Nuker · Plugin Adder · Cheat Engine

smilecreator4 This site is for people who want to hack or want to learn it! Furthermore, this program does not work without turning off Antivirus or W

1 Jan 04, 2022
Wordy is a Wordle-like Discord bot but with a twist.

Wordy Discord Bot Wordy is a Wordle-like Discord bot but with a twist. It already supports 6 languages from the beginning: English, Italian, French, G

The Coding Channel 2 Sep 06, 2022
Opasium AI was specifically designed for the Opasium Games discord only. It is a bot that covers the basic functions of any other bot.

OpasiumAI Opasium AI was specifically designed for the Opasium Games discord only. It is a bot that covers the basic functions of any other bot. Insta

Dan 3 Oct 15, 2021
Trust-minimized Bitcoin wallet

coldcore Trust-minimized, airgapped Bitcoin management This is experimental software. Wait for a formal release before use with real funds. A trust-mi

James O'Beirne 121 Jan 01, 2023
Tesseract Open Source OCR Engine (main repository)

Tesseract OCR About This package contains an OCR engine - libtesseract and a command line program - tesseract. Tesseract 4 adds a new neural net (LSTM

48.3k Jan 05, 2023
GitHub Usage Report

github-analytics from github_analytics import analyze pr_analysis = analyze.PRAnalyzer( "organization/repo", "organization", "team-name",

Shrivu Shankar 1 Oct 26, 2021
The system to host your files on the Discord application

Distorage The system to host your files on the Discord application Documentation Documentation Distorage How to use the package You can install it wit

6 Jun 27, 2022
Discord bot that automatically fills out health screenings

Auto Covid Bot Automatically fill out the NYC DOE health screening form by registering with a discord bot School code can be found on https://schoolse

Cleo 2 Jul 29, 2022
Automatically Forward files from groups to channel & FSub

Backup & ForceSub Automatically Forward files from groups to channel & Do force sub on members Variables API_ID : Get from my.telegram.org API_HASH :

Arunkumar Shibu 7 Nov 06, 2022
𝐀 𝐦𝐨𝐝𝐮𝐥𝐚𝐫 𝐓𝐞𝐥𝐞𝐠𝐫𝐚𝐦 𝐆𝐫𝐨𝐮𝐩 𝐦𝐚𝐧𝐚𝐠𝐞𝐦𝐞𝐧𝐭 𝐛𝐨𝐭 𝐰𝐢𝐭𝐡 𝐮𝐥𝐭𝐢𝐦𝐚𝐭𝐞 𝐟𝐞𝐚𝐭𝐮𝐫𝐞𝐬 !!

𝐇𝐨𝐰 𝐓𝐨 𝐃𝐞𝐩𝐥𝐨𝐲 For easiest way to deploy this Bot click on the below button 𝐌𝐚𝐝𝐞 𝐁𝐲 𝐒𝐮𝐩𝐩𝐨𝐫𝐭 𝐆𝐫𝐨𝐮𝐩 𝐒𝐨𝐮𝐫𝐜𝐞𝐬 𝐆𝐞𝐧𝐞?

Mukesh Solanki 1 Dec 10, 2021