如何使用 ethers.js 在 hardhat 测试中生成带有 eth 种子的任意钱包?

How to generate arbitrary wallet seeded with eth in hardhat tests using ethers.js?

我目前正在尝试 运行 hardhat/waffle 中的一项测试,该测试需要数百个独特的钱包来调用合约,使用新的 ethers.Wallet.createRandom()。但是,none 这些钱包都提供了 eth,所以我无法 call/send 与它们进行交易。

simplest/most 向任意数量的随机生成的钱包提供 eth 的有效方法是什么?谢谢!

Hardhat 允许使用内置 hardhat 网络的 accounts.count 配置选项来播种自定义数量的预注地址。

示例:

module.exports = {
    networks: {
        hardhat: {
            accounts: {
                count: 1000
            }
        }
    }
}

文档:https://hardhat.org/hardhat-network/reference/#config


new ethers.Wallet.createRandom() 函数仅在 JS 应用程序的上下文中从随机私钥创建一个帐户,但它不与提供者(在您的情况下是安全帽)通信。

看到这个答案,我认为它解决了问题:

https://github.com/ethers-io/ethers.js/issues/686

const wallet = ethers.Wallet.createRandom().connect(provider);

我认为您可能想要使用 hardhat 网络方法 hardhat_setBalance,文档使用这样的示例:

await network.provider.send("hardhat_setBalance", [
  "<ACCOUNT ADDRESS>",
  "0x1000", # 4096 wei
]);

虽然我没有在 javascript 中开发,但我一直在 python 中使用 web3.py and eth-account 和如下代码做类似的事情:

from web3 import Web3
from eth_account import Account


chain = Web3(HTTPProvider("http://127.0.0.1:8545"))

acct = Account.create('<RANDOM VALUE>')
address = Web3.toChecksumAddress(acct.address)
print(chain.eth.get_balance(address)) # 0 wei

# add a balance of eth tokens to the address
chain.provider.make_request("hardhat_setBalance", [address, "0x1000"])

print(chain.eth.get_balance(address)) # 4096 wei