Skip to content

Commit f0fe98e

Browse files
author
ignaciosantise
committed
chore: migrated email connector
1 parent 85218aa commit f0fe98e

File tree

7 files changed

+140
-127
lines changed

7 files changed

+140
-127
lines changed

apps/native/App.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
defaultWagmiConfig
1515
} from '@web3modal/wagmi-react-native';
1616

17-
// import { EmailConnector } from '@web3modal/email-wagmi-react-native';
17+
import { emailConnector } from '@web3modal/email-wagmi-react-native';
1818

1919
import {
2020
arbitrum,
@@ -67,13 +67,13 @@ const clipboardClient = {
6767
}
6868
};
6969

70-
// const emailConnector = new EmailConnector({ chains, options: { projectId, metadata } });
70+
const emailConn = emailConnector({ projectId, metadata });
7171

7272
const wagmiConfig = defaultWagmiConfig({
7373
chains,
7474
projectId,
75-
metadata
76-
// extraConnectors: [emailConnector]
75+
metadata,
76+
extraConnectors: [emailConn]
7777
});
7878

7979
const queryClient = new QueryClient();

apps/native/src/views/ActionsView.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ export function ActionsView() {
2626
disabled={isSending}
2727
onPress={() =>
2828
sendTransaction({
29-
to: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', //vitalik.etch
30-
value: parseEther('0.01'),
29+
to: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // vitalik.eth
30+
value: parseEther('0.001'),
3131
data: '0x'
3232
})
3333
}

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
"packages/scaffold-utils",
88
"packages/scaffold",
99
"packages/wagmi",
10+
"packages/coinbase-wagmi",
11+
"packages/email-wagmi",
1012
"packages/email-ethers",
1113
"packages/coinbase-ethers",
1214
"packages/ethers5",
@@ -39,7 +41,7 @@
3941
"@types/qrcode": "1.5.1",
4042
"@types/react": "18.2.34",
4143
"@types/react-native": "0.72.2",
42-
"@walletconnect/react-native-compat": "2.10.5",
44+
"@walletconnect/react-native-compat": "2.13.0",
4345
"babel-jest": "^29.7.0",
4446
"eslint": "^8.46.0",
4547
"eslint-plugin-ft-flow": "2.0.3",

packages/coinbase-wagmi/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ export function coinbaseConnector(parameters: CoinbaseConnectorParameters) {
2323
id: 'coinbaseWallet',
2424
name: 'Coinbase Wallet',
2525
type: coinbaseConnector.type,
26-
async setup() {},
2726
async connect({ chainId } = {}) {
2827
try {
2928
const provider = await this.getProvider();

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
},
4343
"peerDependencies": {
4444
"@react-native-async-storage/async-storage": ">=1.17.0",
45-
"@walletconnect/react-native-compat": ">=2.10.5",
45+
"@walletconnect/react-native-compat": ">=2.13.1",
4646
"react": ">=17",
4747
"react-native": ">=0.68.5"
4848
},

packages/email-wagmi/src/index.ts

Lines changed: 88 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,7 @@
1-
import { type Chain, type ConnectorData, Connector } from 'wagmi';
2-
import { SwitchChainError, createWalletClient, custom, getAddress } from 'viem';
1+
import { createConnector, ChainNotConfiguredError } from 'wagmi';
2+
import { SwitchChainError, getAddress, type Address } from 'viem';
33
import { W3mFrameProvider } from '@web3modal/email-react-native';
44

5-
export type StorageStoreData = {
6-
state: { data?: ConnectorData };
7-
};
8-
9-
interface Config {
10-
chains?: Chain[];
11-
options: EmailProviderOptions;
12-
}
13-
145
export type Metadata = {
156
name: string;
167
description: string;
@@ -27,102 +18,93 @@ type EmailProviderOptions = {
2718
metadata: Metadata;
2819
};
2920

30-
export class EmailConnector extends Connector<W3mFrameProvider, EmailProviderOptions> {
31-
readonly id = 'w3mEmail';
32-
readonly name = 'Web3Modal Email';
33-
readonly ready = true;
34-
35-
private provider: W3mFrameProvider = {} as W3mFrameProvider;
36-
37-
constructor(config: Config) {
38-
super(config);
39-
this.provider = new W3mFrameProvider(config.options.projectId, config.options.metadata);
40-
}
41-
42-
async connect(options: { chainId?: number }): Promise<Required<ConnectorData>> {
43-
const { address, chainId } = await this.provider.connect({ chainId: options?.chainId });
44-
45-
return {
46-
account: address as `0x${string}`,
47-
chain: {
48-
id: chainId,
49-
unsupported: this.isChainUnsupported(1)
50-
}
51-
};
52-
}
53-
54-
async disconnect(): Promise<void> {
55-
await this.provider.disconnect();
56-
}
57-
58-
override async switchChain(chainId: number): Promise<Chain> {
59-
try {
60-
const chain = this.chains?.find(c => c.id === chainId);
61-
if (!chain) {
62-
throw new SwitchChainError(new Error('chain not found on connector.'));
21+
type Provider = W3mFrameProvider;
22+
23+
emailConnector.type = 'w3mEmail' as const;
24+
export function emailConnector(parameters: EmailProviderOptions) {
25+
let _provider: W3mFrameProvider = {} as W3mFrameProvider;
26+
27+
return createConnector<Provider>(config => ({
28+
id: 'w3mEmail',
29+
name: 'Web3Modal Email',
30+
type: emailConnector.type,
31+
async setup() {
32+
_provider = new W3mFrameProvider(parameters.projectId, parameters.metadata);
33+
},
34+
async connect(options = {}) {
35+
const provider = await this.getProvider();
36+
const { address, chainId } = await provider.connect({ chainId: options.chainId });
37+
38+
return {
39+
accounts: [address as Address],
40+
account: address as Address,
41+
chainId,
42+
chain: {
43+
id: chainId,
44+
unsuported: false
45+
}
46+
};
47+
},
48+
async disconnect() {
49+
(await this.getProvider())?.disconnect();
50+
},
51+
async switchChain({ chainId }) {
52+
try {
53+
const chain = config.chains?.find(c => c.id === chainId);
54+
if (!chain) throw new SwitchChainError(new ChainNotConfiguredError());
55+
56+
const provider = await this.getProvider();
57+
await provider.switchNetwork(chainId);
58+
config.emitter.emit('change', { chainId: Number(chainId) });
59+
60+
return chain;
61+
} catch (error) {
62+
if (error instanceof Error) {
63+
throw new SwitchChainError(error);
64+
}
65+
throw error;
6366
}
64-
65-
await this.provider.switchNetwork(chainId);
66-
const unsupported = this.isChainUnsupported(chainId);
67-
this.emit('change', { chain: { id: chainId, unsupported } });
68-
69-
return chain;
70-
} catch (error) {
71-
if (error instanceof Error) {
72-
throw new SwitchChainError(error);
67+
},
68+
async getAccounts() {
69+
const provider = await this.getProvider();
70+
71+
return (
72+
await provider.request({
73+
method: 'eth_accounts'
74+
})
75+
).map(getAddress);
76+
},
77+
async getChainId() {
78+
const provider = await this.getProvider();
79+
const { chainId } = await provider.getChainId();
80+
81+
return chainId;
82+
},
83+
async getProvider() {
84+
return Promise.resolve(_provider);
85+
},
86+
async isAuthorized() {
87+
try {
88+
const provider = await this.getProvider();
89+
const { isConnected } = await provider.isConnected();
90+
91+
return isConnected;
92+
} catch (error) {
93+
return false;
7394
}
74-
throw error;
95+
},
96+
onAccountsChanged(accounts) {
97+
if (accounts.length === 0) config.emitter.emit('disconnect');
98+
else config.emitter.emit('change', { accounts: accounts.map(getAddress) });
99+
},
100+
onChainChanged(chain) {
101+
const chainId = Number(chain);
102+
config.emitter.emit('change', { chainId });
103+
},
104+
async onDisconnect() {
105+
const provider = await this.getProvider();
106+
await provider.disconnect();
107+
config.emitter.emit('disconnect');
75108
}
76-
}
77-
78-
async getAccount(): Promise<`0x${string}`> {
79-
const { address } = await this.provider.connect();
80-
81-
return address as `0x${string}`;
82-
}
83-
84-
async getChainId(): Promise<number> {
85-
const { chainId } = await this.provider.getChainId();
86-
87-
return chainId;
88-
}
89-
90-
async getProvider() {
91-
return Promise.resolve(this.provider);
92-
}
93-
94-
async getWalletClient() {
95-
const { address, chainId } = await this.provider.connect();
96-
97-
return Promise.resolve(
98-
createWalletClient({
99-
account: address as `0x${string}`,
100-
chain: { id: chainId } as Chain,
101-
transport: custom(this.provider)
102-
})
103-
);
104-
}
105-
106-
async isAuthorized(): Promise<boolean> {
107-
const { isConnected } = await this.provider.isConnected();
108-
109-
return isConnected;
110-
}
111-
112-
protected onAccountsChanged = (accounts: string[]) => {
113-
if (accounts.length === 0) this.emit('disconnect');
114-
else this.emit('change', { account: getAddress(accounts[0]!) });
115-
};
116-
117-
protected onChainChanged = (chainId: number | string) => {
118-
const id = Number(chainId);
119-
const unsupported = this.isChainUnsupported(id);
120-
this.emit('change', { chain: { id, unsupported } });
121-
};
122-
123-
async onDisconnect() {
124-
const provider = await this.getProvider();
125-
await provider.disconnect();
126-
this.emit('disconnect');
127-
}
109+
}));
128110
}

yarn.lock

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ __metadata:
128128
"@walletconnect/react-native-compat": "npm:2.10.5"
129129
"@web3modal/wagmi-react-native": "npm:1.4.0-email-beta.5"
130130
babel-plugin-module-resolver: "npm:^5.0.0"
131-
base-64: "npm:1.0.0"
132131
expo: "npm:^50.0.14"
133132
expo-application: "npm:~5.8.3"
134133
expo-clipboard: "npm:~5.0.1"
@@ -10130,6 +10129,25 @@ __metadata:
1013010129
languageName: node
1013110130
linkType: hard
1013210131

10132+
"@walletconnect/react-native-compat@npm:2.13.0":
10133+
version: 2.13.0
10134+
resolution: "@walletconnect/react-native-compat@npm:2.13.0"
10135+
dependencies:
10136+
events: "npm:3.3.0"
10137+
fast-text-encoding: "npm:1.0.6"
10138+
react-native-url-polyfill: "npm:2.0.0"
10139+
peerDependencies:
10140+
"@react-native-async-storage/async-storage": "*"
10141+
"@react-native-community/netinfo": "*"
10142+
expo-application: "*"
10143+
react-native-get-random-values: "*"
10144+
peerDependenciesMeta:
10145+
expo-application:
10146+
optional: true
10147+
checksum: 65fcf4be536360873f8fae18867193e8c63903bd0c282bef17c56326e0b97b4f1b22e3ec1c2539f070596eba23ce3660e4cdaebdea2ae4d3d306b1f607abf35c
10148+
languageName: node
10149+
linkType: hard
10150+
1013310151
"@walletconnect/relay-api@npm:1.0.10":
1013410152
version: 1.0.10
1013510153
resolution: "@walletconnect/relay-api@npm:1.0.10"
@@ -10269,14 +10287,23 @@ __metadata:
1026910287
languageName: unknown
1027010288
linkType: soft
1027110289

10290+
"@web3modal/coinbase-wagmi-react-native@workspace:packages/coinbase-wagmi":
10291+
version: 0.0.0-use.local
10292+
resolution: "@web3modal/coinbase-wagmi-react-native@workspace:packages/coinbase-wagmi"
10293+
peerDependencies:
10294+
"@coinbase/wallet-mobile-sdk": ">=1.0.10"
10295+
wagmi: ">=2"
10296+
languageName: unknown
10297+
linkType: soft
10298+
1027210299
"@web3modal/core-react-native@npm:1.4.0-email-beta.5, @web3modal/core-react-native@workspace:packages/core":
1027310300
version: 0.0.0-use.local
1027410301
resolution: "@web3modal/core-react-native@workspace:packages/core"
1027510302
dependencies:
1027610303
valtio: "npm:1.10.5"
1027710304
peerDependencies:
1027810305
"@react-native-async-storage/async-storage": ">=1.17.0"
10279-
"@walletconnect/react-native-compat": ">=2.10.5"
10306+
"@walletconnect/react-native-compat": ">=2.13.1"
1028010307
react: ">=17"
1028110308
react-native: ">=0.68.5"
1028210309
languageName: unknown
@@ -10305,6 +10332,16 @@ __metadata:
1030510332
languageName: unknown
1030610333
linkType: soft
1030710334

10335+
"@web3modal/email-wagmi-react-native@workspace:packages/email-wagmi":
10336+
version: 0.0.0-use.local
10337+
resolution: "@web3modal/email-wagmi-react-native@workspace:packages/email-wagmi"
10338+
dependencies:
10339+
"@web3modal/email-react-native": "npm:1.4.0-email-beta.5"
10340+
peerDependencies:
10341+
wagmi: ">=1 <2"
10342+
languageName: unknown
10343+
linkType: soft
10344+
1030810345
"@web3modal/ethers-react-native@workspace:packages/ethers":
1030910346
version: 0.0.0-use.local
1031010347
resolution: "@web3modal/ethers-react-native@workspace:packages/ethers"
@@ -11553,13 +11590,6 @@ __metadata:
1155311590
languageName: node
1155411591
linkType: hard
1155511592

11556-
"base-64@npm:1.0.0":
11557-
version: 1.0.0
11558-
resolution: "base-64@npm:1.0.0"
11559-
checksum: d886cb3236cee0bed9f7075675748b59b32fad623ddb8ce1793c790306aa0f76a03238cad4b3fb398abda6527ce08a5588388533a4ccade0b97e82b9da660e28
11560-
languageName: node
11561-
linkType: hard
11562-
1156311593
"base64-js@npm:^1.1.2, base64-js@npm:^1.2.3, base64-js@npm:^1.3.1, base64-js@npm:^1.5.1":
1156411594
version: 1.5.1
1156511595
resolution: "base64-js@npm:1.5.1"
@@ -15101,7 +15131,7 @@ __metadata:
1510115131
languageName: node
1510215132
linkType: hard
1510315133

15104-
"fast-text-encoding@npm:^1.0.6":
15134+
"fast-text-encoding@npm:1.0.6, fast-text-encoding@npm:^1.0.6":
1510515135
version: 1.0.6
1510615136
resolution: "fast-text-encoding@npm:1.0.6"
1510715137
checksum: e1d0381bda229c92c7906f63308f3b9caca8c78b732768b1ee16f560089ed21bc159bbe1434138ccd3815931ec8d4785bdade1ad1c45accfdf27ac6606ac67d2
@@ -22446,7 +22476,7 @@ __metadata:
2244622476
languageName: node
2244722477
linkType: hard
2244822478

22449-
"react-native-url-polyfill@npm:^2.0.0":
22479+
"react-native-url-polyfill@npm:2.0.0, react-native-url-polyfill@npm:^2.0.0":
2245022480
version: 2.0.0
2245122481
resolution: "react-native-url-polyfill@npm:2.0.0"
2245222482
dependencies:
@@ -23374,7 +23404,7 @@ __metadata:
2337423404
"@types/qrcode": "npm:1.5.1"
2337523405
"@types/react": "npm:18.2.34"
2337623406
"@types/react-native": "npm:0.72.2"
23377-
"@walletconnect/react-native-compat": "npm:2.10.5"
23407+
"@walletconnect/react-native-compat": "npm:2.13.0"
2337823408
babel-jest: "npm:^29.7.0"
2337923409
eslint: "npm:^8.46.0"
2338023410
eslint-plugin-ft-flow: "npm:2.0.3"

0 commit comments

Comments
 (0)