Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework evaluation export #127

Merged
merged 146 commits into from
May 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
51fca76
CHANGE save list of rows for each operation
provinzio Apr 7, 2022
a6ccf11
UPDATE misc.group_by to also accept list[str]
provinzio Apr 7, 2022
b39b77b
ADD dsum which sums decimals and returns decimal
provinzio Apr 7, 2022
abeca6a
CHANGE merge identical operations together
provinzio Apr 7, 2022
a16c6df
UPDATE book: ignore operations with change=0
provinzio Apr 7, 2022
86a1390
CHANGE match fees with buy/sell operations, remove fees from book.ope…
provinzio Apr 7, 2022
71f5c0d
FIX typo invsted
provinzio Apr 7, 2022
e872a05
FIX typo mereged
provinzio Apr 8, 2022
89f9412
UPDATE Extend information in error message when kraken internal depos…
provinzio Apr 8, 2022
d19c35e
UPDATE Make taxman helper functions static
provinzio Apr 8, 2022
581fb9f
UPDATE comment in tax evaluation
provinzio Apr 8, 2022
41c0ee3
ADD config error when country is not implemented
provinzio Apr 8, 2022
3721933
UPDATE is_fiat docstring
provinzio Apr 8, 2022
e76ffe9
RENAME TaxEvent.sell_price to sell_value
provinzio Apr 8, 2022
3aaf6f8
ADD platform to export and specify date column header
provinzio Apr 8, 2022
75f527d
CHANGE do not upper config.FIAT value in bitpanda import
provinzio Apr 8, 2022
9cc3c6c
ADD make drun. Shortcut for development (format lint run)
provinzio Apr 8, 2022
d456c50
REFACTOR BalanceQueue
provinzio Apr 8, 2022
d238d8e
MOVE taxman staticmethods outside the class, convert tax_deadline to …
provinzio Apr 8, 2022
ed8f705
fixup REFACTOR BalanceQueue
provinzio Apr 8, 2022
9bba7b9
REFACTOR rename module import transaction to tr
provinzio Apr 8, 2022
6d9d70c
CHANGE Binance operation "Launchpool Interest" to CoinLendInterest
provinzio Apr 8, 2022
484b47e
UPDATE error message when operation type was not found
provinzio Apr 8, 2022
7b8132c
ADD docstring to Staking operations
provinzio Apr 8, 2022
c7ad990
UPDATE Add warning when buffer fee is used, shouldn't happen
provinzio Apr 8, 2022
7f8fa37
FIX merge identical operations before getting prices from csv
provinzio Apr 8, 2022
539fd5b
WORK IN PROGRESS
provinzio Apr 8, 2022
7426249
ADD basic transfer matching algorithm
jhoogstraat Apr 12, 2022
2b9cabd
Cleanup
jhoogstraat Apr 13, 2022
00acedd
Include foreign fiat currencies
jhoogstraat Apr 13, 2022
e6563c2
UPDATE format
provinzio Apr 23, 2022
443b4d7
FIX Wrong variable used
provinzio Apr 23, 2022
a19e266
Merge branch 'resolve-deposits-2' into match-fees-with-operations
provinzio Apr 23, 2022
a60ac32
ADD docstring for misc.dsum
provinzio Apr 23, 2022
fd6c867
FIX misc.group_by docstring
provinzio Apr 23, 2022
b67a175
FIX misc.is_fiat docstring
provinzio Apr 23, 2022
0fbb8e3
UPDATE format
provinzio Apr 23, 2022
436a701
ADD warning when not all withdrawals could be matched
provinzio Apr 23, 2022
3e391f3
FIX matching fees looped over wrong variable
provinzio Apr 23, 2022
0eae371
ADD misc.cdecimal
provinzio Apr 24, 2022
8409bd5
ADD price_data.get_partial_cost
provinzio Apr 24, 2022
943f47b
FIX typo
provinzio Apr 24, 2022
ae80beb
ADD save withdrawn_coins in tr.Withdrawal
provinzio Apr 24, 2022
3df6700
FIX set country specific locale and local timezone
provinzio Apr 27, 2022
f8d0dbf
ADD Withdrawal.partial_withdrawn_coins assert
provinzio Apr 27, 2022
3ac4d9f
ADD new TaxReportEntry class for improved export
provinzio Apr 27, 2022
51d2c9f
CHANGE Rework tax evaluation and export
provinzio Apr 27, 2022
b46529d
RM old tr.TaxEvent class
provinzio Apr 27, 2022
5f548a1
RENAME event_type of Lending/StakingInterestReportEntry
provinzio Apr 27, 2022
d2c86fd
ADD TODO for export
provinzio Apr 27, 2022
70e8d63
ADD archive hint after evaluation
provinzio Apr 27, 2022
f937214
FIX mypy linting errors
provinzio Apr 27, 2022
20d5180
Merge remote-tracking branch 'origin/main' into rework-evaluation-export
provinzio May 4, 2022
1b8fa18
ADD docstring Taxman._evaluate_sell
provinzio May 4, 2022
67524c4
CHANGE ignore deposit/withdrawal fees and raise warning instead askin…
provinzio May 4, 2022
cacdb5c
ADD config option ALL_AIRDROPS_ARE_GIFTS to tax all airdrops as gifts
provinzio May 4, 2022
c1cfcc5
UPDATE format, style ADD helping comments
provinzio May 4, 2022
391ca22
UPDATE increase size of disclaimer in README.md
provinzio May 4, 2022
3c392bd
UPDATE README.md
provinzio May 4, 2022
dc6d174
ADD labels for tr.UnrealizedSellReportEntry
provinzio May 4, 2022
8078788
RM unrealized TODOs
provinzio May 4, 2022
0251673
UPDATE docstring of evaluate_taxation
provinzio May 4, 2022
fe63599
RM export_evaluation_as_csv
provinzio May 4, 2022
8435b0f
RM unused csv module
provinzio May 4, 2022
15ad9bb
FIX linting error
provinzio May 4, 2022
19accac
FIX __patch_002 allow time without time zone in old database
provinzio May 4, 2022
df04a95
ADD TaxReportEntry.fields helper function
provinzio May 4, 2022
a46f3bd
FIX add "utc" to all TaxReportEntry date labels
provinzio May 4, 2022
61fdf73
ADD column_num_to_string, column_string_to_num for excel column manip…
provinzio May 4, 2022
9d3af09
ADD TaxReportEntry.excel_labels helper function
provinzio May 4, 2022
2dc72bd
UPDATE evaluation export
provinzio May 4, 2022
529e126
ADD Savings as allowed account type for binance book
provinzio May 5, 2022
db732a3
FIX typo
provinzio May 5, 2022
b83b039
UPDATE move unmatched deposit warning out of the forloop for a summar…
provinzio May 5, 2022
faca8db
FIX resolve deposits : sort deposits after withdrawals
provinzio May 5, 2022
696ed83
FIX resolve deposit docstring
provinzio May 5, 2022
395bb1e
UPDATE improve comments, warning and error messages
provinzio May 5, 2022
36d4a48
FIX do not raise error when unrealized sell can not be calculated, on…
provinzio May 5, 2022
7d45520
FIX evaluate operations one by one
provinzio May 5, 2022
75a0585
FIX ignore None taxation_type in evaluation summary
provinzio May 5, 2022
d187435
FIX Withdrawal.withdrawn_coins
provinzio May 5, 2022
a3fed35
FIX TaxReportEntry.__post_init__ : check excel values and fields not …
provinzio May 5, 2022
df37ebf
FIX allow TaxReportEntry.taxable_gain to be None in case a ReportEntr…
provinzio May 5, 2022
8272587
ADD custom format for importing (#55)
provinzio May 5, 2022
e952fe2
FIX add xlsxwriter to requirements.txt
provinzio May 5, 2022
66f11a3
ADD remark from book operations to export file
provinzio May 5, 2022
5e54071
UPDATE save transaction remarks as list
provinzio May 5, 2022
d559de6
UPDATE All deposits / withdrawals are now shown in the export
provinzio May 5, 2022
235e30f
UPDATE some ReportEntry event_type names
provinzio May 5, 2022
b46752e
FIX Do not raise error when not enough home fiat in queue
provinzio May 6, 2022
f77d12d
UPDATE Respect existing xlsx and log files when finding filename for …
provinzio May 8, 2022
0769ef2
UPDATE Group portfolio at deadline depending on SINGLE or MULTI DEPOT…
provinzio May 8, 2022
7d935aa
CHANGE Export dates in LOCAL_TIMEZONE
provinzio May 8, 2022
885a2cc
RENAME additional_fee parameter to add_fee_in_fiat
provinzio May 8, 2022
9f951f5
REFACTOR Calculation of buy cost for taxation
provinzio May 8, 2022
2f5a73f
ADD link of trading pairs between buy and sell
provinzio May 8, 2022
aec4dff
FIX Buy/Sell types in fee matching interchanged
provinzio May 8, 2022
14ca913
FIX Resolve all trades (not only trades with fees)
provinzio May 8, 2022
285866e
FIX Calculate buying cost with selling value of previous trade
provinzio May 8, 2022
735359a
ADD Show buys in export file
provinzio May 8, 2022
5a86940
FIX linting error, remove unused variables
provinzio May 8, 2022
9ffbf63
Merge remote-tracking branch 'origin/main' into rework-evaluation-export
provinzio May 8, 2022
b84426d
FIX typo
provinzio May 8, 2022
5a80bc8
ADD excel autofilter to export file
provinzio May 8, 2022
c84a299
RENAME UnrealizedSellReportEntry.event_type
provinzio May 8, 2022
8361afb
FIX remove empty row from excel export summary
provinzio May 8, 2022
cd7e08c
UPDATE improve column width of exported xlsx file
provinzio May 8, 2022
4a80843
RENAME CommissionReportEntry.event_type
provinzio May 8, 2022
a3e8bba
RM deprecated TODOs and refactor remaining TODos
provinzio May 8, 2022
4d1ba6a
UPDATE resolve some unnecessary warnings
provinzio May 8, 2022
8ee480b
CHANGE remove config.FIAT from unrealized sell report entries
provinzio May 8, 2022
00e1473
CHANGE increase log level of file handler to warning
provinzio May 8, 2022
5eac93f
FIX dirty fix to determine buying cost of bought bnb from small asset…
provinzio May 8, 2022
f739ff7
CHANGE only add buys of tax year to export file
provinzio May 8, 2022
5e21a53
FORMAT export file
provinzio May 8, 2022
4c818e7
UPDATE rename report columns Werbungskosten
provinzio May 8, 2022
48a57a1
CHANGE calculate sell value from bought coins market price
provinzio May 8, 2022
96f8c7f
UPDATE gain/loss of buy/transfer sheet always positiv
provinzio May 8, 2022
72194f9
CHANGE do not output values in xlsx file when column is "-"
provinzio May 8, 2022
56edf6b
CHANGE Sort sheets of xlsx file
provinzio May 8, 2022
64593ca
RENAME CommissionReportEntry.entry_type
provinzio May 8, 2022
2041c87
RENAME tr.Sell taxation type to `Einkünfte aus privaten Veräußerungsg…
provinzio May 8, 2022
64acd14
UPDATE extend summary of export file with sell value/buy cost/...
provinzio May 8, 2022
f076d8e
FIX mypy error
provinzio May 8, 2022
4c76bbc
FIX typos
provinzio May 14, 2022
1ff4150
Merge remote-tracking branch 'origin/main' into rework-evaluation-export
provinzio May 14, 2022
93f5280
UPDATE sorting of binance operations
provinzio May 14, 2022
12afc57
RM TODO regarding increase of speculation period (#57)
provinzio May 14, 2022
c3496ff
FIX make archive: check `xlsx` files instead of `csv`
provinzio May 14, 2022
5f08e55
RM Buy from export file for now.. added TODO to add trades instead
provinzio May 14, 2022
7bcbfcf
UPDATE increase width of taxation_type column in export
provinzio May 14, 2022
6ea53af
UPDATE no fees in UnrealizedSellReportEntry, better labels; do not in…
provinzio May 14, 2022
b536e41
FIX valign in export
provinzio May 14, 2022
ce56914
ADD unrealized sell information to summary page
provinzio May 14, 2022
e46c2fb
CHANGE Add more information to general page in export
provinzio May 14, 2022
e9ac806
Merge branch '130-how-to-handle-deposits-from-unknown-sources' into r…
provinzio May 14, 2022
f42b0f9
CHANGE Remarks of deposits/withdrawals changed, when link is missing
provinzio May 14, 2022
0984393
CHANGE Adjust warning message when missing linked deposits get sold
provinzio May 14, 2022
3778a53
FIX Ignore error when not enough EUR in queue to pay fees
provinzio May 14, 2022
9b54ee2
FIX Catch error when determining sell value of unrealized sell. Only …
provinzio May 14, 2022
d5d58cd
CHANGE Ignore unrealized sell value in export when it's faulty
provinzio May 14, 2022
3d6c770
UPDATE Ignore buffer fee warning for config.FIAT
provinzio May 14, 2022
76c04b1
CHANGE Section "Taxation in Germany". updated according to new "BMF" …
provinzio May 14, 2022
3dba427
MV calculation of `is_taxable` to `_evaluate_sell`
provinzio May 14, 2022
b03af45
RM unused excel helper functions
provinzio May 14, 2022
bb2dcfe
UPDATE make sure that module `tzdata` is installed by importing it in…
provinzio May 14, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ build:
run:
python src/main.py

# Shortcut for development (developer run)
drun: format lint run

run-container:
docker run --name cointaxman -it --rm \
-v `pwd`/account_statements:/CoinTaxman/account_statements:Z \
Expand Down
109 changes: 24 additions & 85 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ CoinTaxman hilft dir dabei deine Einkünfte aus dem Krypto-Handel/-Verleih/... i
Momentan deckt der CoinTaxman nur meinen Anwendungsbereich ab.
Pull Requests und Anfragen über Issues sind gerne gesehen (siehe `Key notes for users` für weitere Informationen).

**Disclaimer: use at your own risk**
# **Disclaimer: use at your own risk**

### Currently supported countries
- Germany
Expand All @@ -23,6 +23,10 @@ Pull Requests und Anfragen über Issues sind gerne gesehen (siehe `Key notes for
- [coinbase (pro)](https://github.com/provinzio/CoinTaxman/wiki/Exchange:-coinbase)
- [Kraken](https://github.com/provinzio/CoinTaxman/wiki/Exchange:-Kraken)

It is also possible to import a custom transaction history file.
See [here](https://github.com/provinzio/CoinTaxman/wiki/Custom-import-format) for more informations.
The format is based on the awesome `bittytax_conv`-tool from [BittyTax](https://github.com/BittyTax/BittyTax).

### Requirements

- Python 3.9
Expand All @@ -32,10 +36,12 @@ Quick and easy installation can be done with `pip`.

### Usage

1. Adjust `src/config.py` to your liking
2. Add account statements from supported exchanges in `account_statements/`
1. Adjust `src/config.ini` to your liking
2. Add all your account statements in `account_statements/`
2. Run `python "src/main.py"`

If not all your exchanges are supported, you can not (directly) calculate your taxes with this tool.

Have a look at our [Wiki](https://github.com/provinzio/CoinTaxman/wiki) for more information on how to obtain the account statement for your exchange.

#### Makefile
Expand Down Expand Up @@ -80,7 +86,7 @@ Information I require are for example
Not every aspect has to be implemented directly.
We are free to start by implementing the stuff you need for your tax declaration.

I am looking forward to your [issue](https://github.com/provinzio/CoinTaxman/issues).
I am looking forward to your [issue](https://github.com/provinzio/CoinTaxman/issues) or pull request.
Your country was already requested?
Hit the thumbs up button of that issue or participate in the process.

Expand All @@ -95,7 +101,7 @@ Please provide an example account statement for the requested exchange or some o
Are you already familiar with the API of that exchange or know some other way to request historical prices for that exchange?
Share your knowledge.

I am looking forward to your [issue](https://github.com/provinzio/CoinTaxman/issues).
I am looking forward to your [issue](https://github.com/provinzio/CoinTaxman/issues) or pull request.
Your exchange was already requested?
Hit the thumbs up button of that issue or participate in the process.

Expand All @@ -106,7 +112,7 @@ Hit the thumbs up button of that issue or participate in the process.
- Add your country to the Country enum in `src/core.py`
- Extend `src/config.py` to fit your tax regulation
- Add a country specific tax evaluation function in `src/taxman.py` like `Taxman._evaluate_taxation_GERMANY`
- Depending on your specific tax regulation, you might need to add additional functionality and might want to add or edit the enums in `src/core.py`
- Depending on your specific tax regulation, you might need to add additional functionality
- Update the README with a documentation about the taxation guidelines in your country

#### Adding a new exchange
Expand All @@ -123,88 +129,21 @@ Feel free to commit details about the taxation in your country.

## Taxation in Germany

Meine Interpretation rund um die Besteuerung von Kryptowährung in Deutschland wird durch die Texte von den [Rechtsanwälten und Steuerberatern WINHELLER](https://www.winheller.com/) sehr gut artikuliert.
Meine kurzen Zusammenfassungen am Ende von jedem Abschnitt werden durch einen ausführlicheren Text von [WINHELLER](https://www.winheller.com/) ergänzt.

An dieser Stelle sei explizit erwähnt, dass dies meine Interpretation ist. Es ist weder sichergestellt, dass ich aktuell noch nach diesen praktiziere (falls ich das Repo in Zukunft nicht mehr aktiv pflege), noch ob diese Art der Versteuerung gesetzlich zulässig ist.
Meine Interpretation steht gerne zur Debatte.

### Allgemein

> Kryptowährungen sind kein gesetzliches Zahlungsmittel. Vielmehr werden sie – zumindest im Ertragsteuerrecht – als immaterielle Wirtschaftsgüter betrachtet.
>
> Wird der An- und Verkauf von Kryptowährungen als Privatperson unternommen, sind § 22 Nr. 2, § 23 Abs. 1 Nr. 2 EStG einschlägig. Es handelt sich hierbei um ein privates Veräußerungsgeschäft von „anderen Wirtschaftsgütern“. Gemäß § 23 Abs. 3 Satz 1 EStG ist der Gewinn oder Verlust der Unterschied zwischen Veräußerungspreis einerseits und den Anschaffungs- und Werbungskosten andererseits. Es muss also nur der Anschaffungspreis vom Veräußerungspreis abgezogen werden. Die Gebühren beim Handel auf den Börsen sind Werbungskosten und damit abzugsfähig.
>
> In § 23 Abs. 3 Satz 5 EStG ist zudem eine Freigrenze von 600 € vorgesehen, bis zu deren Erreichen alle privaten Veräußerungsgeschäfte des Veranlagungszeitraums steuerfrei bleiben. Wird die Grenze überschritten, muss allerdings der gesamte Betrag ab dem ersten Euro versteuert werden. Die Einkommensteuer fällt dabei nicht erst beim Umtausch von Kryptowährungen in Euro oder eine andere Fremdwährung an, sondern bereits bei einem Tausch in eine beliebige andere Kryptowährung oder auch beim Kauf von Waren oder Dienstleistungen mit einer solchen. Vergeht aber zwischen Anschaffung und Veräußerung mehr als ein Jahr (ggf. zehn Jahre nach § 23 Abs. 1 Nr. 2 Satz 4 EStG), greift die Haltefrist des § 23 Abs. 1 Nr. 2 Satz 1 EStG. In diesen Fällen ist der gesamte Veräußerungsgewinn nicht steuerbar.
>
> Zur Bestimmung der Anschaffungskosten und des Veräußerungsgewinns sowie zur Bestimmung der Einhaltung der Haltefrist wird in der Regel die sogenannte FIFO-Methode aus § 23 Abs. 1 Nr. 2 Satz 3 EStG herangezogen. Zwar schreibt das Gesetz diese First-In-First-Out-Methode nicht für Kryptowährungen vor, in der Praxis wird sie aber weitgehend angewendet. Es werden allerdings auch andere Meinungen vertreten und eine Berechnung nach der LIFO-Methode oder – zur Bestimmung der Anschaffungskosten – nach Durchschnittswerten vorgeschlagen.

[Quelle](https://www.winheller.com/bankrecht-finanzrecht/bitcointrading/bitcoinundsteuer/besteuerung-kryprowaehrungen.html)
[Wörtlich zitiert vom 14.02.2021]

Zusammenfassung in meinen Worten:
- Kryptowährung sind immaterielle Wirtschaftsgüter.
- Der Verkauf innerhalb eines Jahres gilt als privates Veräußerungsgeschäft und ist als Sonstiges Einkommen zu versteuern (Freigrenze 600 €).
- Der Tausch von Kryptowährung wird ebenfalls versteuert.
- Gebühren zum Handel sind steuerlich abzugsfähig.
- Es kann einmalig entschieden werden, ob nach FIFO oder LIFO versteuert werden soll.

Weitere Grundsätze, die oben nicht angesprochen wurden:
- Versteuerung erfolgt separat getrennt nach Depots (Wallets, Exchanges, etc.) [cryptotax](https://cryptotax.io/fifo-oder-lifo-bitcoin-gewinnermittlung/).

### Airdrops

> Im Rahmen eines Airdrops erhält der Nutzer Kryptowährungen, ohne diese angeschafft oder eine sonstige Leistung hierfür erbracht zu haben. Die Kryptowährungen werden nicht aus dem Rechtskreis eines Dritten auf den Nutzer übertragen. Vielmehr beginnen sie ihre „Existenz“ überhaupt erst in dessen Vermögen. Die Kryptowährung entsteht direkt in den Wallets der Nutzer, wobei die Wallets bestimmte Kriterien erfüllen müssen. Airdrops ähneln insofern einem Lottogewinn oder einem Zufallsfund (sog. Windfall Profits).
>
> Mangels Anschaffungsvorgangs kommt bei einer anschließenden Veräußerung eine Besteuerung nach § 23 Abs. 1 Nr. 2 Einkommensteuergesetz (EStG) nicht in Betracht. Mangels Leistungserbringung seitens des Nutzers liegen auch keine sonstigen Einkünfte i.S.d. § 22 Nr. 3 EStG vor. Damit ist der Verkauf von Airdrops steuerfrei.

[Quelle](https://www.winheller.com/bankrecht-finanzrecht/bitcointrading/bitcoinundsteuer/besteuerung-airdrops.html)
[Wörtlich zitiert vom 14.02.2021]

Zusammenfassung in meinen Worten:
- Erhalt und Verkauf von Airdrops ist steuerfrei.

### Coin Lending

> Handelt es sich bei den durch Krypto-Lending erhaltenen Zinserträgen um Einkünfte aus sonstigen Leistungen gem. § 22 Nr. 3 EStG, so gilt eine Freigrenze von 256 Euro. Beträge darüber werden mit dem perönlichen Einkommensteuersatz von 18 bis 45 % versteuert. Außerdem wäre die spätere Veräußerung gem. § 23 Abs. 1 Nr. 2 EStG der durch das Lending erlangten Kryptowährung mangels Anschaffungsvorgangs nicht steuerbar.
>
> In Deutschland ist die Besteuerung der durch das Krypto-Lending erhaltenen Zinsen jedoch nicht abschließend geklärt. Zum einem wird diskutiert, ob es sich dabei um Kapitaleinkünfte gem. § 20 Abs. 1 Nr. 7 EStG handelt, da es sich bei der Hingabe der Kryptowährung um ein klassisches, verzinsliches Darlehen handelt. Anderseits wird von Finanzämtern immer wieder angenommen, dass es sich bei den erzielten Zinserträgen durch Lending um Einkünfte aus sonstigen Leistungen gem. § 22 Nr. 3 EStG handelt.
>
> Die erhaltene Kryptowährung in Form von Zinsen ist im Zeitpunkt des Zuflusses zu bewerten. Es handele sich deshalb nicht um Kapitaleinkünfte, da die Hingabe der Kryptowährung gerade keine Hingabe von Kapital, sondern vielmehr eine Sachleistung darstelle. Begründet wird dies damit, dass sich eine Kapitalforderung auf eine Geldleistung beziehen muss, nicht aber auf eine Sachleistung, wie es bei Kryptowährungen der Fall ist.
>
> Kontrovers diskutiert wird auch, ob der Verleih einer Kryptowährung zu einer Verlängerung der Haltefrist nach § 23 Abs. 1 Nr. 2 Satz 4 EStG führt. Eine Verlängerung der Haltefrist tritt danach nur dann ein, wenn ein Wirtschaftsgut
> - nach dem 31.12.08 angeschafft wurde,
> - als Einkunftsquelle genutzt wird und
> - damit Einkünfte erzielt werden.
> Unter Nutzung als Einkunftsquelle ist zu verstehen, dass die betroffenen Wirtschaftsgüter eine eigenständige Erwerbsgrundlage bilden. Maßgeblich ist also die Frage, ob mit der Kryptowährung Einkünften erzielt werden.
>
> Beim Lending werden jedoch in der Regel keine Einkünfte aus dem Wirtschaftsgut (der Kryptowährung), sondern aus dem Verleihgeschäft erzielt (als Ertrag aus der Forderung). Weil in diesen Fällen kein Missbrauch vorliegt, kann es bei der Haltefrist von einem Jahr bleiben. Auch das Bayrische Landesamt für Steuern hat bestätigt, dass die erhaltenen Zinsen nicht Ausfluss des „anderen Wirtschaftsgutes Fremdwährungsguthaben“, sondern vielmehr Ausfluss der eigentlichen Kapitalforderungen sind.

[Quelle](https://www.winheller.com/bankrecht-finanzrecht/bitcointrading/bitcoinundsteuer/besteuerung-lending.html)
[Wörtlich zitiert vom 14.02.2021]

Zusammenfassung in meinen Worten:
- Erhaltene Kryptowährung durch Coin Lending wird im Zeitpunkt des Zuflusses als Einkunft aus sonstigen Leistungen versteuert (Freigrenze 256 €).
- Der Verkauf ist nicht steuerbar.
- Coin Lending beeinflusst nicht die Haltefrist der verliehenen Coins.

### Staking
Nach langer Unklarheit über die Besteuerung von Kryptowährung wurde am 10.05.2022 durch das Bundesministerium für Finanzen (BMF) [ein Schreiben](https://www.bundesfinanzministerium.de/Content/DE/Downloads/BMF_Schreiben/Steuerarten/Einkommensteuer/2022-05-09-einzelfragen-zur-ertragsteuerrechtlichen-behandlung-von-virtuellen-waehrungen-und-von-sonstigen-token.html) mit rechtsverbindlichen Vorgaben zur Versteuerung veröffentlicht.

> Ebenso [wie beim Coin Lending] verhält es sich bei Kryptowährungen, die für Staking oder Masternodes genutzt werden. Nutzer müssen bei proof-of-stake-basierten Kryptowährungen oder beim Betreiben von Masternodes einen bestimmten Teil ihrer Kryptowährung der Verfügungsmacht entziehen und dem Netzwerk als Sicherheit bereitstellen. Die Sicherheit des Netzwerkes wird dadurch gewährleistet, dass regelwidriges Verhalten den dem Verlust der Sicherheitsleistung (Kryptowährung) zur Folge hat. Auch in diesen Fällen werden keine Einkünfte aus dem Wirtschaftsgut selbst, sondern für das Blockieren der Verfügungsmacht, also als Ertrag aus der Forderung, erzielt. Auch hier bleibt es bei der Haltefrist von einem Jahr.
Die ursprünglich hier stehenden Vermutungen und Interpretationen meinerseits habe ich aus der aktuellen `README.md` entfernt.
Für Interessierte findet sich das in der Versionshistorie.
Dieses Tool richtet sich nach bestem Wissen nach dem BMF Schreiben.

[Quelle](https://www.winheller.com/bankrecht-finanzrecht/bitcointrading/bitcoinundsteuer/besteuerung-von-staking.html)
[Wörtlich zitiert vom 19.02.2021]
An dieser Stelle sei explizit erwähnt, dass ich trotzdem keine Haftung für die Anwendung dieses Programms übernehme.
Es ist weder sichergestellt, dass ich es aktuell noch nutze (falls ich das Repo in Zukunft nicht mehr aktiv pflege), noch ob die tatsächliche Umsetzung des Programms gesetzlich zulässig ist.
Issues und Pull Requests sind gerne gesehen.

Zusammenfassung:
- siehe Coin Lending
Weitere Besonderheiten die sich so nicht im BMF-Schreiben wiederfinden, sind im folgenden aufgelistet.

### Kommission (Referral System)

Wenn man denkt, dass man den Steuerdschungel endlich durchquert hat, kommt Binance mit seinem Referral System daher.
Über das Werbungs-System erhält man einen prozentualen Anteil an den Trading-Gebühren der Geworbenen auf sein Konto gutgeschrieben.
(lebenslang, logischerweise in BTC.)
Es ist also keine typische Kunden-werben-Kunden-Prämie sondern eher eine Kommission und damit bin ich mir unsicher, wie das einzuordnen ist.
### Binance Referral Rewards (Referral System)

Für das Erste handhabe ich es wie eine Kunden-werben-Kunden-Prämie in Form eines Sachwerts.
Sprich, die BTC werden zum Zeitpunkt des Erhalts in ihren EUR-Gegenwert umgerechnet und den Einkünften aus sonstigen Leistungen hinzugefügt.
Aufgrund eines fehlenden steuerlichen Anschaffungsvorgangs ist eine Veräußerung steuerfrei.
Bei Binance gibt es die Möglichkeit, andere Personen über einen Link zu werben.
Bei jeder Transaktion der Person erhält man einen kleinen Anteil derer Gebühren als Reward gutgeschrieben.
Die Einkünfte durch diese Rewards werden durch CoinTaxman als Einkünfte aus sonstigen Leistungen ausgewiesen und damit wie eine übliche Kunden-werben-Kunden-Prämie erfasst.
17 changes: 12 additions & 5 deletions config.ini
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,29 @@
COUNTRY = GERMANY
TAX_YEAR = 2021
# Missing prices are set as 0 in the database.
# Always refetching zeroes only slows down the evaluation, but at some time.
# It might be a good idea, to try to refetch missing prices.
# Always refetching zeroes only slows down the evaluation, but at some time,
# it might be a good idea, to try to refetch missing prices.
# If you calculated the mean before, this has no effect.
REFETCH_MISSING_PRICES = False
# If the price for a coin is missing, check if there are known prices before
# and after the specific transaction and use linear regression to estimate
# the price inbetween.
# Important: The code must be run twice for this option to take effect.
MEAN_MISSING_PRICES = False
# Calculate the (taxed) gains, if the left over coins would be sold right now.
# This will fetch the current prices and therefore slow down repetitive runs.
# Calculate the (taxed) gains, if the left over coins would be sold at taxation
# deadline (end of the year). If the evaluated TAX_YEAR is ongoing, this will
# fetch the current prices at runtime and therefore slow down repetitive runs.
CALCULATE_UNREALIZED_GAINS = True
# Evaluate taxes for each depot/platform separately. This may reduce your
# taxable gains. Make sure, that this method is accepted by your tax
# authority.
MULTI_DEPOT = True
# Set logging level
# DEBUG, INFO, WARNING, ERROR, FATAL
LOG_LEVEL = DEBUG
LOG_LEVEL = DEBUG
# Taxation of Airdrops is currently only partly implemented (#115).
# If True, all airdrops will be taxed as `Schenkung`.
# If False, all airdrops will be taxed as `Einkünfte aus sonstigen Leistungen`.
# Setting this config falsly will result in a wrong tax calculation.
# Please inform yourself and help to resolve this issue by working on/with #115.
ALL_AIRDROPS_ARE_GIFTS = True
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ python-dateutil==2.8.1
requests==2.25.1
six==1.15.0
urllib3==1.26.5
xlsxwriter==3.0.3
tzdata==2022.1
6 changes: 6 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ warn_return_any = True
show_error_codes = True
warn_unused_configs = True

[mypy-xlsxwriter]
ignore_missing_imports = True

[mypy-tzdata]
ignore_missing_imports = True

[flake8]
exclude = *py*env*/
max_line_length = 88
Expand Down
4 changes: 2 additions & 2 deletions src/archive_evaluation.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ def append_files(basedir: Path, filenames: list[str]) -> None:

# Evaluation and log file
log.debug("Archive latest evaluation and log file")
eval_regex = re.compile(str(TAX_YEAR) + r"\_rev\d{3}\.csv")
eval_regex = re.compile(str(TAX_YEAR) + r"\_rev\d{3}\.xlsx")
evaluation = max((f for f in os.listdir(EXPORT_PATH) if eval_regex.match(f)))
log_file = evaluation.removesuffix(".csv") + ".log"
log_file = evaluation.removesuffix(".xlsx") + ".log"
log.debug("Found: %s", ", ".join((evaluation, log_file)))
append_files(EXPORT_PATH, [evaluation, log_file])

Expand Down
Loading