背景
イーサリアムのステーキングでは課税対象となり得るETHの報酬が毎分のように発生しています。
受け取った報酬を一生売却しないのであれば、シンプルに足し算をすれば税金の計算ができます。
なんならこういったサイトで円換算の報酬履歴をワンクリックで出力できます。
ただ、少しでもETHを売却したり他の暗号資産と交換したら計算地獄が待ち受けています。
その理由が「報酬のETHを入手する度に、保有している全ETHの平均取得単価を再計算しなければいけない」という税法上のルールがあるからです。
例えば、100ETHを保有していて平均取得単価が1万円だとします。
そして1ETHあたりの価格が10万円に上昇した時に1ETHをステーキング報酬として入手したとします。
この時点で1ETH(10万円)の雑所得が課税対象となります。ここまではシンプルですよね。
仮に報酬を受け取った直後に1ETHを売却した場合、「10万円で入手したから売買益は0円か」とはなりません。今まで持っていたETHと入手したETHは区別することができないので、入手時点で平均取得単価を再計算する必要があります。
( 100 ETH x 1万円 ) + ( 1 ETH x 10万円 ) = 110 万円
110 万円 / 101 ETH ≒ 1.09 万円 / 1 ETH
つまり、報酬の1ETHを売却した時の売買益は 10万円 – 1.09 万円 = 8.91 万円です。
トータルでは、10万円 + 8.91 万円 = 18.91 万円の雑所得が課税対象になります。
※ 報酬10万円の過半数が税金で消えることに対しての憤りは話がそれるので割愛します。
もう一度言いますが、課税対象となり得るETHの報酬は毎分のように発生しています。ステーキング以外でETHを運用している人にとって、税金計算がどれだけの苦行かお分かりいただけたでしょうか。
僕の知る限り、ソロステーキングで平均取得単価を自動で再計算するツールは存在しません。
てなわけで自作することにしました。
課税タイミングを考える
前提知識として、ソロステーキングの報酬は大きく分けて2種類に分類されます。
- 常に貰える「証明報酬」:先ほど言った毎分のように発生する報酬とはこれにあたります。バリーデータ1つあたり6分に一度発生するため、複数のバリデーターを運用していれば文字通り毎分のように発生します。ただし、報酬は即使用できるわけではなく、自分の出金先アドレスに出金されるのを待つ必要があります。バリデーター1つあたり1週間に1度ほど自分のアドレスに出金されるため、複数のバリデーターを運用していれば毎日のように自分のアドレスに振り込まれます。
- ブロック生成時に貰える「ブロック生成報酬」:バリデーター1つあたり、平均して約3か月に1回ブロックを生成することができます。ブロック生成時には、ユーザーが支払った取引手数料(fee)が自分の出金先アドレスに直接入金され、ブロック生成報酬は証明報酬に合算されます。
明確なガイドラインはありませんが課税タイミングについては2通りの考え方があるといえます。
- 「報酬が発生した時点を課税タイミングとする」:証明報酬もブロック生成報酬も、出金を待たずに報酬が発生した時点を課税タイミングとします。毎分のように報酬は発生してますが、毎分計算するのは現実的ではないため日次でまとめます。
- 「自分が所有権を持っているアドレスに出金された時点を課税タイミングとする」:報酬を自分が消費できるようになった時を課税タイミングとします。証明報酬は約1週間に1度、ブロック生成したときのfeeはブロック生成時になります。
自分的に一番しっくりくるのが2番目です。現に、僕は出金が可能になるShapella(Shanghai + Capella)アップデートまでソロステーキングの報酬は確定申告していません。なぜなら、イーサリアムネットワークまたは自分に起因するミスがあった場合は出金が保証されていないからです。実現していない損益を申告するのは合理性に欠けると感じていました。出金が解禁されて報酬が自分のアドレスに送金されたら、それまで溜まっていた2年分の報酬を一気に確定申告するつもりです。
また、1番目の報酬が発生したタイミングだと、計算頻度が多すぎることに加え、マイナス損益も考慮する必要が出てきます。停電・インターネット遮断・ハードウェアの故障などの理由からバリデーターが半日以上オフラインになることは十分考えられます。僕は実際に過去2年間で数回経験しました。こういった複雑さを回避する意味でも、僕は2番目の出金された時点を課税タイミングにする方を選んでいます。
自動計算ツールの仕組み
3つのAPIを活用して、それぞれ必要な情報を取得します。
いずれも無料のAPIですが、Beaconcha.inとEtherscanはユーザー登録が必要です。
Alpha Vantageはなぜかユーザー登録不要で一応入力するメールアドレスは架空でもOKです。
- Etherscan API
- 「Withdrawals」タブに表示される取引を取得します。Partial Withdrawalによって1週間に1度ほど出金される報酬です。
- 「Produced Blocks」タブに表示される取引を取得します。MEV-Boostを使用しないでブロック生成したときのfee報酬です。
- 「Tranasctions」タブに表示される取引の内、送金を受け取った取引を取得します。MEV-Boostを使用してブロックを生成した場合のfee報酬は「Transactions」に表示されますが、他の取引と区別ができないため、区別するためにBeaconcha.inのAPIを使います。
- Beaconcha.in API
- 自分のバリデーターが生成したブロック番号を取得します。このブロック番号をもとに、Etherscanの「Transactions」から取得した取引をフィルターにかけます。
- Alpha Vantage API
- 過去のETHの円価格を取得します。無料で1年以上遡って取得できるAPIはここくらいしか見つかりませんでした。たった1回のAPIリクエストで1000日分取得できるのもよきです。
上記のデータが取得できれば後は表計算をするだけです。
自動計算ツールの使い方
GitHubのリポジトリを公開しようと思いましたが、自分のアドレス等を誤って保存してしまったためコードのみを公開します。ソロステーキングのサーバーで実行してもいいですが、CSVファイルが出力されるため普段使いのパソコンで実行した方がいいです。
- 必要なライブラリをインストールします。
pip install yaml requests pandas alpha_vantage
- 以下のような
config.yaml
を作成します。
自分のAPIキー、アドレス、バリデーター番号を入力してください。fee_recipient_address
とvalidator_index
は好きなだけ羅列してOKです。
api_key:
etherscan: "XXXXXX"
beaconchain: "XXXXXX"
alphavantage: "XXXXXX"
fee_recipient_address:
1: "0x000...000"
2: "0x000...00"
validator_index:
1: "123"
2: "234"
3: "345"
- 以下のコードをPython(.py)ファイルとして
config.yaml
と同じディレクトリに保存してください。
- 後はターミナルでPython(.py)ファイルを実行するだけです。CSVが出力されます。