Nextjs 13.0.2 和 Ethers 为什么我的 Provider 未定义?

pat*_*ick 7 blockchain ethereum smartcontracts next.js ethers.js

我正在尝试在 Nextjs 13.0.1 中像这样访问以太坊提供程序:

import { ethers } from "ethers";

export const signMessage = () => {
  
  const provider = new ethers.providers.Web3Provider(window.ethereum);
  const signer = provider.getSigner();

  try {
    signer.signMessage("Hey hey").then((result) => {
      console.log(result);
    });
  } catch (error) {
    // handle error
    console.log(error);
  }
};
Run Code Online (Sandbox Code Playgroud)

但它总是给我错误:

Unhandled Runtime Error
TypeError: Cannot read properties of undefined (reading 'Web3Provider')
Run Code Online (Sandbox Code Playgroud)

我尝试过不同的提供商,但总是收到上面的错误消息。

有人知道为什么它适用于 Nextjs 12 但不适用于 Next 13?

Yil*_*maz 7

我认为您在 next13 中使用的是版本 6。如果你安装

"ethers": "^5.6.4",
Run Code Online (Sandbox Code Playgroud)

在next-13中,它将起作用。

我认为您之前有版本 5 的 next-12 项目,现在在 next-13 上安装新版本

ethers v6所有这些中

export {
    getDefaultProvider,
    Block, FeeData, Log, TransactionReceipt, TransactionResponse,
    AbstractSigner, NonceManager, VoidSigner,
    AbstractProvider,
    FallbackProvider,
    JsonRpcApiProvider, JsonRpcProvider, JsonRpcSigner,

    BrowserProvider,
    AlchemyProvider, AnkrProvider, CloudflareProvider, EtherscanProvider,
    InfuraProvider, PocketProvider, QuickNodeProvider,
    IpcSocketProvider, SocketProvider, WebSocketProvider,
    EnsResolver,
    Network
} from "./providers/index.js";
Run Code Online (Sandbox Code Playgroud)

像这样导入

import { BrowserProvider } from "ethers";

const providerr = new BrowserProvider(window.ethereum);
Run Code Online (Sandbox Code Playgroud)

这就是我设置组件连接的方式

const Test = () => {
  const [provider, setProvider] = useState();
  useEffect(() => {
    const browserProvider = new BrowserProvider(window.ethereum);
    setProvider(browserProvider);
  }, []);
  const connect = async () => {
    await provider.send("eth_requestAccounts");
  };
  return (
    <div>
      <button onClick={connect}>connect</button>
    </div>
  );
};

export default Test;
Run Code Online (Sandbox Code Playgroud)