DeFiの📑暗号資産の確定申告まとめ.

クリプタクトにDeFi損益のためのカスタムファイルをChatGPTの助けを借りながら作成して流し込むのが落としどころか?

本当の魔界はここからだ!

基本的な手順

  1. transaction historyの取得.
    • block exploreからcsv download
    • web serviceに課金して取り込む.
  2. 取引ごとに利益計算
    • swap
    • fee
  3. トークンごとに集計

そもそも自分がなにをやったのか思い出す

Block Exploreには単なるtxしかない. 入出金でしかない. 取引のメモやコメントは必須.

または目的ごとにwalletを分ける.

取引記録の取得/csv Download

海外サービスに取引記録の取得やcsv出力を行うサービスがある. レポート出力のような機能もあるものの日本に対応しているかは怪しいので, 取得した情報をもとに自分でなんとかするしかないかも.

各種チェーンのBlock Exploreサービスの機能を利用.

EVM

Explores

Multichain

services

Cosmos

<2025-01-21 Tue 17:51> IBC chainsの対応状況がつらい. これって自力しかないのだろうか…

損益集計

Issues

Token Symbol/decimals解決

Chainごとに異なるaddress/symbolの対応関係をどうやって統一すればいいの? decimalsも同様.

Bridge Fee

Bridge FeeはいったんBridge Accountに資産をtransferしてから、bridge accountの転送処理(lock/burn)で処理されるので、自分のtx 履歴を取得してもででこないところが厄介. Exploreを確認すればわかる.

そのため、それぞれのチェーンにおけるトークン量の増減によってブリッジ手数料を記録するのがよさそう.

  1. chainAで bridgeの管理するaccountにtransfer
  2. bridge contractによって lock/burn
  3. chainBで bridgeの管理するaccountから自分のアカウントにtransfer

帳簿をつけようとするとき、bridge accountへのtransferを増加/減少で管理したほうがいい.

  1. chainA->bridge account transfer(deposite) : chainAにおいて tokenA loss
  2. bridge account transfer(withdraw) -> chainB :chainBにおいて tokenA bonus

同一トークンの増減の差分がブリッジ手数料となる.


<2025-01-31 Fri 10:03> マニュアルの場合はdefifeeの記入方式のほうが楽.

価格不明対応

ExploreをみるとUSD価格は書いてあるが記帳にはrateが必要.

https://support.koinly.io/en/articles/9490067-market-prices-for-xyz-are-missing

🔧StakeTax

COSMOS/Solana系に対応したOSSツール


  • 一回のexportでは5000 txまで.
  • exportには時間がかかる. exportを開始すると7days有効なjobへのリンクが生成されるので気長に待つ.

staketaxcli(dev)

Python製CLIツール.

https://github.com/hodgerpodger/staketaxcsv

python3.9が必要. CLIの実行では環境変数の設定必要(REAMDEにかいてない!)

PYTHONPATH:/path/to/staketaxcsv/src” PYTHONPATH /path/to/staketaxcsv/src

内部動作しては,

  • txidのリストを生成.
  • RPC APIを一つずつ叩いて取得.
  • Pandasをつかってcsv出力.

  • OSSはすごい!
  • <2023-10-12 Thu 16:09> ウゴカない…
  • <2023-10-13 Fri 16:36>
    • コード修正したけどだめだこりゃだった. もういいや.
    • 便利そうだがそこそこの改造が必要に見えた. もしくは待ってたら修正されるかも.
  • <2025-01-23 Thu 13:37> 動いた. RPCは自分のものを指定する.

envs

node rpc/lcd urlは環境変数で指定できる. set -x STAKETAX_SOL_NODE hogehoge

https://github.com/hodgerpodger/staketaxcsv/blob/main/src/staketaxcsv/settings_csv.py

Chains

Solana

https://docs.stake.tax/tokens/sol

accociated accountごとにtxを発行するので、不要なATAは可能な限りcloseしておいたほうがいい.

  • Solana Token update

    Jupiter Token listを取得. fetchするのはstrict.

    python staketaxcsv/sol/tickers/gather/jupiter.py

  • Unable to fetch txid, Probably old transaction where api fails

    WARNING:root:Unable to fetch txid=xxxxxxxxxxxxxxxxxx. Probably old transaction where api fails.

    mainnetのtimeoutが原因なので、自分のRPC Nodeを設定.

    $ export STAKETAX_SOL_NODE=https://<somename>.solana-mainnet.quiknode.pro/<somekey>/
    $ set -x STAKETAX_SOL_NODE https://<somename>.solana-mainnet.quiknode.pro/<somekey>/

    ref. https://github.com/hodgerpodger/staketaxcsv/issues/348


    <2025-02-02 Sun 18:40> mainnetに0.6secくらいでfetchしてることが原因. 5secくらいのインターバルをおくとエラーはしない. またはquicknodeとか別RPCnodeをつかう. しかしなぜwebサービスversionはエラーしないんだろう.

  • start_date/end_dateで遡れるtxはlatestから200000個

    getSignatureForAddressで過去のtxidを先頭から調べていくロジック. 200 query x 1000で処理が終わる.

