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文件夹下所有合约全部验证!!(作者曾经也失误过,误将所有合约全部验证公开 )