@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,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.EIP6963Connector = void 0;
|
|
13
|
+
const js_utils_1 = require("@broxus/js-utils");
|
|
14
|
+
const mobx_1 = require("mobx");
|
|
15
|
+
const core_1 = require("../core");
|
|
16
|
+
const types_1 = require("../types");
|
|
17
|
+
const utils_1 = require("../utils");
|
|
18
|
+
class EIP6963Connector extends core_1.EthereumConnector {
|
|
19
|
+
params;
|
|
20
|
+
type = types_1.ConnectionType.EIP_6963_INJECTED;
|
|
21
|
+
constructor(params) {
|
|
22
|
+
super(params);
|
|
23
|
+
this.params = params;
|
|
24
|
+
this.provider = params.provider;
|
|
25
|
+
(0, mobx_1.makeObservable)(this);
|
|
26
|
+
this.provider.on('accountsChanged', this.handleAccountsChanged);
|
|
27
|
+
this.provider.on('chainChanged', this.handleChainChanged);
|
|
28
|
+
this.provider.on('connect', this.handleConnect);
|
|
29
|
+
this.provider.on('disconnect', this.handleDisconnect);
|
|
30
|
+
this.init().catch(js_utils_1.error);
|
|
31
|
+
}
|
|
32
|
+
async connect(chainIdOrParams) {
|
|
33
|
+
if (!this.provider) {
|
|
34
|
+
throw new Error('Provider is not defined');
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
this.setState('isConnecting', true);
|
|
38
|
+
const accounts = (await this.provider.request({ method: 'eth_requestAccounts' }));
|
|
39
|
+
const chainId = (await this.provider.request({ method: 'eth_chainId' }));
|
|
40
|
+
(0, js_utils_1.debug)(`Connect to ${this.params.info.name} connection`, accounts, chainId);
|
|
41
|
+
const receivedChainId = (0, utils_1.parseChainId)(chainId);
|
|
42
|
+
const desiredChainId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId;
|
|
43
|
+
if (!desiredChainId || receivedChainId === desiredChainId) {
|
|
44
|
+
this.setData({ accounts, chainId: receivedChainId });
|
|
45
|
+
this.setState({ isConnecting: false, isInitialized: true });
|
|
46
|
+
(0, js_utils_1.debug)(`${this.params.info.name} connection has skipped network switching.`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!chainIdOrParams) {
|
|
50
|
+
(0, js_utils_1.debug)(`${this.params.info.name} connection has skipped network switching. Chain params or chainId is not provided.`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
(0, js_utils_1.debug)(`${this.params.info.name} connection trying to switch network.`);
|
|
54
|
+
await this.switchNetwork(chainIdOrParams).then(async () => {
|
|
55
|
+
await this.connect(desiredChainId);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
this.setState('isConnecting', false);
|
|
60
|
+
throw e;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async disconnect() {
|
|
64
|
+
if (!this.provider) {
|
|
65
|
+
this.setState('isDisconnecting', false);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
(0, js_utils_1.debug)(`Disconnect from ${this.params.info.name} connection`);
|
|
70
|
+
this.setState('isDisconnecting', true);
|
|
71
|
+
this.setData({ accounts: undefined, chainId: undefined });
|
|
72
|
+
this.setState('isDisconnecting', false);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
this.setState('isDisconnecting', false);
|
|
76
|
+
throw e;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async init() {
|
|
80
|
+
this.setState('isInitializing', true);
|
|
81
|
+
if (!this.provider) {
|
|
82
|
+
this.setState({ isInitialized: false, isInitializing: false });
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const accounts = (await this.provider.request({ method: 'eth_accounts' }));
|
|
87
|
+
if (!accounts.length) {
|
|
88
|
+
(0, js_utils_1.throwException)('No accounts returned');
|
|
89
|
+
}
|
|
90
|
+
const chainId = (await this.provider.request({ method: 'eth_chainId' }));
|
|
91
|
+
this.setData({ accounts, chainId: (0, utils_1.parseChainId)(chainId) });
|
|
92
|
+
this.setState({ isInitialized: true, isInitializing: false });
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
(0, js_utils_1.debug)(`${this.params.info.name} could not be pre-connected`, e);
|
|
96
|
+
this.setState({ isInitialized: false, isInitializing: false });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
handleConnect({ chainId }) {
|
|
100
|
+
this.setData({ chainId: (0, utils_1.parseChainId)(chainId) });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.EIP6963Connector = EIP6963Connector;
|
|
104
|
+
__decorate([
|
|
105
|
+
mobx_1.action.bound,
|
|
106
|
+
__metadata("design:type", Function),
|
|
107
|
+
__metadata("design:paramtypes", [Object]),
|
|
108
|
+
__metadata("design:returntype", Promise)
|
|
109
|
+
], EIP6963Connector.prototype, "connect", null);
|
|
110
|
+
__decorate([
|
|
111
|
+
mobx_1.action.bound,
|
|
112
|
+
__metadata("design:type", Function),
|
|
113
|
+
__metadata("design:paramtypes", []),
|
|
114
|
+
__metadata("design:returntype", Promise)
|
|
115
|
+
], EIP6963Connector.prototype, "disconnect", null);
|
|
116
|
+
__decorate([
|
|
117
|
+
mobx_1.action.bound,
|
|
118
|
+
__metadata("design:type", Function),
|
|
119
|
+
__metadata("design:paramtypes", []),
|
|
120
|
+
__metadata("design:returntype", Promise)
|
|
121
|
+
], EIP6963Connector.prototype, "init", null);
|
|
122
|
+
__decorate([
|
|
123
|
+
mobx_1.action.bound,
|
|
124
|
+
__metadata("design:type", Function),
|
|
125
|
+
__metadata("design:paramtypes", [Object]),
|
|
126
|
+
__metadata("design:returntype", void 0)
|
|
127
|
+
], EIP6963Connector.prototype, "handleConnect", null);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AbstractStore } from '@broxus/js-core';
|
|
2
|
+
import { type EthExecutionAPI, type ProviderRpcError } from 'web3-types';
|
|
3
|
+
import { type AddEthereumChainParams, type ConnectionType, type SupportedProviders, type WatchAssetParameters } from '../types';
|
|
4
|
+
export interface EthereumConnectorCtorParams {
|
|
5
|
+
onDisconnect?: (err: ProviderRpcError) => Promise<void> | void;
|
|
6
|
+
}
|
|
7
|
+
export interface EthereumConnectorData {
|
|
8
|
+
accounts?: string[];
|
|
9
|
+
chainId?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface EthereumConnectorState {
|
|
12
|
+
isConnecting?: boolean;
|
|
13
|
+
isDisconnecting?: boolean;
|
|
14
|
+
isInitialized?: boolean;
|
|
15
|
+
isInitializing?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare abstract class EthereumConnector extends AbstractStore<EthereumConnectorData, EthereumConnectorState> {
|
|
18
|
+
protected readonly params?: Readonly<EthereumConnectorCtorParams> | undefined;
|
|
19
|
+
readonly type?: ConnectionType;
|
|
20
|
+
/**
|
|
21
|
+
* An
|
|
22
|
+
* EIP-1193 ({@link https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md}) and
|
|
23
|
+
* EIP-1102 ({@link https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1102.md}) compliant provider.
|
|
24
|
+
* May also comply with EIP-3085 ({@link https://github.com/ethereum/EIPs/blob/master/EIPS/eip-3085.md}).
|
|
25
|
+
* This property must be defined while the connector is active.
|
|
26
|
+
*/
|
|
27
|
+
provider?: SupportedProviders<EthExecutionAPI>;
|
|
28
|
+
protected constructor(params?: Readonly<EthereumConnectorCtorParams> | undefined);
|
|
29
|
+
abstract connect(...args: unknown[]): Promise<void>;
|
|
30
|
+
abstract disconnect(...args: unknown[]): Promise<void>;
|
|
31
|
+
addNetwork(chainParams: AddEthereumChainParams): Promise<void>;
|
|
32
|
+
switchNetwork(chainIdOrParams: number | AddEthereumChainParams): Promise<void>;
|
|
33
|
+
watchAsset(params: WatchAssetParameters): Promise<true>;
|
|
34
|
+
get accounts(): EthereumConnectorData['accounts'];
|
|
35
|
+
get chainId(): EthereumConnectorData['chainId'];
|
|
36
|
+
get isConnecting(): EthereumConnectorState['isConnecting'];
|
|
37
|
+
get isDisconnecting(): EthereumConnectorState['isDisconnecting'];
|
|
38
|
+
get isInitialized(): EthereumConnectorState['isInitialized'];
|
|
39
|
+
get isInitializing(): EthereumConnectorState['isInitializing'];
|
|
40
|
+
protected handleAccountsChanged(accounts: string[]): void;
|
|
41
|
+
protected handleChainChanged(chainId: string): void;
|
|
42
|
+
protected handleDisconnect(err: ProviderRpcError): void;
|
|
43
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.EthereumConnector = void 0;
|
|
13
|
+
const js_core_1 = require("@broxus/js-core");
|
|
14
|
+
const js_utils_1 = require("@broxus/js-utils");
|
|
15
|
+
const mobx_1 = require("mobx");
|
|
16
|
+
class EthereumConnector extends js_core_1.AbstractStore {
|
|
17
|
+
params;
|
|
18
|
+
type;
|
|
19
|
+
/**
|
|
20
|
+
* An
|
|
21
|
+
* EIP-1193 ({@link https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md}) and
|
|
22
|
+
* EIP-1102 ({@link https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1102.md}) compliant provider.
|
|
23
|
+
* May also comply with EIP-3085 ({@link https://github.com/ethereum/EIPs/blob/master/EIPS/eip-3085.md}).
|
|
24
|
+
* This property must be defined while the connector is active.
|
|
25
|
+
*/
|
|
26
|
+
provider;
|
|
27
|
+
constructor(params) {
|
|
28
|
+
super();
|
|
29
|
+
this.params = params;
|
|
30
|
+
}
|
|
31
|
+
async addNetwork(chainParams) {
|
|
32
|
+
if (!this.provider) {
|
|
33
|
+
throw new Error('Provider is not defined');
|
|
34
|
+
}
|
|
35
|
+
await this.provider.request({
|
|
36
|
+
method: 'wallet_addEthereumChain',
|
|
37
|
+
params: [{ ...chainParams }],
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async switchNetwork(chainIdOrParams) {
|
|
41
|
+
if (!this.provider) {
|
|
42
|
+
throw new Error('Provider is not defined');
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const chainId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId;
|
|
46
|
+
const desiredChainId = `0x${chainId.toString(16)}`;
|
|
47
|
+
await this.provider.request({
|
|
48
|
+
method: 'wallet_switchEthereumChain',
|
|
49
|
+
params: [{ chainId: desiredChainId }],
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
// https://github.com/MetaMask/metamask-mobile/issues/3312#issuecomment-1065923294
|
|
54
|
+
const errorCode = e.data?.originalError?.code || e.code;
|
|
55
|
+
// 4902 indicates that the chain has not been added to MetaMask and wallet_addEthereumChain needs to be called
|
|
56
|
+
// https://docs.metamask.io/guide/rpc-api.html#wallet-switchethereumchain
|
|
57
|
+
if (errorCode === 4902 && typeof chainIdOrParams !== 'number') {
|
|
58
|
+
await this.addNetwork(chainIdOrParams);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
throw e;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async watchAsset(params) {
|
|
66
|
+
if (!this.provider) {
|
|
67
|
+
throw new Error('Provider is not defined');
|
|
68
|
+
}
|
|
69
|
+
return this.provider
|
|
70
|
+
.request({
|
|
71
|
+
method: 'wallet_watchAsset',
|
|
72
|
+
params: {
|
|
73
|
+
options: {
|
|
74
|
+
address: params.address, // The address that the token is at.
|
|
75
|
+
decimals: params.decimals, // The number of decimals in the token
|
|
76
|
+
image: params.image, // A string url of the token logo
|
|
77
|
+
symbol: params.symbol, // A ticker symbol or shorthand, up to 5 chars.
|
|
78
|
+
},
|
|
79
|
+
type: 'ERC20', // Initially only supports ERC20, but eventually more!
|
|
80
|
+
},
|
|
81
|
+
})
|
|
82
|
+
.then(result => {
|
|
83
|
+
if (!result) {
|
|
84
|
+
throw new Error('Watch asset request was rejected');
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
get accounts() {
|
|
90
|
+
return this._data.accounts;
|
|
91
|
+
}
|
|
92
|
+
get chainId() {
|
|
93
|
+
return this._data.chainId;
|
|
94
|
+
}
|
|
95
|
+
get isConnecting() {
|
|
96
|
+
return this._state.isConnecting;
|
|
97
|
+
}
|
|
98
|
+
get isDisconnecting() {
|
|
99
|
+
return this._state.isDisconnecting;
|
|
100
|
+
}
|
|
101
|
+
get isInitialized() {
|
|
102
|
+
return this._state.isInitialized;
|
|
103
|
+
}
|
|
104
|
+
get isInitializing() {
|
|
105
|
+
return this._state.isInitializing;
|
|
106
|
+
}
|
|
107
|
+
handleAccountsChanged(accounts) {
|
|
108
|
+
(0, js_utils_1.debug)(`Accounts have been changed to ${accounts}`);
|
|
109
|
+
this.setData({ accounts });
|
|
110
|
+
}
|
|
111
|
+
handleChainChanged(chainId) {
|
|
112
|
+
(0, js_utils_1.debug)(`Chain has been changed to ${chainId}`);
|
|
113
|
+
this.setData({ chainId: Number.parseInt(chainId, 16) });
|
|
114
|
+
}
|
|
115
|
+
handleDisconnect(err) {
|
|
116
|
+
this.setData(() => ({}));
|
|
117
|
+
this.params?.onDisconnect?.(err);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.EthereumConnector = EthereumConnector;
|
|
121
|
+
__decorate([
|
|
122
|
+
mobx_1.observable,
|
|
123
|
+
__metadata("design:type", Object)
|
|
124
|
+
], EthereumConnector.prototype, "provider", void 0);
|
|
125
|
+
__decorate([
|
|
126
|
+
mobx_1.action.bound,
|
|
127
|
+
__metadata("design:type", Function),
|
|
128
|
+
__metadata("design:paramtypes", [Object]),
|
|
129
|
+
__metadata("design:returntype", Promise)
|
|
130
|
+
], EthereumConnector.prototype, "addNetwork", null);
|
|
131
|
+
__decorate([
|
|
132
|
+
mobx_1.action.bound,
|
|
133
|
+
__metadata("design:type", Function),
|
|
134
|
+
__metadata("design:paramtypes", [Object]),
|
|
135
|
+
__metadata("design:returntype", Promise)
|
|
136
|
+
], EthereumConnector.prototype, "switchNetwork", null);
|
|
137
|
+
__decorate([
|
|
138
|
+
mobx_1.action.bound,
|
|
139
|
+
__metadata("design:type", Function),
|
|
140
|
+
__metadata("design:paramtypes", [Object]),
|
|
141
|
+
__metadata("design:returntype", Promise)
|
|
142
|
+
], EthereumConnector.prototype, "watchAsset", null);
|
|
143
|
+
__decorate([
|
|
144
|
+
mobx_1.computed,
|
|
145
|
+
__metadata("design:type", Object),
|
|
146
|
+
__metadata("design:paramtypes", [])
|
|
147
|
+
], EthereumConnector.prototype, "accounts", null);
|
|
148
|
+
__decorate([
|
|
149
|
+
mobx_1.computed,
|
|
150
|
+
__metadata("design:type", Object),
|
|
151
|
+
__metadata("design:paramtypes", [])
|
|
152
|
+
], EthereumConnector.prototype, "chainId", null);
|
|
153
|
+
__decorate([
|
|
154
|
+
mobx_1.computed,
|
|
155
|
+
__metadata("design:type", Object),
|
|
156
|
+
__metadata("design:paramtypes", [])
|
|
157
|
+
], EthereumConnector.prototype, "isConnecting", null);
|
|
158
|
+
__decorate([
|
|
159
|
+
mobx_1.computed,
|
|
160
|
+
__metadata("design:type", Object),
|
|
161
|
+
__metadata("design:paramtypes", [])
|
|
162
|
+
], EthereumConnector.prototype, "isDisconnecting", null);
|
|
163
|
+
__decorate([
|
|
164
|
+
mobx_1.computed,
|
|
165
|
+
__metadata("design:type", Object),
|
|
166
|
+
__metadata("design:paramtypes", [])
|
|
167
|
+
], EthereumConnector.prototype, "isInitialized", null);
|
|
168
|
+
__decorate([
|
|
169
|
+
mobx_1.computed,
|
|
170
|
+
__metadata("design:type", Object),
|
|
171
|
+
__metadata("design:paramtypes", [])
|
|
172
|
+
], EthereumConnector.prototype, "isInitializing", null);
|
|
173
|
+
__decorate([
|
|
174
|
+
mobx_1.action.bound,
|
|
175
|
+
__metadata("design:type", Function),
|
|
176
|
+
__metadata("design:paramtypes", [Array]),
|
|
177
|
+
__metadata("design:returntype", void 0)
|
|
178
|
+
], EthereumConnector.prototype, "handleAccountsChanged", null);
|
|
179
|
+
__decorate([
|
|
180
|
+
mobx_1.action.bound,
|
|
181
|
+
__metadata("design:type", Function),
|
|
182
|
+
__metadata("design:paramtypes", [String]),
|
|
183
|
+
__metadata("design:returntype", void 0)
|
|
184
|
+
], EthereumConnector.prototype, "handleChainChanged", null);
|
|
185
|
+
__decorate([
|
|
186
|
+
mobx_1.action.bound,
|
|
187
|
+
__metadata("design:type", Function),
|
|
188
|
+
__metadata("design:paramtypes", [Object]),
|
|
189
|
+
__metadata("design:returntype", void 0)
|
|
190
|
+
], EthereumConnector.prototype, "handleDisconnect", null);
|
|
@@ -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,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MetaMask = void 0;
|
|
16
|
+
const js_utils_1 = require("@broxus/js-utils");
|
|
17
|
+
const detect_provider_1 = __importDefault(require("@metamask/detect-provider"));
|
|
18
|
+
const mobx_1 = require("mobx");
|
|
19
|
+
const EthereumConnector_1 = require("../core/EthereumConnector");
|
|
20
|
+
const types_1 = require("../types");
|
|
21
|
+
const utils_1 = require("../utils");
|
|
22
|
+
const INJECTABLE_WALLETS = ['isBraveWallet', 'isRabby', 'isLedgerConnect', 'isTrust'];
|
|
23
|
+
class MetaMask extends EthereumConnector_1.EthereumConnector {
|
|
24
|
+
params;
|
|
25
|
+
type = types_1.ConnectionType.INJECTED;
|
|
26
|
+
constructor(params) {
|
|
27
|
+
super(params);
|
|
28
|
+
this.params = params;
|
|
29
|
+
(0, mobx_1.makeObservable)(this);
|
|
30
|
+
this.init().catch(js_utils_1.error);
|
|
31
|
+
}
|
|
32
|
+
async connect(chainIdOrParams) {
|
|
33
|
+
if (!this.provider) {
|
|
34
|
+
throw new Error('Provider is not defined');
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
this.setState('isConnecting', true);
|
|
38
|
+
const accounts = (await this.provider.request({ method: 'eth_requestAccounts' }));
|
|
39
|
+
const chainId = (await this.provider.request({ method: 'eth_chainId' }));
|
|
40
|
+
(0, js_utils_1.debug)('Connect to MetaMask connection', accounts, chainId);
|
|
41
|
+
const receivedChainId = (0, utils_1.parseChainId)(chainId);
|
|
42
|
+
const desiredChainId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId;
|
|
43
|
+
if (!desiredChainId || receivedChainId === desiredChainId) {
|
|
44
|
+
this.setData({ accounts, chainId: receivedChainId });
|
|
45
|
+
this.setState({ isConnecting: false, isInitialized: true });
|
|
46
|
+
(0, js_utils_1.debug)('MetaMask connection has skipped network switching.');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!chainIdOrParams) {
|
|
50
|
+
(0, js_utils_1.debug)('MetaMask connection has skipped network switching. Chain params or chainId is not provided.');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
(0, js_utils_1.debug)('MetaMask connection trying to switch network.');
|
|
54
|
+
await this.switchNetwork(chainIdOrParams).then(async () => {
|
|
55
|
+
await this.connect(desiredChainId);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
this.setState('isConnecting', false);
|
|
60
|
+
throw e;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async disconnect() {
|
|
64
|
+
if (!this.provider) {
|
|
65
|
+
this.setState('isDisconnecting', false);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
(0, js_utils_1.debug)('Disconnect from MetaMask connection');
|
|
70
|
+
this.setState('isDisconnecting', true);
|
|
71
|
+
this.setData({ accounts: undefined, chainId: undefined });
|
|
72
|
+
this.setState('isDisconnecting', false);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
this.setState('isDisconnecting', false);
|
|
76
|
+
throw e;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async init() {
|
|
80
|
+
const onAnnouncement = (event) => {
|
|
81
|
+
if (event.detail.info.name === 'MetaMask' && event.detail.info.rdns === 'io.metamask') {
|
|
82
|
+
this.provider = event.detail.provider;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
try {
|
|
86
|
+
this.setState('isInitializing', true);
|
|
87
|
+
const provider = await (0, detect_provider_1.default)(this.params?.options);
|
|
88
|
+
if (provider) {
|
|
89
|
+
this.provider = provider;
|
|
90
|
+
// Handle the case when e.g. metamask and coinbase wallet are both installed
|
|
91
|
+
if (this.provider.providers?.length) {
|
|
92
|
+
this.provider = this.provider.providers.find(value => value.isMetaMask) ?? this.provider.providers[0];
|
|
93
|
+
}
|
|
94
|
+
window.addEventListener(types_1.EIP6963Event.ANNOUNCE_PROVIDER, onAnnouncement);
|
|
95
|
+
window.dispatchEvent(new Event(types_1.EIP6963Event.REQUEST_PROVIDER));
|
|
96
|
+
if (Object.keys(provider).some(key => INJECTABLE_WALLETS.includes(key))) {
|
|
97
|
+
this.provider = undefined;
|
|
98
|
+
(0, js_utils_1.throwException)('No MetaMask provider found');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
window.removeEventListener(types_1.EIP6963Event.ANNOUNCE_PROVIDER, onAnnouncement);
|
|
104
|
+
}
|
|
105
|
+
if (!this.provider) {
|
|
106
|
+
this.setState({ isInitialized: false, isInitializing: false });
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
this.provider.on('accountsChanged', this.handleAccountsChanged);
|
|
111
|
+
this.provider.on('chainChanged', this.handleChainChanged);
|
|
112
|
+
this.provider.on('connect', this.handleConnect);
|
|
113
|
+
this.provider.on('disconnect', this.handleDisconnect);
|
|
114
|
+
const accounts = (await this.provider.request({ method: 'eth_accounts' }));
|
|
115
|
+
if (!accounts.length) {
|
|
116
|
+
(0, js_utils_1.throwException)('No accounts returned');
|
|
117
|
+
}
|
|
118
|
+
const chainId = (await this.provider.request({ method: 'eth_chainId' }));
|
|
119
|
+
this.setData({ accounts, chainId: (0, utils_1.parseChainId)(chainId) });
|
|
120
|
+
this.setState({ isInitialized: true, isInitializing: false });
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
(0, js_utils_1.debug)('MetaMask could not be pre-connected', e);
|
|
124
|
+
this.setState({ isInitialized: false, isInitializing: false });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
handleConnect({ chainId }) {
|
|
128
|
+
this.setData({ chainId: (0, utils_1.parseChainId)(chainId) });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.MetaMask = MetaMask;
|
|
132
|
+
__decorate([
|
|
133
|
+
mobx_1.override,
|
|
134
|
+
__metadata("design:type", Object)
|
|
135
|
+
], MetaMask.prototype, "provider", void 0);
|
|
136
|
+
__decorate([
|
|
137
|
+
mobx_1.action.bound,
|
|
138
|
+
__metadata("design:type", Function),
|
|
139
|
+
__metadata("design:paramtypes", [Object]),
|
|
140
|
+
__metadata("design:returntype", Promise)
|
|
141
|
+
], MetaMask.prototype, "connect", null);
|
|
142
|
+
__decorate([
|
|
143
|
+
mobx_1.action.bound,
|
|
144
|
+
__metadata("design:type", Function),
|
|
145
|
+
__metadata("design:paramtypes", []),
|
|
146
|
+
__metadata("design:returntype", Promise)
|
|
147
|
+
], MetaMask.prototype, "disconnect", null);
|
|
148
|
+
__decorate([
|
|
149
|
+
mobx_1.action.bound,
|
|
150
|
+
__metadata("design:type", Function),
|
|
151
|
+
__metadata("design:paramtypes", []),
|
|
152
|
+
__metadata("design:returntype", Promise)
|
|
153
|
+
], MetaMask.prototype, "init", null);
|
|
154
|
+
__decorate([
|
|
155
|
+
mobx_1.action.bound,
|
|
156
|
+
__metadata("design:type", Function),
|
|
157
|
+
__metadata("design:paramtypes", [Object]),
|
|
158
|
+
__metadata("design:returntype", void 0)
|
|
159
|
+
], 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
|
+
}
|