/
MagicWeb3Connector.js
89 lines (79 loc) · 2.35 KB
/
MagicWeb3Connector.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
/* global window */
import { ethers } from 'ethers';
import AbstractWeb3Connector from './AbstractWeb3Connector';
export default class MagicWeb3Connector extends AbstractWeb3Connector {
type = 'MagicLink';
async activate({ email, apiKey, network, newSession } = {}) {
let magic = null;
let ether = null;
if (!email) {
throw new Error('"email" not provided, please provide Email');
}
if (!apiKey) {
throw new Error('"apiKey" not provided, please provide Api Key');
}
if (!network) {
throw new Error('"network" not provided, please provide network');
}
let Magic;
try {
Magic = require('magic-sdk')?.Magic;
} catch (error) {
// Do nothing. User might not need walletconnect
}
if (!Magic) {
Magic = window?.Magic;
}
if (!Magic) {
throw new Error('Cannot enable via MagicLink: dependency "magic-sdk" is missing');
}
try {
magic = new Magic(apiKey, {
network: network,
});
if (newSession) {
if (magic?.user) {
try {
await magic?.user?.logout();
} catch (error) {
// Do nothing
}
}
}
ether = new ethers.providers.Web3Provider(magic.rpcProvider);
await magic.auth.loginWithMagicLink({
email: email,
});
} catch (err) {
throw new Error('Error during enable via MagicLink, please double check network and apikey');
}
const loggedIn = await magic.user.isLoggedIn();
if (loggedIn) {
const signer = ether.getSigner();
const { chainId } = await ether.getNetwork();
const address = (await signer.getAddress()).toLowerCase();
// Assign Constants
this.account = address;
this.provider = ether.provider;
this.chainId = `0x${chainId.toString(16)}`;
// Assign magic user for deactivation
this.magicUser = magic;
this.subscribeToEvents(this.provider);
return {
provider: this.provider,
account: this.account,
chainId: this.chainId,
};
}
throw new Error('Error during enable via MagicLink, login to magic failed');
}
deactivate = async () => {
this.unsubscribeToEvents(this.provider);
if (this.magicUser) {
await this.magicUser.user.logout();
}
this.account = null;
this.chainId = null;
this.provider = null;
};
}