100時間後に死ぬNFT のコード解説(3) 失敗・トラブル編
「100時間後に死ぬNFT」のコード解説の続き 失敗・トラブル編です。
onlyOwnerの勘違い
feed関数はNFTトークンのオーナーしか呼び出せない(=飼い主しかエサをやれない)ようにしたいので、深く考えずに onlyOwner modifierをつけていました。
しかし、onlyOwnerはコントラクトのオーナーしか呼び出せないようにする機能であって、トークンのオーナーしか呼び出せないようにしたいのなら、_isApprovedOrOwnerを使う必要がありました。
function feed(uint256 tokenId) external { require(_isApprovedOrOwner(_msgSender(), tokenId), "caller is not owner nor approved"); ... }
複数のアカウントを扱うテストを書いていなかったので、この間違いに気づけませんでした。(ちゃんとテストを書かないと。。。反省)
テストスクリプトで別のアカウントを扱うには connect() を使います。
const factory = await ethers.getContractFactory("DieAfter100HrsNft"); const contract = await factory.deploy(); await contract.deployed(); const [Owner, Alice, Bob] = await ethers.getSigners(); const contractAlice = contract.connect(Alice); // Aliceアカウントと結びついたコントラクト const contractBob = contract.connect(Bob); // Bobアカウントと結びついたコントラクト
Hardhat Testing contracts - Using a different account
console.sol の消し忘れ
PolygonscanにコードをVerifyしたときに、Hardhatのconsole.solまでアップロードされていました。
テストが終了した後に import "hardhat/console.sol";
の行は消しておけばよかった。
Polygonメインネットへのデプロイでエラー
テストネットへのデプロイは問題なかったのですが、メインネットへのデプロイでは
Error: insufficient funds for intrinsic transaction cost
というエラーが出てしまいました。
MATIC残高は十分にありますし、gasやgasPriceの設定がおかしいのかと思って変更してみましたが解決せず。
hardhat.config.jsで設定したRPCのURL https://matic-mainnet.chainstacklabs.com
を別のものに変えてみました。
https://polygon-rpc.com
やhttps://rpc-mainnet.maticvigil.com
に変えてもダメでしたが、
https://rpc.maticvigil.com/ にサインアップして取得したURL https://rpc-mainnet.maticvigil.com/v1/***
に変えると成功しました。
前はhttps://matic-mainnet.chainstacklabs.com
で問題なくデプロイできたので、
もしかすると、単に一時的なPolygonネットワークの問題だったのかもしれません。
PolygonscanのWriteContractが使えない!?
PolygonscanにコードをVerifyしたのですが、なぜかWriteContractが使えませんでした。(ReadContractは使えるのに)
もう一度コードをVerifyしたくても、すでに登録済みと出て再Verifyもできず、、、。
とりあえずPolygonscanに問い合わせしたのですが、次の日には直っていました。問い合わせの結果なのか、単に一時的な時間経過で直ったのかはよくわかりません。(問い合わせの返事は来ていません。)
おわりに
いろいろトラブルもありましたが、無事に公開できました。ぜひ遊んでみてください。
現在の みんなのNFT はこうなっています。↓