最近写了一个钱包的pc端项目,这行的都知道,一般都是用Dapp浏览器在钱包里面打开,直接获取钱包信息。在电脑上,一般也是安装小狐狸(MetaMask),也是可以直接连接。 但是,总是那么些人就是不按套路来。害,那能怎么办,整呗。我来说说我用walletconnect踩的坑:
第一个坑
这里的报错是因为walletconnect只能在https下打开,我用的是vue,在vue.config.js里面的devServer配置https:true
第二个坑
我连接的是币安的公链,chainId为56,但是报错,这个问题卡了我许久,我去github找源码看,才知道,不是所有的公链都支持
但是这并不影响扫码连接钱包。
第三个坑
也就是因为第二个坑的存在,所以我无法获取到钱包地址的余额,总是会报错。我打印所以的方法确实是存在,但是不能call,像这样:
这个确实无解,因为不支持币安链,但是我的合约地址是币安的代币,所以报错。没办法,只能换种办法解决,这个项目的需求简单,我只需要获取余额,转账交易的功能都是能通用的。我在官方文档上发现了可以直接请求获取余额。
注意,获取的余额要除以精度。
结束了,终于暂时把坑给填了,我还是这方面的小白,网上的资料都很少,所以可能我理解失误,莫怪,希望大佬们能指正。
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;
};