Cosmos系(ibc chains)

Cosmos+でリストされてないチェーンの取得は運がよければできる(experimental).

https://docs.stake.tax/tokens/cosmos+


そうでなければ自分で改造.

https://docs.stake.tax/devs/adding-csv-in-cosmos-based-ecosystem

案外簡単にできる?! https://github.com/hodgerpodger/staketaxcsv/commit/ff8af30b85ea4416504d043723e91f3edf5c7ee1, このdiffに倣う -> 少し古いdiffなのであまり参考にならない.

CSV Formats

default

https://docs.stake.tax/export-csv-formats/default-stake.tax-csv timestamp,tx_type,received_amount,received_currency,sent_amount,sent_currency,fee,fee_currency,comment,txid,url,exchange,wallet_address

カスタムフォーマット

クリプタクトこれで対応できる?

https://docs.stake.tax/devs/add-new-csv-format-example https://github.com/hodgerpodger/staketaxcsv/commit/105b9e50dc08349dc750fd2e3f99298c369b543e

address->tickersのresolveも必要. solanaだとJupiterからTokenListをfetch.

Excludes

  • Spam Transfer tx
  • Error Tx除外: —exclude_failed

cache

—db_cache, デバッグ用にデータをキャッシュしておく.

Token Symbol解決

Chainごとに異なるaddress/symbolの対応関係をどうやって統一すればいいの?

クリプタクト対応

<2025-01-23 Thu 17:06> 生成AIの力で1時間ちょっとでカスタムフォーマット吐き出しはできたものの、アドレス->シンボルの解決ができない. base/counterはアドレスのまま出力. もしかしたら、staketaxcsvはdefault csvとして扱い、それをPython Scriptでカスタムファイルフォーマットに直した方が柔軟かも.

https://github.com/hodgerpodger/staketaxcsv/blob/main/README_reference.md#usage-as-staketaxcsv-module

いったんcsvに吐き出さずに、モジュールとして自分のスクリプトから呼び出す方法もある.

Associated Account対応

Associated Accountを指定するには ATA addressを直接指定 + —exclude_associated flag.

refs

Enlightens

🔦DeFi確定申告には四つの地獄がある

DeFi等の確定申告には四つの地獄がある。

  • 第一の地獄:マイナー通貨の単価を全部個別に調べる、NFT取引は全て記録を書き直す地獄
  • 第二の地獄:ポジション不足の経緯が分からない地獄
  • 第三の地獄:頑張っても頑張っても、結局、懐が痛むだけ地獄
  • 第四の地獄:確定申告計算中に、仮想通貨が暴落する地獄

これらの地獄が起こることを、あらかじめ想定した上で、戦いに望むべきなのだ。

ref. DeFi/NFT取引→クリプタクト 確定申告の留意点(備忘録) | Guko | Spotlight

www

🔦「絶対に」年末時点の保有残高(仮想通貨別)を記録しておく

「絶対に」年末時点の保有残高(仮想通貨別)を記録しておく。忘れるとあとで取り返しがつかないため重要。結果を突合させるため。仮に合わなければReduce等の調整ができる。

✅Atomic Arb記帳

たとえばSOLを基軸にした🤖Atomic Arbitrage.

1.) JPYをSolanaチェーンにいれる

  • JPYをつかってSOLの取得(buy)をする際には課税されない.

2.) SOLを基軸にしたSwapの収益に対する課税(SOL/JPY)

  • SOLの増加に対するSOL/JPYのレートで取得価格を計算.
  • これはswapの都度に計算が必要.

3.) SOLの売却(sell)してJPYを取得する SOL/JPYの課税

  • 売却時が課税対象になるので取得時との増減を比較.
  • ポジション損益もここで計算される.

