ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

wagmi coinbaseWallet 连接器:在 dApp 中接入 Coinbase Wallet SDK 的完整实践指南

wagmi coinbaseWallet 连接器:在 dApp 中接入 Coinbase Wallet SDK 的完整实践指南 wagmi coinbaseWallet 连接器在 dApp 中接入 Coinbase Wallet SDK 的完整实践指南【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi本文基于 wagmi 官方文档site/shared/connectors/coinbaseWallet.md与wagmi/connectors包的真实源码编写系统讲解coinbaseWallet连接器从安装coinbase/wallet-sdk、在createConfig中注册连接器到appName、appLogoUrl、preference等全部参数的用法与语义并结合 连接器源码 深入剖析其连接流程、链切换回退策略与错误归一化机制。读完本文你可以完成一个可上生产的 Coinbase Wallet 接入并理解 wagmi 在底层如何处理授权、事件监听与链切换。一、coinbaseWallet 连接器是什么coinbaseWallet是 wagmi 提供的用于接入 Coinbase Wallet SDK 的连接器位于独立包wagmi/connectors中。它与injected、metaMask、walletConnect等连接器地位相同通过 wagmi v3 的createConfig统一注册。从 packages/connectors/src/coinbaseWallet.ts 的源码可以看到连接器的几个关键标识return createConnectorProvider, Properties((config) ({ id: coinbaseWalletSDK, name: Coinbase Wallet, rdns: com.coinbase.wallet, type: coinbaseWallet.type, // ... }))id为coinbaseWalletSDK在 wagmi 的ConnectorsMap、useAccount等场景中标识该连接器rdns为com.coinbase.wallet反向域名标识用于跨框架如移动端、深层链接识别 Coinbase Wallet官方测试 packages/connectors/src/coinbaseWallet.test.ts 也验证了connector.name为Coinbase Wallet。另外coinbaseWallet通过 导出入口 对外暴露函数本体与CoinbaseWalletParameters类型// packages/connectors/src/exports/index.ts export { type CoinbaseWalletParameters, coinbaseWallet, } from ../coinbaseWallet.js二、安装与导入coinbase/wallet-sdk是wagmi/connectors的可选 peer 依赖——在 packages/connectors/package.json 中它的peerDependenciesMeta标记为optional: true版本要求为^4.3.6workspace 中实际锁定为 4.3.6见 pnpm-workspace.yaml。这意味着只有当你真的使用coinbaseWallet连接器时才需要安装 SDK不使用它的项目不会被强制引入该依赖。按文档要求需要单独安装 SDK# pnpm pnpm add coinbase/wallet-sdk^4.3.6 # npm npm install coinbase/wallet-sdk^4.3.6 # yarn yarn add coinbase/wallet-sdk^4.3.6 # bun bun add coinbase/wallet-sdk^4.3.6导入方式React、Vue、Solid 等框架统一从wagmi/connectors导入import { coinbaseWallet } from wagmi/connectorsSDK 更底层的 API 细节文档指引读者查阅 Coinbase Wallet SDK 的官方仓库文档。三、基础用法注册到 createConfig最小可用配置如下对应文档 Usage 一节import { createConfig, http } from wagmi import { mainnet, sepolia } from wagmi/chains import { coinbaseWallet } from wagmi/connectors export const config createConfig({ chains: [mainnet, sepolia], connectors: [coinbaseWallet()], transports: { [mainnet.id]: http(), [sepolia.id]: http(), }, })文档中有一条重要的生产环境建议warning在上线前强烈建议为你的应用设置appName和appLogoUrl这样用户在钱包中授权连接时能看到你应用的身份信息而不是默认样式。源码视角appChainIds 是从哪来的一个容易困惑的问题是coinbaseWallet()的参数里并没有appChainIds但 Coinbase Wallet SDK 的createCoinbaseWalletSDK通常支持这个字段。答案在 getProvider 实现 中const sdk createCoinbaseWalletSDK({ ...parameters, appChainIds: config.chains.map((x) x.id), preference: { options: all, ...(parameters.preference ?? {}), }, })wagmi 会自动把createConfig中配置的chains的 id 列表注入为appChainIds。这也解释了为什么 CoinbaseWalletParameters 类型定义 要显式Omit掉该字段export type CoinbaseWalletParameters /** deprecated remove */ _ unknown, Mutable Omit Parameterstypeof createCoinbaseWalletSDK[0], appChainIds // set via wagmi config 换句话说参数类型 Coinbase SDK 全部参数 −appChainIds由 wagmi 配置接管。同时注意preference.options的默认值由 wagmi 兜底为all用户传入的preference会覆盖该默认值。四、参数详解参数类型统一为CoinbaseWalletParametersimport { type CoinbaseWalletParameters } from wagmi/connectors4.1 appName类型string。应用名称展示在钱包连接界面中import { coinbaseWallet } from wagmi/connectors const connector coinbaseWallet({ appName: My Wagmi App, })4.2 appLogoUrl类型string | null | undefined。应用 logo 图片 URL未指定时Coinbase Wallet 会回退使用当前页面的 faviconconst connector coinbaseWallet({ appName: My Wagmi App, appLogoUrl: https://example.com/myLogoUrl.png, })4.3 preferenceSDK 2.9.0偏好设置控制连接时展示哪一类钱包。示例来自文档const connector coinbaseWallet({ appName: My Wagmi App, preference: { options: smartWalletOnly, }, })preference下有三个子项attributionSDK 2.12.33类型{ auto?: boolean | undefined; dataSuffix?:0x${string}| undefined }。该选项仅对 Coinbase Smart Wallet 生效。当提供合法的数据后缀data suffix时它会被追加到initCode与executeBatch的 calldata 中。Coinbase Smart Wallet 期望一个 16 字节十六进制字符串如果dataSuffix不是合法的 16 字节 hexSmart Wallet 将直接忽略该属性。若auto为trueSmart Wallet 会基于应用的 origin 自动生成 16 字节 hex 字符串。keysUrlSDK 2.12.33类型string。keys 弹窗的地址生产环境默认使用https://keys.coinbase.com/connect开发环境应显式使用https://keys-dev.coinbase.com/connect。optionsSDK 2.12.33类型all | eoaOnly | smartWalletOnly决定展示哪类钱包取值行为eoaOnly仅使用 EOA 浏览器扩展或移动端 Coinbase WalletsmartWalletOnly仅展示 Smart Wallet 弹窗all默认根据上下文同时支持 EOA 与 Smart Wallet版本标注说明文档中的2.9.0、2.12.33等 Badge 指 Coinbase WalletSDKcoinbase/wallet-sdk的版本要求而非 wagmi 包版本。当前 wagmi workspace 锁定的 SDK 版本为 4.3.6见 pnpm-workspace.yaml已覆盖上述全部参数。五、连接流程的源码级剖析5.1 惰性加载 SDKgetProvider()采用懒加载只有在真正触发连接类操作时才await import(coinbase/wallet-sdk)并且用try/catch包裹源码注释说明这是为了让 webpack 将其识别为可选依赖。SDK 实例创建后provider 被缓存在闭包变量walletProvider中复用。5.2 connect授权、监听与链切换connect 实现 的核心步骤调用eth_requestAccounts发起授权如果调用方传了instantOnboarding: true该参数在Properties类型中定义测试用例 coinbaseWallet.test.ts 用expectTypeOf验证了它的存在则会附加{ onboarding: instant }参数启用 Coinbase 的即时开户流程注册accountsChanged、chainChanged、disconnect三个事件监听用闭包缓存句柄避免重复注册若connect传入了chainId且与当前链不同则自动调用switchChain切换用户拒绝时UserRejectedRequestError会向上抛出其他切换失败则静默保持当前链。5.3 用户拒绝的归一化Coinbase Wallet 在不同场景关闭弹窗、未返回账户、拒绝账户、拒绝请求下抛出的错误文案各不相同。源码用一个正则统一识别并包装为 viem 的UserRejectedRequestErrorif ( /(user closed modal|accounts received is empty|user denied account|request rejected)/i.test( (error as Error).message, ) ) throw new UserRejectedRequestError(error as Error)对上层应用如useConnect钩子而言只需按 viem 标准的UserRejectedRequestError处理即可无需针对 Coinbase 的私有文案做分支判断。5.4 switchChain 与 4902 回退switchChain 实现 遵循标准 EIP-3326 流程先在config.chains中查找目标链未配置则抛SwitchChainError(new ChainNotConfiguredError())先尝试wallet_switchEthereumChain捕获 RPC 错误码4902表示该链尚未添加到钱包时自动组装AddEthereumChainParameter含blockExplorerUrls、rpcUrls、chainName、nativeCurrency等优先使用调用方通过addEthereumChainParameter传入的覆盖值否则回退到 wagmi 链配置改调wallet_addEthereumChain添加链添加失败则包装为UserRejectedRequestError其余错误包装为SwitchChainError。5.5 事件与断开onAccountsChanged账户列表为空时触发onDisconnect否则通过config.emitter发出change事件onChainChanged发出带chainId的change事件onDisconnect发出disconnect事件并移除全部监听器disconnect()同样移除监听器后调用provider.disconnect()并兼容旧版 SDK 的provider.close?.()isAuthorized()以eth_accounts是否返回非空账户列表判断是否仍处于授权状态。六、版本适配与适用前提适用版本wagmi v3 的wagmi/corewagmi/connectors架构createConfig/connectors/transports写法当前仓库中wagmi/connectors版本为 8.1.0SDK 依赖coinbase/wallet-sdk^4.3.6为可选 peer dependency使用连接器时必须显式安装框架无关该连接器由wagmi/core的createConnector构建React/Vue/Solid 各框架通过各自的 Provider/组合式 API 消费文档中的示例以wagmiwagmi/chains、wagmi/connectors为包名对应 React 侧 API 文档 与 共享文档。七、小结coinbaseWallet连接器把 Coinbase Wallet SDK 的接入成本收敛为“安装 SDK 注册一行连接器”appChainIds由 wagmi 配置自动注入preference.options默认all用户拒绝被归一化为标准 viem 错误链切换自动处理 4902 回退。生产接入时记得按文档建议配置appName与appLogoUrl如需开发环境调试 Smart Wallet将preference.keysUrl指向keys-dev地址并用options限定钱包形态eoaOnly/smartWalletOnly/all。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表