【问题标题】:useDapp and hardhat returning different values from smart contractuseDapp 和 hardhat 从智能合约返回不同的值
【发布时间】:2022-06-16 03:13:12
【问题描述】:

我有一个使用 Hardhat 的本地测试网节点。我可以使用纯 javascript async awaitconst { ethers, upgrades } = require("hardhat"); 成功部署和测试我的合约。

我正确地返回并打印到控制台,一个 BigNumber 数组,其中包含来自合约函数的 2 个元素。

但是useDapp函数调用返回的值不同。

我已经尝试了所有方法:JSON.stringify(array) 返回 [[]]array[0] 返回未定义,BigNumber.from(array).toNumber 抛出一些疯狂的 BigNumber 错误,等等。但我知道合约给了它正确的值。

为什么我在 2 个不同的 javascript 文件中得到 2 个不同的值?我假设这是安全帽测试文件检索值与 useDapp 的方式的问题。

我的 useDapp 前端钩子看起来像这样,它返回 [Array(0)]length: 1

export function useGetArray(): BigNumber[] | undefined {
  const {value,error}: any = useCall({
    contract: new Contract(myContract, myInterface),
    method: "getArray",
    args: [],
  }) ?? [];

  if(error) {
    return error;
  } else {
    return value;
  };
}

我的安全帽 javascript 测试看起来像这样,它返回 [ BigNumber { value: "50" }, BigNumber { value: "129" } ]:

CONTRACT = await ethers.getContractFactory("CONTRACT");
const contract = await CONTRACT.attach("0x109d198fca64d33Bd9F33E60333A544412cfAC7D");
  array = await contract.getArray();
  console.log(array);

请注意,另外 2 个使用 useDapp 的几乎相同的函数调用,以及一个甚至将数据传递给合约,都可以正常工作。所以问题不在于正在使用或导入 ABI 的地址。

【问题讨论】:

    标签: javascript solidity web3js ethers.js usedapp


    【解决方案1】:

    对于任何对此感到非常困惑的人(我相信这在未来 EVM 智能合约开发人员中会很常见),安全帽默认网络测试与针对主网分叉的测试将从合约中返回不同的数字类型。

    例如,使用带有默认网络的常规 .js 测试文件,从合约返回的 uint256[] 将是常规整数外观数字。

    但是对于主网分支,返回 uint256[] 将返回 BigNumber 数组,javascript 无法分解该数组。您将需要一个 BigNumber 包来使用它。似乎主网分支.js 交互需要获取数组Array[0] 的第一个元素,并且该元素内部将是每个BigNumber 对象,进一步需要使用BigNumber.from(yourNumber).toNumber() 之类的东西进行解码。

    注意:至于向合约中发送数字,您需要确保在处理任何代币值时注意代币的小数位。例如,如果一个代币在合约中编程了 6 位小数,并且您想向合约发送一个代表 600 个硬币的值,您需要发送 600000000(600 加上 6 个 0)或 BigNumber.from(600000000)。我不确定在将其发送到合同之前将其转换为 BigNumber 类型是否会节省气体或其他东西,因为转换是脱链的,但似乎您可以将任一数字发送到合同中。您只需确保根据您正在使用的令牌将 0 添加到数字的末尾。

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 2022-12-24
      • 2020-08-26
      • 2020-01-13
      • 1970-01-01
      • 2021-11-15
      • 2021-12-14
      • 2022-11-11
      • 2022-09-29
      相关资源
      最近更新 更多