@broxus/evm-connect 1.4.0 → 1.4.2

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.
Files changed (33) hide show
  1. package/dist/cjs/components/EvmConnectButton/index.d.ts +3 -1
  2. package/dist/cjs/components/EvmConnectButton/index.js +8 -5
  3. package/dist/cjs/components/EvmConnector/index.d.ts +2 -0
  4. package/dist/cjs/components/EvmConnector/index.js +3 -3
  5. package/dist/cjs/context/EvmWalletProvidersContext.d.ts +3 -2
  6. package/dist/cjs/context/EvmWalletProvidersContext.js +8 -18
  7. package/dist/cjs/context/EvmWalletServiceContext.d.ts +1 -1
  8. package/dist/cjs/context/EvmWalletServiceContext.js +3 -2
  9. package/dist/cjs/core/EthereumConnector.js +7 -8
  10. package/dist/cjs/services/EvmWalletService.d.ts +1 -1
  11. package/dist/cjs/services/EvmWalletService.js +12 -4
  12. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  13. package/dist/cjs/utils/convert-network-to-chain-params.d.ts +2 -0
  14. package/dist/cjs/utils/convert-network-to-chain-params.js +18 -0
  15. package/dist/cjs/utils/index.d.ts +1 -0
  16. package/dist/cjs/utils/index.js +1 -0
  17. package/dist/esm/components/EvmConnectButton/index.d.ts +3 -1
  18. package/dist/esm/components/EvmConnectButton/index.js +8 -5
  19. package/dist/esm/components/EvmConnector/index.d.ts +2 -0
  20. package/dist/esm/components/EvmConnector/index.js +3 -3
  21. package/dist/esm/context/EvmWalletProvidersContext.d.ts +3 -2
  22. package/dist/esm/context/EvmWalletProvidersContext.js +8 -18
  23. package/dist/esm/context/EvmWalletServiceContext.d.ts +1 -1
  24. package/dist/esm/context/EvmWalletServiceContext.js +2 -2
  25. package/dist/esm/core/EthereumConnector.js +7 -8
  26. package/dist/esm/services/EvmWalletService.d.ts +1 -1
  27. package/dist/esm/services/EvmWalletService.js +12 -4
  28. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  29. package/dist/esm/utils/convert-network-to-chain-params.d.ts +2 -0
  30. package/dist/esm/utils/convert-network-to-chain-params.js +14 -0
  31. package/dist/esm/utils/index.d.ts +1 -0
  32. package/dist/esm/utils/index.js +1 -0
  33. package/package.json +4 -4
@@ -2,10 +2,12 @@ import { type ButtonProps } from '@broxus/react-uikit';
2
2
  import * as React from 'react';
3
3
  import { type EvmConnectDialogProps } from '../../components/EvmConnectDialog';
4
4
  import { type EvmWalletService } from '../../services';
