簡體   English   中英

useDapp 和 hardhat 從智能合約返回不同的值

[英]useDapp and hardhat returning different values from smart contract

我有一個使用 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。

對於任何對此感到非常困惑的人,我相信這在未來 EVM 智能合約開發人員中會很常見,安全帽默認網絡測試與針對主網分叉的測試將從合約中返回不同的數字類型。

例如,使用帶有默認網絡的常規.js測試文件,從合約返回uint256[]將是常規整數外觀數字。

但是對於主網分支,返回一個uint256[]將返回一個BigNumber數組,而 javascript 無法分解該數組。 您將需要一個 BigNumber 包來使用它。 似乎主網 fork .js交互需要獲取數組Array[0]的第一個元素,並且該元素內部將是每個BigNumber對象,進一步需要使用BigNumber.from(yourNumber).toNumber()類的東西進行解碼。

注意:至於向合約中發送數字,您需要確保在處理任何代幣值時注意代幣的小數點。 例如,如果一個代幣在合約中編程了 6 個小數位,並且您想向合約發送一個代表 600 個硬幣的值,您需要發送 600000000(600 加上 6 個 0)或BigNumber.from(600000000) 我不確定在將其發送到合同之前將其轉換為BigNumber類型是否會節省氣體或其他東西,因為轉換是脫鏈的,但似乎您可以將任一數字發送到合同中。 您只需確保根據您正在使用的令牌將 0 添加到數字的末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM