首页>>资讯>>产业

Web3前端——Wagmi React

2024-02-23 12:30:41 168

介绍


上文介绍了viem,虽然viem已经做的足够优秀了,对底层api做了很好的封装,但是在面对比较复杂的项目时,还是显得有点力不从心,需要开发者做进一步的封装。因为DApp开发需要支持连接钱包、多个链、签署消息和数据、发送交易、监听事件和状态变化、刷新区块链数据等等。


所以开发者常常面临连接数十个不同的钱包、多链支持的复杂性、拼写错误意外发送多出一个数量级的 ETH 或调用拼写错误的合约函数,或者意外向 RPC 提供商发送垃圾邮件,从而导致数千计算单元的损失的困境。


而Wagmi依赖viem开箱即用地提供了最常用的以太坊功能,具有 40 多个用于帐户、钱包、合约、交易、签名、ENS 等的 React Hook。Wagmi还通过其官方Connector、EIP-6963 支持和可扩展 API支持几乎所有钱包。而且Wagmi借助TanStack Query支持缓存、重复数据删除、持久性等。


核心概念


WagmiProvider


用于提供wagmi的公共配置信息。比如viem连接配置等。wagmi提供的所有hooks必须在WagmiProvider下使用,Wagmi Hooks是对Wagmi Actions的封装,


import { WagmiProvider } from'wagmi'

import { config } from'./config'


function App() {

  return (

    <WagmiProvider config={config}> 

      {/** ... */}

    </WagmiProvider>

  )

}


Connectors


wagmi提供了很多种connector来链接钱包提供商。


coinbaseWallet,用于链接Coinbase Wallet SDK。

injected,用于链接浏览器插件中EIP-1193的钱包。

metaMask,用于链接MetaMask SDK。

safe,用于链接Safe Apps SDK。

walletConnect,用于链接WalletConnect SDK。


EIP-1193连接


在web开发中,我们一般使用injected来做链接。因为浏览器中会存在多个插件钱包,按照EIP-1193的规范,是以最后一个加载完成的钱包为准。


import { createConfig, http } from'wagmi'

import { mainnet, sepolia } from'wagmi/chains'

import { injected } from'wagmi/connectors'


exportconst config = createConfig({

  chains: [mainnet, sepolia],

  connectors: [injected()],

  transports: {

    [mainnet.id]: http(),

    [sepolia.id]: http(),

  },

})


依照上面的写法,链接哪个钱包是不确定的,如果开发者想指定钱包,比如 meatamask,可以增加配置:


injected({

  target:"metaMask"

})


不管怎么样,EIP-1193对于用户来说,都是一种被迫选择的方式。所以,EIP-6963被提出,就是为了让用户有更多自主选择的权利,同时避免钱包提供商之间的恶性竞争。更多EIP-1193和EIP-6963细节可查看之前的文章。


EIP-6963连接


wagmi根据EIP-6963规范,对eip6963:announceProvider实现了监听,所以wagmi能够获取到浏览器安装了哪些钱包以供用户选择。


const { connectors, connect } = useConnect();


useConnect可以获取都所有可用Connector。包括EIP-1193配置的Connector。

1.png

TanStack Query


Wagmi Hooks利用TanStack Query在 React 应用程序中实现简单且直观的异步数据获取、缓存、同步和更新。因为在web3中与区块链交互成本是比较高的,所以对请求和结果进行处理是非常有必要,能很大程度上提高性能和降低成本。

声明:本网站所有相关资料如有侵权请联系站长删除,资料仅供用户学习及研究之用,不构成任何投资建议!