Skip to content

Latest commit

 

History

History
 
 

P203_Connect

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

这一讲我们将支持通过钱包链接区块链,你也可以参考之前基础课程中的连接钱包学习。


初始化 Provider

我们基于 Ant Design Web3 的以太坊适配,来给整个 DApp 的组件提供连接链的支持,我们需要在 DApp 的最外层包裹 WagmiWeb3ConfigProvider,这样就可以在 DApp 的组件中获取链上数据或者调用合约了。

在基础课程部分我们已经安装了相关依赖,如果你是基于新创建的项目学习,你也可以参考 Ant Design Web3 的快速开始文档安装相关依赖:

npm install antd @ant-design/web3 @ant-design/web3-wagmi wagmi viem @tanstack/react-query --save

接下来我们在参考 Ant Design Web3 的推荐配置 components/WtfLayout/index.tsx 中做如下修改:

import React from "react";
import Header from "./Header";
+ import {
+   MetaMask,
+   OkxWallet,
+   TokenPocket,
+   WagmiWeb3ConfigProvider,
+   WalletConnect,
+   Hardhat,
+   Mainnet,
+ } from "@ant-design/web3-wagmi";
+ import { QueryClient } from "@tanstack/react-query";
+ import { createConfig, http } from "wagmi";
+ import { mainnet, hardhat } from "wagmi/chains";
+ import { walletConnect } from "wagmi/connectors";

+ const queryClient = new QueryClient();

+ const config = createConfig({
+   chains: [mainnet, hardhat],
+   transports: {
+     [mainnet.id]: http(),
+     [hardhat.id]: http("http://127.0.0.1:8545/"),
+   },
+   connectors: [
+     walletConnect({
+       showQrModal: false,
+       projectId: "c07c0051c2055890eade3556618e38a6",
+     }),
+   ],
+ });


interface WtfLayoutProps {
  children: React.ReactNode;
}

const WtfLayout: React.FC<WtfLayoutProps> = ({ children }) => {
  return (
-     <div>
+     <WagmiWeb3ConfigProvider
+       eip6963={{
+         autoAddInjectedWallets: true,
+       }}
+       ens
+       chains={[Mainnet, Hardhat]}
+       wallets={[
+         MetaMask(),
+         WalletConnect(),
+         TokenPocket({
+           group: "Popular",
+         }),
+         OkxWallet(),
+       ]}
+       config={config}
+       queryClient={queryClient}
+     >
      <Header />
      {children}
-     </div>
+     </WagmiWeb3ConfigProvider>
  );
};

export default WtfLayout;

在这个配置中我们支持了 WalletConnect,支持了基于 EIP6963 自动检测钱包,支持了显示 ENS,以及默认添加了一些钱包。具体的配置说明不在这里具体展开,你可以在前面的基础课程或者 Ant Design Web3 以及 wagmi 的文档中学习。

另外我们还添加了 Hardhat 本地测试链,便于后续和本地的测试链中部署的合约联调。

配置 ConnectButton

配置好 Provider 之后我们还需要配置 ConnectButton,接下来请修改我们在上一讲课程中已经完成了样式的 components/WtfLayout/Header.tsx 文件:

import Link from "next/link";
import { usePathname } from "next/navigation";
- import { ConnectButton } from "@ant-design/web3";
+ import { ConnectButton, Connector } from "@ant-design/web3";
import styles from "./styles.module.css";

export default function WtfHeader() {
  const pathname = usePathname();
  const isSwapPage = pathname === "/wtfswap";

  return (
    <div className={styles.header}>
      <div className={styles.title}>WTFSwap</div>
      <div className={styles.nav}>
        <Link
          href="/wtfswap"
          className={isSwapPage ? styles.active : undefined}
        >
          Swap
        </Link>
        <Link
          href="/wtfswap/pool"
          className={!isSwapPage ? styles.active : undefined}
        >
          Pool
        </Link>
      </div>
      <div>
+        <Connector
+           modalProps={{
+             mode: "simple",
+           }}
+         >
          <ConnectButton type="text" />
+         <Connector>
      </div>
    </div>
  );
}

我们引入了 Connector 组件,它会读取 WagmiWeb3ConfigProvider 提供的相关信息,传递给 ConnectButton,让连接按钮不再仅仅是 UI 组件,从而具备了连接链的能力。另外 Connector 组件集成了 ConnectModal 组件,如上面代码示例,你可以通过 modalProps 来修改相关配置,我们修改了 modesimple 让弹窗更简洁,你也可以尝试自己做修改调整样式。