![見出し画像](https://assets.st-note.com/production/uploads/images/115444616/rectangle_large_type_2_16af6fae0b1a2a006f9bc45f18b10ee2.png?width=1200)
【完全保存版】ERC6551のトークンバウンドアカウントを作ってみよう!
0 はじめに
今回はERC6551のコントラクトを実際に作ってみましょう。
こちらのYouTubeを元に作っています。
1 準備を行おう
まずは、Remixを立ち上げ、Git Cloneを行います。
下の、「Clone」を選択します。
![](https://assets.st-note.com/img/1693947510336-C3AxU3zWho.png?width=1200)
こちらのGithubを用います。
こちらをコピーします。
![](https://assets.st-note.com/img/1693947548166-Nm7tofwJLo.png?width=1200)
貼り付けて、「OK」
![](https://assets.st-note.com/img/1693947584205-DPx0gsSIdY.png?width=1200)
2 NFTのコントラクトの作成
「contracts」フォルダの「MyNFT.sol」を開きます。
こちらは、普通のERC721のコントラクトです
![](https://assets.st-note.com/img/1693947623066-vwhxso6APZ.png?width=1200)
「COMPILER」を「0.8.19」に変更した上で、下のように、コンパイルを行います。
![](https://assets.st-note.com/img/1693947736432-AeshMa1uQv.png?width=1200)
翻訳者注
時間を置いて試したところ、うまくいかず、「0.8.20」にすることでうまく行きました。
また、Ownableに初期設定が必要になっていたので、下のように追記しました。
constructor() ERC721("myNFT", "NFT") Ownable(msg.sender) {}
![](https://assets.st-note.com/img/1697503950546-pfIXVazHBp.png?width=1200)
その上で、デプロイを行います。
![](https://assets.st-note.com/img/1693948590762-b5QMPqQK9X.png?width=1200)
下のようにデプロイが完了しました。
![](https://assets.st-note.com/img/1693947790713-o7qecxN5bX.png?width=1200)
状況としては、このようになりました。
![](https://assets.st-note.com/img/1693952388791-wRW8IGPokt.png?width=1200)
3 NFTのミントの実施
次に、このコントラクトから、NFTを作成します。
「ACCOUNT」から「0xAb…b2」を選び、下のようにコピーします。
このアカウントにNFTをミントしようと思います。
![](https://assets.st-note.com/img/1693947910736-1gu9qNK2ET.png?width=1200)
では、コピーが終わりましたら、アカウントは下のように元に戻します。
![](https://assets.st-note.com/img/1693947942076-VMcgmp3QUI.png?width=1200)
下のように、「safeMint」の右のボタンを押します。
![](https://assets.st-note.com/img/1693947976414-BFLkvKh9wa.png?width=1200)
先ほどコピーしたアカウントと「tokenId」を入力し、「transact」
これで「tokenID」が1のNFTがミントできました。
![](https://assets.st-note.com/img/1693948014534-sAbhVoFrhR.png?width=1200)
念の為、「ownerOf」で確認すると、このように所有者のアカウントを表示しました。
![](https://assets.st-note.com/img/1693948073592-dPGw320zAN.png?width=1200)
つまり、状況はこのようになりました。
![](https://assets.st-note.com/img/1693952525397-ROsSDgWo4Q.png?width=1200)
4 Registoryコントラクトの作成
次に、「ERC6551Registory.sol」を開きます。
これは、トークンバウンドアカウントを作るためのコントラクトです。
![](https://assets.st-note.com/img/1693948115210-L0vnnV4sQt.png?width=1200)
下のように、コンパイルを行います。
![](https://assets.st-note.com/img/1693948158823-8vhMDdw2mN.png?width=1200)
そして、下のように、デプロイを行います。
![](https://assets.st-note.com/img/1693948651192-pLoTEWkiNv.png?width=1200)
これで、コントラクトができました。
![](https://assets.st-note.com/img/1693948369513-5F120bfoui.png?width=1200)
状況は、このようになりました。
![](https://assets.st-note.com/img/1693952568876-hrNeV9xfxs.png?width=1200)
5 実装コントラクトの作成
次に、「ERC6551Account.sol」を開きます。
これは、トークンバウンドアカウントのロジック部分のコントラクトです。
![](https://assets.st-note.com/img/1693948422692-Mm4kgfNNJV.png?width=1200)
下のように、コンパイルを行います。
![](https://assets.st-note.com/img/1693948479202-bYrgKTZ1Kz.png?width=1200)
その上で、デプロイを行います。
![](https://assets.st-note.com/img/1693948535331-uit6vabVut.png?width=1200)
下のように、コントラクトができました。
![](https://assets.st-note.com/img/1693948740314-HSDO56avuq.png?width=1200)
状況は、下のようになりました。
![](https://assets.st-note.com/img/1693952636116-X0ojuWg2GC.png?width=1200)
6 トークンバウンドアカウントの確認
次に、「ERC6551Registory」コントラクトから作られるトークンバウンドアカウントを確認します。
まずは作成されるコントラクトアドレスを確認します。
下のように、「account」を開きます。
![](https://assets.st-note.com/img/1693948806148-R3OTiXu9Ae.png?width=1200)
下のように設定して、「call」
なお、「salt」は任意の数値です。
「implementation」が実装コントラクトであり、「tokenContract」がNFTのコントラクトです。
![](https://assets.st-note.com/img/1693948949367-nZf5TqcT9U.png?width=1200)
すると、下のように、「0xe1…c1」というアドレスが使用されることがわかりました。
![](https://assets.st-note.com/img/1693949010517-G3hEAlkVwY.png?width=1200)
7 トークンバウンドアカウントの作成
では、実際に作ってみましょう。
「createAccount」に同じ値を入れて、「transact」
なお、「initData(初期値)」は空である[]を入力します。
![](https://assets.st-note.com/img/1693949077724-9RVSyHGvak.png?width=1200)
つまり、このようになりました。
![](https://assets.st-note.com/img/1693952807418-JRo8T3zdAx.png?width=1200)
下のように完了したようです。
![](https://assets.st-note.com/img/1693949124563-ugyE4VuJOh.png?width=1200)
アドレスを確認すると、先ほど事前に確認したアドレスと同一であることも確認できました。
![](https://assets.st-note.com/img/1693949180723-7F9Pl3EoS5.png?width=1200)
つまり、状況はこのようになりました。
注
何となく、コントラクトは□で作っていましたがトークンバウンドアカウントを○で作ってしまったのは、ミスです。以後同じです。
![](https://assets.st-note.com/img/1693952860497-YdxEwvl4ay.png?width=1200)
8 トークンバウンドアカウントの操作
では、このできたトークンバウンドアカウントを操作してみましょう。
下のように、できたアドレスを入れて、「At Address」
![](https://assets.st-note.com/img/1693949240483-ZDaStgGpf1.png?width=1200)
すると、下のように表示されました。
![](https://assets.st-note.com/img/1693950122583-dG55vT40Gi.png?width=1200)
所有者や、トークン情報を確認すると、下のように表示されました。
![](https://assets.st-note.com/img/1693950221471-rscRx64FPi.png?width=1200)
この辺りの情報を表しています。
![](https://assets.st-note.com/img/1693952956332-Oyb5IpNH8W.png?width=1200)
では、このトークンバウンドアカウントから、任意のアドレスにETHを送付してみたいと思います。
任意のアカウントを選び、コピーします。
![](https://assets.st-note.com/img/1693950314885-WtC2W0derR.png?width=1200)
コピーが終わったら、トークンバウンドアカウントが紐づいている、NFTの所有者のアカウントに設定します。
![](https://assets.st-note.com/img/1693950445145-G8sZ2fpGUl.png?width=1200)
現在、トークンバウンドアカウントはETHを持っていません。
そのため、まずは5ETHを送ろうと思います。
![](https://assets.st-note.com/img/1693950552898-wnLotlUPP8.png?width=1200)
下のような状況です。
![](https://assets.st-note.com/img/1693953152670-8CnKagp0DA.png?width=1200)
その上で、「executeCall」でETHを別のアカウントに送付しようと思います。
![](https://assets.st-note.com/img/1693950502838-qVzyWp4UWo.png?width=1200)
下のように、送付先と、送る量(2ETH)を設定し、「transact」
なお、「value」は「wei」という最小単位で表されるため、2ETHを送りたいときは、2に10の18乗をかけた値を設定します。
![](https://assets.st-note.com/img/1693950595135-BmXoZzfaNG.png?width=1200)
このようになりました。
![](https://assets.st-note.com/img/1693953250912-vpogNOEIgr.png?width=1200)
下のように、トークンバウンドアカウントの残高は3ETHとなり、うまく送れたようです。
![](https://assets.st-note.com/img/1693950631041-ri8KnBJtRW.png?width=1200)
送付先のアカウントを確認すると、送られた分が増えていることが確認できました。
![](https://assets.st-note.com/img/1693950653125-YXf8cmVvAH.png?width=1200)
では、今度は、所有者からは特にETHを送らずに、トークンバウンドアカウントから送付してみましょう。
下のように、「VALUE」は0に設定します。
![](https://assets.st-note.com/img/1693950678618-rHBJ2ylNhA.png?width=1200)
下のように、設定し、「transact」
![](https://assets.st-note.com/img/1693950711301-egvAURyiO1.png?width=1200)
すると、下のように、うまく送れたことが確認できました。
![](https://assets.st-note.com/img/1693950731595-ExBxMkkguv.png?width=1200)
このようになりました。
![](https://assets.st-note.com/img/1693953299679-p2WanWl5ZD.png?width=1200)
9 NFTの所有者以外からの操作(エラーの確認)
最後に、NFTの所有者でないアカウントから送ろうとしてみましょう。
これは、エラーになることを想定しています。
![](https://assets.st-note.com/img/1693950761115-z4ajKLdPb7.png?width=1200)
「0.5ETH」を設定して、「transact」
![](https://assets.st-note.com/img/1693950791881-dfQo0DAbLL.png?width=1200)
結果は、想定通り、エラーとなりました。
![](https://assets.st-note.com/img/1693950814852-O6SRfIJrY5.png?width=1200)
では、念の為、NFTの所有者に変更して、実施してみます。
![](https://assets.st-note.com/img/1693950835787-WC43C8GirO.png?width=1200)
「transact」を実行します。
![](https://assets.st-note.com/img/1693950874602-hRKHAHzOpa.png?width=1200)
すると、下のようにうまくいったことが確認できました。
![](https://assets.st-note.com/img/1693950904081-ZFy6cvGrjL.png?width=1200)
今回は以上です。
いいなと思ったら応援しよう!
![ユウキ](https://assets.st-note.com/production/uploads/images/52347520/profile_e7d36b385c74618d7fec56da47f68a35.jpeg?width=600&crop=1:1,smart)