@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
@@ -0,0 +1,2 @@
1
+ import { type AddEthereumChainParams, type EvmNetworkConfig } from '../types';
2
+ export declare function convertNetworkToChainParams(network: EvmNetworkConfig): AddEthereumChainParams;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertNetworkToChainParams = void 0;
4
+ function convertNetworkToChainParams(network) {
5
+ return {
6
+ blockExplorerUrls: [network.explorer.baseUrl],
7
+ chainId: Number(network.chainId),
8
+ chainName: network.name,
9
+ iconUrls: network.icon ? [network.icon] : undefined,
10
+ nativeCurrency: {
11
+ decimals: 18,
12
+ name: network.currency.name ?? network.currency.symbol,
13
+ symbol: network.currency.symbol,
14
+ },
15
+ rpcUrls: [network.rpcUrl],
16
+ };
17
+ }
18
+ exports.convertNetworkToChainParams = convertNetworkToChainParams;
@@ -1,2 +1,3 @@
1
+ export * from '../utils/convert-network-to-chain-params';
1
2
  export * from '../utils/get-evm-provider-platform-link';
2
3
  export * from '../utils/parse-chain-id';
@@ -14,5 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("../utils/convert-network-to-chain-params"), exports);
17
18
  __exportStar(require("../utils/get-evm-provider-platform-link"), exports);
18
19
  __exportStar(require("../utils/parse-chain-id"), exports);
@@ -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
  };
@@ -3,15 +3,18 @@ import { observer } from 'mobx-react-lite';
3
3
  import * as React from 'react';
4
4
  import { EvmConnectDialog } from '../../components/EvmConnectDialog';
5
5
  import { EvmWalletProvidersContext, EvmWalletProvidersProvider, useEvmWalletService } from '../../context';
