背景
DeFi での税金の損益計算で Uniswap で交換したときのトークン価格とか知りたい...
etherscan で DeFi トランザクションを集計して税計算を行う(だいたいできた. 進捗 89%)
https://qiita.com/syoyo/items/c75bad1d98981ae6fa21
があるが, 特定のブロックのときの価格を直接取得はできないのでめんどい... もっとお手軽ぺろっとやりたい...
Moralis(archive node アクセスなど 155 万回/month まで無料) で価格の履歴(各ブロック単位)取れました.
Moralis フリー archive node アクセスサービスで QuickSwap の USDC/JPYC 流動性ペア残高の履歴を取得するメモ
https://qiita.com/syoyo/items/a81f772394bf31432856
その他, Web3 API サービスでいろいろ情報取得できます!
JPYC 価格を取得する
参考として ERC20(Eth mainnet)の JPYC 価格を取得してみます.
実際には流動性プール(exchange. e.g. Uniswap)での価格になります.
デフォルトでは Uniswap が使われました(ブロックが新しければ v3, 古ければ v2).
(Matic の場合は QuickSwap)
curl -X 'GET' \
'https://deep-index.moralis.io/api/v2/erc20/0x2370f9d504c7a6e775bf6e14b3f12846b594cd53/price?chain=eth' \
-H 'accept: application/json' \
-H 'X-API-Key: <APIKEY>'
{
"nativePrice": {
"value": "2253446224184",
"decimals": 18,
"name": "Ether",
"symbol": "ETH"
},
"usdPrice": 0.007632394984635316,
"exchangeAddress": "0x1f98431c8ad98523631ae4a59f267346ea31f984",
"exchangeName": "Uniswap v3"
}
Voila!
usdPrice
が取れました.
特定のブロックでの価格も取得してみます.
curl -X 'GET' \
'https://deep-index.moralis.io/api/v2/erc20/0x2370f9d504c7a6e775bf6e14b3f12846b594cd53/price?chain=eth&to_block=12298371' \
-H 'accept: application/json' \
-H 'X-API-Key: <APIKEY>'
{
"nativePrice": {
"value": "3793535942220",
"decimals": 18,
"name": "Ether",
"symbol": "ETH"
},
"usdPrice": 0.00890160133955811,
"exchangeAddress": "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f",
"exchangeName": "Uniswap v2"
}
Ultra super coool!
LP の時価?
LP(liquidity pair)のトークンの時価もほしいですよね.
(farming などしている場合, きちんとした DeFi 税金計算するには, 年末, 年度末時点での LP などの時価算出が必要)
残念ながら Pricing API で直には求めることができません.
reserve を調べる API ありますので, これで残高を調べ, Uniswap など流動性プールの計算式に当てはめて LP 時価を求めることになるでしょう.
Impermax など通常の(?)流動性プール以外の場合では, reserve 取得は対応してないでしょうから, 本記事最初にある別記事を参考にして自前でゴリゴリ書かないとだめそうです.
税金計算?
価格は取引所の価格ですからいくらか価格に歪みがありますので, 税金の損益計算は, ここから coingecko なり, ステーブルコインの場合は為替レートで参照価格を求めて補正することになるでしょう.
TODO
- 自身のトレードのトランザクションログと, Moralis が出した価格がマッチしているか調べる
- Liquidity-Provider fee を考慮してより正確な損益計算を行う