我试图在实例化智能合约后使用它。但是,我得到一个错误:
Uncaught (in promise) TypeError: Cannot read properties of 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;
好吧,我仍然不明白为什么下面的解决方案是有效的,但如果有人在那里有一个类似的问题,这是什么为我工作:
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]);
- 仅在存在差异时更改状态
- 传递合约作为函数的道具
我的理解是这是一个范围问题。
确保您的环境配置中正确设置了一个帐户。在我的情况下,这是发生的,因为我有一个额外的WALLET_PRIVATE_KEY=
行设置在我的。env使用醚+硬帽。
通常在签名者对象无效或未定义时出现。任何具有无效签名者对象的活动,如合同创建,调用,发送交易等,将会有错误:TypeError: Cannot read properties of null (reading 'call') at contract。合同(node_modules@ethersproject src.ts index.ts: 397:47)…