ERC-20のapproveを解除する 〜意図しないapproveから資産を守る 〜
ERC-20を始めとするイーサリアム上のトークンをスマートコントラクトへで利用する場合、明示的に譲渡の委任(approve)が必要です。(approveについては、記事最後にあるリンクを参照してください)
現在、少なくないプロダクトでは、UXの都合上、ユーザーが望んだ以上のトークンの委任をスマートコントラクトに許可している場合があります。もし、許可してしまったスマートコントラクトに悪意があった場合?悪意がなくとも、バグや脆弱性があった場合?使わなくなったプロダクトからは委任を取り消したいところですが、そのプロダクトがそのUIを用意してくれているとは限りません。
本記事では、ERC-20であるWrapped ETH(WETH)を例に、approveの取り消し方を紹介します。Wrapped ETHは、ETHと1:1で常に交換可能なERC-20トークンです。ETHの価値を保ったままERC-20の機能を持たせているため広く使われています。
委任を取り消したいアカウントを調べる
approveを実行したプロダクトに、approveの取り消しがない以上、スマートコントラクトを直接実行することが唯一の方法です。幸いWETHはEtherscanにてソースコードが公開されているため、処理を直接実行できます。
まずはapproveしたコントラクトアドレスを調べます。
「Transactions」タブの「From」でフィルターを使い自分のアドレスがWETHコントラクトに大して実行したトランザクション一覧を確認します。
次に、approveをしたトランザクションに当たりをつける必要があります。日付に覚えがあれば「Age」の値が参考になるでしょう。また。「Value」の値が0でないものはdeposit(ETHからWETHへの変換)トランザクションです。0のものはapproveもしくはwithdraw(WETHからETHへの変換)なので、0のものから選んでトランザクション詳細ページへ進みましょう。
トランザクション詳細ページに進んだら「Logs」タブを開きます。ここで「Topics 1」が、「委任するアカウント」つまり自分のアドレスであるはずです。また、「Topics 2」が「委任されたアカウント」つまり、本記事に置いて「委任を解除したい対象アカウント」です。ちなみに「Data」の部分に115792...という数字が並んでいますが、これは2の256乗から1を引いた数で、イーサリアムで扱える整数の最大値を表しています。この画像において、「アカウント0xd868...は0xe5c7...へ事実上制限のないWETHの委任をしている」ということがわかります。
さて、ここまでで委任を解除したいアドレスがわかりました。
現状のapproveの値を確認する
ERC-20では、approveしたあとに委任されたアカウントを譲渡を行うたびにapproveの値(allowanceと呼ぶ)の値を減少させます。したがってapprove時の値から変わっていることがありますが、現状を正しく把握しましょう。
「Contract」タブから「Read Contract」を選び、コントラクト情報の読み出しページを開きます。
「6. allowance」が値確認のフォームです。「1つ目の<input>」に自分のアドレス、「2つ目の<input>」に先程調べた解除したいアドレスを入力します。画像では、未だ膨大な数のallowanceが残っていることがわかります。
委任を解除する
approveの値を解除するため、トランザクションを作成していきます。
「Contract」タブから「Write Contract」を選び、コントラクト情報の書き込みページを開きます。
まず最初にWalletに接続する必要があるため、「Connect to Web3」を選択し、MetaMaskなど委任したアカウントを管理しているWalletを選択し、接続してください。正常に接続されると、自分のアドレスが表示されるようになります。
「1. approve」がapproveのフォームです。ここの「guy」に解除したいアドレス、「wad」に0を入力し、「Write」でトランザクションを作成します。
トランザクションが通ったら再度、「Read Contract」へ戻り、allowanceの値を確認してみましょう。
値が0になっていれば、無事approveの解除が成功です。おめでとうございます!
さいごに
本記事では、主に悪意のあるコントラクトにapproveしてしまったケースで紹介しましたが、コントラクトからトークンを利用する際にapproveを避けられるものでありません。(approve問題として最後のリンクで解説しています)
ブロックチェーンのプロダクトは、自己責任を原則として進化していきます。過渡期である以上、自分の資産は自分で守れるよう自衛していくしかありません。
また、正しく使えばapproveは非常に有用な機能です。例えば、自分のハードウェアウォレットなどに全額approveしておくことで、普段使いのホットウォレットの紛失時に、バックアップとして全額引き出すことができます。
プロダクトのサイトで言われるままapproveするだけでなく、Etherscanなどプロダクト外部のサイトで自分の資産を管理できる一助となれば幸いです。
本記事は、Twitter上の 「 #教えてBCG 」というハッシュタグ企画に投稿された質問への回答として作成しました。本記事のようにユーザーの疑問を少しでも解消し、ブロックチェーン全体のUXの改善を目指しておりますので、お気軽に質問ください!
合わせてapproveについての解説記事も参考ください!
投げトークンの送り先はこちら。 rmanzoku.eth (0xd868711BD9a2C6F1548F5f4737f71DA67d821090)