如何在HardHat交互脚本中传递合约Struct类型参数
解决HardHat调用带Struct参数的合约函数报错问题
你的报错是因为initFlash函数要求传入一个FlashParams结构体参数,但你调用时没有传任何参数。在ethers.js中,Solidity的结构体可以直接用JavaScript对象映射,只要对象键名和结构体字段名完全对应即可。
修改你的JS脚本,构造符合要求的参数对象后传入initFlash:
async function main() { const address = '0x90A39BaC0D3A796b52f0394b9A97897d8F26eB1c8'; const PairFlash = await ethers.getContractFactory('PairFlash'); const pairflash = await PairFlash.attach(address); // 构造对应FlashParams结构体的JS对象,替换成你的实际参数值 const flashParams = { token0: '0x...', // 替换为实际的token0地址 token1: '0x...', // 替换为实际的token1地址 fee1: 3000, // Uniswap V3费率,比如0.3%对应3000,按需调整 amount0: ethers.utils.parseUnits('1', 18), // 替换为实际amount0,注意代币精度 amount1: ethers.utils.parseUnits('0', 18), // 替换为实际amount1,注意代币精度 fee2: 500, // 第二个池子的费率,比如0.05%对应500 fee3: 10000 // 第三个池子的费率,比如1%对应10000 }; // 传入参数调用initFlash函数 const tx = await pairflash.initFlash(flashParams); // 等待交易上链确认 await tx.wait(); console.log('Flash初始化交易已确认:', tx.hash); } main() .then(() => process.exit(0)) .catch(error => { console.error(error); process.exit(1); });
关键注意点:
- 所有地址需填写真实合约地址,确保格式为
0x开头的有效地址 fee1/fee2/fee3是Uniswap V3的费率编码,需和你实际使用的池子费率匹配(例如0.05%=500,0.3%=3000,1%=10000)amount0和amount1要根据代币精度转换,ERC20代币通常用ethers.utils.parseUnits处理,避免精度错误- 你的合约
initFlash有onlyOwner修饰符,要确保调用脚本的钱包地址是合约所有者,否则会触发权限报错
内容的提问来源于stack exchange,提问作者Zboi
相关产品推荐
相关产品推荐