正解はないのでとりあえずいろいろ検討したことを書いていく.

  • <2023-10-13 Fri 11:01>
    • 基本的な考え方は海外CEXにおけるアービトラージと同じか.
  • 💭Solana Atomic Arbの損益計算と帳簿付けがめんどくさすぎる問題(23/10/12)
    • Staketaxは動かないのでとりあえずSolscanでcsvを全部落としてpythonで集計.
  • <2023-10-09 Mon 12:50> 方針のupdate.
    • StakeTaxを利用して定期的にSolana Txをcsv export.
    • csv exportから週次や月次の損益を計算.
    • 確定申告で1年分をまとめてクリプタクトに手動入力.
  • <2023-10-01 Sun 16:30>
    • transactionsが多すぎるので外部サービスをつかうことが絶望的. なので自前の計算が必要そう.
    • csvを扱うにも膨大な量になりそうな予感はする. まだなんともいえない.
    • Cyclic Arbitrageはtxが通った場合のトークンの利益に対してJPYのrateをかける.
      • クリプタクトならばリアルタイムなSOL/JPYやUSDC/JPYで計算するだろうがどうしようか.
    • それでもStakeTaxは無料で使えてデータはおとせそうなきがするのでこれをとりあえず毎週動かすか?
      • これでSolanaチェーンについてはデータが手に入る.
    • Solscanでもcsv exportはできる. これでもいいかも.
    • ETHについてはまだ7取引しかしてないので手動でもいいしKoinlyでも行けそうな予感.

jito send bundle

Recieved_amoutにarbの利益、send_amountにjitoへのtipが入る.

📙Cross-Chain Arb記帳

  • <2025-01-29 Wed 11:11> 1週間かけて試行錯誤した結果、うまい自動化の正解はない.
    • 自動化/ツール/生成AIを活用しつつ、手動でカスタムファイルを地道に作成するのがよさそう.
    • 完全な自動化は無理そう. クリプタクトに取り込むときの価格わからない問題.
  • <2025-01-30 Thu 17:50> とりあえず取引履歴が少ないならばcsv downloadで手動記入が一番筋がいいという結論になった.

DeFi取引履歴のAggregateはCryptactをメインでdune/staketakからのカスタムファイル作成

Koinlyは便利だが移動平均法なので、csv downloadして結局はクリプタクトで再計算が必要.総平均法から移動平均法への申請はコインごとの申請を3/15までなので先の見えないため現実的ではない.

するとクリプタクトに課金してつつ足りない部分をDune/Staketaxを活用しながらカスタムファイル作成が現実的.

クリプタクトは対応状況がKoinlyと比べると圧倒的に弱い+クロスチェーンはニッチを狙うので、結局カスタムファイル作成になりそうな予感. 生成AIの登場によって数年前と比べてカスタムファイルの作成の障壁は圧倒的に下がったはず.

<2025-01-23 Thu 11:04>

Bridge feeの扱い

  • 転送手数料として記載
    • bridge feeは回収アカウントがあるので、転送元/転送先の検索でみつかる.
  • 各チェーンごとのamountの増減の記入で相対的に記載.
    • 大抵Exploreで現在価格を調べるときはUSDでかかれている.

クリプタクト取り込み研究

  • Solana Swap: USDC->MOOBS
  • Bridge MOOBS: Solana->Oraichain
  • Swap Oraichain: MOOBS->ORAI
  • Bridge ORAI: Oraichain->Solana
  • Swap Solana: ORAI->USDC

  • MOOBSは未対応コインなので USER-MOOBSのように記入. 必ずBaseに記入.
  • Bridge Feeは SENDFEE/DEFIFEEどちらでもいい. 結局DEFIFEEにしても、FeeCcyをUSDCにするとポジションの減少のみの処理になり、結果は同じになる.
  • MOOBS->ORAIのswapはMOOBSのポジションが0に近くなると、無視される仕様.
    • この少額誤差調整を発動させるためにも、FEEの記入によってポジション減少が必要.
    • 少額誤差調整(MOOBSのクローズで発生): 取引前ポジション(=1093683.002647)以上の取引数量(=1093683.003、取引手数料を含む)を検知しました。取引後、ポジションがゼロになるように数量及び取引手数料を調整しました。
  • 確実に MOOBS/ORAIのポジションが0に近くなるように記入する. すると差分はUSDCの増加となり、正確な計算となる.

DEFIFEEパターン

Timestamp,Action,Source,Base,Volume,Price,Counter,Fee,FeeCcy,Comment
2025-01-21 08:25:01,BUY,solana,USER-MOOBS,1112205.018443,0.00008991148065488158,USDC,0.000505,SOL,USDC -> MOOBS swap on Solana
2025-01-21 08:25:01,DEFIFEE,solana,USER-MOOBS,18522.015796,0.00008991148065488158,USDC,0,JPY,Bridge fee
2025-01-21 08:26:02,SELL,oraichain,USER-MOOBS,1093683.003,0.0000129946245493585,ORAI,0,JPY,MOOBS -> ORAI swap on Oraichain
2025-01-21 08:27:19,DEFIFEE,solana,ORAI,0.258789,0.1381998551,USDC,0,JPY,Bridge fee
2025-01-21 08:27:19,BUY,solana,USDC,100.964006,0.1381998551,ORAI,0.0004166,SOL,ORAI->USDC swap on Solana

