Now and Nawoo

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

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を使います。 これは、あくまで見積もりであって、実際にかかるガスと異なる場合もあるようです。(他のコントラクトを呼び出す場合など)