walletconnect v1 升级到v2 问题汇总

umi + react 17

初始项目

公司有关web3 项目,初期只支持 MetaMask 和 WalletConnect v1 的钱包关联,随着日积月累,项目越来越大,链接钱包的方式越来越多,前期联调完之后,大部分时间使用的Metamask,由于它是一个比较稳定的钱包,操作也比较简单。最新的功能添加了其他的钱包登录,突然发现WalletConnect 已经升级到v2,且v1 当前时间已经关闭,赶紧找官网拔文档。

注意 : "@walletconnect/modal": "^2.6.1", "@walletconnect/ethereum-provider": "^2.8.4", web3@1.7.0 babel-loader@8.3.0 web3@1.3.5 ethers@5.6.9

walletconnect 官网

通过walletconnect官网上文档

根据 官网文档,打算使用@walletconnect/ethereum-provider--> 申请projectId, 使用ethereum-provider 直接将代码改为如下

typescript 复制代码
// import WalletConnectProvider from '@walletconnect/web3-provider';
import { EthereumProvider } from '@walletconnect/ethereum-provider'
...
const [wcProvider, setWcProvider] = useState<any>();
...
const connectWcProvider = async () => {
  // console.log('===provie=', wcProvider)
  if(wcProvider) {
    return wcProvider;
  }
  console.log('===provie=2', wcProvider)
  const newProvider = await EthereumProvider.init({
    projectId: static_wc_projectId, // required
    chains: [1], // required
    showQrModal: true, // requires @walletconnect/modal
    methods: [
      "eth_sign",
      "personal_sign",
      "eth_chainId"
    ]
  });
  setWcProvider(newProvider);
  return newProvider;
};

const connectWallet = (type: string) => {

    let newProvider: any = wcProvider;
    if (!newProvider) {
      newProvider = await connectWcProvider();
    }
    const newWeb3 = new Web3(newProvider);
    try {
      await newProvider.connect();
      // const accounts = await newProvider.enable();
      const accounts = newProvider.accounts;
      console.log('provei---accounts, ', accounts, newWeb3, web3)
    } catch (e) {
      console.error(e)
      setWalletType(userInfo.walletType);
    }
}

问题汇总

启动报错

通过网上各种查找资料,

  • 解决方案一: 添加 file-loader

.umijs.ts 文件中,添加配置

ruby 复制代码
chainWebpack: (config) => {
  config.module
    .rule('js')
    .test(//@walletconnect/ethereum-provider/dist/*.(js)$/)
    .use('file-loader')
    .loader(require.resolve('file-loader'))
},

结果:

最终解决方案:在.umijs.tsconfig.ts 添加 babel-loader, 我用的是babel-loader@8.3.0

less 复制代码
config.module
  .rule('walletconnect')
  .test(/node_modules[\/]@walletconnect/)
  .use('babel-loader')
  .loader('babel-loader')
  .options({
    presets: [
      ['@babel/preset-env', { modules: false }]
    ]
  });

问题二 Connot find module 'webpack/lib/ModuleFilenameHelper.js'

webpack 版本 4.42.1

解决方案:

由于使用的是全局的 webpack,找不到某些目录,将全局的指向自己当前的项目即可, 在当前项目下执行 npm link webpack

问题三 Module parse failed: Unexpected token

解决方案: babel-loader or 其他的版本不对,升级or降低版本

问题四 npm run build

想起来我本地没开代理, walletConnect 必须要外网才可以

javascript 复制代码
chainWebpack: NODE_ENV === 'development' ? (config) => {
  config.module
    .rule('walletconnect')
    .test(/node_modules[\/]@walletconnect/)
    .use('babel-loader')
    .loader('babel-loader')
    .options({
      presets: [
        ['@babel/preset-env', { modules: false }]
      ]
    });
  // config.module
  //   .rule('web3')
  //   .test(/node_modules[\/]web3[\/]dist/)
  //   // .exclude.add(/node_modules[\/]web3[\/]dist[\/]web3.min.js/).end()
  //   .use('babel-loader')
  //   .loader('babel-loader')
  //   .options({
  //     presets: [
  //       ['@babel/preset-env', { modules: false }]
  //     ]
  //   })
  // config.module.rules.push({
  //   test: /.es.js$/,
  //   loader: 'babel-loader',
  //   exclude: /(node_modules)/
  // })
} : webpackPlugin

问题五 Connot convert undefined or null to object at Function.getPrototypeOf

解决方案参考:WalletConnect/walletconnect-monorepo Issues

将localStorage 清空 , session 清空, cookie 清空,就可以。降低版本应该也可以,但是我没有试

相关推荐
欧科云链7 小时前
欧科云链OKLink:比特币与以太坊“双重启动”将如何撬动市场?
web3
清 晨9 小时前
Web3如何推动元宇宙的去中心化发展?
web3·去中心化·智能合约·元宇宙
TianXuan_Chain9 小时前
web3基于zkEVM的L2扩容方案-Scroll
web3·区块链·零知识证明·l2
dingzd952 天前
走进 Web3:探索分布式网络的未来
web3·去中心化·区块链·互联网
Roun32 天前
元宇宙中的去中心化应用:Web3的未来角色
web3·去中心化·区块链
清 晨2 天前
Web3 生态全景:创新与发展之路
人工智能·web3·去中心化·智能合约
Black_mario3 天前
链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 应用场景
网络·人工智能·web3
TianXuan_Chain3 天前
web3跨链预言机协议-BandProtocol
web3·区块链·预言机
黑客老陈3 天前
新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)
运维·服务器·前端·网络·安全·web3·xss