-
- How to Verify that I Entered Data Correctly in the Input Spreadsheet?
- How to Verify that Tax Computation is Correct?
- What Is the Timestamp Format?
- What if I Don't Have the Spot Price for Some Transactions?
- What Tokens Does RP2 Support?
- What Accounting Methods Are Supported?
- Do Accounting Methods Use Universal or Per-Wallet Application
- Can I Change Accounting Method?
- What Countries Are Supported?
- How to Switch from Another Tax Software to RP2?
- Why Should I Use RP2 Instead of Another Software?
- What's the Difference Between Rotki and RP2?
- Can I Avoid Writing the Input Spreadsheet Manually?
- Can I Avoid Writing a Config File from Scratch?
- Is My Tax Report Browsable?
- How to Report a RP2 Bug Without Sharing Personal Information?
- What if I Don't Trust RP2 With My Crypto Data?
- Why Can't I Open the RP2 Output Report with Excel?
- Who is the Author of RP2?
- How to Pronounce RP2?
- What Does RP2 Mean?
-
- What if I and My Spouse File Taxes Jointly?
- How to Handle a Transfer of Funds from a Wallet or Exchange to Another?
- If I Transfer Cryptocurrency Between Two Accounts I Own, Is the Fee Taxable?
- How to Represent Fiat vs Crypto Transaction Fees?
- How to Handle Conversion of a Cryptocurrency to Another?
- How to Handle Airdrops?
- How to Handle Donations?
- How to Handle Gifts?
- How to Handle Hard Forks?
- How to Handle Miscellaneous Crypto Income?
- How to Handle Crypto Interest?
- How to Handle Income from Mining?
- How to Handle Income from Staking?
- How to Handle Losses from Staking?
- How to Handle Income from Crypto Wages?
- How to Handle Crypto Rewards?
- How to Handle Fee-only DeFi Transactions?
- How to Handle DeFi Bridging?
- How to Handle DeFi Reflexive Tokens?
- How to Handle DeFi Yield from Liquidity Pools
- How to Handle NFTs?
- How to Handle Margin Trading?
- How to Handle Futures and Options?
In rp2_full_report.ods check the Account Balances table in the tax sheets, and make sure they match the actual balances of your accounts. If not, you probably have an error in the input file or missed some transactions.
RP2 features transparent computation and generates full computation details for every lot fraction, so that it's possible to verify step-by-step how RP2 reaches the final result.
Timestamp format is ISO8601 (see examples of timestamps in this format). Note that RP2 requires full timestamps, including date, time and timezone.
In some cases exchange reports miss spot price information. In such situations you can retrieve historical price data from Yahoo, CoinMarketCap and others.
The user adds the tokens to the assets
field of the config file: RP2 accepts as valid all the tokens present in this field. See also the question on writing a config file from scratch.
Accounting methods vary country by country, as described in the supported countries document.
RP2 engine uses universal application, not per-wallet application: this means there is one queue for each coin across every wallet and exchange and the accounting method is applied to each such queue.
Yes, for countries that support more than one accounting method, you can select which one to use via the -m
command line option, or you can use the accounting_methods
section of the config file.
RP2 can be used in most countries: see the supported countries document for details.
In other words, how does RP2 handle transactions that were managed by other software in previous years? In this case the user can just leave out from the RP2 input spreadsheet the transactions/lots that were already sold in previous years.
E.g. suppose the user's first year of trading BTC was 2020 and these were their transactions:
- 2020-2-5: buy 1 BTC
- 2020-5-5: buy 2 BTC
- 2020-8-1: sell 1.5 BTC
- 2021: more transactions...
Let's also assume they didn't use RP2 for their 2020 taxes and they used the FIFO accounting method. This means they sold all of lot a) and 0.5 BTC from lot b).
So if they want to start using RP2 for their 2021 taxes, they would just leave out what they already sold and enter the following in the RP2 input spreadsheet:
- 2020-5-5: buy 1.5 BTC
- 2021: more transactions...
This is because a), part of b) and c) are already accounted for in the pre-RP2 system. The Notes column can be useful here: it can be used to describe why lot b) is partial.
Of course the user still needs to keep all the documentation for previous years as well as for the current year. Also they will need to keep the same accounting method they were using previously: to switch accounting method it is a good idea to speak to a tax professional first.
RP2 has all of the following features:
- 100% privacy-focused;
- 100% open-source;
- 100% free;
- 100% non-commercial;
- powerful and robust.
This means that with RP2 there are no transaction limits, no premium versions, no payment requests, no personal data sent to a server (at risk of being hacked), no account creation, no unauditable source code.
Additionally RP2 offers transparent computation and generates full computation details for every lot fraction, so that it's possible to:
- verify step-by-step how RP2 reaches the final result;
- track down every lot fraction and its accounting details, in case of an audit.
One difference is that RP2 is 100% free and non-commercial, whereas Rotki is a commercial product: their free offering has transaction limits and other constraints that can be lifted by purchasing the premium product. Another difference relates to privacy protection: to access premium features in Rotki the user needs to open an account on the Rotki web site and pay them (thus disclosing some personal information to them), whereas on RP2 no personal information ever leaves the user's computer. See also the question on what differentiates RP2 from other crypto tax software.
You can generate it automatically using DaLI, the data loader and input generator for RP2.
You can generate it automatically using DaLI, the data loader and input generator for RP2. Alternatively you can use crypto_example.ini as boilerplate and the Input Files document as reference.
The rp2_full_report output contains full tax computation details. Part of its contents are hyperlinked to enable browsing: in LibreOffice, CTRL-click (on Mac, Command-click) on a cell to jump to the target. The browsable elements are:
- taxable events and acquired lots in the cryptocurrency Tax sheet are hyperlinked to their definition line in the cryptocurrency In-Out sheet;
- summary lines in the Summary sheet are hyperlinked to the first line of the given year in the cryptocurrency Tax sheet.
See the Reporting Bugs section in the CONTRIBUTING document.
In other words, how to be sure RP2 is not malware/spyware? After all, Bitcoin's motto is "don't trust, verify". RP2 is open-source and written in Python, so anybody with Python skills can inspect the code anytime: if RP2 were to try anything untoward (e.g. connecting to a server), someone would likely notice. However if you don't have the time, patience or skill to verify the code and you don't trust others to do so for you, you can still use RP2 in an isolated environment:
- start a fresh virtual machine with your OS of choice;
- install RP2 in the virtual machine;
- isolate the virtual machine: kill networking, shared directories and other mechanisms of outside communication;
- copy your crypto input data to the virtual machine via USB key or other physical medium (because the machine is now isolated);
- run RP2 in the virtual machine.
Some people have reported a problem when opening the rp2_full_report.ods file in Excel. RP2 generates ODS output using the pyexcel-ezodf library, which works well with Libre Office and Open Office (both of which are free). If Excel is unable to open a RP2 file, try again with one of its free alternatives.
The author of RP2 is a Silicon Valley veteran, a software engineer and bitcoiner who also dabbles in Quantum Computing.
It's RP Square (see What Does RP2 Mean).
It's a humorous reference to Warren Buffett’s claim that Bitcoin is “rat poison squared”. Other smart people occasionally made famously wrong remarks about technology: I have a feeling Buffett’s quote might end up among those.
Selling, swapping, donating, mining, staking, earning cryptocurrency are some common taxable events. For an up-to-date list in any given year, ask your tax professional. For additional information on taxable events read the Cryptocurrency Tax FAQ on Reddit and CoinTracker's summary on crypto taxes.
No. The IRS has made it clear that crypto taxes must be paid. Various tax agencies in other jurisdictions have made similar statements.
A good starting point is the Cryptocurrency Tax FAQ on Reddit. Also read the question on which tax forms to file and consult with your tax professional.
RP2 keeps track of in/out lot relationship, lot fractioning and it computes capital gains and losses, but it doesn't generate the final tax forms. The computed information is written to the tax_report_us output, which is intended for tax professionals: all taxable events are grouped in different tabs by type (mining, staking, selling, donating, etc.). Each tax event type has a specific tax treatment: your tax professional can transfer the information from the tax_report_us output tabs to the appropriate forms in any given year.
For additional information on which forms to file read:
Also read the question on crypto tax resources.
The names of people filing taxes jointly should be added to the holders section of the config file (which is used for validation) and also in the holder column of each transaction in the input file. With this information RP2 generates a joint output. Here's an example in which the people filing jointly are called Alice and Bob:
- config/crypto_example.ini (see Alice and Bob in the holders section)
- input/crypto_example.ods (see transactions moving BTC from Bob to Alice in the INTRA table of the BTC tab).
See the input files section of the documentation for format details.
If the both the source and destination accounts belong to the same owner (or to people filing jointly), use an intra-transaction. Otherwise, use an out-transaction. See the input files section of the documentation for format details.
Such fees affect the in/out lot relationships, so RP2 keeps track of them (in the "Investment Expenses" tab of the tax_report_us output). Ask your tax professional about how to handle this tab in any given year.
Here are the possible scenarios for in and out-transaction fees (intra-transactions fees are implicitly defined as crypto_sent
- crypto_received
):
- if the fee was paid in fiat: use
crypto_fee
== 0 (or empty) andfiat_fee
>= 0: RP2 usesfiat_fee
as passed in; - if the fee was paid in the same crypto as the transaction: use
crypto_fee
> 0 andfiat_fee
empty: RP2 populatesfiat_fee
internally asspot_price
*crypto_fee
. Note that for in-transactions, the crypto fee comes out of the crypto amount of the in-transaction: RP2 models this by creating an additional, artificial, fee-only out-transaction in the amount of the crypto fee; - if the fee was paid in the same crypto as the transaction, but the exchange reports a
fiat_fee
value that doesn't matchcrypto_fee
(sometimes this occurs on some exchanges, like Coinbase): usecrypto_fee
>= 0 andfiat_fee
>= 0 (this should generate a warning, but RP2 will use the fiat_fee in the calculation of taxes); - if the fee was paid in a different crypto than the one the transaction is denominated in: use an additional fee-only transaction (
transaction_type
set to FEE), denominated in the new crypto.
Converting from one cryptocurrency to another can be captured in RP2 by splitting the original transaction into two:
- a SELL-type out-transaction that describes selling the initial cryptocurrency into fiat, and
- a BUY-type in-transaction that describes buying the final cryptocurrency using fiat.
If there was a conversion fee and it was paid in crypto, choose one (and only one) applicable option among the following:
- if the crypto fee was paid with the out-currency, assign it to the
crypto_fee
field of the out-transaction, or - if the crypto fee was paid with the in-currency, assign it to the
crypto_fee
field of the in-transaction, or - if the crypto fee was paid with a third crypto currency (neither the in-currency nor the out-currency), create a new fee-only transaction ( (
transaction_type
set to FEE)) denominated in the third currency.
If there was a conversion fee and it was paid in fiat, choose one (and only one) of these options:
- assign it to the
fiat_fee
of the in-transaction, or - assign it to the
fiat_fee
of the out-transaction.
See the input files section of the documentation for format details.
Use an in-transaction and mark the transaction type as AIRDROP. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
Use an in-transaction (if receiving crypto) or out-transaction (if giving crypto) and mark the transaction type as DONATION. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
Use an in-transaction (if receiving crypto) or out-transaction (if giving crypto) and mark the transaction type as GIFT. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
Use an in-transaction and mark the transaction type as HARDFORK. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
Miscellaneous income covers gains from reward programs like Coinbase Earn, etc. Use an in-transaction and mark the transaction type as INCOME. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
Use an in-transaction and mark the transaction type as INTEREST. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
Use an in-transaction and mark the transaction type as MINING. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
Use an in-transaction and mark the transaction type as STAKING. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
This is useful to capture situations where the protocol penalizes users (e.g. when their node is offline for too long, etc.). Use an out-transaction and mark the transaction type as STAKING. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
Use an in-transaction and mark the transaction type as WAGES. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
This applies to governance and incentive tokens (e.g. COMP) as well as other crypto rewards (e.g. credit card rewards or Coinbase rewards). Use an in-transaction and mark the transaction type as INCOME. RP2 will collect gain/loss computations for all such transactions in a tab in the tax_report_us output. Also read question on which tax forms to file and see the input files section of the documentation for format details.
DeFi opens up new scenarios that have their own tax implications. For example:
- a transaction calls a smart contract function that executes and costs some ETH or BNB;
- investment in a DEFI project where a percentage of invested tokens are "burned";
- send 100 CAKE from one BSC wallet to another then the fees are paid in BNB not CAKE.
In RP2 such native crypto costs can be captured via an OUT/FEE transaction.
Remember to use the Notes field to provide context about the nature of the transaction. See the input files section of the documentation for format details.
There is an ongoing debate on how to manage DeFi bridging from a tax perspective. I don't have a definitive answer to the question, but RP2 has expressive primitives that can be used to describe many tax scenarios in different ways. Read the the RP2 Defi Wiki, the RP2 Defi Brainstorming, and always double-check with your tax professional. If you have additional insight on this, feel free to contribute to the issue or open a new one.
There is an ongoing debate on how to manage DeFi reflexive tokens from a tax perspective. I don't have a definitive answer to the question, but RP2 has expressive primitives that can be used to describe many tax scenarios in different ways. Read the the RP2 Defi Wiki, the RP2 Defi Brainstorming, and always double-check with your tax professional. If you have additional insight on this, feel free to contribute to the issue or open a new one.
DeFi opens up new scenarios, like liquidity pools, that have their own tax implications. For example:
- lock 100 DRIP forever and then get 1 DRIP per day back for a max of 365 days;
- buy a "node" that consumes 10 STRONG, but after that the node produces 0.1 STRONG per day, forever.
There is an ongoing debate on how to capture this scenario from a tax perspective: how is the locked-forever crypto handled? Are the first yields considered "recovered" capital and the following ones staking? I don't have a definitive answer to the question, but RP2 has expressive primitives that can be used to describe many tax scenarios in different ways. Read the the RP2 Defi Wiki, the RP2 Defi Brainstorming, and always double-check with your tax professional. If you have additional insight on this, feel free to contribute to the issue or open a new one.
RP2 treats NFTs like cryptocurrencies, that is as property. Use a unique asset type for each NFT, both in the config file and in the input spreadsheet (see the input files section of the documentation for format details): e.g. ETH_BORED_APE_4363. There is debate on whether NFTs should be treated as collectibles instead, but this has not been clarified officially by the IRS yet, to the best of my knowledge. Ask a tax professional for the correct answer in any given year.
Margin trading generates normal capital gains and losses, so it can be modeled using normal RP2 primitives. For more information on this topic check https://www.cointracker.io/blog/margin or ask a tax professional.
Calling for help on this question: if you have insight on this please open an issue or a PR.