[税金計算] 任意の時点でのトークンの価格を求める![DeFi]
DeFiをお触りのみなさん!あけましておめでとうございます!
去年はDeFiが流行し、あんなトークンやこんなトークンを買ったり売ったりしましたね。その利益の計算、どうします?取得時・売却時の価格は分かっていますか?coingeckoに載ってないトークンも持ってる?そりゃ大変だ。ちなみに全部自分のことです。
なので、そんな貴方のために任意の時点でのトークン(ERC-20)のだいたいの価格を求める方法のメモを残しておきます。また、利益計算すなわち税金が関わる話ですので本記事の内容は参考程度ということでお願いします。
Uniswap.info
Uniswap.infoはDeFiを触ったことがある人なら誰でも1回はアクセスしたことがあると思います。実はUniswap.infoのこのグラフ、最近ICOを行ったThe Graphのデータを用いて描画されています。(ちなみにICOでGRT買えなくて悔しかったので僕の前で二度とThe Graphの話はしないでください。)
今回はこのThe GraphのUniswapサブグラフを用いて任意の時点でのトークンの価格を求める方法を紹介します。ちなみに求めることができるのは、あるブロック時点でのUniswap v2上のトークン価格であることに注意してください。ブロックに格納されたトランザクションの順番などによってもトークンの価格は変わりますので正確な数字ではありません!
準備
ここでは、Javascriptというプログラム言語を用います。実行方法を心得ている人は各々の方法で実行してください。なんやそれ何もわからん!という人用にブラウザで簡単に実行する方法を解説します。また、WindowsのChromeでのみ動作を確認しています。
まず、お使いのブラウザで適当なページを開きます。SpotlightのトップページでOKです。そしたらキーボードのF12を1回押します。Macをお使いの方やF12を押しても何も起こらない方はページ上で右クリックして出てくるメニューで一番下にある「検証」をクリックしてください。するとブラウザの右側からにゅっと何かが出てくると思うので、上のタブからConsoleを選択してください。
以下の画像のようになればOKです。
そしたら、出てきた部分(上記画像の空白部分)を左クリックして以下のコードを貼り付けてEnterキーを押してください。
let query = `query tokenPriceByBlockNumber($blockNumber: Int!, $tokenAddress: String!) {
token(id: $tokenAddress, block: { number: $blockNumber }){
derivedETH
symbol
}
bundle(id: "1", block: { number: $blockNumber }) {
ethPrice
}
}`
let tokenPrice = (blockNumber, tokenAddress) => {
tokenAddress = tokenAddress.toLowerCase();
fetch('https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify({
query,
variables: { blockNumber, tokenAddress },
})
})
.then(response => response.json())
.then(response => {
let data = response.data;
console.log("1 " + data.token.symbol + " = " + data.bundle.ethPrice * data.token.derivedETH + " USD");
});
}
undefinedって表示されれば、準備は完了です。まだページは閉じないでくださいね。
使い方
価格を求めるためには先程コードを貼り付けた画面に
tokenPrice(ブロックナンバー、トークンのアドレス);
の形式のコードを入力すればOKです。
例えば、11560393 BlockでのWHITE(0x5F0E628B693018f639D10e4A4F59BD4d8B2B6B44)の価格を知りたければ、
tokenPrice(11560393, "0x5F0E628B693018f639D10e4A4F59BD4d8B2B6B44");
を入力してEnter!
無事、11560393 Block時点において1WHITEが1140.53788...USDだったことが分かりました!ちなみに11560393 BlockでETHをWHITEにスワップしたのは僕ではないことを先に言っておきます(笑)
また、11560393 Blockじゃなくて11539000 Blockの価格が見たいんや!って方は続けて
tokenPrice(11560393, "0x5F0E628B693018f639D10e4A4F59BD4d8B2B6B44");
と入力すればいいですし、WHITEじゃなくてCRO(0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b)の価格が見たければ
tokenPrice(11560393, "0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b");
でOK!是非、試してみてください!