fork mainnet

获取mainnet apikey

登录alchemy,在home页面Create new app,本文选择Ethereum Mainnet,然后就可以从该APP中获取相应的API key。
除了alchemy还可以使用infura。

配置hardhat.conf.js

详细内容可以参考官方文档,本文仅介绍部分内容。
添加以下内容到hardhat配置文件中:

networks: {
  hardhat: {
    forking: {
      url: "https://eth-mainnet.g.alchemy.com/v2/<key>",
      blockNumber: 14390000
    }
  }
}

若是不指定区块,hardhat会自动fork最新区块的前5个区块。

模拟账户

fork mainnet允许使用者模拟指定区块期间mainnet上的任意账户,并且不需要其私钥信息。
以下是官方文档中的使用示例:

const helpers = require("@nomicfoundation/hardhat-toolbox/network-helpers");

const address = "0x1234567890123456789012345678901234567890";
await helpers.impersonateAccount(address);
const impersonatedSigner = await ethers.getSigner(address);

通过地址信息获取一个signer类。
除此之外,hardhat为了方便用户测试,同样在fork mainnet时也会自动生成测试账户(每个账户拥有10000ETH)。

验证合约

获取API key

登录Etherscan,可以免费获取自己的API key,这将在hardhat配置文件中使用。

配置hardhat

在hardhat.conf.js中,添加以下配置:

const { vars } = require("hardhat/config");

const ETHERSCAN_API_KEY = vars.get("ETHERSCAN_API_KEY");

module.exports = {
  // ...rest of the config...
  etherscan: {
    apiKey: ETHERSCAN_API_KEY,
  },
};

部署合约并验证

在hardhat官方文档中,hardhat允许这一步分离,也就是先部署合约,再验证合约,详细步骤可以查看hardhat官方文档
本文使用hardhat ignition/modules模块部署合约。

npx hardhat ignition deploy ignition/modules/Lock.js --network sepolia --verify

使用--verify可以直接验证合约并将其公布到Etherscan上,对于有多个导入的合约来说跟直接在Etherscan上来比,简直是将验证难度降低到了最简单的模式!!(作者深有体会,在Etherscan上验证调用chainlink vrf的合约,简直不要太难!)
注意:--verify会将contract文件夹下所有合约全部验证!!(作者曾经也失误过,误将所有合约全部验证公开