SENDFEEパターン

Timestamp,Action,Source,Base,Volume,Price,Counter,Fee,FeeCcy,Comment
2025-01-21 08:25:01,BUY,solana,USER-MOOBS,1112205.018443,0.00008991148065488158,USDC,0.000505,SOL,USDC -> MOOBS swap on Solana
2025-01-21 08:25:01,SENDFEE,solana,USER-MOOBS,18522.015796,,JPY,0,JPY,Bridge fee
2025-01-21 08:26:02,SELL,oraichain,USER-MOOBS,1093683.003,0.0000129946245493585,ORAI,0,JPY,MOOBS -> ORAI swap on Oraichain
2025-01-21 08:27:19,SENDFEE,solana,ORAI,0.000365,0,JPY,0,JPY,Bridge fee
2025-01-21 08:27:19,BUY,solana,USDC,100.964006,0.1381998551,ORAI,0.0004166,SOL,ORAI->USDC swap on Solana

チェーンそれぞれでBONUS/LOSSでブリッジ手数料調整

  • bridge手数料の算出をしなくていい.
  • BONUS/LOSSの価格は開始と終わりでUSDCでswapした時の価格.
    • 短時間が前提
    • USDCが起点を前提
  • BONUS/LOSSの決済通貨はUSD. USDC-USDを前提.

Timestamp,Action,Source,Base,Volume,Price,Counter,Fee,FeeCcy,Comment 2025-01-23 02:43:17,SELL,solana,TRUMP,7.777075,37.73691780007265,USDC,0.000054823,SOL,jupiter_aggregator_v6 2025-01-23 02:41:39,BONUS,solana,TRUMP,7.777075,37.73691780007265,USD,0,JPY, 2025-01-23 02:41:33,LOSS,orai,TRUMP,7.882949,37.73691780007265,USD,0.000393000,ORAI,Transfer to 2025-01-23 02:41:04,SELL,orai,SOL,1.20173922,7.882949,TRUMP,0.013835,ORAI,OraiDEX Swap 2025-01-23 02:39:51,BONUS,orai,SOL,1.20173922,247.14265321250843,USD,0,JPY,Bridge deposit from 2025-01-23 02:39:48,LOSS,solana,SOL,1.213878,247.14265321250843,USD,0,JPY, 2025-01-23 02:36:39,BUY,solana,SOL,1.213873834,247.14265321250843,USDC,0.000005000,SOL,jupiter_aggregator_v6

未対応コイン同士のトークンswap対応

未対応コインは主軸通貨に記入、自分で価格を調査という2つの制約がある.

USDCを基軸にするとき未対応-USDCの価格はわかっているので、相対的に算出するしかない?

📑Solana トレード損益計算

Step Financeのtransaction history, https://app.step.finance/en/history

損益サービスを利用

RPC Methodで取得

  1. getSignaturesForAddressでtxidを取得.

  2. getTransactionでtxデータ取得してparse

  3. MultipleTransactionの取得はRPCではできない.

  4. 日付指定はできないが、getSignaturesForAddressでbefore/untilをつかうことでpage取得のようなことは可能.

  5. getTransactionにはunixtimeは入っている.

OSSの🔧StakeTaxはSolanaチェーン対応.

データプロバイダからSQLでクエリ

BlockChain Explore csv Export

SolScan csv Export

🌐Solscan取引履歴のUIからのExport機能あり.

API機能はadminに連絡して課金しないとできない. Solscan API Pro Features.


  • 一回のDownloadは5000件まで.
  • To: dateは指定した日付の前日23:59まで.
  • SOL TransfersとSPL Transfersは2度にわけたほうが出力がみやすい.
  • <2023-11-26 Sun> DDoS攻撃の影響かcsv Downloadを実行するとBlockされた.

Insights

🤔DeFiトークンは可能ならばできる限りUSDCに変換して年越しをする

DeFi資産は可能ならばできる限りUSDCに変換して年越しをする, 総平均法的にはこれがいいはず.

もちろんポジションが容易に崩せるならばの話.

✨DeFi確定申告が難しいのはそもそも前例がない場合に自分の頭で考える必要があるから

DeFi確定申告が難しいのはそもそも前例がない場合に自分の頭で考える必要があるから. そのためには税金計算の基礎的な原理原則も抑える必要がある. 税理士さんはDeFi詳しいわけではない.

ref. DeFiの税金・損益計算について|確定申告を行うために必要なこと - Aerial Partners

トランザクションが「どういった取引なのか」ということを判断し、整理・加工して損益計算に算入するという作業が発生します。この作業において、第三者(損益計算ツールや税理士)がどういった取引なのか判断することは難しく、取引を行った投資家様本人で取引内容の判断・整理・加工と管理する必要があります。

References