You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:06:47