错误:合约运行程序不支持在 ethers.js v6 上调用(操作 =“call”,代码 = UNSUPPORTED_OPERATION,版本 = 6.3.0)

m-d*_*ngo 1 solidity decentralized-applications ethers.js hardhat

我正在使用ReactHardhatEthers.jsSolidity制作一个简单的 dapp 。

我一直在关注 YouTube 上的教程,但我陷入了从创建的合约对象调用 Solidity 函数的部分。

每当我尝试从合约中调用函数时,它都会不断产生以下错误:

"contract runner does not support calling"
Run Code Online (Sandbox Code Playgroud)

查询合约是有效的,因为我可以获得合约的余额,但我找不到任何有关如何修复合约运行程序错误的资源。将不胜感激的帮助。下面是 React 中的代码。

"contract runner does not support calling"
Run Code Online (Sandbox Code Playgroud)

坚固性代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

contract Rental {
    struct Bike{
        string name;
        uint rangePower;
        uint maxSpeed;
        uint batteryCapacity;
        uint costPerHour;
        bool isAvailable;
    }
    
    //admin variables
    address owner;
    uint totalHours=0;
    uint totalRents=0;
    uint totalEbikes;

    //array of bikes
    Bike[] bikes;
 
    constructor(){
        //contract deployer address
        owner = msg.sender;

        //initialization of bike values
        bikes.push(Bike("48v/12ah Electric Bicycle Electric Bike", 60, 50, 576, 70, true));
        bikes.push(Bike("51v/17ah Electric Bicycle Electric Bike", 60, 50, 867, 70, true));
        bikes.push(Bike("43v/11ah Electric Bicycle Electric Bike", 60, 50, 473, 70, true));
        bikes.push(Bike("60v/18ah Electric Bicycle Electric Bike", 60, 50, 1080, 70, true));

        totalEbikes=bikes.length;
    }
    
    function getBikes() public view returns (Bike[] memory){
        return bikes;
    }

    function getNumOfBikes() public view returns (uint){
        return bikes.length;
    }

    function changeAvailability() public {
        bikes[1].isAvailable=false;
    }

    function rent(uint _totalHours) payable public {
        totalHours+=_totalHours;
        totalRents++;
    }


}
Run Code Online (Sandbox Code Playgroud)

我正在观看的教程似乎使用的是Ethers v5,而我正在使用Ethers v6,但根据文档,我遇到的问题在两者上似乎是相同的。

小智 6

问题是您正在尝试使用由“提供者”创建的合同实例。提供者仅支持查询,不支持调用。您需要与签名者创建合同实例。

const contract = new ethers.Contract(contractAddress, ABI, signer);