Web3:在新的 ethers.Contract 后无法读取 null 的属性

问题描述 投票:0回答:3

我在实例化智能合约后尝试使用它。但是,我收到错误:

未捕获(承诺中)类型错误:无法读取 null 的属性 (读“打电话”)

我以为实例化后就无法访问该函数,但似乎并非如此。还能是什么?有人遇到过类似的问题吗?

当前代码:

import React, { useEffect, useState } from 'react';
import Head from 'next/head';

import { useWeb3React } from '@web3-react/core';
import NFTCollectionArtifact from 'artifacts/contracts/NFTCollection.sol/NFTCollection.json';
import { Contract, ethers, Signer } from 'ethers';
import { Provider } from '@openmint/utils/provider';

export const Index = () => {
  const context = useWeb3React<Provider>();
  const { library } = context;

  const [contractInstance, setContractInstance] = useState<Contract | undefined>();
  const [signer, setSigner] = useState<Signer>();
  const [name, setName] = useState<String>('');

  useEffect(() => {

    const address = '0x5FbDB2315678afecb367f032d93F642f64180aa3';
    const nftCollection = new ethers.Contract(
      address,
      NFTCollectionArtifact.abi,
      signer
    );

    setContractInstance(nftCollection);
  }, []);

  useEffect(() => {
    if(!contractInstance) return;

    const setContractName = async () => {
      try{
        console.log(await contractInstance?.name());
        setName(await contractInstance?.name());
      } catch(e){
        console.error('my error', e);
      }
    }
  
    setContractName();
  }, [contractInstance]);

  useEffect((): void => {
    if (!library) {
      setSigner(undefined);
      return;
    }

    setSigner(library.getSigner());
  }, [library]);

  return (
    <>
      <Head>
        <title>Preview NFTs</title>
      </Head>
    </>
  );
};

export default Index;

reactjs solidity web3js ethers.js
3个回答
2
投票

好吧,我仍然不明白为什么以下解决方案有效,但如果有人遇到类似的问题,这对我有用:

useEffect((): void => {
    if (!contractInstance) {
      return;
    }

    async function getStatus(MyContract: Contract): Promise<void> {
      const name = await MyContract.name();

      const newStatus: StatusInterface = {
        ...status,
        name
      };

      console.log('newStatus', newStatus);
      if (!isEqual(status, newStatus)) {
        setStatus(newStatus);
      }
    }

    getStatus(contractInstance);
  }, [contractInstance, status, account]);
  • 仅在存在差异时更改状态
  • 将合约作为函数的支柱传递

我的理解是这是一个范围问题。


1
投票

确保您的环境配置已正确设置帐户。就我而言,发生这种情况是因为在使用以太坊 + 安全帽时,我的 .env 中设置了额外的

WALLET_PRIVATE_KEY=
行。


1
投票

如果签名者对象无效/未定义,通常会出现这种情况。任何具有无效签名者对象的活动(例如合约创建、调用、发送交易等)都会出现错误:TypeError:无法读取合约中 null 的属性(读取“调用”)。 (node_modules@ethersprojec

© www.soinside.com 2019 - 2024. All rights reserved.