首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >useDapp和hardhat从智能契约返回不同的值

useDapp和hardhat从智能契约返回不同的值
EN

Stack Overflow用户
提问于 2022-03-09 15:38:26
回答 1查看 691关注 0票数 0

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

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

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

我尝试过一切:JSON.stringify(array)返回[[]]array[0]返回未定义的,BigNumber.from(array).toNumber抛出了一些疯狂的BigNumber错误,等等。但是我知道契约给了它正确的值。

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

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

代码语言:javascript
复制
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" } ]

代码语言:javascript
复制
CONTRACT = await ethers.getContractFactory("CONTRACT");
const contract = await CONTRACT.attach("0x109d198fca64d33Bd9F33E60333A544412cfAC7D");
  array = await contract.getArray();
  console.log(array);

请知道使用useDapp的其他两个几乎相同的函数调用,还有一个甚至传递数据来收缩,工作非常好。因此,问题不在于使用或进口ABI的地址。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-12 01:33:35

对于那些对此感到非常困惑的人(我相信EVM智能契约开发人员将来也会这样做),硬汉默认网络测试和针对主网分叉的测试将从合同中返回不同的数字类型。

例如,在默认网络中使用常规的.js测试文件,从契约返回一个uint256[]将是常规整数看起来的数字。

但是对于主板分叉,返回一个uint256[]将返回一个BigNumber数组,javascript在分解该数组时遇到问题。您将需要一个BigNumber包来使用它。看来,主干网分叉.js交互需要获取数组Array[0]的第一个元素,该元素的内部将是每个BigNumber对象,这需要使用类似于BigNumber.from(yourNumber).toNumber()的内容进行进一步解码。

注意:对于向契约发送数字,您需要确保在处理任何令牌值时注意令牌的小数。例如,如果一个令牌在契约中有6位小数位,并且您想要将一个值发送到表示600个硬币的契约中,那么您需要发送600000000 (600并添加了6 0's )或BigNumber.from(600000000)。我不确定在将其发送到合同之前是否将其转换为BigNumber类型,这样可以节省汽油或其他东西,因为转换是脱离链的,但似乎可以将任何一个号码发送到合同中。您只需确保根据正在使用的令牌将0添加到数字的末尾即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71411979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档