Solidity
大數字錯誤將數據傳遞給智能合約
我有一個智能合約函式,它接收一組 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 }
結果發現導致問題的結構中存在拼寫錯誤。