@broxus/evm-connect 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +182 -0
- package/dist/cjs/components/EvmConnectButton/index.d.ts +21 -0
- package/dist/cjs/components/EvmConnectButton/index.js +52 -0
- package/dist/cjs/components/EvmConnectDialog/index.css +130 -0
- package/dist/cjs/components/EvmConnectDialog/index.d.ts +11 -0
- package/dist/cjs/components/EvmConnectDialog/index.js +65 -0
- package/dist/cjs/components/EvmConnector/index.css +37 -0
- package/dist/cjs/components/EvmConnector/index.d.ts +20 -0
- package/dist/cjs/components/EvmConnector/index.js +97 -0
- package/dist/cjs/components/EvmProvidersDispatcher/ConnectionRequest/index.css +43 -0
- package/dist/cjs/components/EvmProvidersDispatcher/ConnectionRequest/index.d.ts +3 -0
- package/dist/cjs/components/EvmProvidersDispatcher/ConnectionRequest/index.js +65 -0
- package/dist/cjs/components/EvmProvidersDispatcher/ProviderButton/index.css +54 -0
- package/dist/cjs/components/EvmProvidersDispatcher/ProviderButton/index.d.ts +11 -0
- package/dist/cjs/components/EvmProvidersDispatcher/ProviderButton/index.js +93 -0
- package/dist/cjs/components/EvmProvidersDispatcher/index.css +13 -0
- package/dist/cjs/components/EvmProvidersDispatcher/index.d.ts +5 -0
- package/dist/cjs/components/EvmProvidersDispatcher/index.js +49 -0
- package/dist/cjs/components/index.d.ts +4 -0
- package/dist/cjs/components/index.js +20 -0
- package/dist/cjs/constants.d.ts +1 -0
- package/dist/cjs/constants.js +4 -0
- package/dist/cjs/context/EvmWalletProvidersContext.d.ts +20 -0
- package/dist/cjs/context/EvmWalletProvidersContext.js +95 -0
- package/dist/cjs/context/EvmWalletServiceContext.d.ts +10 -0
- package/dist/cjs/context/EvmWalletServiceContext.js +55 -0
- package/dist/cjs/context/index.d.ts +2 -0
- package/dist/cjs/context/index.js +18 -0
- package/dist/cjs/core/EIP6963Connector.d.ts +17 -0
- package/dist/cjs/core/EIP6963Connector.js +127 -0
- package/dist/cjs/core/EthereumConnector.d.ts +43 -0
- package/dist/cjs/core/EthereumConnector.js +190 -0
- package/dist/cjs/core/MetaMask.d.ts +24 -0
- package/dist/cjs/core/MetaMask.js +159 -0
- package/dist/cjs/core/WalletConnect.d.ts +20 -0
- package/dist/cjs/core/WalletConnect.js +141 -0
- package/dist/cjs/core/index.d.ts +4 -0
- package/dist/cjs/core/index.js +20 -0
- package/dist/cjs/hooks/index.d.ts +4 -0
- package/dist/cjs/hooks/index.js +20 -0
- package/dist/cjs/hooks/useEIP6963Connections.d.ts +6 -0
- package/dist/cjs/hooks/useEIP6963Connections.js +47 -0
- package/dist/cjs/hooks/useFilteredConnections.d.ts +2 -0
- package/dist/cjs/hooks/useFilteredConnections.js +7 -0
- package/dist/cjs/hooks/useOrderedConnections.d.ts +2 -0
- package/dist/cjs/hooks/useOrderedConnections.js +41 -0
- package/dist/cjs/hooks/useRecentConnectionMeta.d.ts +15 -0
- package/dist/cjs/hooks/useRecentConnectionMeta.js +80 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/intl/index.d.ts +107 -0
- package/dist/cjs/intl/index.js +110 -0
- package/dist/cjs/services/EvmWalletService.d.ts +165 -0
- package/dist/cjs/services/EvmWalletService.js +430 -0
- package/dist/cjs/services/index.d.ts +1 -0
- package/dist/cjs/services/index.js +17 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/types.d.ts +47 -0
- package/dist/cjs/types.js +15 -0
- package/dist/cjs/utils/get-evm-provider-platform-link.d.ts +2 -0
- package/dist/cjs/utils/get-evm-provider-platform-link.js +14 -0
- package/dist/cjs/utils/index.d.ts +2 -0
- package/dist/cjs/utils/index.js +18 -0
- package/dist/cjs/utils/parse-chain-id.d.ts +1 -0
- package/dist/cjs/utils/parse-chain-id.js +7 -0
- package/dist/esm/components/EvmConnectButton/index.d.ts +21 -0
- package/dist/esm/components/EvmConnectButton/index.js +26 -0
- package/dist/esm/components/EvmConnectDialog/index.css +130 -0
- package/dist/esm/components/EvmConnectDialog/index.d.ts +11 -0
- package/dist/esm/components/EvmConnectDialog/index.js +36 -0
- package/dist/esm/components/EvmConnector/index.css +37 -0
- package/dist/esm/components/EvmConnector/index.d.ts +20 -0
- package/dist/esm/components/EvmConnector/index.js +68 -0
- package/dist/esm/components/EvmProvidersDispatcher/ConnectionRequest/index.css +43 -0
- package/dist/esm/components/EvmProvidersDispatcher/ConnectionRequest/index.d.ts +3 -0
- package/dist/esm/components/EvmProvidersDispatcher/ConnectionRequest/index.js +35 -0
- package/dist/esm/components/EvmProvidersDispatcher/ProviderButton/index.css +54 -0
- package/dist/esm/components/EvmProvidersDispatcher/ProviderButton/index.d.ts +11 -0
- package/dist/esm/components/EvmProvidersDispatcher/ProviderButton/index.js +64 -0
- package/dist/esm/components/EvmProvidersDispatcher/index.css +13 -0
- package/dist/esm/components/EvmProvidersDispatcher/index.d.ts +5 -0
- package/dist/esm/components/EvmProvidersDispatcher/index.js +23 -0
- package/dist/esm/components/index.d.ts +4 -0
- package/dist/esm/components/index.js +4 -0
- package/dist/esm/constants.d.ts +1 -0
- package/dist/esm/constants.js +1 -0
- package/dist/esm/context/EvmWalletProvidersContext.d.ts +20 -0
- package/dist/esm/context/EvmWalletProvidersContext.js +68 -0
- package/dist/esm/context/EvmWalletServiceContext.d.ts +10 -0
- package/dist/esm/context/EvmWalletServiceContext.js +28 -0
- package/dist/esm/context/index.d.ts +2 -0
- package/dist/esm/context/index.js +2 -0
- package/dist/esm/core/EIP6963Connector.d.ts +17 -0
- package/dist/esm/core/EIP6963Connector.js +123 -0
- package/dist/esm/core/EthereumConnector.d.ts +43 -0
- package/dist/esm/core/EthereumConnector.js +186 -0
- package/dist/esm/core/MetaMask.d.ts +24 -0
- package/dist/esm/core/MetaMask.js +152 -0
- package/dist/esm/core/WalletConnect.d.ts +20 -0
- package/dist/esm/core/WalletConnect.js +134 -0
- package/dist/esm/core/index.d.ts +4 -0
- package/dist/esm/core/index.js +4 -0
- package/dist/esm/hooks/index.d.ts +4 -0
- package/dist/esm/hooks/index.js +4 -0
- package/dist/esm/hooks/useEIP6963Connections.d.ts +6 -0
- package/dist/esm/hooks/useEIP6963Connections.js +20 -0
- package/dist/esm/hooks/useFilteredConnections.d.ts +2 -0
- package/dist/esm/hooks/useFilteredConnections.js +3 -0
- package/dist/esm/hooks/useOrderedConnections.d.ts +2 -0
- package/dist/esm/hooks/useOrderedConnections.js +14 -0
- package/dist/esm/hooks/useRecentConnectionMeta.d.ts +15 -0
- package/dist/esm/hooks/useRecentConnectionMeta.js +51 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/intl/index.d.ts +107 -0
- package/dist/esm/intl/index.js +108 -0
- package/dist/esm/services/EvmWalletService.d.ts +165 -0
- package/dist/esm/services/EvmWalletService.js +423 -0
- package/dist/esm/services/index.d.ts +1 -0
- package/dist/esm/services/index.js +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/types.d.ts +47 -0
- package/dist/esm/types.js +12 -0
- package/dist/esm/utils/get-evm-provider-platform-link.d.ts +2 -0
- package/dist/esm/utils/get-evm-provider-platform-link.js +10 -0
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.js +2 -0
- package/dist/esm/utils/parse-chain-id.d.ts +1 -0
- package/dist/esm/utils/parse-chain-id.js +3 -0
- package/package.json +82 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import detectEthereumProvider from '@metamask/detect-provider';
|
|
2
|
+
import { type EthExecutionAPI, type MetaMaskProvider, type ProviderConnectInfo } from 'web3-types';
|
|
3
|
+
import { EthereumConnector, type EthereumConnectorCtorParams } from '../core/EthereumConnector';
|
|
4
|
+
import { type AddEthereumChainParams, ConnectionType } from '../types';
|
|
5
|
+
interface MetaMaskEthereumProvider extends MetaMaskProvider<EthExecutionAPI> {
|
|
6
|
+
isConnected?: () => boolean;
|
|
7
|
+
providers?: MetaMaskEthereumProvider[];
|
|
8
|
+
get accounts(): string[];
|
|
9
|
+
get chainId(): string;
|
|
10
|
+
}
|
|
11
|
+
export interface MetaMaskCtorParams extends EthereumConnectorCtorParams {
|
|
12
|
+
options?: Parameters<typeof detectEthereumProvider>[0];
|
|
13
|
+
}
|
|
14
|
+
export declare class MetaMask extends EthereumConnector {
|
|
15
|
+
protected readonly params?: Readonly<MetaMaskCtorParams> | undefined;
|
|
16
|
+
readonly type = ConnectionType.INJECTED;
|
|
17
|
+
provider?: MetaMaskEthereumProvider;
|
|
18
|
+
constructor(params?: Readonly<MetaMaskCtorParams> | undefined);
|
|
19
|
+
connect(chainIdOrParams?: number | AddEthereumChainParams): Promise<void>;
|
|
20
|
+
disconnect(): Promise<void>;
|
|
21
|
+
protected init(): Promise<void>;
|
|
22
|
+
protected handleConnect({ chainId }: ProviderConnectInfo): void;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { debug, error, throwException } from '@broxus/js-utils';
|
|
11
|
+
import detectEthereumProvider from '@metamask/detect-provider';
|
|
12
|
+
import { action, makeObservable, override } from 'mobx';
|
|
13
|
+
import { EthereumConnector } from '../core/EthereumConnector';
|
|
14
|
+
import { ConnectionType, EIP6963Event } from '../types';
|
|
15
|
+
import { parseChainId } from '../utils';
|
|
16
|
+
const INJECTABLE_WALLETS = ['isBraveWallet', 'isRabby', 'isLedgerConnect', 'isTrust'];
|
|
17
|
+
export class MetaMask extends EthereumConnector {
|
|
18
|
+
params;
|
|
19
|
+
type = ConnectionType.INJECTED;
|
|
20
|
+
constructor(params) {
|
|
21
|
+
super(params);
|
|
22
|
+
this.params = params;
|
|
23
|
+
makeObservable(this);
|
|
24
|
+
this.init().catch(error);
|
|
25
|
+
}
|
|
26
|
+
async connect(chainIdOrParams) {
|
|
27
|
+
if (!this.provider) {
|
|
28
|
+
throw new Error('Provider is not defined');
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
this.setState('isConnecting', true);
|
|
32
|
+
const accounts = (await this.provider.request({ method: 'eth_requestAccounts' }));
|
|
33
|
+
const chainId = (await this.provider.request({ method: 'eth_chainId' }));
|
|
34
|
+
debug('Connect to MetaMask connection', accounts, chainId);
|
|
35
|
+
const receivedChainId = parseChainId(chainId);
|
|
36
|
+
const desiredChainId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId;
|
|
37
|
+
if (!desiredChainId || receivedChainId === desiredChainId) {
|
|
38
|
+
this.setData({ accounts, chainId: receivedChainId });
|
|
39
|
+
this.setState({ isConnecting: false, isInitialized: true });
|
|
40
|
+
debug('MetaMask connection has skipped network switching.');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (!chainIdOrParams) {
|
|
44
|
+
debug('MetaMask connection has skipped network switching. Chain params or chainId is not provided.');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
debug('MetaMask connection trying to switch network.');
|
|
48
|
+
await this.switchNetwork(chainIdOrParams).then(async () => {
|
|
49
|
+
await this.connect(desiredChainId);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
this.setState('isConnecting', false);
|
|
54
|
+
throw e;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async disconnect() {
|
|
58
|
+
if (!this.provider) {
|
|
59
|
+
this.setState('isDisconnecting', false);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
debug('Disconnect from MetaMask connection');
|
|
64
|
+
this.setState('isDisconnecting', true);
|
|
65
|
+
this.setData({ accounts: undefined, chainId: undefined });
|
|
66
|
+
this.setState('isDisconnecting', false);
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
this.setState('isDisconnecting', false);
|
|
70
|
+
throw e;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async init() {
|
|
74
|
+
const onAnnouncement = (event) => {
|
|
75
|
+
if (event.detail.info.name === 'MetaMask' && event.detail.info.rdns === 'io.metamask') {
|
|
76
|
+
this.provider = event.detail.provider;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
try {
|
|
80
|
+
this.setState('isInitializing', true);
|
|
81
|
+
const provider = await detectEthereumProvider(this.params?.options);
|
|
82
|
+
if (provider) {
|
|
83
|
+
this.provider = provider;
|
|
84
|
+
// Handle the case when e.g. metamask and coinbase wallet are both installed
|
|
85
|
+
if (this.provider.providers?.length) {
|
|
86
|
+
this.provider = this.provider.providers.find(value => value.isMetaMask) ?? this.provider.providers[0];
|
|
87
|
+
}
|
|
88
|
+
window.addEventListener(EIP6963Event.ANNOUNCE_PROVIDER, onAnnouncement);
|
|
89
|
+
window.dispatchEvent(new Event(EIP6963Event.REQUEST_PROVIDER));
|
|
90
|
+
if (Object.keys(provider).some(key => INJECTABLE_WALLETS.includes(key))) {
|
|
91
|
+
this.provider = undefined;
|
|
92
|
+
throwException('No MetaMask provider found');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
window.removeEventListener(EIP6963Event.ANNOUNCE_PROVIDER, onAnnouncement);
|
|
98
|
+
}
|
|
99
|
+
if (!this.provider) {
|
|
100
|
+
this.setState({ isInitialized: false, isInitializing: false });
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
this.provider.on('accountsChanged', this.handleAccountsChanged);
|
|
105
|
+
this.provider.on('chainChanged', this.handleChainChanged);
|
|
106
|
+
this.provider.on('connect', this.handleConnect);
|
|
107
|
+
this.provider.on('disconnect', this.handleDisconnect);
|
|
108
|
+
const accounts = (await this.provider.request({ method: 'eth_accounts' }));
|
|
109
|
+
if (!accounts.length) {
|
|
110
|
+
throwException('No accounts returned');
|
|
111
|
+
}
|
|
112
|
+
const chainId = (await this.provider.request({ method: 'eth_chainId' }));
|
|
113
|
+
this.setData({ accounts, chainId: parseChainId(chainId) });
|
|
114
|
+
this.setState({ isInitialized: true, isInitializing: false });
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
debug('MetaMask could not be pre-connected', e);
|
|
118
|
+
this.setState({ isInitialized: false, isInitializing: false });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
handleConnect({ chainId }) {
|
|
122
|
+
this.setData({ chainId: parseChainId(chainId) });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
__decorate([
|
|
126
|
+
override,
|
|
127
|
+
__metadata("design:type", Object)
|
|
128
|
+
], MetaMask.prototype, "provider", void 0);
|
|
129
|
+
__decorate([
|
|
130
|
+
action.bound,
|
|
131
|
+
__metadata("design:type", Function),
|
|
132
|
+
__metadata("design:paramtypes", [Object]),
|
|
133
|
+
__metadata("design:returntype", Promise)
|
|
134
|
+
], MetaMask.prototype, "connect", null);
|
|
135
|
+
__decorate([
|
|
136
|
+
action.bound,
|
|
137
|
+
__metadata("design:type", Function),
|
|
138
|
+
__metadata("design:paramtypes", []),
|
|
139
|
+
__metadata("design:returntype", Promise)
|
|
140
|
+
], MetaMask.prototype, "disconnect", null);
|
|
141
|
+
__decorate([
|
|
142
|
+
action.bound,
|
|
143
|
+
__metadata("design:type", Function),
|
|
144
|
+
__metadata("design:paramtypes", []),
|
|
145
|
+
__metadata("design:returntype", Promise)
|
|
146
|
+
], MetaMask.prototype, "init", null);
|
|
147
|
+
__decorate([
|
|
148
|
+
action.bound,
|
|
149
|
+
__metadata("design:type", Function),
|
|
150
|
+
__metadata("design:paramtypes", [Object]),
|
|
151
|
+
__metadata("design:returntype", void 0)
|
|
152
|
+
], MetaMask.prototype, "handleConnect", null);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import EthereumProvider, { type EthereumProviderOptions } from '@walletconnect/ethereum-provider';
|
|
2
|
+
import { EthereumConnector, type EthereumConnectorCtorParams } from '../core';
|
|
3
|
+
import { type AddEthereumChainParams, ConnectionType } from '../types';
|
|
4
|
+
export interface WalletConnectOptions extends Omit<EthereumProviderOptions, 'rpcMap'> {
|
|
5
|
+
rpcMap?: Record<number, string | string[]>;
|
|
6
|
+
}
|
|
7
|
+
export interface WalletConnectCtorParams extends EthereumConnectorCtorParams {
|
|
8
|
+
options: WalletConnectOptions;
|
|
9
|
+
}
|
|
10
|
+
export declare class WalletConnect extends EthereumConnector {
|
|
11
|
+
protected readonly params: Readonly<WalletConnectCtorParams>;
|
|
12
|
+
readonly type = ConnectionType.WALLET_CONNECT_V2;
|
|
13
|
+
provider?: EthereumProvider;
|
|
14
|
+
protected readonly options: WalletConnectOptions;
|
|
15
|
+
constructor(params: Readonly<WalletConnectCtorParams>);
|
|
16
|
+
connect(chainIdOrParams?: number | AddEthereumChainParams): Promise<void>;
|
|
17
|
+
disconnect(): Promise<void>;
|
|
18
|
+
protected init(): Promise<void>;
|
|
19
|
+
protected createProvider(): Promise<EthereumProvider>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { debug, error, throwException } from '@broxus/js-utils';
|
|
11
|
+
import EthereumProvider from '@walletconnect/ethereum-provider';
|
|
12
|
+
import { action, makeObservable, override } from 'mobx';
|
|
13
|
+
import { EthereumConnector } from '../core';
|
|
14
|
+
import { ConnectionType } from '../types';
|
|
15
|
+
export class WalletConnect extends EthereumConnector {
|
|
16
|
+
params;
|
|
17
|
+
type = ConnectionType.WALLET_CONNECT_V2;
|
|
18
|
+
options;
|
|
19
|
+
constructor(params) {
|
|
20
|
+
super(params);
|
|
21
|
+
this.params = params;
|
|
22
|
+
this.options = params.options;
|
|
23
|
+
makeObservable(this);
|
|
24
|
+
this.init().catch(error);
|
|
25
|
+
}
|
|
26
|
+
async connect(chainIdOrParams) {
|
|
27
|
+
const provider = await this.createProvider();
|
|
28
|
+
const desiredChainId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId;
|
|
29
|
+
if (provider.session) {
|
|
30
|
+
if (!desiredChainId || desiredChainId === provider.chainId) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// WalletConnect exposes connected accounts, not chains: `eip155:${chainId}:${address}`
|
|
34
|
+
const eip155Accounts = provider.session.namespaces.eip155.accounts;
|
|
35
|
+
const isConnectedToDesiredChain = eip155Accounts.some(account => account.startsWith(`eip155:${desiredChainId}:`));
|
|
36
|
+
if (!isConnectedToDesiredChain) {
|
|
37
|
+
if (this.options.optionalChains?.includes(desiredChainId)) {
|
|
38
|
+
throwException(`Cannot activate an optional chain (${desiredChainId}), as the wallet is not connected to it.\n\tYou should handle this error in application code, as there is no guarantee that a wallet is connected to a chain configured in "optionalChains".`);
|
|
39
|
+
}
|
|
40
|
+
throwException(`Unknown chain (${desiredChainId}). Make sure to include any chains you might connect to in the "chains" or "optionalChains" parameters when initializing WalletConnect.`);
|
|
41
|
+
}
|
|
42
|
+
await provider.request({
|
|
43
|
+
method: 'wallet_switchEthereumChain',
|
|
44
|
+
params: [{ chainId: `0x${desiredChainId.toString(16)}` }],
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
this.setState('isConnecting', true);
|
|
50
|
+
await provider.enable();
|
|
51
|
+
this.setData({ accounts: provider.accounts, chainId: provider.chainId });
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
error('Could not connect to the wallet', e);
|
|
55
|
+
throw e;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
this.setState({ isConnecting: false, isInitialized: true });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async disconnect() {
|
|
62
|
+
if (!this.provider) {
|
|
63
|
+
this.setState('isDisconnecting', false);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
debug('Disconnect from Wallet Connect connection');
|
|
68
|
+
this.setState('isDisconnecting', true);
|
|
69
|
+
this.provider.removeListener('accountsChanged', this.handleAccountsChanged);
|
|
70
|
+
this.provider.removeListener('chainChanged', this.handleChainChanged);
|
|
71
|
+
this.provider.removeListener('disconnect', this.handleDisconnect);
|
|
72
|
+
await this.provider.disconnect();
|
|
73
|
+
this.setData({ accounts: undefined, chainId: undefined });
|
|
74
|
+
this.setState('isDisconnecting', false);
|
|
75
|
+
this.provider = undefined;
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
this.setState('isDisconnecting', false);
|
|
79
|
+
throw e;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async init() {
|
|
83
|
+
this.setState('isInitializing', true);
|
|
84
|
+
try {
|
|
85
|
+
const provider = await this.createProvider();
|
|
86
|
+
if (!provider.session) {
|
|
87
|
+
throwException('No active session found. Connect your wallet first.');
|
|
88
|
+
}
|
|
89
|
+
this.setData({ accounts: provider.accounts, chainId: provider.chainId });
|
|
90
|
+
this.setState({ isInitialized: true, isInitializing: false });
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
await this.disconnect();
|
|
94
|
+
this.setState({ isInitialized: false, isInitializing: false });
|
|
95
|
+
error('Wallet Connect could not be pre-connected', e);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async createProvider() {
|
|
99
|
+
// @ts-ignore
|
|
100
|
+
this.provider = await EthereumProvider.init(this.options);
|
|
101
|
+
this.provider.on('accountsChanged', this.handleAccountsChanged);
|
|
102
|
+
this.provider.on('chainChanged', this.handleChainChanged);
|
|
103
|
+
this.provider.on('disconnect', this.handleDisconnect);
|
|
104
|
+
return this.provider;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
__decorate([
|
|
108
|
+
override,
|
|
109
|
+
__metadata("design:type", EthereumProvider)
|
|
110
|
+
], WalletConnect.prototype, "provider", void 0);
|
|
111
|
+
__decorate([
|
|
112
|
+
action.bound,
|
|
113
|
+
__metadata("design:type", Function),
|
|
114
|
+
__metadata("design:paramtypes", [Object]),
|
|
115
|
+
__metadata("design:returntype", Promise)
|
|
116
|
+
], WalletConnect.prototype, "connect", null);
|
|
117
|
+
__decorate([
|
|
118
|
+
action.bound,
|
|
119
|
+
__metadata("design:type", Function),
|
|
120
|
+
__metadata("design:paramtypes", []),
|
|
121
|
+
__metadata("design:returntype", Promise)
|
|
122
|
+
], WalletConnect.prototype, "disconnect", null);
|
|
123
|
+
__decorate([
|
|
124
|
+
action.bound,
|
|
125
|
+
__metadata("design:type", Function),
|
|
126
|
+
__metadata("design:paramtypes", []),
|
|
127
|
+
__metadata("design:returntype", Promise)
|
|
128
|
+
], WalletConnect.prototype, "init", null);
|
|
129
|
+
__decorate([
|
|
130
|
+
action.bound,
|
|
131
|
+
__metadata("design:type", Function),
|
|
132
|
+
__metadata("design:paramtypes", []),
|
|
133
|
+
__metadata("design:returntype", Promise)
|
|
134
|
+
], WalletConnect.prototype, "createProvider", null);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type EIP6963ProviderDetail } from 'web3/lib/commonjs/web3_eip6963';
|
|
2
|
+
export declare const store: {
|
|
3
|
+
readonly subscribe: (callback: () => void) => () => void;
|
|
4
|
+
readonly value: () => EIP6963ProviderDetail<unknown>[];
|
|
5
|
+
};
|
|
6
|
+
export declare function useEIP6963Connections(): EIP6963ProviderDetail[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { EIP6963Event } from '../types';
|
|
3
|
+
let providers = [];
|
|
4
|
+
export const store = {
|
|
5
|
+
subscribe: (callback) => {
|
|
6
|
+
const onAnnouncement = (event) => {
|
|
7
|
+
if (providers.map(p => p.info.uuid).includes(event.detail.info.uuid))
|
|
8
|
+
return;
|
|
9
|
+
providers = [...providers, event.detail];
|
|
10
|
+
callback();
|
|
11
|
+
};
|
|
12
|
+
window.addEventListener(EIP6963Event.ANNOUNCE_PROVIDER, onAnnouncement);
|
|
13
|
+
window.dispatchEvent(new Event(EIP6963Event.REQUEST_PROVIDER));
|
|
14
|
+
return () => window.removeEventListener(EIP6963Event.ANNOUNCE_PROVIDER, onAnnouncement);
|
|
15
|
+
},
|
|
16
|
+
value: () => providers,
|
|
17
|
+
};
|
|
18
|
+
export function useEIP6963Connections() {
|
|
19
|
+
return React.useSyncExternalStore(store.subscribe, store.value, store.value);
|
|
20
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useRecentConnectionMeta } from '../hooks/useRecentConnectionMeta';
|
|
3
|
+
export function useOrderedConnections(providers) {
|
|
4
|
+
const [recentMeta] = useRecentConnectionMeta();
|
|
5
|
+
return React.useMemo(() => providers.reduce((acc, provider) => {
|
|
6
|
+
if (provider.id === recentMeta?.providerId) {
|
|
7
|
+
acc.unshift({ ...provider, isRecent: true });
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
acc.push({ ...provider, isRecent: undefined });
|
|
11
|
+
}
|
|
12
|
+
return acc;
|
|
13
|
+
}, []), [providers, recentMeta?.providerId]);
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ConnectionType } from '../types';
|
|
2
|
+
export interface RecentConnectionMeta {
|
|
3
|
+
chainId?: string;
|
|
4
|
+
disconnected?: boolean;
|
|
5
|
+
providerId: string;
|
|
6
|
+
type?: ConnectionType;
|
|
7
|
+
}
|
|
8
|
+
export declare function storeRecentConnectionMeta(meta: RecentConnectionMeta | undefined): void;
|
|
9
|
+
export declare function getRecentConnectionMeta(): RecentConnectionMeta | undefined;
|
|
10
|
+
type UseRecentConnectionMeta = [
|
|
11
|
+
value: RecentConnectionMeta | undefined,
|
|
12
|
+
setValue: (meta: RecentConnectionMeta | undefined) => void
|
|
13
|
+
];
|
|
14
|
+
export declare function useRecentConnectionMeta(): UseRecentConnectionMeta;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { debug, storage } from '@broxus/js-utils';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { EVM_RECENT_CONNECTION } from '../constants';
|
|
4
|
+
import { ConnectionType } from '../types';
|
|
5
|
+
function isRecentConnectionMeta(value) {
|
|
6
|
+
const meta = { providerId: value.providerId, type: value.type };
|
|
7
|
+
return Boolean(meta.type && ConnectionType[meta.type] && !!meta.providerId);
|
|
8
|
+
}
|
|
9
|
+
export function storeRecentConnectionMeta(meta) {
|
|
10
|
+
if (!meta) {
|
|
11
|
+
storage.remove(EVM_RECENT_CONNECTION);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
debug('Store EVM recent connection', meta);
|
|
15
|
+
storage.set(EVM_RECENT_CONNECTION, JSON.stringify(meta));
|
|
16
|
+
}
|
|
17
|
+
export function getRecentConnectionMeta() {
|
|
18
|
+
const value = storage.get(EVM_RECENT_CONNECTION);
|
|
19
|
+
if (!value) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const json = JSON.parse(value);
|
|
24
|
+
if (isRecentConnectionMeta(json)) {
|
|
25
|
+
return json;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
debug(e);
|
|
30
|
+
}
|
|
31
|
+
storeRecentConnectionMeta(undefined);
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
export function useRecentConnectionMeta() {
|
|
35
|
+
const [meta, setMeta] = React.useState(getRecentConnectionMeta());
|
|
36
|
+
React.useEffect(() => {
|
|
37
|
+
const onStorage = (event) => {
|
|
38
|
+
if (event.key === EVM_RECENT_CONNECTION && event.newValue) {
|
|
39
|
+
const json = JSON.parse(event.newValue);
|
|
40
|
+
if (isRecentConnectionMeta(json)) {
|
|
41
|
+
setMeta(json);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
window.addEventListener('storage', onStorage);
|
|
46
|
+
return () => {
|
|
47
|
+
window.removeEventListener('storage', onStorage);
|
|
48
|
+
};
|
|
49
|
+
}, []);
|
|
50
|
+
return [meta, storeRecentConnectionMeta];
|
|
51
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
EVM_CONNECT_AGREEMENTS_NOTE: {
|
|
3
|
+
defaultMessage: string;
|
|
4
|
+
id: string;
|
|
5
|
+
};
|
|
6
|
+
EVM_CONNECT_NOT_CONNECTED_HINT: {
|
|
7
|
+
defaultMessage: string;
|
|
8
|
+
id: string;
|
|
9
|
+
};
|
|
10
|
+
EVM_CONNECT_INITIALIZING_HINT: {
|
|
11
|
+
defaultMessage: string;
|
|
12
|
+
id: string;
|
|
13
|
+
};
|
|
14
|
+
EVM_CONNECT_CONNECT_BTN_TEXT: {
|
|
15
|
+
defaultMessage: string;
|
|
16
|
+
id: string;
|
|
17
|
+
};
|
|
18
|
+
EVM_CONNECT_DISCONNECT_BTN_TEXT: {
|
|
19
|
+
defaultMessage: string;
|
|
20
|
+
id: string;
|
|
21
|
+
};
|
|
22
|
+
EVM_CONNECT_CHANGE_NETWORK_BTN_TEXT: {
|
|
23
|
+
defaultMessage: string;
|
|
24
|
+
id: string;
|
|
25
|
+
};
|
|
26
|
+
EVM_CONNECT_CHANGE_WALLET_BTN_TEXT: {
|
|
27
|
+
defaultMessage: string;
|
|
28
|
+
id: string;
|
|
29
|
+
};
|
|
30
|
+
EVM_CONNECT_UNSUPPORTED_NETWORK_WARNING: {
|
|
31
|
+
defaultMessage: string;
|
|
32
|
+
id: string;
|
|
33
|
+
};
|
|
34
|
+
EVM_CONNECT_CONNECTOR_BLOCKCHAIN_NAME: {
|
|
35
|
+
defaultMessage: string;
|
|
36
|
+
id: string;
|
|
37
|
+
};
|
|
38
|
+
EVM_CONNECT_CONNECTOR_EXPLORER_HINT: {
|
|
39
|
+
defaultMessage: string;
|
|
40
|
+
id: string;
|
|
41
|
+
};
|
|
42
|
+
EVM_CONNECT_INSTALL_PROVIDER: {
|
|
43
|
+
defaultMessage: string;
|
|
44
|
+
id: string;
|
|
45
|
+
};
|
|
46
|
+
EVM_CONNECT_INSTALL_ANDROID_PLATFORM: {
|
|
47
|
+
defaultMessage: string;
|
|
48
|
+
id: string;
|
|
49
|
+
};
|
|
50
|
+
EVM_CONNECT_INSTALL_IOS_PLATFORM: {
|
|
51
|
+
defaultMessage: string;
|
|
52
|
+
id: string;
|
|
53
|
+
};
|
|
54
|
+
EVM_CONNECT_INSTALL_CHROME_EXTENSION_PLATFORM: {
|
|
55
|
+
defaultMessage: string;
|
|
56
|
+
id: string;
|
|
57
|
+
};
|
|
58
|
+
EVM_CONNECT_INSTALL_FIREFOX_EXTENSION_PLATFORM: {
|
|
59
|
+
defaultMessage: string;
|
|
60
|
+
id: string;
|
|
61
|
+
};
|
|
62
|
+
EVM_CONNECT_INSTALL_SAFARI_EXTENSION_PLATFORM: {
|
|
63
|
+
defaultMessage: string;
|
|
64
|
+
id: string;
|
|
65
|
+
};
|
|
66
|
+
EVM_CONNECT_INSTALL_UNKNOWN_PLATFORM: {
|
|
67
|
+
defaultMessage: string;
|
|
68
|
+
id: string;
|
|
69
|
+
};
|
|
70
|
+
EVM_CONNECT_DISPATCHER_POPUP_TITLE: {
|
|
71
|
+
defaultMessage: string;
|
|
72
|
+
id: string;
|
|
73
|
+
};
|
|
74
|
+
EVM_CONNECT_DISPATCHER_POPUP_NOTE: {
|
|
75
|
+
defaultMessage: string;
|
|
76
|
+
id: string;
|
|
77
|
+
};
|
|
78
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TITLE: {
|
|
79
|
+
defaultMessage: string;
|
|
80
|
+
id: string;
|
|
81
|
+
};
|
|
82
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_NOTE: {
|
|
83
|
+
defaultMessage: string;
|
|
84
|
+
id: string;
|
|
85
|
+
};
|
|
86
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_TITLE: {
|
|
87
|
+
defaultMessage: string;
|
|
88
|
+
id: string;
|
|
89
|
+
};
|
|
90
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_NOTE: {
|
|
91
|
+
defaultMessage: string;
|
|
92
|
+
id: string;
|
|
93
|
+
};
|
|
94
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TRY_AGAIN_BTN_TEXT: {
|
|
95
|
+
defaultMessage: string;
|
|
96
|
+
id: string;
|
|
97
|
+
};
|
|
98
|
+
EVM_CONNECT_DISPATCHER_POPUP_CONNECTED_HINT: {
|
|
99
|
+
defaultMessage: string;
|
|
100
|
+
id: string;
|
|
101
|
+
};
|
|
102
|
+
EVM_CONNECT_DISPATCHER_POPUP_RECENT_HINT: {
|
|
103
|
+
defaultMessage: string;
|
|
104
|
+
id: string;
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
export default _default;
|