@web3auth/no-modal 10.5.6 → 10.7.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.
Files changed (21) hide show
  1. package/dist/lib.cjs/base/utils.js +1 -1
  2. package/dist/lib.cjs/connectors/wallet-connect-v2-connector/WalletConnectV2Provider.js +25 -5
  3. package/dist/lib.cjs/connectors/wallet-connect-v2-connector/walletConnectV2Connector.js +14 -0
  4. package/dist/lib.cjs/connectors/wallet-connect-v2-connector/walletConnectV2Utils.js +22 -3
  5. package/dist/lib.cjs/providers/ethereum-mpc-provider/providers/signingProviders/EthereumSigningProvider.js +32 -0
  6. package/dist/lib.cjs/providers/ethereum-provider/rpc/ethRpcMiddlewares.js +10 -2
  7. package/dist/lib.cjs/types/base/chain/IChainInterface.d.ts +12 -0
  8. package/dist/lib.cjs/types/connectors/wallet-connect-v2-connector/WalletConnectV2Provider.d.ts +3 -1
  9. package/dist/lib.cjs/types/connectors/wallet-connect-v2-connector/walletConnectV2Utils.d.ts +6 -0
  10. package/dist/lib.cjs/types/providers/ethereum-mpc-provider/providers/signingProviders/EthereumSigningProvider.d.ts +2 -1
  11. package/dist/lib.cjs/types/providers/ethereum-provider/rpc/ethRpcMiddlewares.d.ts +1 -1
  12. package/dist/lib.cjs/types/providers/ethereum-provider/rpc/interfaces.d.ts +2 -0
  13. package/dist/lib.esm/base/utils.js +1 -1
  14. package/dist/lib.esm/connectors/wallet-connect-v2-connector/WalletConnectV2Provider.js +27 -7
  15. package/dist/lib.esm/connectors/wallet-connect-v2-connector/walletConnectV2Connector.js +14 -0
  16. package/dist/lib.esm/connectors/wallet-connect-v2-connector/walletConnectV2Utils.js +19 -1
  17. package/dist/lib.esm/providers/ethereum-mpc-provider/providers/signingProviders/EthereumSigningProvider.js +32 -0
  18. package/dist/lib.esm/providers/ethereum-provider/rpc/ethRpcMiddlewares.js +10 -2
  19. package/dist/noModal.umd.min.js +1 -1
  20. package/dist/noModal.umd.min.js.LICENSE.txt +9 -0
  21. package/package.json +11 -11
@@ -145,7 +145,7 @@ const getWalletServicesAnalyticsProperties = walletServicesConfig => {
145
145
  ws_default_portfolio: walletServicesConfig === null || walletServicesConfig === void 0 || (_walletServicesConfig1 = walletServicesConfig.whiteLabel) === null || _walletServicesConfig1 === void 0 ? void 0 : _walletServicesConfig1.defaultPortfolio
146
146
  };
147
147
  };
