我有一个Hardhat脚本查询RIF令牌余额根茎。然而,RIF地址是硬编码在我的脚本:
const rifTokenAddress = '0x2aCc95758f8b5F583470bA265Eb685a8f45fC9D5';
async function main() {
const erc20 = await ethers.getContractAt(
['function balanceOf(address owner) view returns (uint)'],
rifTokenAddress.toLowerCase(),
);
const walletAddress = (await ethers.getSigner(0)).address;
const rifBalance = await erc20.balanceOf(walletAddress);
console.log(ethers.utils.formatEther(rifBalance));
}
main();
现在我用这个命令来运行脚本:
npx hardhat run scripts/balances.js --network rskmainnet
我希望能详细说明命令行中的令牌地址如下:
npx hardhat run scripts/balances.js --network rskmainnet --token 0x2d919f19D4892381d58EdEbEcA66D5642ceF1A1F
有没有办法修改Hardhat脚本这样它就可以从命令行,类似于我如何选择网络与--network
参数?作为参考,这是我的hardhat.config.js
文件:
require('@nomicfoundation/hardhat-toolbox');
const { mnemonic } = require('./.secret.json');
const accounts = {
mnemonic,
path: "m/44'/60'/0'/0",
};
module.exports = {
solidity: '0.8.9',
networks: {
hardhat: {},
rsktestnet: {
chainId: 31,
url: 'https://public-node.testnet.rsk.co/',
accounts,
},
rskmainnet: {
chainId: 30,
url: 'https://public-node.rsk.co/',
accounts,
},
},
};
我能想到的一个快速解决方案是,将npx hardhat命令作为脚本放在package.json中。
"hardhat-runner": "npx hardhat run --network rskmainnet scripts/balances.js"
现在您可以使用以下命令调用它。现在传递你的参数'token'。
npm run hardhat-runner --token=0x2d919f19D4892381d58EdEbEcA66D5642ceF1A1F
在你的js代码中,你会得到这个env变量
process.env.npm_config_token
在我看来,hardhat不接受自定义参数,因此直接传递任何参数都会导致HH308错误。这在将来可能会改变。
注意:此解决方案仅在NPM 7上测试过。
欢呼。
没有办法使用Hardhat脚本。这是因为脚本只允许Hardhat内置的CLI参数(包括--network
),但不允许您定义自己的自定义CLI参数。
然而,通过将脚本转换为任务很容易完成,它允许您定义自己的自定义CLI参数。
参见Hardhat任务文档
回答你的具体问题:
创建一个文件tasks/balance.js
并复制粘贴以下任务定义:
const { task } = require('hardhat/config');
const rifTokenAddress = '0x2aCc95758f8b5F583470bA265Eb685a8f45fC9D5';
module.exports = task('balance', 'Displays token balance')
.addOptionalParam('token', 'ERC20 token name')
.setAction(async ({ token }) => {
const erc20 = await ethers.getContractAt(
['function balanceOf(address owner) view returns (uint)'],
token?.toLowerCase() || rifTokenAddress.toLowerCase(),
);
const walletAddress = (await ethers.getSigner(0)).address;
const erc20Balance = await erc20.balanceOf(walletAddress);
console.log(ethers.utils.formatEther(erc20Balance));
});
注意上面的代码是基于你原来的Hardhat脚本,并被改编为Hardhat任务;添加参数
这段代码定义了一个balance
任务,它带有一个可选的--token
参数,该参数接受ERC20令牌地址。如果未指定--token
,默认值为rifTokenAddress
。
导入hardhat.config.js
顶部的任务:
require('@nomicfoundation/hardhat-toolbox');
require('./tasks/balance.js');
现在您可以从命令行查询令牌余额,如下所示:
# queries default token balance
npx hardhat balance
--network rsktestnet
或者像这样:
# queries specified token balance
npx hardhat balance
--network rsktestnet
--token 0x19f64674D8a5b4e652319F5e239EFd3bc969a1FE