Web3Modal和walletconnect连接钱包

9,263 阅读2分钟

最近写了一个钱包的pc端项目,这行的都知道,一般都是用Dapp浏览器在钱包里面打开,直接获取钱包信息。在电脑上,一般也是安装小狐狸(MetaMask),也是可以直接连接。 但是,总是那么些人就是不按套路来。害,那能怎么办,整呗。我来说说我用walletconnect踩的坑:

第一个坑

image.png

这里的报错是因为walletconnect只能在https下打开,我用的是vue,在vue.config.js里面的devServer配置https:true

第二个坑

image.png

我连接的是币安的公链,chainId为56,但是报错,这个问题卡了我许久,我去github找源码看,才知道,不是所有的公链都支持

image.png

但是这并不影响扫码连接钱包。

第三个坑

image.png

也就是因为第二个坑的存在,所以我无法获取到钱包地址的余额,总是会报错。我打印所以的方法确实是存在,但是不能call,像这样:

image.png 这个确实无解,因为不支持币安链,但是我的合约地址是币安的代币,所以报错。没办法,只能换种办法解决,这个项目的需求简单,我只需要获取余额,转账交易的功能都是能通用的。我在官方文档上发现了可以直接请求获取余额。

image.png

注意,获取的余额要除以精度。

image.png

结束了,终于暂时把坑给填了,我还是这方面的小白,网上的资料都很少,所以可能我理解失误,莫怪,希望大佬们能指正。

walletconnect 连接代码

import WalletConnectProvider from '@walletconnect/web3-provider';
import Web3Modal from 'web3modal';
const providerOptions = {
  walletconnect: {
    package: WalletConnectProvider,
    options: {
      infuraId: '',//以太坊连接必填
      // rpc: {
      //   56: 'https://bsc-dataseed1.binance.org',
      // },
      // network: 56,
    },
  },
};

const web3Modal = new Web3Modal({
  network: 'mainnet',
  cacheProvider: true,
  providerOptions,
});

const subscribeProvider = async (provider, newWeb3) => {
  if (!provider.on) {
    return;
  }

  //断开连接
  provider.on('close', () => {
    sessionStorage.removeItem('myAddress');
    localStorage.clear();
    console.log('断开连接')
    closeApp(newWeb3);
  });

  //切换账号
  provider.on('accountsChanged', async (accounts) => {
    let address = await accounts[0];
    console.log('切换账号')
    sessionStorage.setItem('myAddress', address);
  });
};

const closeApp = async (newWeb3) => {
  if (newWeb3 && newWeb3.currentProvider && newWeb3.currentProvider.close) {
    await newWeb3.currentProvider.close();
  }
  await newWeb3.clearCachedProvider();
};

const getAccount = async () => {
  const provider = await web3Modal.connect();
  await web3Modal.toggleModal();
  await subscribeProvider(provider, newWeb3);
  const newWeb3 = new Web3(provider);
  return newWeb3;
};

export default getAccount;

合约调用

const rpc_contractAddr = '';//合约地址
import newWeb3 from './newWeb3';

export const initToken = async () => {
  let web3 = await newWeb3();
  const rpcContract = new web3.eth.Contract(token_abi, rpc_contractAddr); // 构造合约对象

  return rpcContract.methods;
};