6
- export const EvmConnectButton = observer((props) => {
6
+ import { convertNetworkToChainParams } from '../../utils';
7
+ export const EvmConnectButton = observer(({ children, className, disabled, network, popupClassName, popupType, shape, size, standalone, type = 'primary', onClose, onConnect, onOpen, }) => {
7
8
  const walletService = useEvmWalletService();
8
9
  const walletProviders = React.useContext(EvmWalletProvidersContext);
9
- const { children, className, disabled, popupClassName, popupType, shape, size, standalone, type = 'primary', onClose, onConnect, onOpen, } = props;
10
10
  const [isModalShown, setModalVisibility] = React.useState(false);
11
11
  const connect = React.useCallback(async () => {
12
12
  setModalVisibility(false);
13
- await Promise.allSettled([onConnect?.(walletService), walletService.connect()]);
14
- }, [onConnect, walletService]);
13
+ await Promise.allSettled([
14
+ onConnect?.(walletService),
15
+ walletService.connect(network?.chainId ? convertNetworkToChainParams(network) : undefined),
16
+ ]);
17
+ }, [network, onConnect, walletService]);
15
18
  const close = React.useCallback(() => {
16
19
  setModalVisibility(false);
17
20
  onClose?.();
@@ -22,6 +25,6 @@ export const EvmConnectButton = observer((props) => {
22
25
  }, [onOpen]);
23
26
  return (React.createElement(React.Fragment, null,
24
27
  React.createElement(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),
25
- !standalone && (React.createElement(EvmWalletProvidersProvider, { agreementsNote: walletProviders?.agreementsNote, onConnect: close },
28
+ !standalone && (React.createElement(EvmWalletProvidersProvider, { agreementsNote: walletProviders?.agreementsNote, network: network, onConnect: close },
26
29
  React.createElement(EvmConnectDialog, { className: popupClassName, open: isModalShown, type: popupType, onClose: close })))));
27
30
  });
@@ -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;
@@ -15,7 +15,7 @@ export const EvmConnector = observer((props) => {
15
15
  const walletService = useEvmWalletService();
16
16
  const [, setRecentMeta] = useRecentConnectionMeta();
17
17
  const drop = React.useRef(null);
18
- const { changeWalletButtonText = intl.formatMessage(messages.EVM_CONNECT_CHANGE_WALLET_BTN_TEXT), className, connectButtonShape, connectButtonText = intl.formatMessage(messages.EVM_CONNECT_CONNECT_BTN_TEXT), connectButtonType, disconnectButtonText = intl.formatMessage(messages.EVM_CONNECT_DISCONNECT_BTN_TEXT), popupType, suffix, showDropMenu = true, showSubIcon = true, standalone = walletService.providers?.length === 1, } = props;
18
+ const { changeWalletButtonText = intl.formatMessage(messages.EVM_CONNECT_CHANGE_WALLET_BTN_TEXT), className, connectButtonShape, connectButtonText = intl.formatMessage(messages.EVM_CONNECT_CONNECT_BTN_TEXT), connectButtonType, disconnectButtonText = intl.formatMessage(messages.EVM_CONNECT_DISCONNECT_BTN_TEXT), network, popupType, suffix, showDropMenu = true, showSubIcon = true, standalone = walletService.providers?.length === 1, } = props;
19
19
  const changeWallet = () => {
20
20
  drop.current?.close();
21
21
  };
@@ -55,9 +55,9 @@ export const EvmConnector = observer((props) => {
55
55
  suffix,
56
56
  walletService.isConnected && showDropMenu && (React.createElement(Dropdown, { ref: drop, action: "click", overlayClassName: "evm-connect-dropdown", overlay: (React.createElement(List, { className: "uk-margin-remove", size: "large" },
57
57
  !standalone && (React.createElement(List.Item, { key: "connect-wallet" },
58
- React.createElement(EvmConnectButton, { className: "evm-connect-change-wallet", popupType: popupType, type: "link", onOpen: changeWallet }, changeWalletButtonText))),
58
+ React.createElement(EvmConnectButton, { className: "evm-connect-change-wallet", network: network, popupType: popupType, type: "link", onOpen: changeWallet }, changeWalletButtonText))),
59
59
  React.createElement(List.Item, null,
60
60
  React.createElement(Button, { "aria-disabled": walletService.isDisconnecting, className: "evm-connect-logout", disabled: walletService.isDisconnecting, type: "link", onClick: disconnect }, disconnectButtonText)))), placement: "bottom-right" },
61
61
  React.createElement(Icon, { className: "evm-connect-dropdown-trigger", icon: "ellipsisVertical", ratio: 0.8 }))),
62
- !walletService.isConnected && (React.createElement(EvmConnectButton, { key: "connect", popupType: popupType, shape: connectButtonShape, standalone: standalone, type: connectButtonType }, connectButtonText)))));
62
+ !walletService.isConnected && (React.createElement(EvmConnectButton, { key: "connect", network: network, popupType: popupType, shape: connectButtonShape, standalone: standalone, type: connectButtonType }, connectButtonText)))));
63
63
  });
@@ -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
  };
@@ -4,11 +4,12 @@ import { observer } from 'mobx-react-lite';
4
4
  import * as React from 'react';
5
5
  import { useEvmWalletService } from '../context/EvmWalletServiceContext';
6
6
  import { useRecentConnectionMeta } from '../hooks';
7
+ import { convertNetworkToChainParams } from '../utils';
7
8
  export const EvmWalletProvidersContext = React.createContext(null);
8
9
  export function useEvmWalletProviders() {
9
10
  return useContext(EvmWalletProvidersContext);
10
11
  }