148
- const sdkVersion = "10.5.6";
148
+ const sdkVersion = "10.7.0";
149
149
  const getErrorAnalyticsProperties = error => {
150
150
  try {
151
151
  const code = error instanceof index.Web3AuthError ? error.code : error === null || error === void 0 ? void 0 : error.code;
@@ -77,11 +77,9 @@ class WalletConnectV2Provider extends baseProvider.BaseProvider {
77
77
  message: "Connector is not initialized, pass wallet connect connector in constructor",
78
78
  code: 4902
79
79
  });
80
- const currentChainConfig = this.getChain(chainId);
81
- const {
82
- chainId: currentChainId
83
- } = currentChainConfig;
84
- const currentNumChainId = parseInt(currentChainId, 16);
80
+ const newChainConfig = this.getChain(chainId);
81
+ if (!newChainConfig) throw index.WalletLoginError.connectionError("Chain config is not available");
82
+ const currentNumChainId = parseInt(this.getCurrentChainId(), 16);
85
83
  await walletConnectV2Utils.switchChain({
86
84
  connector: this.connector,
87
85
  chainId: currentNumChainId,
@@ -93,6 +91,18 @@ class WalletConnectV2Provider extends baseProvider.BaseProvider {
93
91
  chainId
94
92
  });
95
93
  }
94
+ async addChain(chainConfig) {
95
+ if (!this.connector) throw auth.providerErrors.custom({
96
+ message: "Connector is not initialized, pass wallet connect connector in constructor",
97
+ code: 4902
98
+ });
99
+ const currentNumChainId = parseInt(this.getCurrentChainId(), 16);
100
+ await walletConnectV2Utils.addChain({
101
+ connector: this.connector,
102
+ chainId: currentNumChainId,
103
+ chainConfig
104
+ });
105
+ }
96
106
  // no need to implement this method in wallet connect v2.
97
107
  async lookupNetwork(_, chainId) {
98
108
  return chainId;
@@ -166,6 +176,9 @@ class WalletConnectV2Provider extends baseProvider.BaseProvider {
166
176
  await this.switchChain({
167
177
  chainId
168
178
  });
179
+ },
180
+ addChain: async params => {
181
+ await this.addChain(params);
169
182
  }
170
183
  };
171
184
  const chainSwitchMiddleware = ethRpcMiddlewares.createEthChainSwitchMiddleware(chainSwitchHandlers);
@@ -230,6 +243,13 @@ class WalletConnectV2Provider extends baseProvider.BaseProvider {
230
243
  }
231
244
  });
232
245
  }
246
+ getCurrentChainId() {
247
+ const currentChain = this.state.chainId;
248
+ if (!currentChain || currentChain === "loading") {
249
+ return this.config.chains[0].chainId;
250
+ }
251
+ return currentChain;
252
+ }
233
253
  }
234
254
  _WalletConnectV2Provider = WalletConnectV2Provider;
235
255
  _defineProperty(WalletConnectV2Provider, "getProviderInstance", async params => {
@@ -448,6 +448,20 @@ class WalletConnectV2Connector extends baseConnector.BaseConnector {
448
448
  sessionRemovedByWallet: true
449
449
  });
450
450
  });
451
+ this.connector.events.on("session_expire", ({
452
+ topic
453
+ }) => {
454
+ var _this$activeSession6;
455
+ // Session has expired -> clean up the session
456
+ loglevel.log.info("Session expired event received for topic:", topic);
457
+ if (((_this$activeSession6 = this.activeSession) === null || _this$activeSession6 === void 0 ? void 0 : _this$activeSession6.topic) === topic) {
458
+ this.disconnect({
459
+ sessionRemovedByWallet: true
460
+ }).catch(error => {
461
+ loglevel.log.error("Failed to disconnect expired session", error);
462
+ });
463
+ }
464
+ });
451
465
  }
