Now and Nawoo

NFTの制作記録、技術メモ → C#, Solidity, Blockchain, Bitcoin, Ethereum, NFT

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.comhttps://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は使えるのに)

f:id:nawoo5:20211201215250p:plain:w500

もう一度コードをVerifyしたくても、すでに登録済みと出て再Verifyもできず、、、。

とりあえずPolygonscanに問い合わせしたのですが、次の日には直っていました。問い合わせの結果なのか、単に一時的な時間経過で直ったのかはよくわかりません。(問い合わせの返事は来ていません。)

おわりに

いろいろトラブルもありましたが、無事に公開できました。ぜひ遊んでみてください。

現在の みんなのNFT はこうなっています。↓

f:id:nawoo5:20211201230246p:plain:w500