11
- export const EvmWalletProvidersProvider = observer(({ agreementsNote, children, onConnect }) => {
12
+ export const EvmWalletProvidersProvider = observer(({ agreementsNote, children, network, onConnect }) => {
12
13
  const walletService = useEvmWalletService();
13
14
  const [recentMeta, setRecentMeta] = useRecentConnectionMeta();
14
15
  const [error, setError] = React.useState(null);
@@ -18,23 +19,12 @@ export const EvmWalletProvidersProvider = observer(({ agreementsNote, children,
18
19
  setError(null);
19
20
  setConnectingProvider(providerConfig);
20
21
  const prevConnector = walletService.connector;
21
- const chainParams = recentMeta?.chainId
22
- ? walletService.networks.find(network => network.chainId === recentMeta.chainId) ?? 1
23
- : 1;
22
+ // eslint-disable-next-line no-nested-ternary
23
+ const chainParams = network?.chainId ? Number(network.chainId) : undefined ?? (recentMeta?.chainId
24
+ ? walletService.networks.find(_network => _network.chainId === recentMeta.chainId) ?? 1
25
+ : 1);
24
26
  debug(`Try to activate ${providerConfig.info.name} connection with chain`, typeof chainParams === 'number' ? chainParams : chainParams.chainId);
25
- await providerConfig.connector?.connect(typeof chainParams === 'number'
26
- ? chainParams
27
- : {
28
- blockExplorerUrls: [chainParams.explorer.baseUrl],
29
- chainId: Number(chainParams.chainId),
30
- chainName: chainParams.name,
31
- nativeCurrency: {
32
- decimals: 18,
33
- name: chainParams.currency.name,
34
- symbol: chainParams.currency.symbol,
35
- },
36
- rpcUrls: [chainParams.rpcUrl],
37
- });
27
+ await providerConfig.connector?.connect(typeof chainParams === 'number' ? chainParams : convertNetworkToChainParams(chainParams));
38
28
  if (providerConfig.id !== walletService.providerId) {
39
29
  await prevConnector?.disconnect(true);
40
30
  }
@@ -50,7 +40,7 @@ export const EvmWalletProvidersProvider = observer(({ agreementsNote, children,
50
40
  catch (e) {
51
41
  setError(e);
52
42
  }
53
- }, [onConnect, recentMeta?.chainId, setRecentMeta, walletService]);
43
+ }, [network, onConnect, recentMeta, setRecentMeta, walletService]);
54
44
  const reset = React.useCallback(() => {
55
45
  setError(null);
56
46
  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 {};
@@ -8,7 +8,7 @@ export const EvmWalletServiceContext = React.createContext(null);
8
8
  export function useEvmWalletService() {
9
9
  return useContext(EvmWalletServiceContext);
10
10
  }
11
- export const EvmWalletServiceProvider = React.memo(({ agreementsNote, children, params, wallet, }) => {
11
+ export function EvmWalletServiceProvider({ agreementsNote, children, params, wallet, }) {
12
12
  const [, setRecentMeta] = useRecentConnectionMeta();
13
13
  const context = React.useMemo(() => {
14
14
  if (wallet instanceof EvmWalletService) {
@@ -24,7 +24,7 @@ export const EvmWalletServiceProvider = React.memo(({ agreementsNote, children,
24
24
  }, { delay: 10, fireImmediately: context.isReady }), [context, setRecentMeta]);
25
25
  return (React.createElement(EvmWalletServiceContext.Provider, { value: context },
26
26
  React.createElement(EvmWalletProvidersProvider, { agreementsNote: agreementsNote }, children)));
27
- });
27
+ }
28
28
  if (process.env.NODE_ENV !== 'production') {
29
29
  EvmWalletServiceContext.displayName = 'EvmWalletServiceContext';
30
30
  }
@@ -29,18 +29,19 @@ export class EthereumConnector extends AbstractStore {
29
29
  if (!this.provider) {
30
30
  throw new Error('Provider is not defined');
31
31
  }
32
+ const chainId = `0x${chainParams.chainId.toString(16)}`;
32
33
  await this.provider.request({
33
34
  method: 'wallet_addEthereumChain',
34
- params: [{ ...chainParams }],
35
+ params: [{ ...chainParams, chainId }],
35
36
  });
36
37
  }
37
38
  async switchNetwork(chainIdOrParams) {
38
39
  if (!this.provider) {
39
40
  throw new Error('Provider is not defined');
40
41
  }
42
+ const chainId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId;
43
+ const desiredChainId = `0x${chainId.toString(16)}`;
41
44
  try {
42
- const chainId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId;
43
- const desiredChainId = `0x${chainId.toString(16)}`;
44
45
  await this.provider.request({
45
46
  method: 'wallet_switchEthereumChain',
46
47
  params: [{ chainId: desiredChainId }],
@@ -52,7 +53,7 @@ export class EthereumConnector extends AbstractStore {
52
53
  // 4902 indicates that the chain has not been added to MetaMask and wallet_addEthereumChain needs to be called
53
54
  // https://docs.metamask.io/guide/rpc-api.html#wallet-switchethereumchain
54
55
  if (errorCode === 4902 && typeof chainIdOrParams !== 'number') {
55
- await this.addNetwork(chainIdOrParams);
56
+ await this.addNetwork({ ...chainIdOrParams });
56
57
  }
57
58
  else {
58
59
  throw e;
@@ -63,8 +64,7 @@ export class EthereumConnector extends AbstractStore {
63
64
  if (!this.provider) {
64
65
  throw new Error('Provider is not defined');
65
66
  }
66
- return this.provider
67
- .request({
67
+ return this.provider.request({
68
68
  method: 'wallet_watchAsset',
69
69
  params: {
70
70
  options: {
@@ -75,8 +75,7 @@ export class EthereumConnector extends AbstractStore {
75
75
  },
76
76
  type: 'ERC20', // Initially only supports ERC20, but eventually more!
77
77
  },
78
- })
79
- .then(result => {
78
+ }).then(result => {
80
79
  if (!result) {
81
80
  throw new Error('Watch asset request was rejected');
82
81
  }
@@ -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>}
@@ -11,6 +11,7 @@ import { AbstractStore } from '@broxus/js-core';
11
11
  import { debounce, debug, error } from '@broxus/js-utils';
12
12
  import { action, computed, makeObservable, reaction } from 'mobx';
13
13
  import Web3 from 'web3';
14
+ import { convertNetworkToChainParams } from '../utils';
14
15
  export class EvmWalletService extends AbstractStore {
15
16
  params;
16
17
  constructor(params) {
@@ -39,13 +40,20 @@ export class EvmWalletService extends AbstractStore {
39
40
  * Manually connect to the wallet
40
41
  * @returns {Promise<void>}
41
42
  */
42
- async connect() {
43
+ async connect(chainIdOrParams) {
43
44
  if (this.isConnecting || this.isDisconnecting) {
44
45
  return;
45
46
  }
46
47
  try {
47
- const defaultNetworkId = this.params?.defaultNetworkId ?? this.network?.chainId ?? 1;
48
- const chainParams = this.networks.find(network => network.chainId === defaultNetworkId?.toString());
48
+ const defaultNetworkId = typeof chainIdOrParams === 'number' ? chainIdOrParams : chainIdOrParams?.chainId
49
+ ?? this.params?.defaultNetworkId
50
+ ?? this.network?.chainId
51
+ ?? 1;
52
+ const network = this.networks.find(_network => _network.chainId === defaultNetworkId?.toString());
53
+ // eslint-disable-next-line no-nested-ternary
54
+ const chainParams = typeof chainIdOrParams === 'object'
55
+ ? chainIdOrParams
56
+ : network ? convertNetworkToChainParams(network) : undefined;
49
57
  await this.connector?.connect(chainParams ?? 1);
50
58
  }
51
59
  catch (e) {
@@ -305,7 +313,7 @@ __decorate([
305
313
  __decorate([
306
314
  action.bound,
307
315
  __metadata("design:type", Function),
308
- __metadata("design:paramtypes", []),
316
+ __metadata("design:paramtypes", [Object]),
309
317
  __metadata("design:returntype", Promise)
310
318
  ], EvmWalletService.prototype, "connect", null);
311
319
  __decorate([