@metamask/connect-multichain 0.7.0 → 0.8.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 (44) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/dist/browser/es/connect-multichain.d.mts +1 -0
  3. package/dist/browser/es/connect-multichain.mjs +96 -51
  4. package/dist/browser/es/connect-multichain.mjs.map +1 -1
  5. package/dist/browser/es/metafile-esm.json +1 -1
  6. package/dist/browser/iife/connect-multichain.d.ts +1 -0
  7. package/dist/browser/iife/connect-multichain.js +2651 -4959
  8. package/dist/browser/iife/connect-multichain.js.map +1 -1
  9. package/dist/browser/iife/metafile-iife.json +1 -1
  10. package/dist/browser/umd/connect-multichain.d.ts +1 -0
  11. package/dist/browser/umd/connect-multichain.js +95 -50
  12. package/dist/browser/umd/connect-multichain.js.map +1 -1
  13. package/dist/browser/umd/metafile-cjs.json +1 -1
  14. package/dist/node/cjs/connect-multichain.d.ts +1 -0
  15. package/dist/node/cjs/connect-multichain.js +95 -50
  16. package/dist/node/cjs/connect-multichain.js.map +1 -1
  17. package/dist/node/cjs/metafile-cjs.json +1 -1
  18. package/dist/node/es/connect-multichain.d.mts +1 -0
  19. package/dist/node/es/connect-multichain.mjs +96 -51
  20. package/dist/node/es/connect-multichain.mjs.map +1 -1
  21. package/dist/node/es/metafile-esm.json +1 -1
  22. package/dist/react-native/es/connect-multichain.d.mts +1 -0
  23. package/dist/react-native/es/connect-multichain.mjs +96 -51
  24. package/dist/react-native/es/connect-multichain.mjs.map +1 -1
  25. package/dist/react-native/es/metafile-esm.json +1 -1
  26. package/dist/src/domain/multichain/types.d.ts +1 -0
  27. package/dist/src/domain/multichain/types.d.ts.map +1 -1
  28. package/dist/src/multichain/index.d.ts.map +1 -1
  29. package/dist/src/multichain/index.js +65 -22
  30. package/dist/src/multichain/index.js.map +1 -1
  31. package/dist/src/multichain/transports/default/index.d.ts +1 -0
  32. package/dist/src/multichain/transports/default/index.d.ts.map +1 -1
  33. package/dist/src/multichain/transports/default/index.js +28 -32
  34. package/dist/src/multichain/transports/default/index.js.map +1 -1
  35. package/dist/src/multichain/transports/mwp/KeyManager.d.ts +1 -0
  36. package/dist/src/multichain/transports/mwp/KeyManager.d.ts.map +1 -1
  37. package/dist/src/multichain/transports/mwp/KeyManager.js +4 -1
  38. package/dist/src/multichain/transports/mwp/KeyManager.js.map +1 -1
  39. package/dist/src/multichain/transports/mwp/index.d.ts +1 -0
  40. package/dist/src/multichain/transports/mwp/index.d.ts.map +1 -1
  41. package/dist/src/multichain/transports/mwp/index.js +6 -1
  42. package/dist/src/multichain/transports/mwp/index.js.map +1 -1
  43. package/dist/types/connect-multichain.d.ts +1 -0
  44. package/package.json +3 -3
@@ -455,6 +455,7 @@ type MergeableMultichainOptions = Omit<MultichainOptions, 'dapp' | 'analytics' |
455
455
  */
456
456
  type CreateMultichainFN = (options: MultiChainFNOptions) => Promise<MultichainCore>;
