无法使用 ethers 库将 MATIC 发送到智能合约

Can't send MATIC to smart contract using ethers library

我在多边形测试网(孟买网络)中部署了我的 solidity 智能合约。
我测试了我的智能合约在我的反应前端中运行良好,除了一个支付功能。

function getLotto() payable external {
    require(msg.value == 100000000000000000, "Pay 0.1MATIC");
    ...
}

这是我的前端代码。当按下某个按钮时它会被调用。 当然我在contract里设置了signer和abi

const handler = () => {
    const options = {
        gasPrice: 800000,
        value: ethers.BigNumber.from("100000000000000000"),
      };
    await myContract.getLotto(options);
}

我也试过这段代码,但还是不行。

value: ethers.utils.parseEther("0.1")

这是错误信息。

---已编辑------

export class MarioNft {
  constructor(rpc, contractAddr, abi) {
    this.rpc = rpc;
    this.contractAddr = contractAddr;
    this.abi = abi;
    this.isSigned = false;

    this.provider = new ethers.providers.JsonRpcProvider(rpc);
    this.contract = new ethers.Contract(contractAddr, abi, this.provider);
    this.baseUri = null; 
  }
  ...

  setContractWithSigner(signer) {
    this.contract = new ethers.Contract(this.contractAddr, this.abi, signer);
    this.isSigned = true;
  }

  async lotto() {
    if (this.isSigned) {
      const res = await this.contract.getLotto();
      console.log("lotto res: ", res); /////
    } else {
      ///////
      console.log("from marioNft class: signer is false");
    }
  }

}
const lottoHandler = async () => {
    if (metaProvider === null) {
      alert("Need to connect to MetaMask");
    } else {
      if (!marioNft.checkIsSigned()) {
        marioNft.setContractWithSigner(metaSigner);
      }
      
      const options = {
        gasPrice: 800000,
        value: ethers.BigNumber.from("100000000000000000"),
      };
      await marioNft.lotto(options);

  };

------------编辑2----------------

const updateEthers = () => {
    let tempProvider = new ethers.providers.Web3Provider(window.ethereum);
    setMetaProvider(tempProvider);
    
    // this tempSigner will be used in marioNft.setContractWithSigner()
    let tempSigner = tempProvider.getSigner();
    setMetaSigner(tempSigner);
  };

当我打印 tempSigner

您在 MarioNFT class 中的异步乐透函数不传递选项对象:

async lotto() {
    if (this.isSigned) {
      const res = await this.contract.getLotto();
      console.log("lotto res: ", res); /////
    } else {
      ///////
      console.log("from marioNft class: signer is false");
    }
  }

所以应该是:

async lotto(options) {
    if (this.isSigned) {
      const res = await this.contract.getLotto(options);
      console.log("lotto res: ", res); /////
    } else {
      ///////
      console.log("from marioNft class: signer is false");
    }
  }