@broxus/evm-connect 1.0.0 → 1.1.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.
@@ -31,7 +31,8 @@ const EvmConnectDialog_1 = require("../../components/EvmConnectDialog");
31
31
  const context_1 = require("../../context");
32
32
  exports.EvmConnectButton = (0, mobx_react_lite_1.observer)((props) => {
33
33
  const walletService = (0, context_1.useEvmWalletService)();
34
- const { agreementsNote, children, className, disabled, popupClassName, popupType, shape, size, standalone, type = 'primary', onClose, onConnect, onOpen, } = props;
34
+ const walletProviders = React.useContext(context_1.EvmWalletProvidersContext);
35
+ const { children, className, disabled, popupClassName, popupType, shape, size, standalone, type = 'primary', onClose, onConnect, onOpen, } = props;
35
36
  const [isModalShown, setModalVisibility] = React.useState(false);
36
37
  const connect = React.useCallback(async () => {
37
38
  setModalVisibility(false);
@@ -47,6 +48,6 @@ exports.EvmConnectButton = (0, mobx_react_lite_1.observer)((props) => {
47
48
  }, [onOpen]);
48
49
  return (React.createElement(React.Fragment, null,
49
50
  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),
50
- !standalone && (React.createElement(context_1.EvmWalletProvidersProvider, { agreementsNote: agreementsNote, providers: walletService.providers, onConnected: close },
51
+ !standalone && (React.createElement(context_1.EvmWalletProvidersProvider, { agreementsNote: walletProviders?.agreementsNote, onConnect: close },
51
52
  React.createElement(EvmConnectDialog_1.EvmConnectDialog, { className: popupClassName, open: isModalShown, type: popupType, onClose: close })))));
52
53
  });
@@ -39,15 +39,15 @@ const intl_1 = __importDefault(require("../../intl"));
39
39
  require("./index.css");
40
40
  exports.EvmConnectDialog = (0, mobx_react_lite_1.observer)(({ className, open, type, onClose }) => {
41
41
  const intl = (0, react_intl_1.useIntl)();
42
- const { agreementsNote, connectingProvider, reset } = (0, context_1.useEvmWalletProviders)();
42
+ const walletProviders = (0, context_1.useEvmWalletProviders)();
43
43
  const onClosed = () => {
44
- reset();
44
+ walletProviders.reset();
45
45
  };
46
46
  const close = () => {
47
47
  onClose?.();
48
48
  };
49
49
  if (type === 'drawer') {
50
- return (React.createElement(react_uikit_1.Drawer, { className: className, destroyOnClose: true, keyboard: !connectingProvider, maskClosable: !connectingProvider, motion: {
50
+ return (React.createElement(react_uikit_1.Drawer, { className: className, destroyOnClose: true, keyboard: !walletProviders.connectingProvider, maskClosable: !walletProviders.connectingProvider, motion: {
51
51
  motionLeave: true,
52
52
  removeOnLeave: true,
53
53
  // eslint-disable-next-line sort-keys
@@ -58,8 +58,8 @@ exports.EvmConnectDialog = (0, mobx_react_lite_1.observer)(({ className, open, t
58
58
  React.createElement(react_uikit_1.Component, { className: "uk-drawer-title" }, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_TITLE))),
59
59
  React.createElement("div", { className: "uk-drawer-body" },
60
60
  React.createElement(components_1.EvmProvidersDispatcher, null)),
61
- React.createElement(react_uikit_1.Text, { align: "center", className: "uk-drawer-footer uk-margin-top", component: "footer", kind: "meta" }, agreementsNote || intl.formatMessage(intl_1.default.EVM_CONNECT_AGREEMENTS_NOTE))));
61
+ React.createElement(react_uikit_1.Text, { align: "center", className: "uk-drawer-footer uk-margin-top", component: "footer", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(intl_1.default.EVM_CONNECT_AGREEMENTS_NOTE))));
62
62
  }
63
- return (React.createElement(react_uikit_1.Modal, { centered: true, className: (0, classnames_1.default)('evm-connect-modal', className), closeIcon: React.createElement(react_components_1.Close, { kind: "modal", ratio: 0.9, onClick: close }), destroyOnClose: true, footer: (React.createElement(react_uikit_1.Text, { align: "center", component: "div", kind: "meta" }, agreementsNote || intl.formatMessage(intl_1.default.EVM_CONNECT_AGREEMENTS_NOTE))), keyboard: !connectingProvider, maskClosable: !connectingProvider, title: intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_TITLE), visible: open, width: 380, onClose: close, onClosed: onClosed },
63
+ return (React.createElement(react_uikit_1.Modal, { centered: true, className: (0, classnames_1.default)('evm-connect-modal', className), closeIcon: React.createElement(react_components_1.Close, { kind: "modal", ratio: 0.9, onClick: close }), destroyOnClose: true, footer: (React.createElement(react_uikit_1.Text, { align: "center", component: "div", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(intl_1.default.EVM_CONNECT_AGREEMENTS_NOTE))), keyboard: !walletProviders.connectingProvider, maskClosable: !walletProviders.connectingProvider, title: intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_TITLE), visible: open, width: 380, onClose: close, onClosed: onClosed },
64
64
  React.createElement(components_1.EvmProvidersDispatcher, null)));
65
65
  });
@@ -37,29 +37,29 @@ const intl_1 = __importDefault(require("../../../intl"));
37
37
  require("./index.css");
38
38
  function ConnectionRequest() {
39
39
  const intl = (0, react_intl_1.useIntl)();
40
- const { connect, connectingProvider, error, reset } = (0, context_1.useEvmWalletProviders)();
40
+ const walletProviders = (0, context_1.useEvmWalletProviders)();
41
41
  const tryAgain = async () => {
42
- if (connectingProvider) {
43
- await connect(connectingProvider);
42
+ if (walletProviders.connectingProvider) {
43
+ await walletProviders.connect(walletProviders.connectingProvider);
44
44
  }
45
45
  };
46
46
  return (React.createElement("div", { className: "evm-connect-connection-request" },
47
- React.createElement(react_uikit_1.Button, { className: "evm-connect-connection-request-back-button uk-position-top-left", type: "text", onClick: reset },
47
+ React.createElement(react_uikit_1.Button, { className: "evm-connect-connection-request-back-button uk-position-top-left", type: "text", onClick: walletProviders.reset },
48
48
  React.createElement(react_components_1.Icon, { icon: "arrowLeft", ratio: 0.9 })),
49
49
  React.createElement(react_uikit_1.Grid, { childWidth: 1, gap: "collapse" },
50
- connectingProvider?.info.icon && (React.createElement(react_uikit_1.Text, { align: "center", className: (0, classnames_1.default)('uk-margin-top', {
51
- 'uk-margin-bottom': connectingProvider?.info.description,
52
- 'uk-margin-medium-bottom': !connectingProvider?.info.description,
50
+ walletProviders.connectingProvider?.info.icon && (React.createElement(react_uikit_1.Text, { align: "center", className: (0, classnames_1.default)('uk-margin-top', {
51
+ 'uk-margin-bottom': walletProviders.connectingProvider?.info.description,
52
+ 'uk-margin-medium-bottom': !walletProviders.connectingProvider?.info.description,
53
53
  }) },
54
- React.createElement("img", { src: connectingProvider.info.icon, alt: connectingProvider.info.name, height: 60, width: 60 }))),
55
- connectingProvider?.info.description && (React.createElement(react_uikit_1.Text, { align: "center", className: "uk-margin-medium-bottom", component: "div", kind: "meta" }, connectingProvider.info.description)),
56
- !error ? (React.createElement(react_uikit_1.Text, { align: "center" },
54
+ React.createElement("img", { src: walletProviders.connectingProvider.info.icon, alt: walletProviders.connectingProvider.info.name, height: 60, width: 60 }))),
55
+ walletProviders.connectingProvider?.info.description && (React.createElement(react_uikit_1.Text, { align: "center", className: "uk-margin-medium-bottom", component: "div", kind: "meta" }, walletProviders.connectingProvider.info.description)),
56
+ !walletProviders.error ? (React.createElement(react_uikit_1.Text, { align: "center" },
57
57
  React.createElement("h4", { className: "evm-connect-connection-request-title" }, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TITLE, {
58
- title: connectingProvider?.info.name ?? 'wallet',
58
+ title: walletProviders.connectingProvider?.info.name ?? 'wallet',
59
59
  })),
60
60
  React.createElement("div", null, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_NOTE)))) : (React.createElement(react_uikit_1.Text, { align: "center" },
61
61
  React.createElement("h4", { className: "evm-connect-connection-request-title uk-text-danger" }, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_TITLE)),
62
- React.createElement("div", { className: "uk-margin-small-bottom" }, error.message ? (React.createElement(react_uikit_1.Text, { color: "danger" }, error.message)) : intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_NOTE)),
62
+ React.createElement("div", { className: "uk-margin-small-bottom" }, walletProviders.error.message ? (React.createElement(react_uikit_1.Text, { color: "danger" }, walletProviders.error.message)) : intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_NOTE)),
63
63
  React.createElement(react_uikit_1.Button, { className: "evm-connect-connection-request-button", type: "default", onClick: tryAgain }, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TRY_AGAIN_BTN_TEXT)))))));
64
64
  }
65
65
  exports.ConnectionRequest = ConnectionRequest;
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { type EthereumConnector } from '../core';
2
3
  import { type EvmWalletProviderConfig } from '../types';
3
4
  export interface EvmWalletProvidersContextConsumer {
4
5
  agreementsNote?: React.ReactNode;
@@ -12,9 +13,8 @@ export declare const EvmWalletProvidersContext: React.Context<EvmWalletProviders
12
13
  export declare function useEvmWalletProviders(): EvmWalletProvidersContextConsumer;
13
14
  export type EvmWalletProvidersProviderProps = React.PropsWithChildren<{
14
15
  agreementsNote?: React.ReactNode;
15
- providers?: Readonly<EvmWalletProviderConfig[]>;
16
- onConnected?: VoidFunction;
16
+ onConnect?: (connector?: EthereumConnector) => Promise<void> | void;
17
17
  }>;
18
- export declare const EvmWalletProvidersProvider: ((props: EvmWalletProvidersProviderProps) => React.JSX.Element) & {
18
+ export declare const EvmWalletProvidersProvider: (({ agreementsNote, children, onConnect }: EvmWalletProvidersProviderProps) => React.JSX.Element) & {
19
19
  displayName: string;
20
20
  };
@@ -35,10 +35,9 @@ function useEvmWalletProviders() {
35
35
  return (0, react_uikit_1.useContext)(exports.EvmWalletProvidersContext);
36
36
  }
37
37
  exports.useEvmWalletProviders = useEvmWalletProviders;
38
- exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)((props) => {
38
+ exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)(({ agreementsNote, children, onConnect }) => {
39
39
  const walletService = (0, EvmWalletServiceContext_1.useEvmWalletService)();
40
40
  const [recentMeta, setRecentMeta] = (0, hooks_1.useRecentConnectionMeta)();
41
- const { agreementsNote, children, providers = walletService.providers } = props;
42
41
  const [error, setError] = React.useState(null);
43
42
  const [connectingProvider, setConnectingProvider] = React.useState(null);
44
43
  const connect = React.useCallback(async (providerConfig) => {
@@ -50,20 +49,23 @@ exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)((props) =>
50
49
  ? walletService.networks.find(network => network.chainId === recentMeta.chainId) ?? 1
51
50
  : 1;
52
51
  (0, js_utils_1.debug)(`Try to activate ${providerConfig.info.name} connection with chain`, typeof chainParams === 'number' ? chainParams : chainParams.chainId);
53
- await providerConfig.connector?.connect(typeof chainParams === 'number' ? chainParams : {
54
- blockExplorerUrls: [chainParams.explorer.baseUrl],
55
- chainId: Number(chainParams.chainId),
56
- chainName: chainParams.name,
57
- nativeCurrency: {
58
- decimals: 18,
59
- name: chainParams.currency.name,
60
- symbol: chainParams.currency.symbol,
61
- },
62
- rpcUrls: [chainParams.rpcUrl],
63
- });
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
+ });
64
65
  if (providerConfig.id !== walletService.providerId) {
65
66
  await prevConnector?.disconnect(true);
66
67
  }
68
+ await onConnect?.(providerConfig.connector);
67
69
  setRecentMeta({
68
70
  chainId: providerConfig.connector.chainId?.toString(),
69
71
  disconnected: false,
@@ -75,7 +77,7 @@ exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)((props) =>
75
77
  catch (e) {
76
78
  setError(e);
77
79
  }
78
- }, [recentMeta, setRecentMeta, walletService]);
80
+ }, [onConnect, recentMeta?.chainId, setRecentMeta, walletService]);
79
81
  const reset = React.useCallback(() => {
80
82
  setError(null);
81
83
  setConnectingProvider(null);
@@ -85,9 +87,8 @@ exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)((props) =>
85
87
  connect,
86
88
  connectingProvider,
87
89
  error,
88
- providers,
89
90
  reset,
90
- }), [agreementsNote, connect, connectingProvider, error, providers, reset]);
91
+ }), [agreementsNote, connect, connectingProvider, error, reset]);
91
92
  return React.createElement(exports.EvmWalletProvidersContext.Provider, { value: context }, children);
92
93
  });
93
94
  if (process.env.NODE_ENV !== 'production') {
@@ -3,8 +3,9 @@ import { EvmWalletService, type EvmWalletServiceCtorParams } from '../services';
3
3
  export declare const EvmWalletServiceContext: React.Context<EvmWalletService | null>;
4
4
  export declare function useEvmWalletService(): EvmWalletService;
5
5
  type EvmWalletProviderProps = React.PropsWithChildren<{
6
+ agreementsNote?: React.ReactNode;
6
7
  params?: EvmWalletServiceCtorParams;
7
8
  wallet?: EvmWalletService;
8
9
  }>;
9
- export declare const EvmWalletServiceProvider: React.MemoExoticComponent<({ children, params, wallet, }: EvmWalletProviderProps) => React.JSX.Element>;
10
+ export declare const EvmWalletServiceProvider: React.MemoExoticComponent<({ agreementsNote, children, params, wallet, }: EvmWalletProviderProps) => React.JSX.Element>;
10
11
  export {};
@@ -27,6 +27,7 @@ exports.EvmWalletServiceProvider = exports.useEvmWalletService = exports.EvmWall
27
27
  const react_uikit_1 = require("@broxus/react-uikit");
28
28
  const mobx_1 = require("mobx");
29
29
  const React = __importStar(require("react"));
30
+ const EvmWalletProvidersContext_1 = require("../context/EvmWalletProvidersContext");
30
31
  const hooks_1 = require("../hooks");
31
32
  const services_1 = require("../services");
32
33
  exports.EvmWalletServiceContext = React.createContext(null);
@@ -34,7 +35,7 @@ function useEvmWalletService() {
34
35
  return (0, react_uikit_1.useContext)(exports.EvmWalletServiceContext);
35
36
  }
36
37
  exports.useEvmWalletService = useEvmWalletService;
37
- exports.EvmWalletServiceProvider = React.memo(({ children, params, wallet, }) => {
38
+ exports.EvmWalletServiceProvider = React.memo(({ agreementsNote, children, params, wallet, }) => {
38
39
  const [, setRecentMeta] = (0, hooks_1.useRecentConnectionMeta)();
39
40
  const context = React.useMemo(() => {
40
41
  if (wallet instanceof services_1.EvmWalletService) {
@@ -48,7 +49,8 @@ exports.EvmWalletServiceProvider = React.memo(({ children, params, wallet, }) =>
48
49
  setRecentMeta({ ...recentMeta, chainId: chainId.toString() });
49
50
  }
50
51
  }, { delay: 10, fireImmediately: context.isReady }), [context, setRecentMeta]);
51
- return React.createElement(exports.EvmWalletServiceContext.Provider, { value: context }, children);
52
+ return (React.createElement(exports.EvmWalletServiceContext.Provider, { value: context },
53
+ React.createElement(EvmWalletProvidersContext_1.EvmWalletProvidersProvider, { agreementsNote: agreementsNote }, children)));
52
54
  });
53
55
  if (process.env.NODE_ENV !== 'production') {
54
56
  exports.EvmWalletServiceContext.displayName = 'EvmWalletServiceContext';
@@ -1,9 +1,8 @@
1
- import { type EvmNetworkConfig } from '@broxus/js-bridge-essentials';
2
1
  import { AbstractStore, type NativeCurrency } from '@broxus/js-core';
3
2
  import { type IReactionDisposer } from 'mobx';
4
3
  import Web3 from 'web3';
5
4
  import { type EthereumConnector } from '../core';
6
- import { type AddEthereumChainParams, type EvmWalletProviderConfig } from '../types';
5
+ import { type AddEthereumChainParams, type EvmNetworkConfig, type EvmWalletProviderConfig } from '../types';
7
6
  export interface EvmWalletServiceCtorParams {
8
7
  defaultNetworkId?: number;
9
8
  /**