今日は StarkNet basecamp の課題をやっていると、新しく作成したアカウント B が ETH を受け取れなくなってしまいました。そのため、以前にデプロイしたアカウント A の ETH をアカウント B に送金したいと思います。
アカウント A と B はコマンドラインで作成されたもので、ウォレットには組み込まれておらず、コマンドライン、SDK、またはサードパーティのコマンドラインツールを使用して ETH コントラクトの transfer 関数を呼び出すことでのみ目的を達成することができます。コマンドラインを使用するのが最も簡単です。
アカウント B はstarknet new_account --account v0.11.0.2
コマンドで作成され、~/.starknet_accounts/starknet_open_zeppelin_accounts.jsonには自動的に以下のようなレコードが追加されます。
"v0.11.0.2": {
"private_key": "0x6c.......c46",
"public_key": "0x66e22d3fabc4575d48c8b015d830f06dfcd07fe2bcb1b707363cbdee237c2a8",
"salt": "0x6ebe039e6862dbcc51da66b6729e2ae9c329e6f85d1c7c658055b9ddfdcef93",
"address": "0xe669f0765742557ea1c44320b5bcf2ca2c5d5725f016a21bb48bcb07932400",
"deployed": false
}
同様に、以前のアカウント A も見つけることができます。名前はversion_11です。
"version_11": {
"private_key": "0x5a....4ff",
"public_key": "0x6e5c1e7e741190090f45bd323661203417e7e88c76bf872356d1c84e7462bf2",
"salt": "0x35ff7c0aeadc5144ea68682a744f4bda3b2b07dadf17ab11dc90ce862fac7c9",
"address": "0x4f5084d55c9b67e147660e6429a18b3c868c36da70888548b48a43b89ec4cea",
"deployed": true
}
StarkScan ブラウザでアカウント A を検索すると、PortfolioにETH のコントラクトアドレス(StarkNet では ETH はトークンとして扱われます)が見つかります。
ETH はアップグレード可能なコントラクトであり、見つかったプロキシ(Proxy)コントラクトの abi にはTransferが含まれていません。Read/Write Contractでロジック(Implementation)コントラクトのアドレスを見つけることができます。abi が必要な場合は、ロジックコントラクトのページにアクセスしてダウンロードできます。
このページでtransferを見つけることができ、パラメーターrecipientはFelt、amountはUint256です。
transfer関数を呼び出すためには、invoke を使用します。
以下は送金コマンドです。
starknet invoke --address 0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7 --function transfer --inputs 2242186224124962059324130445823883801135621115872240251912124809464678993130 100000000000000000 0 --account version_11
--addressは ETH のコントラクトアドレスであり、--accountは署名されたアカウント A の名前です。
--inputのパラメーターは Decimal に変換する必要があります。recipientはアドレスであり、Python の int を使用して変換します。amountは uint256 であり、2 つの felt パラメーターが必要です。最初のパラメーターはint(ETHの量e18)
であり、2 番目のパラメーターは 0 です。
送金が成功しました。
次はアカウント B のガスデプロイです。
他のコントラクト間のやり取りも同様の方法で行うことができます。