Hardhatの使い方メモ(3) scripts
scriptsディレクトリに、デプロイ以外のスクリプトを書いておくこともできます。 私が使っているスクリプトをいくつか紹介します。
tokenURIからSVGファイルを取得する
フルオンチェーンNFTを自作しているときに、tokenURI関数で取得できるSVGファイルを確認したいときに使っています。 Lootのように、Base64エンコードされたJSONの中に、Base64エンコードされたSVGファイルが入っているタイプのみに使えます。
const fs = require("fs"); async function main() { // デプロイ const factory = await ethers.getContractFactory("MyNft"); const contract = await factory.deploy(); await contract.deployed(); console.log("Deployed to:", contract.address); // Claim関数でNFTを発行する const tokenId = 100; const tx = await contract.claim(tokenId); await tx.wait(); // confirm待ち // tokenURIからSVGを取得してファイルに保存 const uri = await contract.tokenURI(tokenId); const json = Buffer.from(uri.split(",")[1], "base64").toString(); const svg = Buffer.from(JSON.parse(json).image.split(",")[1], "base64").toString(); console.log(svg); fs.writeFileSync(`./mynft_${tokenId}.svg`, svg); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });
スクリプトを実行するには、ターミナルから以下のコマンドを入力します。
> npx hardhat run .\scripts\getSVG.js
ガス手数料(Gas Fee)を調べる
async function main() { // デプロイ const factory = await ethers.getContractFactory("MyNft"); const contract = await factory.deploy(); await contract.deployed(); console.log("Deployed to:", contract.address); // デプロイにかかったガス const txReceipt = await ethers.provider.getTransactionReceipt(contract.deployTransaction.hash); const deployGas = txReceipt.gasUsed.toString(); console.log("deploy gas", deployGas); // 関数の実行にかかるガス const tokenId = 100; const gas1 = await contract.estimateGas.claim(tokenId); console.log("claim gas", gas1.toString()); const gas2 = await contract.estimateGas.tokenURI(tokenId); console.log("tokenURI gas", gas2.toString()); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });
デプロイにかかったガスはtransactionのreceiptから取得します。
関数の実行にかかるガスはestimateGasを使います。 これは、あくまで見積もりであって、実際にかかるガスと異なる場合もあるようです。(他のコントラクトを呼び出す場合など)