5
+ import { type EvmNetworkConfig } from '../../types';
5
6
  export type EvmConnectButtonProps = React.PropsWithChildren<{
6
7
  agreementsNote?: React.ReactNode;
7
8
  className?: string;
8
9
  disabled?: boolean;
10
+ network?: EvmNetworkConfig;
9
11
  popupClassName?: EvmConnectDialogProps['className'];
10
12
  popupType?: EvmConnectDialogProps['type'];
11
13
  shape?: ButtonProps['shape'];
@@ -16,6 +18,6 @@ export type EvmConnectButtonProps = React.PropsWithChildren<{
16
18
  onConnect?: (walletService?: EvmWalletService) => Promise<void> | void;
17
19
  onOpen?: VoidFunction;
18
20
  }>;
19
- export declare const EvmConnectButton: ((props: EvmConnectButtonProps) => React.JSX.Element) & {
21
+ export declare const EvmConnectButton: (({ children, className, disabled, network, popupClassName, popupType, shape, size, standalone, type, onClose, onConnect, onOpen, }: EvmConnectButtonProps) => React.JSX.Element) & {
20
22
  displayName: string;
21
23
  };
@@ -29,15 +29,18 @@ const mobx_react_lite_1 = require("mobx-react-lite");
29
29
  const React = __importStar(require("react"));
30
30
  const EvmConnectDialog_1 = require("../../components/EvmConnectDialog");
31
31
  const context_1 = require("../../context");
32
- exports.EvmConnectButton = (0, mobx_react_lite_1.observer)((props) => {
32
+ const utils_1 = require("../../utils");
33
+ exports.EvmConnectButton = (0, mobx_react_lite_1.observer)(({ children, className, disabled, network, popupClassName, popupType, shape, size, standalone, type = 'primary', onClose, onConnect, onOpen, }) => {
33
34
  const walletService = (0, context_1.useEvmWalletService)();
34
35
  const walletProviders = React.useContext(context_1.EvmWalletProvidersContext);
35
- const { children, className, disabled, popupClassName, popupType, shape, size, standalone, type = 'primary', onClose, onConnect, onOpen, } = props;
36
36
  const [isModalShown, setModalVisibility] = React.useState(false);
37
37
  const connect = React.useCallback(async () => {
38
38
  setModalVisibility(false);
39
- await Promise.allSettled([onConnect?.(walletService), walletService.connect()]);
40
- }, [onConnect, walletService]);
39
+ await Promise.allSettled([
40
+ onConnect?.(walletService),
41
+ walletService.connect(network?.chainId ? (0, utils_1.convertNetworkToChainParams)(network) : undefined),
42
+ ]);
43
+ }, [network, onConnect, walletService]);
41
44
  const close = React.useCallback(() => {
42
45
  setModalVisibility(false);
43
46
  onClose?.();
@@ -48,6 +51,6 @@ exports.EvmConnectButton = (0, mobx_react_lite_1.observer)((props) => {
48
51
  }, [onOpen]);
49
52
  return (React.createElement(React.Fragment, null,
50
53
  React.createElement(react_uikit_1.Button, { "aria-disabled": walletService.isInitializing || walletService.isConnecting, disabled: disabled === undefined ? walletService.isInitializing || walletService.isConnecting : disabled, className: className, shape: shape, size: size, type: type, onClick: standalone ? connect : open }, children),
51
- !standalone && (React.createElement(context_1.EvmWalletProvidersProvider, { agreementsNote: walletProviders?.agreementsNote, onConnect: close },
54
+ !standalone && (React.createElement(context_1.EvmWalletProvidersProvider, { agreementsNote: walletProviders?.agreementsNote, network: network, onConnect: close },
52
55
  React.createElement(EvmConnectDialog_1.EvmConnectDialog, { className: popupClassName, open: isModalShown, type: popupType, onClose: close })))));
53
56
  });
@@ -1,5 +1,6 @@
1
1
  import { type ButtonProps } from '@broxus/react-uikit';
2
2
  import * as React from 'react';
3
+ import { type EvmNetworkConfig } from '../../types';
3
4
  import './index.css';
4
5
  export interface EvmConnectorProps {
5
6
  changeWalletButtonText?: React.ReactNode;
@@ -8,6 +9,7 @@ export interface EvmConnectorProps {
8
9
  connectButtonText?: React.ReactNode;
9
10
  connectButtonType?: ButtonProps['type'];
10
11
  disconnectButtonText?: React.ReactNode;
12
+ network?: EvmNetworkConfig;
11
13
  popupType?: 'drawer';
12
14
  suffix?: React.ReactNode;
13
15
  showDropMenu?: boolean;
@@ -44,7 +44,7 @@ exports.EvmConnector = (0, mobx_react_lite_1.observer)((props) => {
44
44
  const walletService = (0, context_1.useEvmWalletService)();
45
45
  const [, setRecentMeta] = (0, hooks_1.useRecentConnectionMeta)();
46
46
  const drop = React.useRef(null);
47
- const { changeWalletButtonText = intl.formatMessage(intl_1.default.EVM_CONNECT_CHANGE_WALLET_BTN_TEXT), className, connectButtonShape, connectButtonText = intl.formatMessage(intl_1.default.EVM_CONNECT_CONNECT_BTN_TEXT), connectButtonType, disconnectButtonText = intl.formatMessage(intl_1.default.EVM_CONNECT_DISCONNECT_BTN_TEXT), popupType, suffix, showDropMenu = true, showSubIcon = true, standalone = walletService.providers?.length === 1, } = props;
47
+ const { changeWalletButtonText = intl.formatMessage(intl_1.default.EVM_CONNECT_CHANGE_WALLET_BTN_TEXT), className, connectButtonShape, connectButtonText = intl.formatMessage(intl_1.default.EVM_CONNECT_CONNECT_BTN_TEXT), connectButtonType, disconnectButtonText = intl.formatMessage(intl_1.default.EVM_CONNECT_DISCONNECT_BTN_TEXT), network, popupType, suffix, showDropMenu = true, showSubIcon = true, standalone = walletService.providers?.length === 1, } = props;
48
48
  const changeWallet = () => {
49
49
  drop.current?.close();
50
50
  };
@@ -84,9 +84,9 @@ exports.EvmConnector = (0, mobx_react_lite_1.observer)((props) => {
84
84
  suffix,
85
85
  walletService.isConnected && showDropMenu && (React.createElement(react_uikit_1.Dropdown, { ref: drop, action: "click", overlayClassName: "evm-connect-dropdown", overlay: (React.createElement(react_uikit_1.List, { className: "uk-margin-remove", size: "large" },
86
86
  !standalone && (React.createElement(react_uikit_1.List.Item, { key: "connect-wallet" },
87
- React.createElement(EvmConnectButton_1.EvmConnectButton, { className: "evm-connect-change-wallet", popupType: popupType, type: "link", onOpen: changeWallet }, changeWalletButtonText))),
87
+ React.createElement(EvmConnectButton_1.EvmConnectButton, { className: "evm-connect-change-wallet", network: network, popupType: popupType, type: "link", onOpen: changeWallet }, changeWalletButtonText))),
88
88
  React.createElement(react_uikit_1.List.Item, null,
89
89
  React.createElement(react_uikit_1.Button, { "aria-disabled": walletService.isDisconnecting, className: "evm-connect-logout", disabled: walletService.isDisconnecting, type: "link", onClick: disconnect }, disconnectButtonText)))), placement: "bottom-right" },
90
90
  React.createElement(react_components_1.Icon, { className: "evm-connect-dropdown-trigger", icon: "ellipsisVertical", ratio: 0.8 }))),
91
- !walletService.isConnected && (React.createElement(EvmConnectButton_1.EvmConnectButton, { key: "connect", popupType: popupType, shape: connectButtonShape, standalone: standalone, type: connectButtonType }, connectButtonText)))));
91
+ !walletService.isConnected && (React.createElement(EvmConnectButton_1.EvmConnectButton, { key: "connect", network: network, popupType: popupType, shape: connectButtonShape, standalone: standalone, type: connectButtonType }, connectButtonText)))));
92
92
  });
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { type EthereumConnector } from '../core';
3
- import { type EvmWalletProviderConfig } from '../types';
3
+ import { type EvmNetworkConfig, type EvmWalletProviderConfig } from '../types';
4
4
  export interface EvmWalletProvidersContextConsumer {
5
5
  agreementsNote?: React.ReactNode;
6
6
  connect: (providerConfig: EvmWalletProviderConfig) => Promise<void>;
@@ -12,8 +12,9 @@ export declare const EvmWalletProvidersContext: React.Context<EvmWalletProviders
12
12
  export declare function useEvmWalletProviders(): EvmWalletProvidersContextConsumer;
13
13
  export type EvmWalletProvidersProviderProps = React.PropsWithChildren<{
14
14
  agreementsNote?: React.ReactNode;
15
+ network?: EvmNetworkConfig;
15
16
  onConnect?: (connector?: EthereumConnector) => Promise<void> | void;
16
17
  }>;
17
- export declare const EvmWalletProvidersProvider: (({ agreementsNote, children, onConnect }: EvmWalletProvidersProviderProps) => React.JSX.Element) & {
18
+ export declare const EvmWalletProvidersProvider: (({ agreementsNote, children, network, onConnect }: EvmWalletProvidersProviderProps) => React.JSX.Element) & {
18
19
  displayName: string;
19
20
  };
@@ -30,12 +30,13 @@ const mobx_react_lite_1 = require("mobx-react-lite");
30
30
  const React = __importStar(require("react"));
31
31
  const EvmWalletServiceContext_1 = require("../context/EvmWalletServiceContext");
32
32
  const hooks_1 = require("../hooks");
33
+ const utils_1 = require("../utils");
33
34
  exports.EvmWalletProvidersContext = React.createContext(null);
34
35
  function useEvmWalletProviders() {
35
36
  return (0, react_uikit_1.useContext)(exports.EvmWalletProvidersContext);
36
37
  }
37
38
  exports.useEvmWalletProviders = useEvmWalletProviders;
38
- exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)(({ agreementsNote, children, onConnect }) => {
39
+ exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)(({ agreementsNote, children, network, onConnect }) => {
39
40
  const walletService = (0, EvmWalletServiceContext_1.useEvmWalletService)();
40
41
  const [recentMeta, setRecentMeta] = (0, hooks_1.useRecentConnectionMeta)();
41
42
  const [error, setError] = React.useState(null);
@@ -45,23 +46,12 @@ exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)(({ agreemen
45
46
  setError(null);
46
47
  setConnectingProvider(providerConfig);
47
48
  const prevConnector = walletService.connector;
48
- const chainParams = recentMeta?.chainId
49
- ? walletService.networks.find(network => network.chainId === recentMeta.chainId) ?? 1
50
- : 1;
49
+ // eslint-disable-next-line no-nested-ternary
50
+ const chainParams = network?.chainId ? Number(network.chainId) : undefined ?? (recentMeta?.chainId
51
+ ? walletService.networks.find(_network => _network.chainId === recentMeta.chainId) ?? 1
52
+ : 1);
51
53
  (0, js_utils_1.debug)(`Try to activate ${providerConfig.info.name} connection with chain`, typeof chainParams === 'number' ? chainParams : chainParams.chainId);
52
- await providerConfig.connector?.connect(typeof chainParams === 'number'
53
- ? chainParams
54
- : {
55
- blockExplorerUrls: [chainParams.explorer.baseUrl],
56
- chainId: Number(chainParams.chainId),
57
- chainName: chainParams.name,
58
- nativeCurrency: {
59
- decimals: 18,
60
- name: chainParams.currency.name,
61
- symbol: chainParams.currency.symbol,
62
- },
63
- rpcUrls: [chainParams.rpcUrl],
64
- });
54
+ await providerConfig.connector?.connect(typeof chainParams === 'number' ? chainParams : (0, utils_1.convertNetworkToChainParams)(chainParams));
65
55
  if (providerConfig.id !== walletService.providerId) {
66
56
  await prevConnector?.disconnect(true);
67
57
  }
@@ -77,7 +67,7 @@ exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)(({ agreemen
77
67
  catch (e) {
78
68
  setError(e);
79
69
  }
80
- }, [onConnect, recentMeta?.chainId, setRecentMeta, walletService]);
70
+ }, [network, onConnect, recentMeta, setRecentMeta, walletService]);
81
71
  const reset = React.useCallback(() => {
82
72
  setError(null);
83
73
  setConnectingProvider(null);
@@ -7,5 +7,5 @@ type EvmWalletProviderProps = React.PropsWithChildren<{
7
7
  params?: EvmWalletServiceCtorParams;
8
8
  wallet?: EvmWalletService;
9
9
  }>;
10
- export declare const EvmWalletServiceProvider: React.MemoExoticComponent<({ agreementsNote, children, params, wallet, }: EvmWalletProviderProps) => React.JSX.Element>;
10
+ export declare function EvmWalletServiceProvider({ agreementsNote, children, params, wallet, }: EvmWalletProviderProps): React.JSX.Element;
11
11
  export {};
@@ -35,7 +35,7 @@ function useEvmWalletService() {
35
35
  return (0, react_uikit_1.useContext)(exports.EvmWalletServiceContext);
36
36
  }
37
37
  exports.useEvmWalletService = useEvmWalletService;
38
- exports.EvmWalletServiceProvider = React.memo(({ agreementsNote, children, params, wallet, }) => {
38
+ function EvmWalletServiceProvider({ agreementsNote, children, params, wallet, }) {
39
39
  const [, setRecentMeta] = (0, hooks_1.useRecentConnectionMeta)();
40
40
  const context = React.useMemo(() => {
41
41
  if (wallet instanceof services_1.EvmWalletService) {
@@ -51,7 +51,8 @@ exports.EvmWalletServiceProvider = React.memo(({ agreementsNote, children, param
51
51
  }, { delay: 10, fireImmediately: context.isReady }), [context, setRecentMeta]);
52
52
  return (React.createElement(exports.EvmWalletServiceContext.Provider, { value: context },
53
53
  React.createElement(EvmWalletProvidersContext_1.EvmWalletProvidersProvider, { agreementsNote: agreementsNote }, children)));
54
- });
54
+ }
55
+ exports.EvmWalletServiceProvider = EvmWalletServiceProvider;
55
56
  if (process.env.NODE_ENV !== 'production') {
56
57
  exports.EvmWalletServiceContext.displayName = 'EvmWalletServiceContext';
57
58
  }
@@ -32,18 +32,19 @@ class EthereumConnector extends js_core_1.AbstractStore {
32
32
  if (!this.provider) {
33
33
  throw new Error('Provider is not defined');
34
34
  }
35
+ const chainId = `0x${chainParams.chainId.toString(16)}`;
35
36
  await this.provider.request({
36
37
  method: 'wallet_addEthereumChain',
37
- params: [{ ...chainParams }],
38
+ params: [{ ...chainParams, chainId }],
38
39
  });
39
40
  }
40
41
  async switchNetwork(chainIdOrParams) {
41
42
  if (!this.provider) {
42
43
  throw new Error('Provider is not defined');
43
44
  }
45
+ const chainId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId;
46
+ const desiredChainId = `0x${chainId.toString(16)}`;
44
47
  try {
45
- const chainId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId;
46
- const desiredChainId = `0x${chainId.toString(16)}`;
47
48
  await this.provider.request({
48
49
  method: 'wallet_switchEthereumChain',
49
50
  params: [{ chainId: desiredChainId }],
@@ -55,7 +56,7 @@ class EthereumConnector extends js_core_1.AbstractStore {
55
56
  // 4902 indicates that the chain has not been added to MetaMask and wallet_addEthereumChain needs to be called
56
57
  // https://docs.metamask.io/guide/rpc-api.html#wallet-switchethereumchain
57
58
  if (errorCode === 4902 && typeof chainIdOrParams !== 'number') {
58
- await this.addNetwork(chainIdOrParams);
59
+ await this.addNetwork({ ...chainIdOrParams });
59
60
  }
60
61
  else {
61
62
  throw e;
@@ -66,8 +67,7 @@ class EthereumConnector extends js_core_1.AbstractStore {
66
67
  if (!this.provider) {
67
68
  throw new Error('Provider is not defined');
68
69
  }
69
- return this.provider
70
- .request({
70
+ return this.provider.request({
71
71
  method: 'wallet_watchAsset',
72
72
  params: {
73
73
  options: {
@@ -78,8 +78,7 @@ class EthereumConnector extends js_core_1.AbstractStore {
78
78
  },
79
79
  type: 'ERC20', // Initially only supports ERC20, but eventually more!
80
80
  },
81
- })
82
- .then(result => {
81
+ }).then(result => {
83
82
  if (!result) {
84
83
  throw new Error('Watch asset request was rejected');
85
84
  }
@@ -35,7 +35,7 @@ export declare class EvmWalletService extends AbstractStore<EvmWalletServiceData
35
35
  * Manually connect to the wallet
36
36
  * @returns {Promise<void>}
37
37
  */
38
- connect(): Promise<void>;
38
+ connect(chainIdOrParams?: number | AddEthereumChainParams): Promise<void>;
39
39
  /**
40
40
  * Manually disconnect from the wallet
41
41
  * @returns {Promise<void>}
@@ -17,6 +17,7 @@ const js_core_1 = require("@broxus/js-core");
17
17
  const js_utils_1 = require("@broxus/js-utils");
18
18
  const mobx_1 = require("mobx");
19
19
  const web3_1 = __importDefault(require("web3"));
20
+ const utils_1 = require("../utils");
20
21
  class EvmWalletService extends js_core_1.AbstractStore {
21
22
  params;
22
23
  constructor(params) {
@@ -45,13 +46,20 @@ class EvmWalletService extends js_core_1.AbstractStore {
45
46
  * Manually connect to the wallet
46
47
  * @returns {Promise<void>}
47
48
  */
48
- async connect() {
49
+ async connect(chainIdOrParams) {
49
50
  if (this.isConnecting || this.isDisconnecting) {
50
51
  return;
51
52
  }
52
53
  try {
53
- const defaultNetworkId = this.params?.defaultNetworkId ?? this.network?.chainId ?? 1;
54
- const chainParams = this.networks.find(network => network.chainId === defaultNetworkId?.toString());
54
+ const defaultNetworkId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId
55
+ ?? this.params?.defaultNetworkId
56
+ ?? this.network?.chainId
57
+ ?? 1;
58
+ const network = this.networks.find(_network => _network.chainId === defaultNetworkId?.toString());
59
+ // eslint-disable-next-line no-nested-ternary
60
+ const chainParams = typeof chainIdOrParams === 'object'
61
+ ? chainIdOrParams
62
+ : network ? (0, utils_1.convertNetworkToChainParams)(network) : undefined;
55
63
  await this.connector?.connect(chainParams ?? 1);
56
64
  }
57
65
  catch (e) {
@@ -312,7 +320,7 @@ __decorate([
312
320
  __decorate([
313
321
  mobx_1.action.bound,
314
322
  __metadata("design:type", Function),
315
- __metadata("design:paramtypes", []),
323
+ __metadata("design:paramtypes", [Object]),
316
324
  __metadata("design:returntype", Promise)
317
325
  ], EvmWalletService.prototype, "connect", null);
318
326
  __decorate([