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
Discord spam bots with multiple account support and more

Discord spam bots with multiple account support and more. PLEASE READ EVERYTHING BEFORE WRITING AN ISSUE!! Server Messages Text Image Dm Messages Text

Mr. Nobody 6 Sep 14, 2022
An automated bot for twitter using Tweepy!

Tweeby An automated bot for twitter using Tweepy! About This bot will look for tweets that contain certain hashtags, if found. It'll send them a messa

Ori 1 Dec 06, 2021
Stackoverflow Telegram Bot With Python

Template for Telegram Bot Template to create a telegram bot in python. How to Run Set your telegram bot token as environment variable TELEGRAM_BOT_TOK

PyTopia 10 Mar 07, 2022
IMDb + Auto + Unlimited Filter BoT

Telegram Movie Bot Features Auto Filter Manuel Filter IMDB Admin Commands Broadcast Index IMDB search Inline Search Random pics ids and User info Stat

Team AlinaX 1 Dec 03, 2021
Simple Discord bot which logs several events in your server

logging-bot Simple Discord bot which logs several events in your server, including: Message Edits Message Deletes Role Adds Role Removes Member joins

1 Feb 14, 2022
Python SDK for 42DI

42di Python SDK Install pip install git+https://github.com/42di/python-sdk import import di #42di import pandas_datareader as pdr Init SDK project =

42DI 2 Nov 03, 2021
Bot per la chat live del corso di sistemi operativi UniBO

cravattaBot TL;DR: Ho fatto un bot telegram per la chat del corso di sistemi. Indice Installazione e prerequisiti Prerequisiti Installazione Setup Con

Alessandro Frau 3 May 21, 2022
A simple Facebook Account generator, written in python (needs different Email so Accounts do not get banned)

FacebookAccountGenerator FAB is a Facebook-Account generating script, written in python Installation Use the package manager pip to install selenium p

MrOverload 7 Jan 05, 2023
Upload comma-delimited files to biglocalnews.org in your GitHub Action

Upload comma-delimited files to biglocalnews.org in your GitHub Action Inputs api-key: Your biglocalnews.org API token. project-id: The identifier of

biglocalnews 1 Apr 20, 2022
Powerful spammer bots for telegram made with python and telethon.

Powerful spammer bots for telegram made with python and telethon. We can deploy upto 70 bots at a time.

32 Dec 15, 2022
Pdisk Link Converter Telegram Bot, Convert link in a single click

Pdisk Converter Bot Make short link by using Pdisk API key Installation The Easy Way Required Variables BOT_TOKEN: Create a bot using @BotFather, and

Ayush Kumar Jaiswal 6 Jul 28, 2022
A simple google translator telegram bot

Translator-Bot A simple google translator telegram bot Please fork this repository don't import code Made with Python3 (C) @FayasNoushad Copyright per

Fayas Noushad 14 Nov 12, 2022
A feishu bot daily push arxiv latest articles.

arxiv-feishu-bot We develop A simple feishu bot script daily pushes arxiv latest articles. His effect is as follows: Of course, you can also use other

huchi 6 Apr 06, 2022
An inline Telegram bot to keep your private messages hidden from prying eyes.

Hide This Bot Hide This Bot is an inline Telegram bot to keep your private messages hidden from prying eyes.     How do I host it? Here is a brief gui

41 Dec 02, 2022
Program that automates the bump of the Disboard Bot. Done 100% in Python with PyAutoGUI library

Auto-Discord-Bump Program that automates the bump of the Disboard Bot done 100% in python with PyAutoGUI How to configue You will need 3 things before

Mateus 1 Dec 19, 2021
:electric_plug: Generating short urls with python has never been easier

pyshorteners A simple URL shortening API wrapper Python library. Installing pip install pyshorteners Documentation https://pyshorteners.readthedocs.i

Ellison 351 Jan 03, 2023
Repositorio dedicado a contener los archivos fuentes del bot de discord "Lector de Ejercicios".

Lector de Ejercicios Este bot de discord está pensado para usarse únicamente en el discord de la materia Algoritmos y Programación I, de la Facultad d

Franco Lighterman Reismann 3 Sep 17, 2022
Optimus Prime - A modular Telegram group management and drive clone bot running on Python with sqlalchemy database

Optimus Prime Bot . 🤖 A modular Telegram group management and drive clone bot r

9 Jun 01, 2022
Shedding a new skin on Dis-Snek's commands.

Molter - WIP Shedding a new skin on Dis-Snek's commands. Currently, its goals are to make message commands more similar to discord.py's message comman

Astrea 7 May 01, 2022
A collection of scripts to steal BTC from Lightning Network enabled custodial services. Only for educational purpose! Share your findings only when design flaws are fixed.

Lightning Network Fee Siphoning Attack LN-fee-siphoning is a collection of scripts to subtract BTC from Lightning Network enabled custodial services b

Reckless_Satoshi 14 Oct 15, 2022