DeFiの📑暗号資産の確定申告まとめ.
クリプタクトにDeFi損益のためのカスタムファイルをChatGPTの助けを借りながら作成して流し込むのが落としどころか?
本当の魔界はここからだ!
基本的な手順
- transaction historyの取得.
- block exploreからcsv download
- web serviceに課金して取り込む.
- 取引ごとに利益計算
- swap
- fee
- トークンごとに集計
そもそも自分がなにをやったのか思い出す
Block Exploreには単なるtxしかない. 入出金でしかない. 取引のメモやコメントは必須.
または目的ごとにwalletを分ける.
取引記録の取得/csv Download
海外サービスに取引記録の取得やcsv出力を行うサービスがある. レポート出力のような機能もあるものの日本に対応しているかは怪しいので, 取得した情報をもとに自分でなんとかするしかないかも.
各種チェーンのBlock Exploreサービスの機能を利用.
EVM
Explores
- 🔍Etherscan: CSV Export機能をつかう.
Multichain
- Zerion: https://zerion.io/
- DeBankよりもよくきくサービス. EVMのcsvダウンロードならもっともいいのか?
- 有料で99ドルって書いてあった.
- 📱DeBank
- 22まではスクレイピングして整形が主流. 23/03くらいからcsv downloadできるようになった?!
- https://twitter.com/MMmedjedMM/status/1485373070822940673
- https://github.com/MMMedjedMM/debank-history-csv
- 課金が必要. 最低月15ドルから.
services
- 📙Koinly
- recap: https://recap.io/features/defi
- CoinLedger: ブログ記事は詳しい.
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を確認すればわかる.
そのため、それぞれのチェーンにおけるトークン量の増減によってブリッジ手数料を記録するのがよさそう.
- chainAで bridgeの管理するaccountにtransfer
- bridge contractによって lock/burn
- chainBで bridgeの管理するaccountから自分のアカウントにtransfer
帳簿をつけようとするとき、bridge accountへのtransferを増加/減少で管理したほうがいい.
- chainA->bridge account transfer(deposite) : chainAにおいて tokenA loss
- 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でカスタムファイルフォーマットに直した方が柔軟かも.
いったんcsvに吐き出さずに、モジュールとして自分のスクリプトから呼び出す方法もある.
Associated Account対応
Associated Accountを指定するには ATA addressを直接指定 + —exclude_associated flag.
refs
- 【StakeTax】ウォレットの取引履歴をCSV出力 でステーキング報酬の税金計算がラクちん!with Koinly | DeFi牧場
- StakeTaxとKoinlyでTerra/Lunaの税金を自動で計算^^
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で取得
-
getSignaturesForAddressでtxidを取得.
-
getTransactionでtxデータ取得してparse
-
MultipleTransactionの取得はRPCではできない.
-
日付指定はできないが、getSignaturesForAddressでbefore/untilをつかうことでpage取得のようなことは可能.
- before/untilはtxidであるので、この情報が必要.
- https://solana.com/ja/docs/rpc/http/getsignaturesforaddress
-
getTransactionにはunixtimeは入っている.
OSSの🔧StakeTaxはSolanaチェーン対応.
データプロバイダからSQLでクエリ
- 📈Dune: クエリResultsをAPIでダウンロード.
- 📈BigQuery Public CryptoCurrency Data:
BlockChain Explore csv Export
SolScan csv Export
🌐Solscan取引履歴のUIからのExport機能あり.
- SPL Transfers: トークン別の損益
- SOL Transfers: Solanaの手数料
- Download CSV Report - Solscan Documentation
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の税金計算が魔界そうなので週末を利用して早めに準備しておく(23/08/19)
- 💭DeFiの帳簿付けについて想定よりシンプルな気もするがその気のせいを論理的に理解できない(23/10/13)
🤔DeFiトークンは可能ならばできる限りUSDCに変換して年越しをする
DeFi資産は可能ならばできる限りUSDCに変換して年越しをする, 総平均法的にはこれがいいはず.
もちろんポジションが容易に崩せるならばの話.
✨DeFi確定申告が難しいのはそもそも前例がない場合に自分の頭で考える必要があるから
DeFi確定申告が難しいのはそもそも前例がない場合に自分の頭で考える必要があるから. そのためには税金計算の基礎的な原理原則も抑える必要がある. 税理士さんはDeFi詳しいわけではない.
ref. DeFiの税金・損益計算について|確定申告を行うために必要なこと - Aerial Partners
トランザクションが「どういった取引なのか」ということを判断し、整理・加工して損益計算に算入するという作業が発生します。この作業において、第三者(損益計算ツールや税理士)がどういった取引なのか判断することは難しく、取引を行った投資家様本人で取引内容の判断・整理・加工と管理する必要があります。
References
- 【確定申告】DeFiの税金計算が難しい理由。まず絶対やるべきことは? - YouTube
- CryptactのDeFi機能の説明. 素晴らしいツールなのだが5万円が課金できない…
- 流動性供給がやっかい, なぜならば金融庁からの指針がない. そのためこうだろうという仮説のもと機能実装…
- クリプタクトなしにDeFi計算できるのか… 半笑いで動画終了w, わたしは半泣きだよ.
- extra.33【徹底解説】暗号資産/仮想通貨の税金の基礎からDeFiやステーキングなど応用まで | ゲスト:魔界の税理士 村上ゆういち(EXODUS) - YouTube
- EXODUSがDeFi確定申告を取り上げた, 2023/10/30