Skip to content

Commit e324d3c

Browse files
authored
Feature/wallet connect 2.0 (#236)
* added walletconnect 2.0 support
1 parent 46ac840 commit e324d3c

9 files changed

Lines changed: 1399 additions & 28 deletions

File tree

package-lock.json

Lines changed: 1299 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "etherspot",
3-
"version": "1.43.9",
3+
"version": "1.44.0",
44
"description": "Etherspot SDK",
55
"keywords": [
66
"ether",
@@ -45,6 +45,7 @@
4545
"@etherspot/contracts": "1.9.9",
4646
"@lifi/sdk": "1.6.4",
4747
"@nerdwallet/apollo-cache-policies": "1.2.1",
48+
"@walletconnect/universal-provider": "^2.10.0",
4849
"class-transformer": "0.4.0",
4950
"class-validator": "0.14.0",
5051
"cross-fetch": "3.1.5",

src/sdk/sdk.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,14 @@ import {
180180
KnownContract,
181181
} from './transactions';
182182
import { State, StateService } from './state';
183-
import { WalletService, isWalletProvider, WalletProviderLike } from './wallet';
183+
import {
184+
WalletService,
185+
isWalletProvider,
186+
WalletProviderLike,
187+
isWalletConnectProvider,
188+
WalletConnect2WalletProvider,
189+
EthereumProvider,
190+
} from './wallet';
184191

185192
/**
186193
* Sdk
@@ -196,7 +203,10 @@ export class Sdk {
196203
constructor(walletProvider: WalletProviderLike, optionsLike?: EnvNames | SdkOptions) {
197204
let options: SdkOptions = {};
198205

199-
if (!isWalletProvider(walletProvider)) {
206+
let walletConnectProvider;
207+
if (isWalletConnectProvider(walletProvider)) {
208+
walletConnectProvider = new WalletConnect2WalletProvider(walletProvider as EthereumProvider);
209+
} else if (!isWalletProvider(walletProvider)) {
200210
throw new Exception('Invalid wallet provider');
201211
}
202212

@@ -239,7 +249,7 @@ export class Sdk {
239249

240250
this.services = {
241251
networkService: new NetworkService(networkOptions, networkName),
242-
walletService: new WalletService(walletProvider, {
252+
walletService: new WalletService(walletConnectProvider ?? walletProvider, {
243253
omitProviderNetworkCheck: omitWalletProviderNetworkCheck,
244254
}),
245255
sessionService: new SessionService({

src/sdk/wallet/providers/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ export * from './key.wallet-provider';
44
export * from './meta-mask.wallet-provider';
55
export * from './utils';
66
export * from './wallet-connect.wallet-provider';
7+
export * from './wallet-connect-2.wallet-provider';
78
export * from './web3.wallet-provider';
89
export * from './web3eip1193.wallet-provider';

src/sdk/wallet/providers/interfaces.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { BytesLike, Wallet } from 'ethers';
2+
import type UniversalProvider from '@walletconnect/universal-provider';
23
import { UniqueSubject } from '../../common';
34
import { NetworkNames } from '../../network';
45

@@ -25,6 +26,20 @@ export interface Web3eip1193Provider {
2526
request(args: RequestArguments): any;
2627
}
2728

29+
export declare class EthereumProvider {
30+
accounts: string[];
31+
signer: InstanceType<typeof UniversalProvider>;
32+
chainId: number;
33+
request<T = unknown>(args: RequestArguments): Promise<T>;
34+
sendAsync(args: RequestArguments, callback: (error: Error | null, response: any) => void): void;
35+
disconnect(): Promise<void>;
36+
on(event: string, callback: (error: Error | null, payload: any | null) => void): void;
37+
once(event: string, callback: (error: Error | null, payload: any | null) => void): void;
38+
removeListener(event: string, callback: (error: Error | null, payload: any | null) => void): void;
39+
off(event: string, callback: (error: Error | null, payload: any | null) => void): void;
40+
readonly isWalletConnect?: boolean;
41+
}
42+
2843
export interface WalletConnectConnector {
2944
accounts: string[];
3045
chainId: number;
@@ -36,4 +51,4 @@ export interface WalletLike {
3651
privateKey: string;
3752
}
3853

39-
export type WalletProviderLike = string | WalletLike | WalletProvider;
54+
export type WalletProviderLike = string | WalletLike | WalletProvider | EthereumProvider;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './is-wallet-provider';
2+
export * from './is-wallet-connect-provider';
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { EthereumProvider, WalletProviderLike } from '../interfaces';
2+
3+
export function isWalletConnectProvider(provider: WalletProviderLike): boolean {
4+
return typeof provider === 'object' && (provider as EthereumProvider)?.isWalletConnect;
5+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { BytesLike } from 'ethers';
2+
import { toHex } from '../../common';
3+
import { DynamicWalletProvider } from './dynamic.wallet-provider';
4+
import { EthereumProvider } from './interfaces';
5+
6+
export class WalletConnect2WalletProvider extends DynamicWalletProvider {
7+
constructor(readonly provider: EthereumProvider) {
8+
super('WalletConnect2');
9+
10+
try {
11+
const {
12+
accounts: [address],
13+
chainId,
14+
} = provider;
15+
16+
this.setAddress(address);
17+
this.setNetworkName(chainId);
18+
} catch (err) {
19+
//
20+
}
21+
22+
this.updateSessionHandler = this.updateSessionHandler.bind(this);
23+
24+
provider.on('connect', this.updateSessionHandler);
25+
provider.on('session_event', this.updateSessionHandler);
26+
provider.on('disconnect', () => {
27+
this.setAddress(null);
28+
this.setNetworkName(null);
29+
});
30+
}
31+
32+
async signMessage(message: BytesLike): Promise<string> {
33+
const response = await this.provider.signer.request({
34+
method: 'personal_sign',
35+
params: [toHex(message), this.address],
36+
});
37+
38+
return typeof response === 'string' ? response : null;
39+
}
40+
41+
protected updateSessionHandler(error: Error, payload: { params: { accounts: string[]; chainId: number } }): void {
42+
let address: string = null;
43+
let chainId: number = null;
44+
45+
if (!error) {
46+
try {
47+
({
48+
accounts: [address],
49+
chainId,
50+
} = payload.params[0]);
51+
} catch (err) {
52+
address = null;
53+
chainId = null;
54+
}
55+
}
56+
57+
this.setAddress(address);
58+
this.setNetworkName(chainId);
59+
}
60+
}

tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
"ES5",
1818
"es2015.collection",
1919
"es2015.iterable"
20-
]
20+
],
21+
"skipLibCheck": true
2122
},
2223
"include": [
2324
"./examples/**/*.ts",

0 commit comments

Comments
 (0)