赞
踩
Vue+Web3链接常用的钱包配置项
"dependencies": {
"@coinbase/wallet-sdk": "^3.0.3",
"@walletconnect/web3-provider": "^1.7.4",
"fortmatic": "^2.2.1",
"jsencrypt": "^3.2.1",
"vue": "2.6.14",
"vue-awesome-swiper": "^4.1.1",
"vue-color": "^2.8.1",
"vue-moment": "^4.1.0",
"vue-router": "^3.0.1",
"vuex": "3.6.2",
"web3": "^1.7.1",
"web3modal": "^1.9.5"
},
公用代码封装
import Web3 from "web3"; import Fortmatic from 'fortmatic' import WalletConnectProvider from "@walletconnect/web3-provider"; import CoinbaseWalletSDK from "@coinbase/wallet-sdk"; //获取各个钱包的provider const modalItemClick = async (name) => { let provider if (name === 'injected') { // injected METAMASK const { ethereum } = window if (ethereum && ethereum.isMetaMask) { provider = ethereum } else { const href = document.location.host + document.location.pathname //跳转metamask app location.href = `https://metamask.app.link/dapp/${href}` } else if (name === 'walletlink') { let walletLink = new CoinbaseWalletSDK({ appName: 'NFTSTAR', infuraId: INFURA_ID }) provider = walletLink.makeWeb3Provider(DEFAULT_ETH_JSONRPC_URL, DEFAULT_CHAIN_ID) } else if (name === 'walletconnect') { // Walletconnect provider = new WalletConnectProvider({ infuraId: INFURA_ID }) } else if (name === 'fortmatic') { // Fortmatic let fm = new Fortmatic(FORTMATIC_KEY, { rpcUrl: DEFAULT_ETH_JSONRPC_URL, chianId: process.env.VUE_APP_ETH_CHAIN_ID }) provider = fm.getProvider() } if (provider) { try { await provider.enable() } catch { return } return provider } } const fetchAccountData = async (provider) => { store.commit('setWalletModal', { showWallet: false }) const web3 = new Web3(provider) // Get connected chain id from Ethereum node const chainId = await web3.eth.getChainId() if (chainId != process.env.VUE_APP_ETH_CHAIN_ID) { //判断是否ETH主链 //不是主链,你要干点啥都行 } const accounts = await web3.eth.getAccounts() //钱包地址存入VUEX store.commit('setWalletAddress', { address: accounts[0] }) if (provider.on) { // 监听地址变更d provider.on('accountsChanged', (accounts) => { store.commit('setWalletAddress', { address: accounts[0] }) // window.location.reload() }) // 监听网络变更 provider.on('chainChanged', (chainId) => { window.location.reload() }) } // 获取钱包余额 // const rowResolvers = accounts.map(async (address) => { // store.commit('setWalletBalance', { balance: await web3.eth.getBalance(address) }) // const ethBalance = web3.utils.fromWei(store.state.wallet.balance, 'ether') // // console.log('ethBalance: ', ethBalance) // const humanFriendlyBalance = parseFloat(ethBalance).toFixed(4) // // console.log('humanFriendlyBalance: ', humanFriendlyBalance) // }) // await Promise.all(rowResolvers) } export { modalItemClick, fetchAccountData }
//钱包组件 wallet-address-login.vue
<template> <div class="wallet-address-login"> <!-- 选择钱包 --> <van-popup class="walletModule" v-model="showWallet" style="width: 90%"> <div class="wallet-collection"> <ul class="wallet"> <li class="item" v-for="item in walletList" :key="item.index" @click="walletModalClick(item.name)"> <img class="icon" :src="item.icon" alt="" /> <div class="title">{{ item.title }}</div> <div class="tips">{{ item.tips }}</div> </li> </ul> </div> </van-popup> <div class="showLoading" v-show="showWalletMouleLoading"> <van-loading color="#00EAAA" vertical text-color="#fff">Loading...</van-loading> </div> </div> </template> <script> // 钱包登录相关 import Web3 from 'web3' import walletCollection from '@/components/common/walletCollection.vue' import { modalItemClick, fetchAccountData } from '@/web3Modal/index.js' export default { data() { return { walletList: [ { icon:'钱包icon', title: 'MetaMask', tips: 'Connect to your MetaMask Wallet', index: 1, name: 'injected' }, { icon:'钱包icon', title: 'WalletConnect', tips: 'Scan with WalletConnect to connect', index: 2, name: 'walletconnect' }, { icon:'钱包icon', title: 'Fortmatic', tips: 'Connect with your Fortmatic account', index: 3, name: 'fortmatic' }, { icon:'钱包icon', title: 'Coinbase Wallet', tips: 'Scan with Coinbase Wallet to connect', index: 4, name: 'walletlink' } ] } }, computed: { address() { return this.$store.state.wallet.address }, showWallet: { get: function () { return this.$store.state.showWallet }, // setter set: function (newValue) { this.$store.commit('setWalletModal', { showWallet: newValue }) } }, showWalletMouleLoading() { return this.$store.state.showWalletMouleLoading } }, methods: { async walletModalClick(name) { sessionStorage.setItem('walletConnectName', name) if (name == 'fortmatic') { this.$store.commit('setWalletMouleLoading', { showWalletMouleLoading: true }) } this.$store.commit('setWalletConnectName', { walletConnectName: name }) const provider = await modalItemClick(name) await fetchAccountData(provider) }, components: { walletCollection } } </script> <style lang="stylus" scoped> .wallet-address-login { .showLoading { position: fixed; z-index: 10000; left: 0; top: 0; width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; background: rgba(0, 0, 0, 0.5); } } </style>
//调用组件
//父组件引入 import walletAddressLogin from '@/components/common/wallet-address-login' export default { components: { walletAddressLogin }, computed: { showLoading() { return this.$store.state.waitingToLoad } } } //调用组件 <wallet-address-login></wallet-address-login> methods:{ connectWallet(){ this.$store.commit('setWalletModal', { showWallet: true }) } }
有不明白的可以私聊讨论,web3modal有现成的钱包组件弹窗,以上争对移动端自定义的钱包组件,下一篇会写PC端的web3modal使用方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。