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

useDApp是否支持多合约调用?如何复用send调用另一合约方法?

解决方案

useDApp的useContractFunction返回的send是绑定到指定合约与函数的专属调用方法,无法直接复用它去调用另一个合约的function2,以下是两种可行的处理方式:

方式一:使用别名声明新的useContractFunction实例

这是useDApp的标准用法,通过给返回的send设置别名避免变量冲突,同时保留useContractFunction提供的交易状态跟踪能力:

// 原有合约1的function1调用声明,给send设置别名
const { send: sendFunction1, state: state1 } = useContractFunction(contract1, 'function1');
// 新增合约2的function2调用声明,用不同别名
const { send: sendFunction2, state: state2 } = useContractFunction(contract2, 'function2');

// 调用合约2的function2时直接用sendFunction2
sendFunction2(/* 函数参数 */);

方式二:直接调用ethers合约实例

如果不想额外声明useContractFunction,可以直接用contract2的ethers实例调用函数,不过需要自行处理交易状态和错误:

const callContract2Function2 = async (/* 函数参数 */) => {
  try {
    // 发起交易
    const txResponse = await contract2.function2(/* 函数参数 */);
    // 等待交易上链确认
    await txResponse.wait();
    // 交易成功后的逻辑
  } catch (error) {
    // 处理交易失败的情况
    console.error('调用function2失败:', error);
  }
};

补充说明

之所以不能复用原有send,是因为useContractFunction内部已经将send与contract1和function1的上下文绑定死了,它的核心作用就是触发该特定合约函数的调用,不支持动态切换目标合约或函数。

内容的提问来源于stack exchange,提问作者ecode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:10:48