@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,108 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl';
|
|
2
|
+
/* eslint-disable sort-keys */
|
|
3
|
+
export default defineMessages({
|
|
4
|
+
EVM_CONNECT_AGREEMENTS_NOTE: {
|
|
5
|
+
defaultMessage: 'By connecting a wallet, you agree to Terms of Service and consent to its Privacy Policy.',
|
|
6
|
+
id: 'EVM_CONNECT_AGREEMENTS_NOTE',
|
|
7
|
+
},
|
|
8
|
+
EVM_CONNECT_NOT_CONNECTED_HINT: {
|
|
9
|
+
defaultMessage: 'Not connected',
|
|
10
|
+
id: 'EVM_CONNECT_NOT_CONNECTED_HINT',
|
|
11
|
+
},
|
|
12
|
+
EVM_CONNECT_INITIALIZING_HINT: {
|
|
13
|
+
defaultMessage: 'Initializing',
|
|
14
|
+
id: 'EVM_CONNECT_INITIALIZING_HINT',
|
|
15
|
+
},
|
|
16
|
+
EVM_CONNECT_CONNECT_BTN_TEXT: {
|
|
17
|
+
defaultMessage: 'Connect',
|
|
18
|
+
id: 'EVM_CONNECT_CONNECT_BTN_TEXT',
|
|
19
|
+
},
|
|
20
|
+
EVM_CONNECT_DISCONNECT_BTN_TEXT: {
|
|
21
|
+
defaultMessage: 'Disconnect',
|
|
22
|
+
id: 'EVM_CONNECT_DISCONNECT_BTN_TEXT',
|
|
23
|
+
},
|
|
24
|
+
EVM_CONNECT_CHANGE_NETWORK_BTN_TEXT: {
|
|
25
|
+
defaultMessage: 'Change network',
|
|
26
|
+
id: 'EVM_CONNECT_CHANGE_NETWORK_BTN_TEXT',
|
|
27
|
+
},
|
|
28
|
+
EVM_CONNECT_CHANGE_WALLET_BTN_TEXT: {
|
|
29
|
+
defaultMessage: 'Change wallet',
|
|
30
|
+
id: 'EVM_CONNECT_CHANGE_WALLET_BTN_TEXT',
|
|
31
|
+
},
|
|
32
|
+
EVM_CONNECT_UNSUPPORTED_NETWORK_WARNING: {
|
|
33
|
+
defaultMessage: 'Unsupported network',
|
|
34
|
+
id: 'EVM_CONNECT_UNSUPPORTED_NETWORK_WARNING',
|
|
35
|
+
},
|
|
36
|
+
EVM_CONNECT_CONNECTOR_BLOCKCHAIN_NAME: {
|
|
37
|
+
defaultMessage: 'Ethereum',
|
|
38
|
+
id: 'EVM_CONNECT_CONNECTOR_BLOCKCHAIN_NAME',
|
|
39
|
+
},
|
|
40
|
+
EVM_CONNECT_CONNECTOR_EXPLORER_HINT: {
|
|
41
|
+
defaultMessage: 'Open in {explorerTitle}',
|
|
42
|
+
id: 'EVM_CONNECT_CONNECTOR_EXPLORER_HINT',
|
|
43
|
+
},
|
|
44
|
+
EVM_CONNECT_INSTALL_PROVIDER: {
|
|
45
|
+
defaultMessage: 'Install {providerName}',
|
|
46
|
+
id: 'EVM_CONNECT_INSTALL_PROVIDER',
|
|
47
|
+
},
|
|
48
|
+
EVM_CONNECT_INSTALL_ANDROID_PLATFORM: {
|
|
49
|
+
defaultMessage: 'Install Android App',
|
|
50
|
+
id: 'EVM_CONNECT_INSTALL_ANDROID_PLATFORM',
|
|
51
|
+
},
|
|
52
|
+
EVM_CONNECT_INSTALL_IOS_PLATFORM: {
|
|
53
|
+
defaultMessage: 'Install iOS App',
|
|
54
|
+
id: 'EVM_CONNECT_INSTALL_IOS_PLATFORM',
|
|
55
|
+
},
|
|
56
|
+
EVM_CONNECT_INSTALL_CHROME_EXTENSION_PLATFORM: {
|
|
57
|
+
defaultMessage: 'Install Chrome extension',
|
|
58
|
+
id: 'EVM_CONNECT_INSTALL_CHROME_EXTENSION_PLATFORM',
|
|
59
|
+
},
|
|
60
|
+
EVM_CONNECT_INSTALL_FIREFOX_EXTENSION_PLATFORM: {
|
|
61
|
+
defaultMessage: 'Install Firefox extension',
|
|
62
|
+
id: 'EVM_CONNECT_INSTALL_FIREFOX_EXTENSION_PLATFORM',
|
|
63
|
+
},
|
|
64
|
+
EVM_CONNECT_INSTALL_SAFARI_EXTENSION_PLATFORM: {
|
|
65
|
+
defaultMessage: 'Install Safari extension',
|
|
66
|
+
id: 'EVM_CONNECT_INSTALL_SAFARI_EXTENSION_PLATFORM',
|
|
67
|
+
},
|
|
68
|
+
EVM_CONNECT_INSTALL_UNKNOWN_PLATFORM: {
|
|
69
|
+
defaultMessage: '—',
|
|
70
|
+
id: 'EVM_CONNECT_INSTALL_UNKNOWN_PLATFORM',
|
|
71
|
+
},
|
|
72
|
+
EVM_CONNECT_DISPATCHER_POPUP_TITLE: {
|
|
73
|
+
defaultMessage: 'Connect a wallet',
|
|
74
|
+
id: 'EVM_CONNECT_DISPATCHER_POPUP_TITLE',
|
|
75
|
+
},
|
|
76
|
+
EVM_CONNECT_DISPATCHER_POPUP_NOTE: {
|
|
77
|
+
defaultMessage: 'At the moment we only support the wallets below.',
|
|
78
|
+
id: 'EVM_CONNECT_DISPATCHER_POPUP_NOTE',
|
|
79
|
+
},
|
|
80
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TITLE: {
|
|
81
|
+
defaultMessage: 'Continue in {title}',
|
|
82
|
+
id: 'EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TITLE',
|
|
83
|
+
},
|
|
84
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_NOTE: {
|
|
85
|
+
defaultMessage: 'Accept connection request in the wallet',
|
|
86
|
+
id: 'EVM_CONNECT_DISPATCHER_POPUP_REQUEST_NOTE',
|
|
87
|
+
},
|
|
88
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_TITLE: {
|
|
89
|
+
defaultMessage: 'Connection failed',
|
|
90
|
+
id: 'EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_TITLE',
|
|
91
|
+
},
|
|
92
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_NOTE: {
|
|
93
|
+
defaultMessage: 'Connection can be declined if a previous request is still active',
|
|
94
|
+
id: 'EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_NOTE',
|
|
95
|
+
},
|
|
96
|
+
EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TRY_AGAIN_BTN_TEXT: {
|
|
97
|
+
defaultMessage: 'Try again',
|
|
98
|
+
id: 'EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TRY_AGAIN_BTN_TEXT',
|
|
99
|
+
},
|
|
100
|
+
EVM_CONNECT_DISPATCHER_POPUP_CONNECTED_HINT: {
|
|
101
|
+
defaultMessage: 'Connected',
|
|
102
|
+
id: 'EVM_CONNECT_DISPATCHER_POPUP_CONNECTED_HINT',
|
|
103
|
+
},
|
|
104
|
+
EVM_CONNECT_DISPATCHER_POPUP_RECENT_HINT: {
|
|
105
|
+
defaultMessage: 'Recent',
|
|
106
|
+
id: 'EVM_CONNECT_DISPATCHER_POPUP_RECENT_HINT',
|
|
107
|
+
},
|
|
108
|
+
});
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { type EvmNetworkConfig } from '@broxus/js-bridge-essentials';
|
|
2
|
+
import { AbstractStore, type NativeCurrency } from '@broxus/js-core';
|
|
3
|
+
import { type IReactionDisposer } from 'mobx';
|
|
4
|
+
import Web3 from 'web3';
|
|
5
|
+
import { type EthereumConnector } from '../core';
|
|
6
|
+
import { type AddEthereumChainParams, type EvmWalletProviderConfig } from '../types';
|
|
7
|
+
export interface EvmWalletServiceCtorParams {
|
|
8
|
+
defaultNetworkId?: number;
|
|
9
|
+
/**
|
|
10
|
+
* List of supported networks
|
|
11
|
+
*/
|
|
12
|
+
networks?: Readonly<EvmNetworkConfig[]>;
|
|
13
|
+
providerId?: string;
|
|
14
|
+
/**
|
|
15
|
+
* List of supported Providers
|
|
16
|
+
*/
|
|
17
|
+
providers?: Readonly<EvmWalletProviderConfig[]>;
|
|
18
|
+
}
|
|
19
|
+
export interface EvmWalletServiceData {
|
|
20
|
+
balance?: string;
|
|
21
|
+
networks: Readonly<EvmNetworkConfig[]>;
|
|
22
|
+
}
|
|
23
|
+
export interface EvmWalletServiceState {
|
|
24
|
+
isSyncing?: boolean;
|
|
25
|
+
providerId?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class EvmWalletService extends AbstractStore<EvmWalletServiceData, EvmWalletServiceState> {
|
|
28
|
+
protected readonly params?: Readonly<EvmWalletServiceCtorParams> | undefined;
|
|
29
|
+
constructor(params?: Readonly<EvmWalletServiceCtorParams> | undefined);
|
|
30
|
+
/**
|
|
31
|
+
* Manually connect to the wallet
|
|
32
|
+
* @returns {Promise<void>}
|
|
33
|
+
*/
|
|
34
|
+
connect(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Manually disconnect from the wallet
|
|
37
|
+
* @returns {Promise<void>}
|
|
38
|
+
*/
|
|
39
|
+
disconnect(force?: boolean): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Switch network or add a new one if not exists in the current connected wallet
|
|
42
|
+
* @param {number|AddEthereumChainParams} chainIdOrParams
|
|
43
|
+
* @returns {Promise<void>}
|
|
44
|
+
*/
|
|
45
|
+
switchNetwork(chainIdOrParams: number | AddEthereumChainParams): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Define current provider connector
|
|
48
|
+
* @returns {EthereumConnector|undefined}
|
|
49
|
+
*/
|
|
50
|
+
get connector(): EthereumConnector | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* An independent RPC connection that allows you to receive data from the blockchain without being
|
|
53
|
+
* able to send transactions.
|
|
54
|
+
*
|
|
55
|
+
* This connection does not require connection permissions and wrapped on `Web3` interface.
|
|
56
|
+
* @returns {Web3|undefined}
|
|
57
|
+
*/
|
|
58
|
+
get connection(): Web3 | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Returns current Web3 Instance
|
|
61
|
+
*/
|
|
62
|
+
get provider(): Web3 | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Returns computed wallet balance value
|
|
65
|
+
* @returns {EvmWalletServiceData["balance"]}
|
|
66
|
+
*/
|
|
67
|
+
get balance(): EvmWalletServiceData['balance'];
|
|
68
|
+
/**
|
|
69
|
+
* List of the supported networks
|
|
70
|
+
* @returns {EvmWalletServiceData["networks"]}
|
|
71
|
+
*/
|
|
72
|
+
get networks(): EvmWalletServiceData['networks'];
|
|
73
|
+
/**
|
|
74
|
+
* Returns `true` if wallet contract is updating
|
|
75
|
+
* @returns {EvmWalletServiceState["isSyncing"]}
|
|
76
|
+
*/
|
|
77
|
+
get isSyncing(): EvmWalletServiceState['isSyncing'];
|
|
78
|
+
/**
|
|
79
|
+
A unique identifier of the connected wallet (provider)
|
|
80
|
+
* @returns {EvmWalletServiceState["providerId"]}
|
|
81
|
+
*/
|
|
82
|
+
get providerId(): EvmWalletServiceState['providerId'];
|
|
83
|
+
/**
|
|
84
|
+
* Returns computed wallet address value
|
|
85
|
+
* @returns {string|undefined}
|
|
86
|
+
*/
|
|
87
|
+
get address(): string | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* Returns wallet native currency
|
|
90
|
+
* @returns {Readonly<NativeCurrency<string>>}
|
|
91
|
+
*/
|
|
92
|
+
get currency(): Readonly<NativeCurrency<string>>;
|
|
93
|
+
/**
|
|
94
|
+
* Returns `true` if provider is available.
|
|
95
|
+
* That means extension is installed and activated, else `false`
|
|
96
|
+
* @returns {boolean}
|
|
97
|
+
*/
|
|
98
|
+
get hasProvider(): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Returns `true` if wallet is connected
|
|
101
|
+
* @returns {boolean}
|
|
102
|
+
*/
|
|
103
|
+
get isConnected(): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Returns `true` if wallet is initialized and connected
|
|
106
|
+
* @returns {boolean}
|
|
107
|
+
*/
|
|
108
|
+
get isReady(): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Checks network support
|
|
111
|
+
* @returns {boolean}
|
|
112
|
+
*/
|
|
113
|
+
get isUnsupportedNetwork(): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Returns current network config
|
|
116
|
+
* @returns {Readonly<EvmNetworkConfig|undefined>}
|
|
117
|
+
*/
|
|
118
|
+
get network(): Readonly<EvmNetworkConfig | undefined>;
|
|
119
|
+
/**
|
|
120
|
+
Returns details about current connected provider
|
|
121
|
+
* @returns {EvmWalletProviderConfig["info"]|undefined}
|
|
122
|
+
*/
|
|
123
|
+
get providerInfo(): EvmWalletProviderConfig['info'] | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* The list of the supported providers
|
|
126
|
+
* @returns {Readonly<EvmWalletProviderConfig[]|undefined>}
|
|
127
|
+
*/
|
|
128
|
+
get providers(): Readonly<EvmWalletProviderConfig[] | undefined>;
|
|
129
|
+
/**
|
|
130
|
+
* Returns current network chain id
|
|
131
|
+
* @returns {EthereumConnector["chainId"]}
|
|
132
|
+
*/
|
|
133
|
+
get chainId(): EthereumConnector['chainId'];
|
|
134
|
+
/**
|
|
135
|
+
* Returns `true` if wallet is connecting
|
|
136
|
+
* @returns {EthereumConnector["isConnecting"]}
|
|
137
|
+
*/
|
|
138
|
+
get isConnecting(): EthereumConnector['isConnecting'];
|
|
139
|
+
/**
|
|
140
|
+
* Returns `true` if wallet is disconnecting
|
|
141
|
+
* @returns {EthereumConnector["isDisconnecting"]}
|
|
142
|
+
*/
|
|
143
|
+
get isDisconnecting(): EthereumConnector['isDisconnecting'];
|
|
144
|
+
/**
|
|
145
|
+
* Returns `true` if wallet is initialized
|
|
146
|
+
* @returns {EthereumConnector["isInitialized"]}
|
|
147
|
+
*/
|
|
148
|
+
get isInitialized(): EthereumConnector['isInitialized'];
|
|
149
|
+
/**
|
|
150
|
+
* Returns `true` if wallet is initializing
|
|
151
|
+
* @returns {EthereumConnector["isInitializing"]}
|
|
152
|
+
*/
|
|
153
|
+
get isInitializing(): EthereumConnector['isInitializing'];
|
|
154
|
+
/**
|
|
155
|
+
* Sync account balance
|
|
156
|
+
*/
|
|
157
|
+
protected syncBalance(): Promise<void>;
|
|
158
|
+
/**
|
|
159
|
+
* Trying to resolve EVM Wallet connection
|
|
160
|
+
* @protected
|
|
161
|
+
*/
|
|
162
|
+
protected init(): Promise<void>;
|
|
163
|
+
protected accountDisposer: IReactionDisposer | undefined;
|
|
164
|
+
protected networkDisposer: IReactionDisposer | undefined;
|
|
165
|
+
}
|
|
@@ -0,0 +1,423 @@
|
|
|
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 { AbstractStore } from '@broxus/js-core';
|
|
11
|
+
import { debounce, debug, error } from '@broxus/js-utils';
|
|
12
|
+
import { action, computed, makeObservable, reaction } from 'mobx';
|
|
13
|
+
import Web3 from 'web3';
|
|
14
|
+
export class EvmWalletService extends AbstractStore {
|
|
15
|
+
params;
|
|
16
|
+
constructor(params) {
|
|
17
|
+
super();
|
|
18
|
+
this.params = params;
|
|
19
|
+
this.setData(() => ({
|
|
20
|
+
networks: params?.networks || [],
|
|
21
|
+
}));
|
|
22
|
+
this.setState(() => ({
|
|
23
|
+
isSyncing: undefined,
|
|
24
|
+
providerId: params?.providerId,
|
|
25
|
+
}));
|
|
26
|
+
makeObservable(this);
|
|
27
|
+
this.init().catch(reason => {
|
|
28
|
+
error('Wallet init failed with an error', reason);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Manually connect to the wallet
|
|
33
|
+
* @returns {Promise<void>}
|
|
34
|
+
*/
|
|
35
|
+
async connect() {
|
|
36
|
+
if (this.isConnecting || this.isDisconnecting) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const defaultNetworkId = this.params?.defaultNetworkId ?? this.network?.chainId ?? 1;
|
|
41
|
+
const chainParams = this.networks.find(network => network.chainId === defaultNetworkId?.toString());
|
|
42
|
+
await this.connector?.connect(chainParams ?? 1);
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
error('EVM Wallet connect error', e);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Manually disconnect from the wallet
|
|
50
|
+
* @returns {Promise<void>}
|
|
51
|
+
*/
|
|
52
|
+
async disconnect(force) {
|
|
53
|
+
if ((this.isConnecting || this.isDisconnecting) && !force) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
await this.connector?.disconnect();
|
|
58
|
+
this.setData('balance', undefined);
|
|
59
|
+
this.setState('providerId', undefined);
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
error('EVM Wallet disconnect error', e);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
//
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Switch network or add a new one if not exists in the current connected wallet
|
|
70
|
+
* @param {number|AddEthereumChainParams} chainIdOrParams
|
|
71
|
+
* @returns {Promise<void>}
|
|
72
|
+
*/
|
|
73
|
+
async switchNetwork(chainIdOrParams) {
|
|
74
|
+
await this.connector?.switchNetwork(chainIdOrParams);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Define current provider connector
|
|
78
|
+
* @returns {EthereumConnector|undefined}
|
|
79
|
+
*/
|
|
80
|
+
get connector() {
|
|
81
|
+
return this.providers?.find(config => config.id === this.providerId)?.connector;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* An independent RPC connection that allows you to receive data from the blockchain without being
|
|
85
|
+
* able to send transactions.
|
|
86
|
+
*
|
|
87
|
+
* This connection does not require connection permissions and wrapped on `Web3` interface.
|
|
88
|
+
* @returns {Web3|undefined}
|
|
89
|
+
*/
|
|
90
|
+
get connection() {
|
|
91
|
+
return this.network?.rpcUrl ? new Web3(new Web3.providers.HttpProvider(this.network.rpcUrl)) : this.provider;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Returns current Web3 Instance
|
|
95
|
+
*/
|
|
96
|
+
get provider() {
|
|
97
|
+
return this.connector?.provider != null ? new Web3(this.connector.provider) : undefined;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Returns computed wallet balance value
|
|
101
|
+
* @returns {EvmWalletServiceData["balance"]}
|
|
102
|
+
*/
|
|
103
|
+
get balance() {
|
|
104
|
+
return this._data.balance ?? '0';
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* List of the supported networks
|
|
108
|
+
* @returns {EvmWalletServiceData["networks"]}
|
|
109
|
+
*/
|
|
110
|
+
get networks() {
|
|
111
|
+
return this._data?.networks;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Returns `true` if wallet contract is updating
|
|
115
|
+
* @returns {EvmWalletServiceState["isSyncing"]}
|
|
116
|
+
*/
|
|
117
|
+
get isSyncing() {
|
|
118
|
+
return this._state.isSyncing;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
A unique identifier of the connected wallet (provider)
|
|
122
|
+
* @returns {EvmWalletServiceState["providerId"]}
|
|
123
|
+
*/
|
|
124
|
+
get providerId() {
|
|
125
|
+
return this._state.providerId;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Returns computed wallet address value
|
|
129
|
+
* @returns {string|undefined}
|
|
130
|
+
*/
|
|
131
|
+
get address() {
|
|
132
|
+
return this.connector?.accounts?.[0];
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Returns wallet native currency
|
|
136
|
+
* @returns {Readonly<NativeCurrency<string>>}
|
|
137
|
+
*/
|
|
138
|
+
get currency() {
|
|
139
|
+
return {
|
|
140
|
+
balance: this.balance,
|
|
141
|
+
decimals: this.network?.currency.decimals ?? 18,
|
|
142
|
+
icon: this.network?.currency.icon,
|
|
143
|
+
name: this.network?.currency.name,
|
|
144
|
+
symbol: this.network?.currency.symbol || 'ETH',
|
|
145
|
+
wrappedCurrencyAddress: this.network?.currency.wrappedCurrencyAddress,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Returns `true` if provider is available.
|
|
150
|
+
* That means extension is installed and activated, else `false`
|
|
151
|
+
* @returns {boolean}
|
|
152
|
+
*/
|
|
153
|
+
get hasProvider() {
|
|
154
|
+
return this.connector?.provider != null;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Returns `true` if wallet is connected
|
|
158
|
+
* @returns {boolean}
|
|
159
|
+
*/
|
|
160
|
+
get isConnected() {
|
|
161
|
+
return this.address !== undefined;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Returns `true` if wallet is initialized and connected
|
|
165
|
+
* @returns {boolean}
|
|
166
|
+
*/
|
|
167
|
+
get isReady() {
|
|
168
|
+
return (!this.isInitializing
|
|
169
|
+
&& !this.isConnecting
|
|
170
|
+
&& !this.isDisconnecting
|
|
171
|
+
&& this.isInitialized === true
|
|
172
|
+
&& this.isConnected);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Checks network support
|
|
176
|
+
* @returns {boolean}
|
|
177
|
+
*/
|
|
178
|
+
get isUnsupportedNetwork() {
|
|
179
|
+
if (this.chainId == null) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
return !(this.networks?.map(network => network.chainId)?.includes(this.chainId.toString()) ?? false);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Returns current network config
|
|
186
|
+
* @returns {Readonly<EvmNetworkConfig|undefined>}
|
|
187
|
+
*/
|
|
188
|
+
get network() {
|
|
189
|
+
return this.networks?.find(network => network.type === 'evm' && network.chainId === this.chainId?.toString());
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
Returns details about current connected provider
|
|
193
|
+
* @returns {EvmWalletProviderConfig["info"]|undefined}
|
|
194
|
+
*/
|
|
195
|
+
get providerInfo() {
|
|
196
|
+
return this.providers?.find(config => config.id === this.providerId)?.info;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* The list of the supported providers
|
|
200
|
+
* @returns {Readonly<EvmWalletProviderConfig[]|undefined>}
|
|
201
|
+
*/
|
|
202
|
+
get providers() {
|
|
203
|
+
return this.params?.providers;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Returns current network chain id
|
|
207
|
+
* @returns {EthereumConnector["chainId"]}
|
|
208
|
+
*/
|
|
209
|
+
get chainId() {
|
|
210
|
+
return this.connector?.chainId;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Returns `true` if wallet is connecting
|
|
214
|
+
* @returns {EthereumConnector["isConnecting"]}
|
|
215
|
+
*/
|
|
216
|
+
get isConnecting() {
|
|
217
|
+
return this.connector?.isConnecting;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Returns `true` if wallet is disconnecting
|
|
221
|
+
* @returns {EthereumConnector["isDisconnecting"]}
|
|
222
|
+
*/
|
|
223
|
+
get isDisconnecting() {
|
|
224
|
+
return this.connector?.isDisconnecting;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Returns `true` if wallet is initialized
|
|
228
|
+
* @returns {EthereumConnector["isInitialized"]}
|
|
229
|
+
*/
|
|
230
|
+
get isInitialized() {
|
|
231
|
+
return this.connector?.isInitialized;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Returns `true` if wallet is initializing
|
|
235
|
+
* @returns {EthereumConnector["isInitializing"]}
|
|
236
|
+
*/
|
|
237
|
+
get isInitializing() {
|
|
238
|
+
return this.connector?.isInitializing;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Sync account balance
|
|
242
|
+
*/
|
|
243
|
+
async syncBalance() {
|
|
244
|
+
if (!this.provider) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
if (this.address) {
|
|
249
|
+
this.setState('isSyncing', this.isSyncing === undefined);
|
|
250
|
+
const balance = await this.provider.eth.getBalance(this.address);
|
|
251
|
+
this.setData('balance', balance.toString());
|
|
252
|
+
debug(`Sync EVM balance: ${balance}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
error('Sync EVM balance failed with an error', e);
|
|
257
|
+
this.setData('balance', undefined);
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
this.setState('isSyncing', false);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Trying to resolve EVM Wallet connection
|
|
265
|
+
* @protected
|
|
266
|
+
*/
|
|
267
|
+
async init() {
|
|
268
|
+
this.accountDisposer = reaction(() => this.address, async (address, prevAddress) => {
|
|
269
|
+
if (address?.toLowerCase() !== prevAddress?.toLowerCase()) {
|
|
270
|
+
this.setState('isSyncing', undefined);
|
|
271
|
+
}
|
|
272
|
+
await this.syncBalance();
|
|
273
|
+
});
|
|
274
|
+
this.networkDisposer = reaction(() => this.chainId, async (chainId, prevChainId) => {
|
|
275
|
+
if (chainId !== prevChainId) {
|
|
276
|
+
this.setState('isSyncing', undefined);
|
|
277
|
+
}
|
|
278
|
+
await this.syncBalance();
|
|
279
|
+
});
|
|
280
|
+
const handler = debounce(async () => {
|
|
281
|
+
await this.syncBalance();
|
|
282
|
+
handler();
|
|
283
|
+
}, 10_000);
|
|
284
|
+
handler();
|
|
285
|
+
}
|
|
286
|
+
accountDisposer;
|
|
287
|
+
networkDisposer;
|
|
288
|
+
}
|
|
289
|
+
__decorate([
|
|
290
|
+
action.bound,
|
|
291
|
+
__metadata("design:type", Function),
|
|
292
|
+
__metadata("design:paramtypes", []),
|
|
293
|
+
__metadata("design:returntype", Promise)
|
|
294
|
+
], EvmWalletService.prototype, "connect", null);
|
|
295
|
+
__decorate([
|
|
296
|
+
action.bound,
|
|
297
|
+
__metadata("design:type", Function),
|
|
298
|
+
__metadata("design:paramtypes", [Boolean]),
|
|
299
|
+
__metadata("design:returntype", Promise)
|
|
300
|
+
], EvmWalletService.prototype, "disconnect", null);
|
|
301
|
+
__decorate([
|
|
302
|
+
action.bound,
|
|
303
|
+
__metadata("design:type", Function),
|
|
304
|
+
__metadata("design:paramtypes", [Object]),
|
|
305
|
+
__metadata("design:returntype", Promise)
|
|
306
|
+
], EvmWalletService.prototype, "switchNetwork", null);
|
|
307
|
+
__decorate([
|
|
308
|
+
computed,
|
|
309
|
+
__metadata("design:type", Object),
|
|
310
|
+
__metadata("design:paramtypes", [])
|
|
311
|
+
], EvmWalletService.prototype, "connector", null);
|
|
312
|
+
__decorate([
|
|
313
|
+
computed,
|
|
314
|
+
__metadata("design:type", Object),
|
|
315
|
+
__metadata("design:paramtypes", [])
|
|
316
|
+
], EvmWalletService.prototype, "connection", null);
|
|
317
|
+
__decorate([
|
|
318
|
+
computed,
|
|
319
|
+
__metadata("design:type", Object),
|
|
320
|
+
__metadata("design:paramtypes", [])
|
|
321
|
+
], EvmWalletService.prototype, "provider", null);
|
|
322
|
+
__decorate([
|
|
323
|
+
computed,
|
|
324
|
+
__metadata("design:type", Object),
|
|
325
|
+
__metadata("design:paramtypes", [])
|
|
326
|
+
], EvmWalletService.prototype, "balance", null);
|
|
327
|
+
__decorate([
|
|
328
|
+
computed,
|
|
329
|
+
__metadata("design:type", Object),
|
|
330
|
+
__metadata("design:paramtypes", [])
|
|
331
|
+
], EvmWalletService.prototype, "networks", null);
|
|
332
|
+
__decorate([
|
|
333
|
+
computed,
|
|
334
|
+
__metadata("design:type", Object),
|
|
335
|
+
__metadata("design:paramtypes", [])
|
|
336
|
+
], EvmWalletService.prototype, "isSyncing", null);
|
|
337
|
+
__decorate([
|
|
338
|
+
computed,
|
|
339
|
+
__metadata("design:type", Object),
|
|
340
|
+
__metadata("design:paramtypes", [])
|
|
341
|
+
], EvmWalletService.prototype, "providerId", null);
|
|
342
|
+
__decorate([
|
|
343
|
+
computed,
|
|
344
|
+
__metadata("design:type", Object),
|
|
345
|
+
__metadata("design:paramtypes", [])
|
|
346
|
+
], EvmWalletService.prototype, "address", null);
|
|
347
|
+
__decorate([
|
|
348
|
+
computed,
|
|
349
|
+
__metadata("design:type", Object),
|
|
350
|
+
__metadata("design:paramtypes", [])
|
|
351
|
+
], EvmWalletService.prototype, "currency", null);
|
|
352
|
+
__decorate([
|
|
353
|
+
computed,
|
|
354
|
+
__metadata("design:type", Boolean),
|
|
355
|
+
__metadata("design:paramtypes", [])
|
|
356
|
+
], EvmWalletService.prototype, "hasProvider", null);
|
|
357
|
+
__decorate([
|
|
358
|
+
computed,
|
|
359
|
+
__metadata("design:type", Boolean),
|
|
360
|
+
__metadata("design:paramtypes", [])
|
|
361
|
+
], EvmWalletService.prototype, "isConnected", null);
|
|
362
|
+
__decorate([
|
|
363
|
+
computed,
|
|
364
|
+
__metadata("design:type", Boolean),
|
|
365
|
+
__metadata("design:paramtypes", [])
|
|
366
|
+
], EvmWalletService.prototype, "isReady", null);
|
|
367
|
+
__decorate([
|
|
368
|
+
computed,
|
|
369
|
+
__metadata("design:type", Boolean),
|
|
370
|
+
__metadata("design:paramtypes", [])
|
|
371
|
+
], EvmWalletService.prototype, "isUnsupportedNetwork", null);
|
|
372
|
+
__decorate([
|
|
373
|
+
computed,
|
|
374
|
+
__metadata("design:type", Object),
|
|
375
|
+
__metadata("design:paramtypes", [])
|
|
376
|
+
], EvmWalletService.prototype, "network", null);
|
|
377
|
+
__decorate([
|
|
378
|
+
computed,
|
|
379
|
+
__metadata("design:type", Object),
|
|
380
|
+
__metadata("design:paramtypes", [])
|
|
381
|
+
], EvmWalletService.prototype, "providerInfo", null);
|
|
382
|
+
__decorate([
|
|
383
|
+
computed,
|
|
384
|
+
__metadata("design:type", Object),
|
|
385
|
+
__metadata("design:paramtypes", [])
|
|
386
|
+
], EvmWalletService.prototype, "providers", null);
|
|
387
|
+
__decorate([
|
|
388
|
+
computed,
|
|
389
|
+
__metadata("design:type", Object),
|
|
390
|
+
__metadata("design:paramtypes", [])
|
|
391
|
+
], EvmWalletService.prototype, "chainId", null);
|
|
392
|
+
__decorate([
|
|
393
|
+
computed,
|
|
394
|
+
__metadata("design:type", Object),
|
|
395
|
+
__metadata("design:paramtypes", [])
|
|
396
|
+
], EvmWalletService.prototype, "isConnecting", null);
|
|
397
|
+
__decorate([
|
|
398
|
+
computed,
|
|
399
|
+
__metadata("design:type", Object),
|
|
400
|
+
__metadata("design:paramtypes", [])
|
|
401
|
+
], EvmWalletService.prototype, "isDisconnecting", null);
|
|
402
|
+
__decorate([
|
|
403
|
+
computed,
|
|
404
|
+
__metadata("design:type", Object),
|
|
405
|
+
__metadata("design:paramtypes", [])
|
|
406
|
+
], EvmWalletService.prototype, "isInitialized", null);
|
|
407
|
+
__decorate([
|
|
408
|
+
computed,
|
|
409
|
+
__metadata("design:type", Object),
|
|
410
|
+
__metadata("design:paramtypes", [])
|
|
411
|
+
], EvmWalletService.prototype, "isInitializing", null);
|
|
412
|
+
__decorate([
|
|
413
|
+
action.bound,
|
|
414
|
+
__metadata("design:type", Function),
|
|
415
|
+
__metadata("design:paramtypes", []),
|
|
416
|
+
__metadata("design:returntype", Promise)
|
|
417
|
+
], EvmWalletService.prototype, "syncBalance", null);
|
|
418
|
+
__decorate([
|
|
419
|
+
action.bound,
|
|
420
|
+
__metadata("design:type", Function),
|
|
421
|
+
__metadata("design:paramtypes", []),
|
|
422
|
+
__metadata("design:returntype", Promise)
|
|
423
|
+
], EvmWalletService.prototype, "init", null);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../services/EvmWalletService';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../services/EvmWalletService';
|