我有一个使用Hardhat的本地testnet节点。我可以使用普通的javascript、async await和const { ethers, upgrades } = require("hardhat");成功地部署和测试我的合同。
我正在正确地返回,并打印到控制台,一个包含来自契约函数的2个元素的BigNumber数组。
但是useDapp函数调用返回一个不同的值。
我尝试过一切:JSON.stringify(array)返回[[]],array[0]返回未定义的,BigNumber.from(array).toNumber抛出了一些疯狂的BigNumber错误,等等。但是我知道契约给了它正确的值。
为什么我在两个不同的javascript文件中得到两个不同的值?我假设这是硬帽测试文件检索值与useDapp的方式的一个问题。
我的useDapp前端钩子看起来像这样,它用length: 1返回[Array(0)]
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);请知道使用useDapp的其他两个几乎相同的函数调用,还有一个甚至传递数据来收缩,工作非常好。因此,问题不在于使用或进口ABI的地址。
发布于 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添加到数字的末尾即可。
https://stackoverflow.com/questions/71411979
复制相似问题