@0xsequence/provider 2.2.2 → 2.2.4

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.
@@ -3728,9 +3728,13 @@ class SequenceClientSession {
3728
3728
  return this.store.setItem(SequenceClientSession.SESSION_LOCALSTORE_KEY, JSON.stringify(session));
3729
3729
  }
3730
3730
  getSession() {
3731
- const session = this.store.getItem(SequenceClientSession.SESSION_LOCALSTORE_KEY);
3732
- if (session) {
3733
- return JSON.parse(session);
3731
+ try {
3732
+ const session = this.store.getItem(SequenceClientSession.SESSION_LOCALSTORE_KEY);
3733
+ if (session) {
3734
+ return JSON.parse(session);
3735
+ }
3736
+ } catch (err) {
3737
+ console.error('Error parsing session', err);
3734
3738
  }
3735
3739
  return undefined;
3736
3740
  }
@@ -4182,7 +4186,7 @@ let sequenceWalletProvider;
4182
4186
  * @throws Error if projectAccessKey is not provided, empty string or is not string.
4183
4187
  */
4184
4188
  const initWallet = (projectAccessKey, partialConfig) => {
4185
- var _config$networks$filt, _config$networks, _findNetworkConfig;
4189
+ var _findNetworkConfig, _client$getSession;
4186
4190
  if (!projectAccessKey || typeof projectAccessKey !== 'string') {
4187
4191
  throw new Error('Please pass a projectAccessKey in initWallet.');
4188
4192
  }
@@ -4194,53 +4198,29 @@ const initWallet = (projectAccessKey, partialConfig) => {
4194
4198
  const config = _extends({}, DefaultProviderConfig, partialConfig, {
4195
4199
  transports: _extends({}, DefaultProviderConfig.transports, partialConfig == null ? void 0 : partialConfig.transports)
4196
4200
  });
4197
- const rpcProviders = {};
4201
+ let networks = [];
4202
+ const updateNetworks = (connectedNetworks = []) => {
4203
+ var _config$networks;
4204
+ networks = mergeNetworks(network.allNetworks, connectedNetworks, (_config$networks = config.networks) != null ? _config$networks : []);
4205
+
4206
+ // Append projectAccessKey to network rpcUrls
4207
+ networks = networks.map(network => {
4208
+ // Don't double-append in the case the user has already included their access key in the rpc URL
4209
+ if (network.rpcUrl.includes(projectAccessKey)) {
4210
+ return network;
4211
+ }
4198
4212
 
4199
- // Find any new networks that aren't already defined in sequence.js
4200
- // and add them to the list of networks, (they must have a rpcUrl and chainId)
4201
- const newNetworks = (_config$networks$filt = (_config$networks = config.networks) == null ? void 0 : _config$networks.filter(n => {
4202
- // eslint-disable-next-line
4203
- n.rpcUrl !== undefined && n.chainId !== undefined && !network.allNetworks.find(an => an.chainId === n.chainId);
4204
- })) != null ? _config$networks$filt : [];
4205
-
4206
- // Override any information about the networks using the config
4207
- const combinedNetworks = network.allNetworks.map(n => {
4208
- var _config$networks2;
4209
- const network = (_config$networks2 = config.networks) == null ? void 0 : _config$networks2.find(cn => cn.chainId === n.chainId);
4210
- return network ? _extends({}, n, network) : n;
4211
- }).concat(newNetworks).map(network => {
4212
- // don't double-append in the case the user has already included their access key in the rpc URL
4213
- if (network.rpcUrl.includes(projectAccessKey)) {
4213
+ // XXX: This will probably break non-sequence RPC provider URLs.
4214
+ network.rpcUrl = network.rpcUrl + `/${projectAccessKey}`;
4214
4215
  return network;
4215
- }
4216
-
4217
- // this will probably break non-sequence RPC provider URLs.
4218
- network.rpcUrl = network.rpcUrl + `/${projectAccessKey}`;
4219
- return network;
4220
- });
4221
-
4222
- // This builds a "public rpc" on demand, we build them on demand because we don't want to
4223
- // generate a bunch of providers for networks that aren't used.
4224
- const providerForChainId = chainId => {
4225
- if (!rpcProviders[chainId]) {
4226
- var _combinedNetworks$fin;
4227
- const rpcUrl = (_combinedNetworks$fin = combinedNetworks.find(n => n.chainId === chainId)) == null ? void 0 : _combinedNetworks$fin.rpcUrl;
4228
- if (!rpcUrl) {
4229
- throw new Error(`no rpcUrl found for chainId: ${chainId}`);
4230
- }
4231
- rpcProviders[chainId] = new network.JsonRpcProvider(rpcUrl, {
4232
- middlewares: [network.loggingProviderMiddleware, network.exceptionProviderMiddleware, new network.CachedProvider()]
4233
- }, {
4234
- cacheTimeout: -1
4235
- });
4236
- }
4237
- return rpcProviders[chainId];
4216
+ });
4238
4217
  };
4218
+ updateNetworks();
4239
4219
 
4240
4220
  // This is the starting default network (as defined by the config)
4241
4221
  // it can be later be changed using `wallet_switchEthereumChain` or some
4242
4222
  // of the other methods on the provider.
4243
- const defaultNetwork = config.defaultNetwork ? (_findNetworkConfig = network.findNetworkConfig(combinedNetworks, config.defaultNetwork)) == null ? void 0 : _findNetworkConfig.chainId : undefined;
4223
+ const defaultNetwork = config.defaultNetwork ? (_findNetworkConfig = network.findNetworkConfig(networks, config.defaultNetwork)) == null ? void 0 : _findNetworkConfig.chainId : undefined;
4244
4224
  if (!defaultNetwork && config.defaultNetwork) {
4245
4225
  throw new Error(`defaultNetwork not found for chainId: ${config.defaultNetwork}`);
4246
4226
  }
@@ -4255,6 +4235,34 @@ const initWallet = (projectAccessKey, partialConfig) => {
4255
4235
  projectAccessKey: projectAccessKey,
4256
4236
  analytics: config.analytics
4257
4237
  });
4238
+ updateNetworks((_client$getSession = client.getSession()) == null ? void 0 : _client$getSession.networks);
4239
+ client.onConnect(ev => {
4240
+ var _ev$session;
4241
+ updateNetworks((_ev$session = ev.session) == null ? void 0 : _ev$session.networks);
4242
+ });
4243
+ const rpcProviders = {};
4244
+
4245
+ // This builds a "public rpc" on demand, we build them on demand because we don't want to
4246
+ // generate a bunch of providers for networks that aren't used.
4247
+ const providerForChainId = chainId => {
4248
+ const network$1 = network.findNetworkConfig(networks, chainId);
4249
+ if (!network$1) {
4250
+ throw new Error(`no network config found for chainId: ${chainId}`);
4251
+ }
4252
+ const {
4253
+ rpcUrl
4254
+ } = network$1;
4255
+
4256
+ // Cache providers by rpc url
4257
+ if (!rpcProviders[rpcUrl]) {
4258
+ rpcProviders[rpcUrl] = new network.JsonRpcProvider(rpcUrl, {
4259
+ middlewares: [network.loggingProviderMiddleware, network.exceptionProviderMiddleware, new network.CachedProvider()]
4260
+ }, {
4261
+ cacheTimeout: -1
4262
+ });
4263
+ }
4264
+ return rpcProviders[rpcUrl];
4265
+ };
4258
4266
  sequenceWalletProvider = new SequenceProvider(client, providerForChainId);
4259
4267
  return sequenceWalletProvider;
4260
4268
  };
@@ -4271,6 +4279,18 @@ const getWallet = () => {
4271
4279
  return sequenceWalletProvider;
4272
4280
  };
4273
4281
 
4282
+ // allNetworks <- connectedNetworks <- config.networks
4283
+ const mergeNetworks = (...networks) => {
4284
+ const networkMap = new Map();
4285
+ for (const network of networks.flat()) {
4286
+ if (network.chainId && network.rpcUrl) {
4287
+ const existingNetwork = networkMap.get(network.chainId);
4288
+ networkMap.set(network.chainId, _extends({}, existingNetwork, network));
4289
+ }
4290
+ }
4291
+ return Array.from(networkMap.values());
4292
+ };
4293
+
4274
4294
  exports.Analytics = Analytics;
4275
4295
  exports.AnalyticsEventType = AnalyticsEventType;
4276
4296
  exports.BaseInjectedTransport = BaseInjectedTransport;
@@ -3728,9 +3728,13 @@ class SequenceClientSession {
3728
3728
  return this.store.setItem(SequenceClientSession.SESSION_LOCALSTORE_KEY, JSON.stringify(session));
3729
3729
  }
3730
3730
  getSession() {
3731
- const session = this.store.getItem(SequenceClientSession.SESSION_LOCALSTORE_KEY);
3732
- if (session) {
3733
- return JSON.parse(session);
3731
+ try {
3732
+ const session = this.store.getItem(SequenceClientSession.SESSION_LOCALSTORE_KEY);
3733
+ if (session) {
3734
+ return JSON.parse(session);
3735
+ }
3736
+ } catch (err) {
3737
+ console.error('Error parsing session', err);
3734
3738
  }
3735
3739
  return undefined;
3736
3740
  }
@@ -4182,7 +4186,7 @@ let sequenceWalletProvider;
4182
4186
  * @throws Error if projectAccessKey is not provided, empty string or is not string.
4183
4187
  */
4184
4188
  const initWallet = (projectAccessKey, partialConfig) => {
4185
- var _config$networks$filt, _config$networks, _findNetworkConfig;
4189
+ var _findNetworkConfig, _client$getSession;
4186
4190
  if (!projectAccessKey || typeof projectAccessKey !== 'string') {
4187
4191
  throw new Error('Please pass a projectAccessKey in initWallet.');
4188
4192
  }
@@ -4194,53 +4198,29 @@ const initWallet = (projectAccessKey, partialConfig) => {
4194
4198
  const config = _extends({}, DefaultProviderConfig, partialConfig, {
4195
4199
  transports: _extends({}, DefaultProviderConfig.transports, partialConfig == null ? void 0 : partialConfig.transports)
4196
4200
  });
4197
- const rpcProviders = {};
4201
+ let networks = [];
4202
+ const updateNetworks = (connectedNetworks = []) => {
4203
+ var _config$networks;
4204
+ networks = mergeNetworks(network.allNetworks, connectedNetworks, (_config$networks = config.networks) != null ? _config$networks : []);
4205
+
4206
+ // Append projectAccessKey to network rpcUrls
4207
+ networks = networks.map(network => {
4208
+ // Don't double-append in the case the user has already included their access key in the rpc URL
4209
+ if (network.rpcUrl.includes(projectAccessKey)) {
4210
+ return network;
4211
+ }
4198
4212
 
4199
- // Find any new networks that aren't already defined in sequence.js
4200
- // and add them to the list of networks, (they must have a rpcUrl and chainId)
4201
- const newNetworks = (_config$networks$filt = (_config$networks = config.networks) == null ? void 0 : _config$networks.filter(n => {
4202
- // eslint-disable-next-line
4203
- n.rpcUrl !== undefined && n.chainId !== undefined && !network.allNetworks.find(an => an.chainId === n.chainId);
4204
- })) != null ? _config$networks$filt : [];
4205
-
4206
- // Override any information about the networks using the config
4207
- const combinedNetworks = network.allNetworks.map(n => {
4208
- var _config$networks2;
4209
- const network = (_config$networks2 = config.networks) == null ? void 0 : _config$networks2.find(cn => cn.chainId === n.chainId);
4210
- return network ? _extends({}, n, network) : n;
4211
- }).concat(newNetworks).map(network => {
4212
- // don't double-append in the case the user has already included their access key in the rpc URL
4213
- if (network.rpcUrl.includes(projectAccessKey)) {
4213
+ // XXX: This will probably break non-sequence RPC provider URLs.
4214
+ network.rpcUrl = network.rpcUrl + `/${projectAccessKey}`;
4214
4215
  return network;
4215
- }
4216
-
4217
- // this will probably break non-sequence RPC provider URLs.
4218
- network.rpcUrl = network.rpcUrl + `/${projectAccessKey}`;
4219
- return network;
4220
- });
4221
-
4222
- // This builds a "public rpc" on demand, we build them on demand because we don't want to
4223
- // generate a bunch of providers for networks that aren't used.
4224
- const providerForChainId = chainId => {
4225
- if (!rpcProviders[chainId]) {
4226
- var _combinedNetworks$fin;
4227
- const rpcUrl = (_combinedNetworks$fin = combinedNetworks.find(n => n.chainId === chainId)) == null ? void 0 : _combinedNetworks$fin.rpcUrl;
4228
- if (!rpcUrl) {
4229
- throw new Error(`no rpcUrl found for chainId: ${chainId}`);
4230
- }
4231
- rpcProviders[chainId] = new network.JsonRpcProvider(rpcUrl, {
4232
- middlewares: [network.loggingProviderMiddleware, network.exceptionProviderMiddleware, new network.CachedProvider()]
4233
- }, {
4234
- cacheTimeout: -1
4235
- });
4236
- }
4237
- return rpcProviders[chainId];
4216
+ });
4238
4217
  };
4218
+ updateNetworks();
4239
4219
 
4240
4220
  // This is the starting default network (as defined by the config)
4241
4221
  // it can be later be changed using `wallet_switchEthereumChain` or some
4242
4222
  // of the other methods on the provider.
4243
- const defaultNetwork = config.defaultNetwork ? (_findNetworkConfig = network.findNetworkConfig(combinedNetworks, config.defaultNetwork)) == null ? void 0 : _findNetworkConfig.chainId : undefined;
4223
+ const defaultNetwork = config.defaultNetwork ? (_findNetworkConfig = network.findNetworkConfig(networks, config.defaultNetwork)) == null ? void 0 : _findNetworkConfig.chainId : undefined;
4244
4224
  if (!defaultNetwork && config.defaultNetwork) {
4245
4225
  throw new Error(`defaultNetwork not found for chainId: ${config.defaultNetwork}`);
4246
4226
  }
@@ -4255,6 +4235,34 @@ const initWallet = (projectAccessKey, partialConfig) => {
4255
4235
  projectAccessKey: projectAccessKey,
4256
4236
  analytics: config.analytics
4257
4237
  });
4238
+ updateNetworks((_client$getSession = client.getSession()) == null ? void 0 : _client$getSession.networks);
4239
+ client.onConnect(ev => {
4240
+ var _ev$session;
4241
+ updateNetworks((_ev$session = ev.session) == null ? void 0 : _ev$session.networks);
4242
+ });
4243
+ const rpcProviders = {};
4244
+
4245
+ // This builds a "public rpc" on demand, we build them on demand because we don't want to
4246
+ // generate a bunch of providers for networks that aren't used.
4247
+ const providerForChainId = chainId => {
4248
+ const network$1 = network.findNetworkConfig(networks, chainId);
4249
+ if (!network$1) {
4250
+ throw new Error(`no network config found for chainId: ${chainId}`);
4251
+ }
4252
+ const {
4253
+ rpcUrl
4254
+ } = network$1;
4255
+
4256
+ // Cache providers by rpc url
4257
+ if (!rpcProviders[rpcUrl]) {
4258
+ rpcProviders[rpcUrl] = new network.JsonRpcProvider(rpcUrl, {
4259
+ middlewares: [network.loggingProviderMiddleware, network.exceptionProviderMiddleware, new network.CachedProvider()]
4260
+ }, {
4261
+ cacheTimeout: -1
4262
+ });
4263
+ }
4264
+ return rpcProviders[rpcUrl];
4265
+ };
4258
4266
  sequenceWalletProvider = new SequenceProvider(client, providerForChainId);
4259
4267
  return sequenceWalletProvider;
4260
4268
  };
@@ -4271,6 +4279,18 @@ const getWallet = () => {
4271
4279
  return sequenceWalletProvider;
4272
4280
  };
4273
4281
 
4282
+ // allNetworks <- connectedNetworks <- config.networks
4283
+ const mergeNetworks = (...networks) => {
4284
+ const networkMap = new Map();
4285
+ for (const network of networks.flat()) {
4286
+ if (network.chainId && network.rpcUrl) {
4287
+ const existingNetwork = networkMap.get(network.chainId);
4288
+ networkMap.set(network.chainId, _extends({}, existingNetwork, network));
4289
+ }
4290
+ }
4291
+ return Array.from(networkMap.values());
4292
+ };
4293
+
4274
4294
  exports.Analytics = Analytics;
4275
4295
  exports.AnalyticsEventType = AnalyticsEventType;
4276
4296
  exports.BaseInjectedTransport = BaseInjectedTransport;
@@ -3724,9 +3724,13 @@ class SequenceClientSession {
3724
3724
  return this.store.setItem(SequenceClientSession.SESSION_LOCALSTORE_KEY, JSON.stringify(session));
3725
3725
  }
3726
3726
  getSession() {
3727
- const session = this.store.getItem(SequenceClientSession.SESSION_LOCALSTORE_KEY);
3728
- if (session) {
3729
- return JSON.parse(session);
3727
+ try {
3728
+ const session = this.store.getItem(SequenceClientSession.SESSION_LOCALSTORE_KEY);
3729
+ if (session) {
3730
+ return JSON.parse(session);
3731
+ }
3732
+ } catch (err) {
3733
+ console.error('Error parsing session', err);
3730
3734
  }
3731
3735
  return undefined;
3732
3736
  }
@@ -4178,7 +4182,7 @@ let sequenceWalletProvider;
4178
4182
  * @throws Error if projectAccessKey is not provided, empty string or is not string.
4179
4183
  */
4180
4184
  const initWallet = (projectAccessKey, partialConfig) => {
4181
- var _config$networks$filt, _config$networks, _findNetworkConfig;
4185
+ var _findNetworkConfig, _client$getSession;
4182
4186
  if (!projectAccessKey || typeof projectAccessKey !== 'string') {
4183
4187
  throw new Error('Please pass a projectAccessKey in initWallet.');
4184
4188
  }
@@ -4190,53 +4194,29 @@ const initWallet = (projectAccessKey, partialConfig) => {
4190
4194
  const config = _extends({}, DefaultProviderConfig, partialConfig, {
4191
4195
  transports: _extends({}, DefaultProviderConfig.transports, partialConfig == null ? void 0 : partialConfig.transports)
4192
4196
  });
4193
- const rpcProviders = {};
4197
+ let networks = [];
4198
+ const updateNetworks = (connectedNetworks = []) => {
4199
+ var _config$networks;
4200
+ networks = mergeNetworks(allNetworks, connectedNetworks, (_config$networks = config.networks) != null ? _config$networks : []);
4201
+
4202
+ // Append projectAccessKey to network rpcUrls
4203
+ networks = networks.map(network => {
4204
+ // Don't double-append in the case the user has already included their access key in the rpc URL
4205
+ if (network.rpcUrl.includes(projectAccessKey)) {
4206
+ return network;
4207
+ }
4194
4208
 
4195
- // Find any new networks that aren't already defined in sequence.js
4196
- // and add them to the list of networks, (they must have a rpcUrl and chainId)
4197
- const newNetworks = (_config$networks$filt = (_config$networks = config.networks) == null ? void 0 : _config$networks.filter(n => {
4198
- // eslint-disable-next-line
4199
- n.rpcUrl !== undefined && n.chainId !== undefined && !allNetworks.find(an => an.chainId === n.chainId);
4200
- })) != null ? _config$networks$filt : [];
4201
-
4202
- // Override any information about the networks using the config
4203
- const combinedNetworks = allNetworks.map(n => {
4204
- var _config$networks2;
4205
- const network = (_config$networks2 = config.networks) == null ? void 0 : _config$networks2.find(cn => cn.chainId === n.chainId);
4206
- return network ? _extends({}, n, network) : n;
4207
- }).concat(newNetworks).map(network => {
4208
- // don't double-append in the case the user has already included their access key in the rpc URL
4209
- if (network.rpcUrl.includes(projectAccessKey)) {
4209
+ // XXX: This will probably break non-sequence RPC provider URLs.
4210
+ network.rpcUrl = network.rpcUrl + `/${projectAccessKey}`;
4210
4211
  return network;
4211
- }
4212
-
4213
- // this will probably break non-sequence RPC provider URLs.
4214
- network.rpcUrl = network.rpcUrl + `/${projectAccessKey}`;
4215
- return network;
4216
- });
4217
-
4218
- // This builds a "public rpc" on demand, we build them on demand because we don't want to
4219
- // generate a bunch of providers for networks that aren't used.
4220
- const providerForChainId = chainId => {
4221
- if (!rpcProviders[chainId]) {
4222
- var _combinedNetworks$fin;
4223
- const rpcUrl = (_combinedNetworks$fin = combinedNetworks.find(n => n.chainId === chainId)) == null ? void 0 : _combinedNetworks$fin.rpcUrl;
4224
- if (!rpcUrl) {
4225
- throw new Error(`no rpcUrl found for chainId: ${chainId}`);
4226
- }
4227
- rpcProviders[chainId] = new JsonRpcProvider(rpcUrl, {
4228
- middlewares: [loggingProviderMiddleware, exceptionProviderMiddleware, new CachedProvider()]
4229
- }, {
4230
- cacheTimeout: -1
4231
- });
4232
- }
4233
- return rpcProviders[chainId];
4212
+ });
4234
4213
  };
4214
+ updateNetworks();
4235
4215
 
4236
4216
  // This is the starting default network (as defined by the config)
4237
4217
  // it can be later be changed using `wallet_switchEthereumChain` or some
4238
4218
  // of the other methods on the provider.
4239
- const defaultNetwork = config.defaultNetwork ? (_findNetworkConfig = findNetworkConfig(combinedNetworks, config.defaultNetwork)) == null ? void 0 : _findNetworkConfig.chainId : undefined;
4219
+ const defaultNetwork = config.defaultNetwork ? (_findNetworkConfig = findNetworkConfig(networks, config.defaultNetwork)) == null ? void 0 : _findNetworkConfig.chainId : undefined;
4240
4220
  if (!defaultNetwork && config.defaultNetwork) {
4241
4221
  throw new Error(`defaultNetwork not found for chainId: ${config.defaultNetwork}`);
4242
4222
  }
@@ -4251,6 +4231,34 @@ const initWallet = (projectAccessKey, partialConfig) => {
4251
4231
  projectAccessKey: projectAccessKey,
4252
4232
  analytics: config.analytics
4253
4233
  });
4234
+ updateNetworks((_client$getSession = client.getSession()) == null ? void 0 : _client$getSession.networks);
4235
+ client.onConnect(ev => {
4236
+ var _ev$session;
4237
+ updateNetworks((_ev$session = ev.session) == null ? void 0 : _ev$session.networks);
4238
+ });
4239
+ const rpcProviders = {};
4240
+
4241
+ // This builds a "public rpc" on demand, we build them on demand because we don't want to
4242
+ // generate a bunch of providers for networks that aren't used.
4243
+ const providerForChainId = chainId => {
4244
+ const network = findNetworkConfig(networks, chainId);
4245
+ if (!network) {
4246
+ throw new Error(`no network config found for chainId: ${chainId}`);
4247
+ }
4248
+ const {
4249
+ rpcUrl
4250
+ } = network;
4251
+
4252
+ // Cache providers by rpc url
4253
+ if (!rpcProviders[rpcUrl]) {
4254
+ rpcProviders[rpcUrl] = new JsonRpcProvider(rpcUrl, {
4255
+ middlewares: [loggingProviderMiddleware, exceptionProviderMiddleware, new CachedProvider()]
4256
+ }, {
4257
+ cacheTimeout: -1
4258
+ });
4259
+ }
4260
+ return rpcProviders[rpcUrl];
4261
+ };
4254
4262
  sequenceWalletProvider = new SequenceProvider(client, providerForChainId);
4255
4263
  return sequenceWalletProvider;
4256
4264
  };
@@ -4267,4 +4275,16 @@ const getWallet = () => {
4267
4275
  return sequenceWalletProvider;
4268
4276
  };
4269
4277
 
4278
+ // allNetworks <- connectedNetworks <- config.networks
4279
+ const mergeNetworks = (...networks) => {
4280
+ const networkMap = new Map();
4281
+ for (const network of networks.flat()) {
4282
+ if (network.chainId && network.rpcUrl) {
4283
+ const existingNetwork = networkMap.get(network.chainId);
4284
+ networkMap.set(network.chainId, _extends({}, existingNetwork, network));
4285
+ }
4286
+ }
4287
+ return Array.from(networkMap.values());
4288
+ };
4289
+
4270
4290
  export { Analytics, AnalyticsEventType, BaseInjectedTransport, BaseProviderTransport, BaseWalletTransport, CHANNEL_ID, DefaultChainIdTracker, DefaultProviderConfig, ErrSignedInRequired, EventType, ExtensionMessageHandler, ExtensionMessageProvider, InitState, LocalStorage, MemoryItemStore, MuxMessageProvider, OpenState, PROVIDER_OPEN_TIMEOUT, ProviderError, ProxyMessageChannel, ProxyMessageChannelPort, ProxyMessageHandler, ProxyMessageProvider, SequenceClient, SequenceClientSession, SequenceProvider, SequenceSigner, SingleNetworkSequenceProvider, SingleNetworkSequenceSigner, UnrealMessageHandler, UnrealMessageProvider, WalletRequestHandler, WindowMessageHandler, WindowMessageProvider, WindowSessionParams, getWallet, initWallet, isBrowserExtension, isMuxTransportTemplate, isProviderTransport, isUnityPlugin, isValidMessageSignature, isValidSignature, isValidTypedDataSignature, isWalletUpToDate, messageToBytes, nextMessageIdx, prefixEIP191Message, resolveArrayProperties, setupAnalytics, trimEIP191Prefix, unregisterWallet, useBestStore, validateTransactionRequest };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xsequence/provider",
3
- "version": "2.2.2",
3
+ "version": "2.2.4",
4
4
  "description": "provider sub-package for Sequence",
5
5
  "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/provider",
6
6
  "source": "src/index.ts",
@@ -15,15 +15,15 @@
15
15
  "@databeat/tracker": "^0.9.3",
16
16
  "eventemitter2": "^6.4.5",
17
17
  "webextension-polyfill": "^0.10.0",
18
- "@0xsequence/abi": "2.2.2",
19
- "@0xsequence/account": "2.2.2",
20
- "@0xsequence/core": "2.2.2",
21
- "@0xsequence/migration": "2.2.2",
22
- "@0xsequence/auth": "2.2.2",
23
- "@0xsequence/network": "2.2.2",
24
- "@0xsequence/utils": "2.2.2",
25
- "@0xsequence/relayer": "2.2.2",
26
- "@0xsequence/wallet": "2.2.2"
18
+ "@0xsequence/abi": "2.2.4",
19
+ "@0xsequence/account": "2.2.4",
20
+ "@0xsequence/core": "2.2.4",
21
+ "@0xsequence/auth": "2.2.4",
22
+ "@0xsequence/migration": "2.2.4",
23
+ "@0xsequence/network": "2.2.4",
24
+ "@0xsequence/relayer": "2.2.4",
25
+ "@0xsequence/utils": "2.2.4",
26
+ "@0xsequence/wallet": "2.2.4"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/webextension-polyfill": "^0.10.0",
package/src/client.ts CHANGED
@@ -54,10 +54,14 @@ export class SequenceClientSession {
54
54
  }
55
55
 
56
56
  getSession(): WalletSession | undefined {
57
- const session = this.store.getItem(SequenceClientSession.SESSION_LOCALSTORE_KEY)
57
+ try {
58
+ const session = this.store.getItem(SequenceClientSession.SESSION_LOCALSTORE_KEY)
58
59
 
59
- if (session) {
60
- return JSON.parse(session)
60
+ if (session) {
61
+ return JSON.parse(session)
62
+ }
63
+ } catch (err) {
64
+ console.error('Error parsing session', err)
61
65
  }
62
66
 
63
67
  return undefined
package/src/init.ts CHANGED
@@ -84,58 +84,31 @@ export const initWallet = (projectAccessKey: string, partialConfig?: Partial<Pro
84
84
  }
85
85
  }
86
86
 
87
- const rpcProviders: Record<number, ethers.JsonRpcProvider> = {}
88
-
89
- // Find any new networks that aren't already defined in sequence.js
90
- // and add them to the list of networks, (they must have a rpcUrl and chainId)
91
- const newNetworks = (config.networks?.filter(n => {
92
- // eslint-disable-next-line
93
- n.rpcUrl !== undefined && n.chainId !== undefined && !allNetworks.find(an => an.chainId === n.chainId)
94
- }) ?? []) as NetworkConfig[]
95
-
96
- // Override any information about the networks using the config
97
- const combinedNetworks = allNetworks
98
- .map(n => {
99
- const network = config.networks?.find(cn => cn.chainId === n.chainId)
100
- return network ? { ...n, ...network } : n
101
- })
102
- .concat(newNetworks)
103
- .map(network => {
104
- // don't double-append in the case the user has already included their access key in the rpc URL
87
+ let networks: NetworkConfig[] = []
88
+
89
+ const updateNetworks = (connectedNetworks: NetworkConfig[] = []) => {
90
+ networks = mergeNetworks(allNetworks, connectedNetworks, config.networks ?? [])
91
+
92
+ // Append projectAccessKey to network rpcUrls
93
+ networks = networks.map(network => {
94
+ // Don't double-append in the case the user has already included their access key in the rpc URL
105
95
  if (network.rpcUrl.includes(projectAccessKey)) {
106
96
  return network
107
97
  }
108
98
 
109
- // this will probably break non-sequence RPC provider URLs.
99
+ // XXX: This will probably break non-sequence RPC provider URLs.
110
100
  network.rpcUrl = network.rpcUrl + `/${projectAccessKey}`
101
+
111
102
  return network
112
103
  })
113
-
114
- // This builds a "public rpc" on demand, we build them on demand because we don't want to
115
- // generate a bunch of providers for networks that aren't used.
116
- const providerForChainId = (chainId: number) => {
117
- if (!rpcProviders[chainId]) {
118
- const rpcUrl = combinedNetworks.find(n => n.chainId === chainId)?.rpcUrl
119
- if (!rpcUrl) {
120
- throw new Error(`no rpcUrl found for chainId: ${chainId}`)
121
- }
122
-
123
- rpcProviders[chainId] = new JsonRpcProvider(
124
- rpcUrl,
125
- {
126
- middlewares: [loggingProviderMiddleware, exceptionProviderMiddleware, new CachedProvider()]
127
- },
128
- { cacheTimeout: -1 }
129
- )
130
- }
131
-
132
- return rpcProviders[chainId]
133
104
  }
134
105
 
106
+ updateNetworks()
107
+
135
108
  // This is the starting default network (as defined by the config)
136
109
  // it can be later be changed using `wallet_switchEthereumChain` or some
137
110
  // of the other methods on the provider.
138
- const defaultNetwork = config.defaultNetwork ? findNetworkConfig(combinedNetworks, config.defaultNetwork)?.chainId : undefined
111
+ const defaultNetwork = config.defaultNetwork ? findNetworkConfig(networks, config.defaultNetwork)?.chainId : undefined
139
112
  if (!defaultNetwork && config.defaultNetwork) {
140
113
  throw new Error(`defaultNetwork not found for chainId: ${config.defaultNetwork}`)
141
114
  }
@@ -151,6 +124,39 @@ export const initWallet = (projectAccessKey: string, partialConfig?: Partial<Pro
151
124
  analytics: config.analytics
152
125
  })
153
126
 
127
+ updateNetworks(client.getSession()?.networks)
128
+
129
+ client.onConnect(ev => {
130
+ updateNetworks(ev.session?.networks)
131
+ })
132
+
133
+ const rpcProviders: Record<string, ethers.JsonRpcProvider> = {}
134
+
135
+ // This builds a "public rpc" on demand, we build them on demand because we don't want to
136
+ // generate a bunch of providers for networks that aren't used.
137
+ const providerForChainId = (chainId: number) => {
138
+ const network = findNetworkConfig(networks, chainId)
139
+
140
+ if (!network) {
141
+ throw new Error(`no network config found for chainId: ${chainId}`)
142
+ }
143
+
144
+ const { rpcUrl } = network
145
+
146
+ // Cache providers by rpc url
147
+ if (!rpcProviders[rpcUrl]) {
148
+ rpcProviders[rpcUrl] = new JsonRpcProvider(
149
+ rpcUrl,
150
+ {
151
+ middlewares: [loggingProviderMiddleware, exceptionProviderMiddleware, new CachedProvider()]
152
+ },
153
+ { cacheTimeout: -1 }
154
+ )
155
+ }
156
+
157
+ return rpcProviders[rpcUrl]
158
+ }
159
+
154
160
  sequenceWalletProvider = new SequenceProvider(client, providerForChainId)
155
161
  return sequenceWalletProvider
156
162
  }
@@ -168,3 +174,18 @@ export const getWallet = () => {
168
174
  }
169
175
  return sequenceWalletProvider
170
176
  }
177
+
178
+ // allNetworks <- connectedNetworks <- config.networks
179
+ const mergeNetworks = (...networks: Partial<NetworkConfig>[][]) => {
180
+ const networkMap = new Map<number, NetworkConfig>()
181
+
182
+ for (const network of networks.flat()) {
183
+ if (network.chainId && network.rpcUrl) {
184
+ const existingNetwork = networkMap.get(network.chainId)
185
+
186
+ networkMap.set(network.chainId, { ...existingNetwork, ...network } as NetworkConfig)
187
+ }
188
+ }
189
+
190
+ return Array.from(networkMap.values())
191
+ }