-
Notifications
You must be signed in to change notification settings - Fork 3
/
wallet.js
93 lines (83 loc) · 2.93 KB
/
wallet.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import {NETWORKS} from "./constants.js";
export const web3 = window.ethereum ? new Web3(ethereum) : undefined;
const isMetamaskConnected = async () => {
if (!web3) {
return false
}
const accounts = await web3.eth.getAccounts();
return accounts.length > 0;
}
export const getWalletAddress = async (refresh=false) => {
const currentAddress = async () => {
if (!window.ethereum) {
return undefined;
}
return ethereum?.selectedAddress ?? await ethereum.request({ method: 'eth_requestAccounts' })[0];
}
if (!ethereum?.selectedAddress) {
await connectMetamask();
if (refresh) {
window.location.reload();
}
}
return await currentAddress();
}
export const getCurrentNetwork = async () => {
return Number(await ethereum.request({ method: 'net_version' }));
}
export const switchNetwork = async (chainID) => {
if (!window.ethereum) {
return
}
const chainIDHex = `0x${chainID.toString(16)}`;
try {
await ethereum.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: chainIDHex }],
});
} catch (error) {
// This error code indicates that the chain has not been added to MetaMask
// if it is not, then install it into the user MetaMask
if (error.code === 4902) {
try {
await ethereum.request({
method: 'wallet_addEthereumChain',
params: [
{
chainId: chainIDHex,
nativeCurrency: NETWORKS[chainID].currency,
chainName: NETWORKS[chainID].name,
rpcUrls: [NETWORKS[chainID].rpcURL],
blockExplorerUrls: [NETWORKS[chainID].blockExplorerURL]
},
],
});
} catch (addError) {
console.error(addError);
}
}
console.error(error);
}
}
export const updateMetamaskStatus = async () => {
const connected = await isMetamaskConnected()
if (connected) {
const button = document.querySelector(window.buttonID ?? '#connect');
button.textContent = "Metamask connected";
}
}
const getIsMobile = () => /Mobi/i.test(window.navigator.userAgent)
|| /iPhone|iPod|iPad/i.test(navigator.userAgent);
export const connectMetamask = async () => {
const isMobile = getIsMobile();
if (window.ethereum) {
await ethereum.request({ method: 'eth_requestAccounts' });
await updateMetamaskStatus();
} else if (isMobile) {
const link = window.location.href
.replace("https://", "")
.replace("www.", "");
window.open(`https://metamask.app.link/dapp/${link}`);
}
}
document.querySelector(window.buttonID ?? '#connect').addEventListener('click', connectMetamask);