reactjs 使用紧急代码50调用视图函数时出现调用还原异常

llew8vvj  于 2022-12-12  发布在  React
关注(0)|答案(1)|浏览(130)

当我从我的前端调用我的solidity合约的视图函数时,我得到了一个错误。
该错误在文档中列为错误32:

0x32: If you access an array, bytesN or an array slice at an out-of-bounds or negative index (i.e. x[i] where i >= x.length or i < 0).

我的合同:

address public owner;

struct FoodItem {
    address owner;
    string url;
    string name;
    string originCountry;
}

FoodItem[] public foodItems;

function addFoodItem(
    string memory url,
    string memory name,
    string memory originCountry
) public {
    foodItems.push(FoodItem(msg.sender, name, url, originCountry));
}

function getFoodItemsByOwner() public view returns (FoodItem[] memory) {
    uint256 itemCount = 0;

    for (uint256 i = 0; i < foodItems.length; i++) {
        if (foodItems[i].owner == msg.sender) {
            itemCount += 1;
        }
    }

    FoodItem[] memory myfoods = new FoodItem[](itemCount);
    for (uint256 i = 0; i < foodItems.length; i++) {
        if (foodItems[i].owner == msg.sender) {
            myfoods[i] = foodItems[i];
        }
    }

    return myfoods;
}

而我的功能从React过来:

const getDishesByUser = async () => {
    const { ethereum } = window;
    if(ethereum) {
        const provider = new ethers.providers.Web3Provider(ethereum);    
        const signer = provider.getSigner();
        const contract = new ethers.Contract(abiFoodAddress, Food.abi, signer);
        const data = await contract.getFoodItemsByOwner();
       console.log(data);
        setDishesByuser(data)
        //router.push('/');
    }

  };

  useEffect(() => {
    getDishesByUser();
  }, []);

控制台中的完整错误输出:

index.js?dd68:224 Uncaught (in promise) Error: call revert exception; VM Exception while processing transaction: reverted with panic code 50 [ See: https://links.ethers.org/v5-errors-CALL_EXCEPTION ] (method="getFoodItemsByOwner()", data="0x4e487b710000000000000000000000000000000000000000000000000000000000000032", errorArgs=[{"type":"BigNumber","hex":"0x32"}], errorName="Panic", errorSignature="Panic(uint256)", reason=null, code=CALL_EXCEPTION, version=abi/5.7.0)
nx7onnlm

nx7onnlm1#

您可以在addFoodItem函数中控制台记录foodItems,以确保您确实推送了这些项。Map(地址=〉FoodItem[])公共foodItems;
因此您可以执行:
push(FoodItem(消息发送者,名称,URL,来源国家));
但你必须指明谁是所有者

相关问题