Hardhat 教學
安裝與初始化
專案結構

在本地測試與部屬
寫測試檔案
Artifacts
使用 Mainnet fork 測試
測試檔案內設置區塊時間
部署合約
Etherscan 驗證合約
測試單一檔案
相關連結
常見問題
Last updated

Last updated
mkdir hardhat-test && cd hardhat-test
npx hardhat initnpx hardhat nodenpx hardhat run --network localhost scripts/deploy.jsnpx hardhat console --network localhostconst Greeter = await ethers.getContractFactory("Greeter");const greeter = await Greeter.attach(<剛才部署本地的合約地址>);await greeter.greet()const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("Greeter12", function () {
it("Should return the new greeting once it's changed", async function () {
const Greeter = await ethers.getContractFactory("Greeter");
// const greeter = await Greeter.deploy("Hello, world!");
// await greeter.deployed();
//expect(await greeter.greet()).to.equal("Hello, world!");
const greeter = await Greeter.attach("0x5FbDB2315678afecb367f032d93F642f64180aa3");
const setGreetingTx = await greeter.setGreeting("Hola, mundo!");
// wait until the transaction is mined
await setGreetingTx.wait();
const a = await greeter.greet()
//console.log(a)
expect(await greeter.greet()).to.equal("Hola, mundo!");
});
});
npx hardhat test --network localhostrequire("@nomicfoundation/hardhat-toolbox");
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.28",
networks: {
hardhat: {
forking: {
url: "https://eth-mainnet.g.alchemy.com/v2/<API KEY>",
},
},
},
};const { expect } = require("chai");
const { ethers } = require("hardhat"); // Import ethers from Hardhat
describe("Query Account Balance on Forked Mainnet", function () {
it("should fetch the balance of the specified account", async function () {
// Replace this with the address you want to query
const targetAddress = "...";
// Use ethers to get the balance
const balance = await ethers.provider.getBalance(targetAddress);
// Log the balance for debugging
console.log(`Balance of ${targetAddress}: ${balance} ETH`);
// Verify that the balance is returned as a BigNumber
expect(balance).to.be.a("BigInt");
});
});const { ethers } = require("hardhat");
const { expect } = require("chai");
describe("USDC Balance Check", function () {
it("Should return the USDC balance of the address", async function () {
const usdcAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; // USDC Contract Address
const addressToCheck = "..."; // Address whose balance you want to check
// USDC Contract ABI (Simplified; use the full ABI from Etherscan)
const usdcAbi = ["function balanceOf(address owner) view returns (uint256)"];
// Connect to the USDC contract
const usdcContract = new ethers.Contract(usdcAddress, usdcAbi, ethers.provider);
// Fetch the balance
const balance = await usdcContract.balanceOf(addressToCheck);
// Log the balance (optional)
console.log("USDC Balance:", balance.toString());
// 也可手動改變地址 ETH 餘額
const mainnetAccount = addressToCheck; // Replace with a mainnet account address
await hre.network.provider.request({
method: "hardhat_impersonateAccount",
params: [mainnetAccount],
});
await hre.network.provider.send("hardhat_setBalance", [
mainnetAccount,
"0x8AC7230489E80000000", // 40960 ETH
]);
const ethBalance = await ethers.provider.getBalance(addressToCheck);
// Log the balance (optional)
console.log("ETH Balance:", ethers.formatEther(ethBalance), "ETH");
// Assert (for example, checking if the balance is greater than a certain amount)
expect(balance).to.be.gt(ethers.parseUnits("100", 6)); // Check if balance is greater than 100 USDC
});
});const { ethers } = require("hardhat");
// Fast forward time by 7 days for testing
await ethers.provider.send("evm_increaseTime", [7 * 24 * 60 * 60]);
await ethers.provider.send("evm_mine");import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
require('dotenv').config()
const config: HardhatUserConfig = {
solidity: "0.8.24",
networks: {
someTestnet: {
url: "<rpc url>",
accounts: [`${process.env.PRIVATE_KEY}`],
gasPrice: 160000000000, // 160 GWei (部署的 Gas Price)
}
}
};
export default config;import { ethers } from "hardhat";
async function main() {
const EthStaker = await ethers.deployContract("EthStaker");
await EthStaker.waitForDeployment();
console.log(
`EthStaker deployed to ${EthStaker.target}`
);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});npx hardhat run scripts/deploy.ts --network someTestnetetherscan: {
//apiKey: process.env.ETHERSCAN_API_KEY,
apiKey: process.env.POLYGONSCAN_API_KEY,
},npx hardhat verify --network <網路名稱> <要驗證的合約地址> <建構子參數>通常是直接使用 hardhat vm 部署與測試合約所產生,可改用 hardhat localhost node 試試SimplifiedNFT1155 = await ethers.getContractFactory("SimplifiedNFT1155");
simplifiedNFT1155 = await SimplifiedNFT1155.deploy("baseURI/");
NFTStaker = await ethers.getContractFactory("NFTStaker");
nftStaker = await NFTStaker.deploy(simplifiedNFT1155.target);