【完全保存版】BiconomyでAccountA bstractionを実行しよう
0 はじめに
今回は、「Biconomy」の紹介をします。
ここでは、コントラクトアカウントを作成し、そのアカウントからトークンを送付しています。
なお、今回の内容は、こちらの公式のチュートリアルを元にしています。
1 準備を行う
まずは、git cloneで取ってきます。
git clone https://github.com/ytakahashi2020/biconomy_tutorial.git
下のようになりました。
次に、できたフォルダに行き、依存関係をインストールします。
cd biconomy_tutorial
yarn install
次に、「.env.example」ファイルをコピーして、「.env」ファイルを作ります。
そして、ご自身の秘密鍵を入れます。
初めてやるときは、テスト用のアカウントが良いと思います。
秘密鍵を入れた、アカウントには、あらかじめテストトークンを入れておきます。
やり方については、この辺りをご参照ください。
2 実行してみよう
では、「yarn dev」で実行してみましょう。
下のように、コントラクトアカウントを取得しました。
なお、処理が失敗しているのは、残高が入っていないためです。
こちらにも、上のやり方と同様、「mumbai」トークンを入れておきます。(0.03matic程度あれば十分です。)
下のように、トークンが入ったことを確認します。
なお、この時点では、ただのアドレス(EOA)です。
3 再度、実行しよう
では、再び、yarn devを行ってみましょう。
yarn dev
下のように、うまく行っていることがわかります。
今回の処理としては、コントラクトアカウントを作成し、そこから別のウォレットにトークンを送付しています。
また、PolygonScanを確認すると、アドレス(EOA)からコントラクトアドレスになったことも確認できます。
4 コードを確認してみよう
では、コードを確認してみましょう。
1 .envファイルの反映
下のように、「config()」を使い、「.env」ファイルの中身にアクセスできるようにしています。
「process.env.PRIVATE_KEY」で値を取得しています。
2 Bundlerの取得
次は、Bundlerを取得しています。
Bundlerは「UserOperation」をまとめ、下のように、「Entry point コントラクト」に送る役割です。
この辺りがご不明の場合は、こちらをご参照ください。
戻りますと、下のように、「バンドラーURL」「チェーンID」「エントリーポイントアドレス」を元に、インスタンスを初期化しています。
確かに、どのチェーンか、どのエントリーポイントか(どこに送るの?)は必要な要素ですね。
3 providerの作成
次は、「ethers」の「providers」を用いて、「provider」を作成しています。
ブロックチェーンとやりとりを行うために必要なものです。
4 walletの取得
次に、秘密鍵から、「ethers」の「Wallet」を用いて、ウォレットを作っています。
こちらを署名者に設定することになります。
5 スマートアカウントの構成情報の設定
次に、スマートコントラクトを作るのに必要な情報を「biconomySmartAccountConfig」にまとめています。
下のように、「署名者」「チェーンID」「バンドラー」を設定しています。
6 スマートアカウントの作成
上の情報を元に、「createAccount」関数を作り、下のように、スマートコントラクトを作成しています。
まずは、オブジェクトを作成しています。
その上で、「init」関数を使い、初期化を行っています。
そして、オーナーアドレス(秘密鍵で設定したアドレス)とコントラクトアカウントのアドレスを表示させています。
7 トランザクションの作成
最後に、createTransaction関数を定義し、末尾の部分で実行しています。
まずは、上で定義した、「createAccount」関数で、コントラクトアカウントを作成します。
その上で、トランザクションに必要な情報を集めています。
「to」のアドレスは、チュートリアルにあったアドレスですが、変えても大丈夫です。
送付を行うだけなので、「data」は「0x」(内容なし)で、valueが「0.01」maticです。
そのトランザクションの情報を元に、「userOperation」を作成しています。
なお、「UserOperation」はこちらになります。
次に、「Paymaster」を設定します。
ただ、今回は、使用しないので、「0x」(なし)と設定しています。
次に、「sendUserOp」でUserOperationをバンドラーに送付しています。
完了まで、下のように待ち、結果を「transactionDetail」で取得しています。
最後に、結果を下のように表示させています。
今回は以上です。