452
466
  async _getSignedMessage(challenge, accounts, chainNamespace) {
453
467
  const signedMessage = await this.provider.request({
@@ -2,7 +2,7 @@
2
2
 
3
3
  var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
4
4
  var bs58 = require('@toruslabs/bs58');
5
- var utils = require('@walletconnect/utils');
5
+ var utils$1 = require('@walletconnect/utils');
6
6
  var auth = require('@web3auth/auth');
7
7
  var wsEmbed = require('@web3auth/ws-embed');
8
8
  require('@babel/runtime/helpers/defineProperty');
@@ -18,6 +18,7 @@ require('../../base/plugin/errors.js');
18
18
  require('../../base/plugin/IPlugin.js');
19
19
  require('@toruslabs/constants');
20
20
  require('@toruslabs/http-helpers');
21
+ var utils = require('./utils.js');
21
22
 
22
23
  async function getLastActiveSession(signClient) {
23
24
  if (signClient.session.length) {
@@ -58,10 +59,10 @@ async function getAccounts(signClient) {
58
59
  if (!session) {
59
60
  throw auth.providerErrors.disconnected();
60
61
  }
61
- const accounts = utils.getAccountsFromNamespaces(session.namespaces);
62
+ const accounts = utils$1.getAccountsFromNamespaces(session.namespaces);
62
63
  if (accounts && accounts.length) {
63
64
  return [...new Set(accounts.map(add => {
64
- return utils.parseAccountId(add).address;
65
+ return utils$1.parseAccountId(add).address;
65
66
  }))];
66
67
  }
67
68
  throw index.WalletLoginError.connectionError("Failed to get accounts");
@@ -155,7 +156,25 @@ async function switchChain({
155
156
  chainId: newChainId
156
157
  }]);
157
158
  }
159
+ async function addChain({
160
+ connector,
161
+ chainId,
162
+ chainConfig
163
+ }) {
164
+ if (!chainConfig) {
165
+ throw auth.providerErrors.custom({
166
+ message: "Chain config is required",
167
+ code: 4902
168
+ });
169
+ }
170
+ const formattedChainId = utils.formatChainId(chainConfig.chainId);
171
+ const formattedChainConfig = _objectSpread(_objectSpread({}, chainConfig), {}, {
172
+ chainId: formattedChainId
173
+ });
174
+ await sendJrpcRequest(connector, `eip155:${chainId}`, "wallet_addEthereumChain", [formattedChainConfig]);
175
+ }
158
176
 
177
+ exports.addChain = addChain;
159
178
  exports.getAccounts = getAccounts;
160
179
  exports.getEthProviderHandlers = getEthProviderHandlers;
161
180
  exports.getSolProviderHandlers = getSolProviderHandlers;
@@ -141,6 +141,35 @@ class EthereumSigningProvider extends baseProvider.BaseProvider {
141
141
  });
142
142
  await this.setupProvider(this.state.signMethods, params.chainId);
143
143
  }
144
+ async addChain(chainConfig) {
145
+ if (!this._providerEngineProxy) throw auth.providerErrors.custom({
146
+ message: "Provider is not initialized",
147
+ code: 4902
148
+ });
149
+ if (!this.state.signMethods) {
150
+ throw auth.providerErrors.custom({
151
+ message: "sign methods are undefined",
152
+ code: 4902
153
+ });
154
+ }
155
+ // find existing chain config with the same chainId
156
+ const existingChain = this.config.chains.find(chain => chain.chainId === chainConfig.chainId);
157
+ if (existingChain) {
158
+ return;
159
+ }
160
+ // add the chain config to the config
161
+ this.config.chains.push({
162
+ chainId: chainConfig.chainId,
163
+ displayName: chainConfig.chainName,
164
+ rpcTarget: chainConfig.rpcUrls[0],
165
+ chainNamespace: baseControllers.CHAIN_NAMESPACES.EIP155,
166
+ blockExplorerUrl: chainConfig.blockExplorerUrls[0],
167
+ logo: chainConfig.iconUrls[0],
168
+ tickerName: chainConfig.nativeCurrency.name,
169
+ ticker: chainConfig.nativeCurrency.symbol,
170
+ decimals: chainConfig.nativeCurrency.decimals
171
+ });
172
+ }
144
173
  async lookupNetwork(_, chainId) {
145
174
  if (!this._providerEngineProxy) throw auth.providerErrors.custom({
146
175
  message: "Provider is not initialized",
@@ -164,6 +193,9 @@ class EthereumSigningProvider extends baseProvider.BaseProvider {
164
193
  await this.switchChain({
165
194
  chainId
166
195
  });
196
+ },
197
+ addChain: async params => {
198
+ await this.addChain(params);
167
199
  }
168
200
  };
169
201
  const chainSwitchMiddleware = ethRpcMiddlewares.createEthChainSwitchMiddleware(chainSwitchHandlers);
@@ -29,7 +29,8 @@ function createEthMiddleware(providerHandlers) {
29
29
  return ethMiddleware;
30
30
  }
31
31
  function createEthChainSwitchMiddleware({
32
- switchChain
32
+ switchChain,
33
+ addChain
33
34
  }) {
34
35
  async function updateChain(req, res) {
35
36
  var _req$params;
@@ -37,8 +38,15 @@ function createEthChainSwitchMiddleware({
37
38
  if (!chainParams) throw auth.rpcErrors.invalidParams("Missing chainId");
38
39
  res.result = await switchChain(chainParams);
39
40
  }
41
+ async function addChainConfig(req, res) {
42
+ var _req$params2;
43
+ const chainConfig = (_req$params2 = req.params) !== null && _req$params2 !== void 0 && _req$params2.length ? req.params[0] : undefined;
44
+ if (!chainConfig) throw auth.rpcErrors.invalidParams("Missing chainConfig");
45
+ res.result = await addChain(chainConfig);
46
+ }
40
47
  return auth.createScaffoldMiddleware({
41
- wallet_switchEthereumChain: auth.createAsyncMiddleware(updateChain)
48
+ wallet_switchEthereumChain: auth.createAsyncMiddleware(updateChain),
49
+ wallet_addEthereumChain: auth.createAsyncMiddleware(addChainConfig)
42
50
  });
43
51
  }
44
52
 
@@ -12,3 +12,15 @@ export type CustomChainConfig = ProviderConfig & {
12
12
  fallbackRpcTargets?: string[];
13
13
  fallbackWsTargets?: string[];
14
14
  };
15
+ export type AddEthereumChainConfig = {
16
+ chainId: string;
17
+ chainName: string;
18
+ rpcUrls: string[];
19
+ blockExplorerUrls: string[];
20
+ nativeCurrency: {
21
+ name: string;
22
+ symbol: string;
23
+ decimals: number;
24
+ };
25
+ iconUrls: string[];
26
+ };
@@ -1,5 +1,5 @@
1
1
  import type { ISignClient } from "@walletconnect/types";
2
- import { CustomChainConfig } from "../../base";
2
+ import { AddEthereumChainConfig, CustomChainConfig } from "../../base";
3
3
  import { BaseProvider, BaseProviderConfig, BaseProviderState } from "../../providers/base-provider";
4
4
  export type WalletConnectV2ProviderConfig = BaseProviderConfig;
5
5
  export interface WalletConnectV2ProviderState extends BaseProviderState {
@@ -23,6 +23,7 @@ export declare class WalletConnectV2Provider extends BaseProvider<BaseProviderCo
23
23
  switchChain({ chainId }: {
24
24
  chainId: string;
25
25
  }): Promise<void>;
26
+ addChain(chainConfig: AddEthereumChainConfig): Promise<void>;
26
27
  protected lookupNetwork(_: ISignClient, chainId: string): Promise<string>;
27
28
  private setupEngine;
28
29
  private setupEthEngine;
@@ -31,4 +32,5 @@ export declare class WalletConnectV2Provider extends BaseProvider<BaseProviderCo
31
32
  private connectedTopic;
32
33
  private checkIfAccountAllowed;
33
34
  private onConnectorStateUpdate;
35
+ private getCurrentChainId;
34
36
  }
@@ -1,4 +1,5 @@
1
1
  import type { ISignClient } from "@walletconnect/types";
2
+ import { AddEthereumChainConfig } from "../../base";
2
3
  import type { IEthProviderHandlers } from "../../providers/ethereum-provider";
3
4
  import type { ISolanaProviderHandlers } from "../../providers/solana-provider";
4
5
  export declare function sendJrpcRequest<T, U>(signClient: ISignClient, chainId: string, method: string, params: U): Promise<T>;
@@ -16,3 +17,8 @@ export declare function switchChain({ connector, chainId, newChainId, }: {
16
17
  chainId: number;
17
18
  newChainId: string;
18
19
  }): Promise<void>;
20
+ export declare function addChain({ connector, chainId, chainConfig, }: {
21
+ connector: ISignClient;
22
+ chainId: number;
23
+ chainConfig: AddEthereumChainConfig;
24
+ }): Promise<void>;
@@ -1,4 +1,4 @@
1
- import { CustomChainConfig } from "../../../../base";
1
+ import { AddEthereumChainConfig, CustomChainConfig } from "../../../../base";
2
2
  import { BaseProvider, BaseProviderConfig, BaseProviderState } from "../../../../providers/base-provider";
3
3
  interface ProviderParams {
4
4
  sign: (msgHash: Buffer, rawMsg?: Buffer) => Promise<{
@@ -66,6 +66,7 @@ export declare class EthereumSigningProvider extends BaseProvider<BaseProviderCo
66
66
  switchChain(params: {
67
67
  chainId: string;
68
68
  }): Promise<void>;
69
+ addChain(chainConfig: AddEthereumChainConfig): Promise<void>;
69
70
  protected lookupNetwork(_: ProviderParams, chainId: string): Promise<string>;
70
71
  private getChainSwitchMiddleware;
71
72
  private getAccountMiddleware;
@@ -1,4 +1,4 @@
1
1
  import { JRPCMiddleware } from "@web3auth/auth";
2
2
  import { IEthChainSwitchHandlers, IEthProviderHandlers } from "./interfaces";
3
3
  export declare function createEthMiddleware(providerHandlers: IEthProviderHandlers): JRPCMiddleware<unknown, unknown>;
4
- export declare function createEthChainSwitchMiddleware({ switchChain }: IEthChainSwitchHandlers): JRPCMiddleware<unknown, unknown>;
4
+ export declare function createEthChainSwitchMiddleware({ switchChain, addChain }: IEthChainSwitchHandlers): JRPCMiddleware<unknown, unknown>;
@@ -1,5 +1,6 @@
1
1
  import type { JRPCRequest } from "@web3auth/auth";
2
2
  import type { TransactionLike, TypedDataDomain, TypedDataField } from "ethers";
3
+ import { AddEthereumChainConfig } from "../../../base";
3
4
  export interface IEthAccountHandlers {
4
5
  updatePrivatekey: (params: {
5
6
  privateKey: string;
@@ -9,6 +10,7 @@ export interface IEthChainSwitchHandlers {
9
10
  switchChain: (params: {
10
11
  chainId: string;
11
12
  }) => Promise<void>;
13
+ addChain: (params: AddEthereumChainConfig) => Promise<void>;
12
14
  }
13
15
  export type TransactionParams<A = string> = TransactionLike<A> & {
14
16
  input?: string;
@@ -145,7 +145,7 @@ const getWalletServicesAnalyticsProperties = walletServicesConfig => {
145
145
  ws_default_portfolio: walletServicesConfig === null || walletServicesConfig === void 0 || (_walletServicesConfig1 = walletServicesConfig.whiteLabel) === null || _walletServicesConfig1 === void 0 ? void 0 : _walletServicesConfig1.defaultPortfolio
146
146
  };
147
147
  };
148
- const sdkVersion = "10.5.6";
148
+ const sdkVersion = "10.7.0";
149
149
  const getErrorAnalyticsProperties = error => {
150
150
  try {
151
151
  const code = error instanceof Web3AuthError ? error.code : error === null || error === void 0 ? void 0 : error.code;
@@ -3,14 +3,14 @@ import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
3
  import { getAccountsFromNamespaces, parseAccountId } from '@walletconnect/utils';
4
4
  import { providerErrors, JRPCEngine, providerFromEngine } from '@web3auth/auth';
5
5
  import { formatChainId } from './utils.js';
6
- import { switchChain, getAccounts, getEthProviderHandlers, getSolProviderHandlers } from './walletConnectV2Utils.js';
6
+ import { switchChain, addChain, getAccounts, getEthProviderHandlers, getSolProviderHandlers } from './walletConnectV2Utils.js';
7
7
  import { createEthMiddleware, createEthChainSwitchMiddleware } from '../../providers/ethereum-provider/rpc/ethRpcMiddlewares.js';
8
8
  import { createEthJsonRpcClient } from '../../providers/ethereum-provider/rpc/jrpcClient.js';
9
9
  import { createSolanaMiddleware } from '../../providers/solana-provider/rpc/solanaRpcMiddlewares.js';
10
10
  import { createSolanaJsonRpcClient } from '../../providers/solana-provider/rpc/JrpcClient.js';
11
11
  import { BaseProvider } from '../../providers/base-provider/baseProvider.js';
12
- import { CHAIN_NAMESPACES } from '@toruslabs/base-controllers';
13
12
  import { WalletLoginError } from '../../base/errors/index.js';
13
+ import { CHAIN_NAMESPACES } from '@toruslabs/base-controllers';
14
14
  import { log } from '../../base/loglevel.js';
15
15
 
16
16
  var _WalletConnectV2Provider;
@@ -55,11 +55,9 @@ class WalletConnectV2Provider extends BaseProvider {
55
55
  message: "Connector is not initialized, pass wallet connect connector in constructor",
56
56
  code: 4902
57
57
  });
58
- const currentChainConfig = this.getChain(chainId);
59
- const {
60
- chainId: currentChainId
61
- } = currentChainConfig;
62
- const currentNumChainId = parseInt(currentChainId, 16);
58
+ const newChainConfig = this.getChain(chainId);
59
+ if (!newChainConfig) throw WalletLoginError.connectionError("Chain config is not available");
60
+ const currentNumChainId = parseInt(this.getCurrentChainId(), 16);
63
61
  await switchChain({
64
62
  connector: this.connector,
65
63
  chainId: currentNumChainId,
@@ -71,6 +69,18 @@ class WalletConnectV2Provider extends BaseProvider {
71
69
  chainId
72
70
  });
73
71
  }
72
+ async addChain(chainConfig) {
73
+ if (!this.connector) throw providerErrors.custom({
74
+ message: "Connector is not initialized, pass wallet connect connector in constructor",
75
+ code: 4902
76
+ });
77
+ const currentNumChainId = parseInt(this.getCurrentChainId(), 16);
78
+ await addChain({
79
+ connector: this.connector,
80
+ chainId: currentNumChainId,
81
+ chainConfig
82
+ });
83
+ }
74
84
 
75
85
  // no need to implement this method in wallet connect v2.
76
86
  async lookupNetwork(_, chainId) {
@@ -145,6 +155,9 @@ class WalletConnectV2Provider extends BaseProvider {
145
155
  await this.switchChain({
146
156
  chainId
147
157
  });
158
+ },
159
+ addChain: async params => {
160
+ await this.addChain(params);
148
161
  }
149
162
  };
150
163
  const chainSwitchMiddleware = createEthChainSwitchMiddleware(chainSwitchHandlers);
@@ -209,6 +222,13 @@ class WalletConnectV2Provider extends BaseProvider {
209
222
  }
210
223
  });
211
224
  }
225
+ getCurrentChainId() {
226
+ const currentChain = this.state.chainId;
227
+ if (!currentChain || currentChain === "loading") {
228
+ return this.config.chains[0].chainId;
229
+ }
230
+ return currentChain;
231
+ }
212
232
  }
213
233
  _WalletConnectV2Provider = WalletConnectV2Provider;
214
234
  _defineProperty(WalletConnectV2Provider, "getProviderInstance", async params => {
@@ -448,6 +448,20 @@ class WalletConnectV2Connector extends BaseConnector {
448
448
  sessionRemovedByWallet: true
449
449
  });
450
450
  });
451
+ this.connector.events.on("session_expire", ({
452
+ topic
453
+ }) => {
454
+ var _this$activeSession6;
455
+ // Session has expired -> clean up the session
456
+ log.info("Session expired event received for topic:", topic);
457
+ if (((_this$activeSession6 = this.activeSession) === null || _this$activeSession6 === void 0 ? void 0 : _this$activeSession6.topic) === topic) {
458
+ this.disconnect({
459
+ sessionRemovedByWallet: true
460
+ }).catch(error => {
461
+ log.error("Failed to disconnect expired session", error);
462
+ });
463
+ }
464
+ });
451
465
  }
452
466
  async _getSignedMessage(challenge, accounts, chainNamespace) {
453
467
  const signedMessage = await this.provider.request({
@@ -3,6 +3,7 @@ import { bs58 } from '@toruslabs/bs58';
3
3
  import { getAccountsFromNamespaces, parseAccountId } from '@walletconnect/utils';
4
4
  import { providerErrors, rpcErrors } from '@web3auth/auth';
5
5
  import { EVM_METHOD_TYPES, SOLANA_METHOD_TYPES } from '@web3auth/ws-embed';
6
+ import { formatChainId } from './utils.js';
6
7
  import { WalletLoginError } from '../../base/errors/index.js';
7
8
  import { SOLANA_CAIP_CHAIN_MAP } from '../../base/constants.js';
8
9
 
@@ -142,5 +143,22 @@ async function switchChain({
142
143
  chainId: newChainId
143
144
  }]);
144
145
  }
146
+ async function addChain({
147
+ connector,
148
+ chainId,
149
+ chainConfig
150
+ }) {
151
+ if (!chainConfig) {
152
+ throw providerErrors.custom({
153
+ message: "Chain config is required",
154
+ code: 4902
155
+ });
156
+ }
157
+ const formattedChainId = formatChainId(chainConfig.chainId);
158
+ const formattedChainConfig = _objectSpread(_objectSpread({}, chainConfig), {}, {
159
+ chainId: formattedChainId
160
+ });
161
+ await sendJrpcRequest(connector, `eip155:${chainId}`, "wallet_addEthereumChain", [formattedChainConfig]);
162
+ }
145
163
 
146
- export { getAccounts, getEthProviderHandlers, getSolProviderHandlers, sendJrpcRequest, switchChain };
164
+ export { addChain, getAccounts, getEthProviderHandlers, getSolProviderHandlers, sendJrpcRequest, switchChain };
@@ -125,6 +125,35 @@ class EthereumSigningProvider extends BaseProvider {
125
125
  });
126
126
  await this.setupProvider(this.state.signMethods, params.chainId);
127
127
  }
128
+ async addChain(chainConfig) {
129
+ if (!this._providerEngineProxy) throw providerErrors.custom({
130
+ message: "Provider is not initialized",
131
+ code: 4902
132
+ });
133
+ if (!this.state.signMethods) {
134
+ throw providerErrors.custom({
135
+ message: "sign methods are undefined",
136
+ code: 4902
137
+ });
138
+ }
139
+ // find existing chain config with the same chainId
140
+ const existingChain = this.config.chains.find(chain => chain.chainId === chainConfig.chainId);
141
+ if (existingChain) {
142
+ return;
143
+ }
144
+ // add the chain config to the config
145
+ this.config.chains.push({
146
+ chainId: chainConfig.chainId,
147
+ displayName: chainConfig.chainName,
148
+ rpcTarget: chainConfig.rpcUrls[0],
149
+ chainNamespace: CHAIN_NAMESPACES.EIP155,
150
+ blockExplorerUrl: chainConfig.blockExplorerUrls[0],
151
+ logo: chainConfig.iconUrls[0],
152
+ tickerName: chainConfig.nativeCurrency.name,
153
+ ticker: chainConfig.nativeCurrency.symbol,
154
+ decimals: chainConfig.nativeCurrency.decimals
155
+ });
156
+ }
128
157
  async lookupNetwork(_, chainId) {
129
158
  if (!this._providerEngineProxy) throw providerErrors.custom({
130
159
  message: "Provider is not initialized",
@@ -148,6 +177,9 @@ class EthereumSigningProvider extends BaseProvider {
148
177
  await this.switchChain({
149
178
  chainId
150
179
  });
180
+ },
181
+ addChain: async params => {
182
+ await this.addChain(params);
151
183
  }
152
184
  };
153
185
  const chainSwitchMiddleware = createEthChainSwitchMiddleware(chainSwitchHandlers);
@@ -27,7 +27,8 @@ function createEthMiddleware(providerHandlers) {
27
27
  return ethMiddleware;
28
28
  }
29
29
  function createEthChainSwitchMiddleware({
30
- switchChain
30
+ switchChain,
31
+ addChain
31
32
  }) {
32
33
  async function updateChain(req, res) {
33
34
  var _req$params;
@@ -35,8 +36,15 @@ function createEthChainSwitchMiddleware({
35
36
  if (!chainParams) throw rpcErrors.invalidParams("Missing chainId");
36
37
  res.result = await switchChain(chainParams);
37
38
  }
39
+ async function addChainConfig(req, res) {
40
+ var _req$params2;
41
+ const chainConfig = (_req$params2 = req.params) !== null && _req$params2 !== void 0 && _req$params2.length ? req.params[0] : undefined;
42
+ if (!chainConfig) throw rpcErrors.invalidParams("Missing chainConfig");
43
+ res.result = await addChain(chainConfig);
44
+ }
38
45
  return createScaffoldMiddleware({
39
- wallet_switchEthereumChain: createAsyncMiddleware(updateChain)
46
+ wallet_switchEthereumChain: createAsyncMiddleware(updateChain),
47
+ wallet_addEthereumChain: createAsyncMiddleware(addChainConfig)
40
48
  });
41
49
  }
42
50