Solidity

大數字錯誤將數據傳遞給智能合約

  • November 7, 2022

我有一個智能合約函式,它接收一組 Structs 作為輸入。結構是這樣的。

struct Bgd {
       uint id;
       uint tanslationCode;
       string description;
       string image;
       string layer;
       uint supply;
       string createdBy;
       address revenue;
       uint price;
       bool approved;
   }

該函式在下面,只需將結構數組循環並添加到映射中。

mapping(uint => Bgd) _idToMetadata; 
mapping(uint => uint) _maxSupply; 
mapping(uint => uint) _itemsMinted;  
mapping(uint => bool) _approved;  

function addAttachedBackgrounds(Bgd[] calldata bgds)external onlyRole(UPDATER_ROLE){
       for (uint i; i < bgds.length; i++){
           uint id = bgds[i].id;
           _idToMetadata[id] = bgds[i];
           uint s = bgds[i].supply;
           _maxSupply[id] = s;//bgds[i].supply;
           if (id > bgdCurrentid){
               bgdCurrentid = id + 1; 
           }
           _approved[id] = true;
       }
   }

我現在正在使用 Hardhat 和 ethers 執行一些單元測試。但是當我嘗試向此函式添加數據時出現錯誤。

Error: invalid BigNumber value (argument="value", value=undefined, code=INVALID_ARGUMENT, version=bignumber/5.6.2)

我用來創建輸入數組的程式碼如下。

let bgdData = [];
const accessories = require("./accessories.json");
 for (i = 0; i < accessories.length; i++) {
   let a = accessories[i];
   let a_price = Number(a["price"]).toFixed(4);
   let weiPrice = ethers.utils.parseEther(a_price);

   a["price"] = weiPrice;
   a["revenue"] = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
   if (a["layer"] == "background") {
     bgdData.push(a);
     // console.log(a);
   } else {
     a["avType"] = 1;
     a["city"] = 1;
     accessoryData.push(a);
   }
 }

然後將其添加到契約中。

const addBgsData = async () => {
   await bgDataContract.addAttachedBackgrounds(bgdData);
 };

以相同方式創建的另一個數組工作正常。當我控制台記錄 bgdData 數組時,將獲取以下對象。

{
   id: 6,
   translationCode: 6,
   description: '',
   image: 'https://avatarimg.metropolisworld.net/img/accessories/1/none/6',
   layer: 'background',
   supply: 10,
   createdBy: 'Puks',
   revenue: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
   price: BigNumber { value: "3255100000000000000" },
   approved: true
 }

所以我的問題是為什麼我會收到這個錯誤?非常感謝任何幫助。

當錯誤類型的數據作為參數傳遞時,通常會發生此錯誤。

我猜在您的情況下,undefined結構中傳遞了一個值。

另外,在呼叫智能合約方法時,如果數字很長,請考慮將其作為string. 即您更新bgdData的對象可能如下所示:

{
   id: 6,
   translationCode: 6,
   description: '',
   image: 'https://avatarimg.metropolisworld.net/img/accessories/1/none/6',
   layer: 'background',
   supply: 10,
   createdBy: 'Puks',
   revenue: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
   price: "3255100000000000000",
   approved: true
}

結果發現導致問題的結構中存在拼寫錯誤。

引用自:https://ethereum.stackexchange.com/questions/138920