457
457
  type ExtendedTransport = Omit<Transport, 'connect'> & {
458
+ init: () => Promise<void>;
458
459
  connect: (props?: {
459
460
  scopes: Scope[];
460
461
  caipAccountIds: CaipAccountId[];
@@ -1630,7 +1630,7 @@ trackWalletActionRejected_fn = function(options) {
1630
1630
  var import_multichain_api_client = require("@metamask/multichain-api-client");
1631
1631
  init_utils2();
1632
1632
  var DEFAULT_REQUEST_TIMEOUT = 60 * 1e3;
1633
- var _notificationCallbacks, _transport, _defaultRequestOptions, _pendingRequests, _handleResponseListener, _handleNotificationListener, _DefaultTransport_instances, notifyCallbacks_fn, isMetamaskProviderEvent_fn, handleResponse_fn, handleNotification_fn, setupMessageListener_fn;
1633
+ var _notificationCallbacks, _transport, _defaultRequestOptions, _pendingRequests, _handleResponseListener, _handleNotificationListener, _DefaultTransport_instances, notifyCallbacks_fn, isMetamaskProviderEvent_fn, handleResponse_fn, handleNotification_fn, setupMessageListener_fn, init_fn;
1634
1634
  var DefaultTransport = class {
1635
1635
  constructor() {
1636
1636
  __privateAdd(this, _DefaultTransport_instances);
@@ -1678,11 +1678,31 @@ var DefaultTransport = class {
1678
1678
  });
1679
1679
  });
1680
1680
  }
1681
+ init() {
1682
+ return __async(this, null, function* () {
1683
+ yield __privateMethod(this, _DefaultTransport_instances, init_fn).call(this);
1684
+ let walletSession = { sessionScopes: {} };
1685
+ try {
1686
+ const sessionRequest = yield this.request(
1687
+ { method: "wallet_getSession" },
1688
+ __privateGet(this, _defaultRequestOptions)
1689
+ );
1690
+ walletSession = sessionRequest.result;
1691
+ } catch (e) {
1692
+ console.error(
1693
+ "Failed to get wallet session during DefaultTransport init"
1694
+ );
1695
+ }
1696
+ __privateMethod(this, _DefaultTransport_instances, notifyCallbacks_fn).call(this, {
1697
+ method: "wallet_sessionChanged",
1698
+ params: walletSession
1699
+ });
1700
+ });
1701
+ }
1681
1702
  connect(options) {
1682
1703
  return __async(this, null, function* () {
1683
1704
  var _a3, _b, _c, _d, _e;
1684
- __privateMethod(this, _DefaultTransport_instances, setupMessageListener_fn).call(this);
1685
- yield __privateGet(this, _transport).connect();
1705
+ yield __privateMethod(this, _DefaultTransport_instances, init_fn).call(this);
1686
1706
  const sessionRequest = yield this.request(
1687
1707
  { method: "wallet_getSession" },
1688
1708
  __privateGet(this, _defaultRequestOptions)
@@ -1739,26 +1759,6 @@ var DefaultTransport = class {
1739
1759
  disconnect() {
1740
1760
  return __async(this, arguments, function* (scopes = []) {
1741
1761
  yield this.request({ method: "wallet_revokeSession", params: { scopes } });
1742
- const response = yield this.request({ method: "wallet_getSession" });
1743
- const { sessionScopes } = response.result;
1744
- if (Object.keys(sessionScopes).length > 0) {
1745
- return;
1746
- }
1747
- __privateGet(this, _notificationCallbacks).clear();
1748
- if (__privateGet(this, _handleResponseListener)) {
1749
- window.removeEventListener("message", __privateGet(this, _handleResponseListener));
1750
- __privateSet(this, _handleResponseListener, void 0);
1751
- }
1752
- if (__privateGet(this, _handleNotificationListener)) {
1753
- window.removeEventListener("message", __privateGet(this, _handleNotificationListener));
1754
- __privateSet(this, _handleNotificationListener, void 0);
1755
- }
1756
- for (const [, request] of __privateGet(this, _pendingRequests)) {
1757
- clearTimeout(request.timeout);
1758
- request.reject(new Error("Transport disconnected"));
1759
- }
1760
- __privateGet(this, _pendingRequests).clear();
1761
- yield __privateGet(this, _transport).disconnect();
1762
1762
  });
1763
1763
  }
1764
1764
  isConnected() {
@@ -1847,7 +1847,7 @@ handleNotification_fn = function(event) {
1847
1847
  return;
1848
1848
  }
1849
1849
  const responseData = (_b = (_a3 = event == null ? void 0 : event.data) == null ? void 0 : _a3.data) == null ? void 0 : _b.data;
1850
- if (typeof responseData === "object" && responseData.method === "metamask_chainChanged" || responseData.method === "metamask_accountsChanged") {
1850
+ if (typeof responseData === "object" && responseData !== null && (responseData.method === "metamask_chainChanged" || responseData.method === "metamask_accountsChanged")) {
1851
1851
  __privateMethod(this, _DefaultTransport_instances, notifyCallbacks_fn).call(this, responseData);
1852
1852
  }
1853
1853
  };
@@ -1860,6 +1860,12 @@ setupMessageListener_fn = function() {
1860
1860
  window.addEventListener("message", __privateGet(this, _handleResponseListener));
1861
1861
  window.addEventListener("message", __privateGet(this, _handleNotificationListener));
1862
1862
  };
1863
+ init_fn = function() {
1864
+ return __async(this, null, function* () {
1865
+ __privateMethod(this, _DefaultTransport_instances, setupMessageListener_fn).call(this);
1866
+ yield __privateGet(this, _transport).connect();
1867
+ });
1868
+ };
1863
1869
 
1864
1870
  // src/multichain/transports/multichainApiClientWrapper/index.ts
1865
1871
  var import_rpc_errors = require("@metamask/rpc-errors");
@@ -2257,6 +2263,10 @@ var MWPTransport = class {
2257
2263
  }
2258
2264
  });
2259
2265
  }
2266
+ init() {
2267
+ return __async(this, null, function* () {
2268
+ });
2269
+ }
2260
2270
  // TODO: Rename this
2261
2271
  sendEip1193Message(payload, options) {
2262
2272
  return __async(this, null, function* () {
@@ -2609,7 +2619,7 @@ var MWPTransport = class {
2609
2619
  getActiveSession() {
2610
2620
  return __async(this, null, function* () {
2611
2621
  const { kvstore } = this;
2612
- const sessionStore = new import_mobile_wallet_protocol_core.SessionStore(kvstore);
2622
+ const sessionStore = yield import_mobile_wallet_protocol_core.SessionStore.create(kvstore);
2613
2623
  try {
2614
2624
  const [activeSession] = yield sessionStore.list();
2615
2625
  return activeSession;
@@ -2683,6 +2693,9 @@ var KeyManager = class {
2683
2693
  return Buffer.from(decryptedBuffer).toString("utf8");
2684
2694
  });
2685
2695
  }
2696
+ validatePeerKey(key) {
2697
+ import_eciesjs.PublicKey.fromHex(Buffer.from(key).toString("hex"));
2698
+ }
2686
2699
  };
2687
2700
  var keymanager = new KeyManager();
2688
2701
 
@@ -2690,7 +2703,7 @@ var keymanager = new KeyManager();
2690
2703
  init_utils2();
2691
2704
  var logger2 = createLogger("metamask-sdk:core");
2692
2705
  var SINGLETON_KEY = "__METAMASK_CONNECT_MULTICHAIN_SINGLETON__";
2693
- var _a2, _provider, _providerTransportWrapper, _transport2, _dappClient, _beforeUnloadListener, _listener, _sdkInfo, _MetaMaskConnectMultichain_instances, setupAnalytics_fn, onTransportNotification_fn, getStoredTransport_fn, setupTransport_fn, init_fn, createDappClient_fn, setupMWP_fn, onBeforeUnload_fn, createBeforeUnloadListener_fn, renderInstallModalAsync_fn, showInstallModal_fn, headlessConnect_fn, setupDefaultTransport_fn, deeplinkConnect_fn, handleConnection_fn, getCaipSession_fn, openConnectDeeplinkIfNeeded_fn;
2706
+ var _a2, _provider, _providerTransportWrapper, _transport2, _dappClient, _beforeUnloadListener, _listener, _sdkInfo, _MetaMaskConnectMultichain_instances, setupAnalytics_fn, onTransportNotification_fn, getStoredTransport_fn, setupTransport_fn, init_fn2, createDappClient_fn, setupMWP_fn, onBeforeUnload_fn, createBeforeUnloadListener_fn, renderInstallModalAsync_fn, showInstallModal_fn, headlessConnect_fn, setupDefaultTransport_fn, deeplinkConnect_fn, handleConnection_fn, getCaipSession_fn, openConnectDeeplinkIfNeeded_fn;
2694
2707
  var _MetaMaskConnectMultichain = class _MetaMaskConnectMultichain extends MultichainCore {
2695
2708
  constructor(options) {
2696
2709
  var _a3, _b, _c, _d, _e, _f;
@@ -2728,6 +2741,9 @@ var _MetaMaskConnectMultichain = class _MetaMaskConnectMultichain extends Multic
2728
2741
  }
2729
2742
  set status(value) {
2730
2743
  var _a3, _b;
2744
+ if (this._status === value) {
2745
+ return;
2746
+ }
2731
2747
  this._status = value;
2732
2748
  (_b = (_a3 = this.options.transport) == null ? void 0 : _a3.onNotification) == null ? void 0 : _b.call(_a3, {
2733
2749
  method: "stateChanged",
@@ -2783,7 +2799,7 @@ var _MetaMaskConnectMultichain = class _MetaMaskConnectMultichain extends Multic
2783
2799
  if (isEnabled2) {
2784
2800
  enableDebug("metamask-sdk:core");
2785
2801
  }
2786
- yield __privateMethod(_a3 = instance, _MetaMaskConnectMultichain_instances, init_fn).call(_a3);
2802
+ yield __privateMethod(_a3 = instance, _MetaMaskConnectMultichain_instances, init_fn2).call(_a3);
2787
2803
  return instance;
2788
2804
  }))();
2789
2805
  globalObject[SINGLETON_KEY] = instancePromise;
@@ -2893,14 +2909,16 @@ var _MetaMaskConnectMultichain = class _MetaMaskConnectMultichain extends Multic
2893
2909
  );
2894
2910
  yield (_a3 = __privateGet(this, _transport2)) == null ? void 0 : _a3.disconnect(scopes);
2895
2911
  if (remainingScopes.length === 0) {
2896
- yield (_b = __privateGet(this, _listener)) == null ? void 0 : _b.call(this);
2897
- (_c = __privateGet(this, _beforeUnloadListener)) == null ? void 0 : _c.call(this);
2898
2912
  yield this.storage.removeTransport();
2899
- __privateSet(this, _listener, void 0);
2900
- __privateSet(this, _beforeUnloadListener, void 0);
2901
- __privateSet(this, _transport2, void 0);
2902
- __privateGet(this, _providerTransportWrapper).clearTransportNotificationListener();
2903
- __privateSet(this, _dappClient, void 0);
2913
+ if (this.transportType !== "browser" /* Browser */) {
2914
+ yield (_b = __privateGet(this, _listener)) == null ? void 0 : _b.call(this);
2915
+ (_c = __privateGet(this, _beforeUnloadListener)) == null ? void 0 : _c.call(this);
2916
+ __privateSet(this, _listener, void 0);
2917
+ __privateSet(this, _beforeUnloadListener, void 0);
2918
+ __privateSet(this, _transport2, void 0);
2919
+ __privateGet(this, _providerTransportWrapper).clearTransportNotificationListener();
2920
+ __privateSet(this, _dappClient, void 0);
2921
+ }
2904
2922
  this.status = "disconnected";
2905
2923
  }
2906
2924
  });
@@ -2939,16 +2957,16 @@ var _MetaMaskConnectMultichain = class _MetaMaskConnectMultichain extends Multic
2939
2957
  // without having to concern themselves with the current transport connection status.
2940
2958
  emitSessionChanged() {
2941
2959
  return __async(this, null, function* () {
2942
- var _a3;
2960
+ var _a3, _b;
2943
2961
  const emptySession = { sessionScopes: {} };
2944
- if (this.status !== "connected" && this.status !== "connecting") {
2962
+ if (!((_a3 = __privateGet(this, _transport2)) == null ? void 0 : _a3.isConnected())) {
2945
2963
  this.emit("wallet_sessionChanged", emptySession);
2946
2964
  return;
2947
2965
  }
2948
2966
  const response = yield this.transport.request({
2949
2967
  method: "wallet_getSession"
2950
2968
  });
2951
- this.emit("wallet_sessionChanged", (_a3 = response.result) != null ? _a3 : emptySession);
2969
+ this.emit("wallet_sessionChanged", (_b = response.result) != null ? _b : emptySession);
2952
2970
  });
2953
2971
  }
2954
2972
  };
@@ -2985,9 +3003,17 @@ setupAnalytics_fn = function() {
2985
3003
  };
2986
3004
  onTransportNotification_fn = function(payload) {
2987
3005
  return __async(this, null, function* () {
2988
- var _a3;
3006
+ var _a3, _b, _c;
2989
3007
  if (typeof payload === "object" && payload !== null && "method" in payload) {
2990
- this.emit(payload.method, (_a3 = payload.params) != null ? _a3 : payload.result);
3008
+ if (payload.method === "wallet_sessionChanged") {
3009
+ const sessionScopes = (_b = (_a3 = payload.params) == null ? void 0 : _a3.sessionScopes) != null ? _b : {};
3010
+ const hasScopes = Object.keys(sessionScopes).length > 0;
3011
+ if (this.status === "loaded" && !hasScopes) {
3012
+ return;
3013
+ }
3014
+ this.status = hasScopes ? "connected" : "disconnected";
3015
+ }
3016
+ this.emit(payload.method, (_c = payload.params) != null ? _c : payload.result);
2991
3017
  }
2992
3018
  });
2993
3019
  };
@@ -3025,6 +3051,7 @@ getStoredTransport_fn = function() {
3025
3051
  };
3026
3052
  setupTransport_fn = function() {
3027
3053
  return __async(this, null, function* () {
3054
+ var _a3;
3028
3055
  const transport = yield __privateMethod(this, _MetaMaskConnectMultichain_instances, getStoredTransport_fn).call(this);
3029
3056
  if (transport) {
3030
3057
  if (!this.transport.isConnected()) {
@@ -3039,10 +3066,20 @@ setupTransport_fn = function() {
3039
3066
  }
3040
3067
  } else {
3041
3068
  this.status = "loaded";
3069
+ const hasExtensionInstalled = yield hasExtension();
3070
+ const preferExtension = (_a3 = this.options.ui.preferExtension) != null ? _a3 : true;
3071
+ if (hasExtensionInstalled && preferExtension) {
3072
+ yield __privateMethod(this, _MetaMaskConnectMultichain_instances, setupDefaultTransport_fn).call(this, { persist: false });
3073
+ try {
3074
+ yield this.transport.init();
3075
+ } catch (error) {
3076
+ console.error("Passive init failed:", error);
3077
+ }
3078
+ }
3042
3079
  }
3043
3080
  });
3044
3081
  };
3045
- init_fn = function() {
3082
+ init_fn2 = function() {
3046
3083
  return __async(this, null, function* () {
3047
3084
  try {
3048
3085
  yield __privateMethod(this, _MetaMaskConnectMultichain_instances, setupAnalytics_fn).call(this);
@@ -3066,7 +3103,7 @@ init_fn = function() {
3066
3103
  createDappClient_fn = function() {
3067
3104
  return __async(this, null, function* () {
3068
3105
  const { adapter: kvstore } = this.options.storage;
3069
- const sessionstore = new import_mobile_wallet_protocol_core2.SessionStore(kvstore);
3106
+ const sessionstore = yield import_mobile_wallet_protocol_core2.SessionStore.create(kvstore);
3070
3107
  const websocket = (
3071
3108
  // eslint-disable-next-line no-negated-condition
3072
3109
  typeof window !== "undefined" ? WebSocket : (yield import("ws")).WebSocket
@@ -3243,9 +3280,13 @@ headlessConnect_fn = function(scopes, caipAccountIds, sessionProperties) {
3243
3280
  });
3244
3281
  };
3245
3282
  setupDefaultTransport_fn = function() {
3246
- return __async(this, null, function* () {
3247
- this.status = "connecting";
3248
- yield this.storage.setTransport("browser" /* Browser */);
3283
+ return __async(this, arguments, function* (options = { persist: true }) {
3284
+ if (__privateGet(this, _transport2) instanceof DefaultTransport) {
3285
+ return __privateGet(this, _transport2);
3286
+ }
3287
+ if (options == null ? void 0 : options.persist) {
3288
+ yield this.storage.setTransport("browser" /* Browser */);
3289
+ }
3249
3290
  const transport = new DefaultTransport();
3250
3291
  __privateSet(this, _listener, transport.onNotification(
3251
3292
  __privateMethod(this, _MetaMaskConnectMultichain_instances, onTransportNotification_fn).bind(this)
@@ -3363,16 +3404,20 @@ handleConnection_fn = function(promise, scopes, transportType) {
3363
3404
  };
3364
3405
  getCaipSession_fn = function() {
3365
3406
  return __async(this, null, function* () {
3407
+ var _a3;
3366
3408
  let sessionData = {
3367
3409
  sessionScopes: {},
3368
3410
  sessionProperties: {}
3369
3411
  };
3370
- if (this.status === "connected") {
3371
- const response = yield this.transport.request({
3372
- method: "wallet_getSession"
3373
- });
3374
- if (response.result) {
3375
- sessionData = response.result;
3412
+ if ((_a3 = __privateGet(this, _transport2)) == null ? void 0 : _a3.isConnected()) {
3413
+ try {
3414
+ const response = yield this.transport.request({
3415
+ method: "wallet_getSession"
3416
+ });
3417
+ if (response.result) {
3418
+ sessionData = response.result;
3419
+ }
3420
+ } catch (e) {
3376
3421
  }
3377
3422
  }
3378
3423
  return sessionData;