@metamask/connect-multichain 0.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.
Files changed (241) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +20 -0
  3. package/README.md +15 -0
  4. package/dist/browser/es/connect-multichain.d.mts +585 -0
  5. package/dist/browser/es/connect-multichain.mjs +2609 -0
  6. package/dist/browser/es/connect-multichain.mjs.map +1 -0
  7. package/dist/browser/es/metafile-esm.json +1 -0
  8. package/dist/browser/iife/connect-multichain.d.ts +585 -0
  9. package/dist/browser/iife/connect-multichain.js +30057 -0
  10. package/dist/browser/iife/connect-multichain.js.map +1 -0
  11. package/dist/browser/iife/metafile-iife.json +1 -0
  12. package/dist/browser/umd/connect-multichain.d.ts +585 -0
  13. package/dist/browser/umd/connect-multichain.js +2622 -0
  14. package/dist/browser/umd/connect-multichain.js.map +1 -0
  15. package/dist/browser/umd/metafile-cjs.json +1 -0
  16. package/dist/node/cjs/connect-multichain.d.ts +585 -0
  17. package/dist/node/cjs/connect-multichain.js +2603 -0
  18. package/dist/node/cjs/connect-multichain.js.map +1 -0
  19. package/dist/node/cjs/metafile-cjs.json +1 -0
  20. package/dist/node/es/connect-multichain.d.mts +585 -0
  21. package/dist/node/es/connect-multichain.mjs +2564 -0
  22. package/dist/node/es/connect-multichain.mjs.map +1 -0
  23. package/dist/node/es/metafile-esm.json +1 -0
  24. package/dist/react-native/es/connect-multichain.d.mts +585 -0
  25. package/dist/react-native/es/connect-multichain.mjs +2517 -0
  26. package/dist/react-native/es/connect-multichain.mjs.map +1 -0
  27. package/dist/react-native/es/metafile-esm.json +1 -0
  28. package/dist/src/config/index.d.ts +4 -0
  29. package/dist/src/config/index.d.ts.map +1 -0
  30. package/dist/src/config/index.js +4 -0
  31. package/dist/src/config/index.js.map +1 -0
  32. package/dist/src/domain/errors/base.d.ts +7 -0
  33. package/dist/src/domain/errors/base.d.ts.map +1 -0
  34. package/dist/src/domain/errors/base.js +8 -0
  35. package/dist/src/domain/errors/base.js.map +1 -0
  36. package/dist/src/domain/errors/index.d.ts +3 -0
  37. package/dist/src/domain/errors/index.d.ts.map +1 -0
  38. package/dist/src/domain/errors/index.js +2 -0
  39. package/dist/src/domain/errors/index.js.map +1 -0
  40. package/dist/src/domain/errors/rpc.d.ts +25 -0
  41. package/dist/src/domain/errors/rpc.d.ts.map +1 -0
  42. package/dist/src/domain/errors/rpc.js +33 -0
  43. package/dist/src/domain/errors/rpc.js.map +1 -0
  44. package/dist/src/domain/errors/storage.d.ts +24 -0
  45. package/dist/src/domain/errors/storage.d.ts.map +1 -0
  46. package/dist/src/domain/errors/storage.js +30 -0
  47. package/dist/src/domain/errors/storage.js.map +1 -0
  48. package/dist/src/domain/errors/types.d.ts +7 -0
  49. package/dist/src/domain/errors/types.d.ts.map +1 -0
  50. package/dist/src/domain/errors/types.js +2 -0
  51. package/dist/src/domain/errors/types.js.map +1 -0
  52. package/dist/src/domain/events/index.d.ts +39 -0
  53. package/dist/src/domain/events/index.d.ts.map +1 -0
  54. package/dist/src/domain/events/index.js +58 -0
  55. package/dist/src/domain/events/index.js.map +1 -0
  56. package/dist/src/domain/events/types/index.d.ts +8 -0
  57. package/dist/src/domain/events/types/index.d.ts.map +1 -0
  58. package/dist/src/domain/events/types/index.js +2 -0
  59. package/dist/src/domain/events/types/index.js.map +1 -0
  60. package/dist/src/domain/index.d.ts +9 -0
  61. package/dist/src/domain/index.d.ts.map +1 -0
  62. package/dist/src/domain/index.js +9 -0
  63. package/dist/src/domain/index.js.map +1 -0
  64. package/dist/src/domain/logger/index.d.ts +41 -0
  65. package/dist/src/domain/logger/index.d.ts.map +1 -0
  66. package/dist/src/domain/logger/index.js +79 -0
  67. package/dist/src/domain/logger/index.js.map +1 -0
  68. package/dist/src/domain/multichain/api/constants.d.ts +5 -0
  69. package/dist/src/domain/multichain/api/constants.d.ts.map +1 -0
  70. package/dist/src/domain/multichain/api/constants.js +101 -0
  71. package/dist/src/domain/multichain/api/constants.js.map +1 -0
  72. package/dist/src/domain/multichain/api/eip155.d.ts +58 -0
  73. package/dist/src/domain/multichain/api/eip155.d.ts.map +1 -0
  74. package/dist/src/domain/multichain/api/eip155.js +2 -0
  75. package/dist/src/domain/multichain/api/eip155.js.map +1 -0
  76. package/dist/src/domain/multichain/api/infura.d.ts +3 -0
  77. package/dist/src/domain/multichain/api/infura.d.ts.map +1 -0
  78. package/dist/src/domain/multichain/api/infura.js +10 -0
  79. package/dist/src/domain/multichain/api/infura.js.map +1 -0
  80. package/dist/src/domain/multichain/api/types.d.ts +89 -0
  81. package/dist/src/domain/multichain/api/types.d.ts.map +1 -0
  82. package/dist/src/domain/multichain/api/types.js +2 -0
  83. package/dist/src/domain/multichain/api/types.js.map +1 -0
  84. package/dist/src/domain/multichain/index.d.ts +51 -0
  85. package/dist/src/domain/multichain/index.d.ts.map +1 -0
  86. package/dist/src/domain/multichain/index.js +33 -0
  87. package/dist/src/domain/multichain/index.js.map +1 -0
  88. package/dist/src/domain/multichain/types.d.ts +102 -0
  89. package/dist/src/domain/multichain/types.d.ts.map +1 -0
  90. package/dist/src/domain/multichain/types.js +2 -0
  91. package/dist/src/domain/multichain/types.js.map +1 -0
  92. package/dist/src/domain/platform/index.d.ts +17 -0
  93. package/dist/src/domain/platform/index.d.ts.map +1 -0
  94. package/dist/src/domain/platform/index.js +122 -0
  95. package/dist/src/domain/platform/index.js.map +1 -0
  96. package/dist/src/domain/store/adapter.d.ts +10 -0
  97. package/dist/src/domain/store/adapter.d.ts.map +1 -0
  98. package/dist/src/domain/store/adapter.js +6 -0
  99. package/dist/src/domain/store/adapter.js.map +1 -0
  100. package/dist/src/domain/store/client.d.ts +16 -0
  101. package/dist/src/domain/store/client.d.ts.map +1 -0
  102. package/dist/src/domain/store/client.js +3 -0
  103. package/dist/src/domain/store/client.js.map +1 -0
  104. package/dist/src/domain/store/index.d.ts +3 -0
  105. package/dist/src/domain/store/index.d.ts.map +1 -0
  106. package/dist/src/domain/store/index.js +3 -0
  107. package/dist/src/domain/store/index.js.map +1 -0
  108. package/dist/src/domain/ui/factory.d.ts +26 -0
  109. package/dist/src/domain/ui/factory.d.ts.map +1 -0
  110. package/dist/src/domain/ui/factory.js +2 -0
  111. package/dist/src/domain/ui/factory.js.map +1 -0
  112. package/dist/src/domain/ui/index.d.ts +3 -0
  113. package/dist/src/domain/ui/index.d.ts.map +1 -0
  114. package/dist/src/domain/ui/index.js +2 -0
  115. package/dist/src/domain/ui/index.js.map +1 -0
  116. package/dist/src/domain/ui/types.d.ts +34 -0
  117. package/dist/src/domain/ui/types.d.ts.map +1 -0
  118. package/dist/src/domain/ui/types.js +38 -0
  119. package/dist/src/domain/ui/types.js.map +1 -0
  120. package/dist/src/domain/utils/index.d.ts +7 -0
  121. package/dist/src/domain/utils/index.d.ts.map +1 -0
  122. package/dist/src/domain/utils/index.js +9 -0
  123. package/dist/src/domain/utils/index.js.map +1 -0
  124. package/dist/src/index.browser.d.ts +4 -0
  125. package/dist/src/index.browser.d.ts.map +1 -0
  126. package/dist/src/index.browser.js +28 -0
  127. package/dist/src/index.browser.js.map +1 -0
  128. package/dist/src/index.native.d.ts +4 -0
  129. package/dist/src/index.native.d.ts.map +1 -0
  130. package/dist/src/index.native.js +28 -0
  131. package/dist/src/index.native.js.map +1 -0
  132. package/dist/src/index.node.d.ts +4 -0
  133. package/dist/src/index.node.d.ts.map +1 -0
  134. package/dist/src/index.node.js +28 -0
  135. package/dist/src/index.node.js.map +1 -0
  136. package/dist/src/multichain/index.d.ts +41 -0
  137. package/dist/src/multichain/index.d.ts.map +1 -0
  138. package/dist/src/multichain/index.js +499 -0
  139. package/dist/src/multichain/index.js.map +1 -0
  140. package/dist/src/multichain/rpc/handlers/rpcClient.d.ts +19 -0
  141. package/dist/src/multichain/rpc/handlers/rpcClient.d.ts.map +1 -0
  142. package/dist/src/multichain/rpc/handlers/rpcClient.js +105 -0
  143. package/dist/src/multichain/rpc/handlers/rpcClient.js.map +1 -0
  144. package/dist/src/multichain/rpc/requestRouter.d.ts +29 -0
  145. package/dist/src/multichain/rpc/requestRouter.d.ts.map +1 -0
  146. package/dist/src/multichain/rpc/requestRouter.js +104 -0
  147. package/dist/src/multichain/rpc/requestRouter.js.map +1 -0
  148. package/dist/src/multichain/transports/default/index.d.ts +17 -0
  149. package/dist/src/multichain/transports/default/index.d.ts.map +1 -0
  150. package/dist/src/multichain/transports/default/index.js +101 -0
  151. package/dist/src/multichain/transports/default/index.js.map +1 -0
  152. package/dist/src/multichain/transports/mwp/KeyManager.d.ts +9 -0
  153. package/dist/src/multichain/transports/mwp/KeyManager.d.ts.map +1 -0
  154. package/dist/src/multichain/transports/mwp/KeyManager.js +35 -0
  155. package/dist/src/multichain/transports/mwp/KeyManager.js.map +1 -0
  156. package/dist/src/multichain/transports/mwp/index.d.ts +65 -0
  157. package/dist/src/multichain/transports/mwp/index.d.ts.map +1 -0
  158. package/dist/src/multichain/transports/mwp/index.js +323 -0
  159. package/dist/src/multichain/transports/mwp/index.js.map +1 -0
  160. package/dist/src/multichain/utils/index.d.ts +41 -0
  161. package/dist/src/multichain/utils/index.d.ts.map +1 -0
  162. package/dist/src/multichain/utils/index.js +239 -0
  163. package/dist/src/multichain/utils/index.js.map +1 -0
  164. package/dist/src/store/adapters/node.d.ts +9 -0
  165. package/dist/src/store/adapters/node.d.ts.map +1 -0
  166. package/dist/src/store/adapters/node.js +34 -0
  167. package/dist/src/store/adapters/node.js.map +1 -0
  168. package/dist/src/store/adapters/rn.d.ts +8 -0
  169. package/dist/src/store/adapters/rn.d.ts.map +1 -0
  170. package/dist/src/store/adapters/rn.js +33 -0
  171. package/dist/src/store/adapters/rn.js.map +1 -0
  172. package/dist/src/store/adapters/web.d.ts +16 -0
  173. package/dist/src/store/adapters/web.d.ts.map +1 -0
  174. package/dist/src/store/adapters/web.js +99 -0
  175. package/dist/src/store/adapters/web.js.map +1 -0
  176. package/dist/src/store/index.d.ts +17 -0
  177. package/dist/src/store/index.d.ts.map +1 -0
  178. package/dist/src/store/index.js +130 -0
  179. package/dist/src/store/index.js.map +1 -0
  180. package/dist/src/ui/index.d.ts +45 -0
  181. package/dist/src/ui/index.d.ts.map +1 -0
  182. package/dist/src/ui/index.js +185 -0
  183. package/dist/src/ui/index.js.map +1 -0
  184. package/dist/src/ui/modals/base/AbstractInstallModal.d.ts +16 -0
  185. package/dist/src/ui/modals/base/AbstractInstallModal.d.ts.map +1 -0
  186. package/dist/src/ui/modals/base/AbstractInstallModal.js +90 -0
  187. package/dist/src/ui/modals/base/AbstractInstallModal.js.map +1 -0
  188. package/dist/src/ui/modals/base/AbstractOTPModal.d.ts +8 -0
  189. package/dist/src/ui/modals/base/AbstractOTPModal.d.ts.map +1 -0
  190. package/dist/src/ui/modals/base/AbstractOTPModal.js +16 -0
  191. package/dist/src/ui/modals/base/AbstractOTPModal.js.map +1 -0
  192. package/dist/src/ui/modals/base/utils.d.ts +3 -0
  193. package/dist/src/ui/modals/base/utils.d.ts.map +1 -0
  194. package/dist/src/ui/modals/base/utils.js +30 -0
  195. package/dist/src/ui/modals/base/utils.js.map +1 -0
  196. package/dist/src/ui/modals/node/index.d.ts +3 -0
  197. package/dist/src/ui/modals/node/index.d.ts.map +1 -0
  198. package/dist/src/ui/modals/node/index.js +3 -0
  199. package/dist/src/ui/modals/node/index.js.map +1 -0
  200. package/dist/src/ui/modals/node/install.d.ts +9 -0
  201. package/dist/src/ui/modals/node/install.d.ts.map +1 -0
  202. package/dist/src/ui/modals/node/install.js +47 -0
  203. package/dist/src/ui/modals/node/install.js.map +1 -0
  204. package/dist/src/ui/modals/node/otp.d.ts +10 -0
  205. package/dist/src/ui/modals/node/otp.d.ts.map +1 -0
  206. package/dist/src/ui/modals/node/otp.js +10 -0
  207. package/dist/src/ui/modals/node/otp.js.map +1 -0
  208. package/dist/src/ui/modals/rn/index.d.ts +3 -0
  209. package/dist/src/ui/modals/rn/index.d.ts.map +1 -0
  210. package/dist/src/ui/modals/rn/index.js +3 -0
  211. package/dist/src/ui/modals/rn/index.js.map +1 -0
  212. package/dist/src/ui/modals/rn/install.d.ts +7 -0
  213. package/dist/src/ui/modals/rn/install.d.ts.map +1 -0
  214. package/dist/src/ui/modals/rn/install.js +9 -0
  215. package/dist/src/ui/modals/rn/install.js.map +1 -0
  216. package/dist/src/ui/modals/rn/otp.d.ts +10 -0
  217. package/dist/src/ui/modals/rn/otp.d.ts.map +1 -0
  218. package/dist/src/ui/modals/rn/otp.js +10 -0
  219. package/dist/src/ui/modals/rn/otp.js.map +1 -0
  220. package/dist/src/ui/modals/types.d.ts +13 -0
  221. package/dist/src/ui/modals/types.d.ts.map +1 -0
  222. package/dist/src/ui/modals/types.js +2 -0
  223. package/dist/src/ui/modals/types.js.map +1 -0
  224. package/dist/src/ui/modals/web/index.d.ts +3 -0
  225. package/dist/src/ui/modals/web/index.d.ts.map +1 -0
  226. package/dist/src/ui/modals/web/index.js +3 -0
  227. package/dist/src/ui/modals/web/index.js.map +1 -0
  228. package/dist/src/ui/modals/web/install.d.ts +7 -0
  229. package/dist/src/ui/modals/web/install.d.ts.map +1 -0
  230. package/dist/src/ui/modals/web/install.js +32 -0
  231. package/dist/src/ui/modals/web/install.js.map +1 -0
  232. package/dist/src/ui/modals/web/otp.d.ts +10 -0
  233. package/dist/src/ui/modals/web/otp.d.ts.map +1 -0
  234. package/dist/src/ui/modals/web/otp.js +10 -0
  235. package/dist/src/ui/modals/web/otp.js.map +1 -0
  236. package/dist/src/ui/qr.d.ts +3 -0
  237. package/dist/src/ui/qr.d.ts.map +1 -0
  238. package/dist/src/ui/qr.js +32 -0
  239. package/dist/src/ui/qr.js.map +1 -0
  240. package/dist/types/connect-multichain.d.ts +585 -0
  241. package/package.json +111 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/domain/errors/base.ts","../../../src/domain/errors/rpc.ts","../../../src/domain/errors/index.ts","../../../src/domain/events/index.ts","../../../src/domain/logger/index.ts","../../../src/domain/multichain/api/constants.ts","../../../src/domain/multichain/api/infura.ts","../../../src/domain/multichain/index.ts","../../../src/domain/platform/index.ts","../../../src/domain/store/adapter.ts","../../../src/domain/store/client.ts","../../../src/domain/store/index.ts","../../../src/domain/ui/types.ts","../../../src/domain/ui/index.ts","../../../src/domain/utils/index.ts","../../../src/domain/index.ts","../../../src/ui/modals/base/utils.ts","../../../src/ui/modals/base/AbstractInstallModal.ts","../../../src/ui/modals/web/install.ts","../../../src/ui/modals/base/AbstractOTPModal.ts","../../../src/ui/modals/web/otp.ts","../../../src/ui/modals/web/index.ts","../../../src/store/adapters/web.ts","../../../src/index.browser.ts","../../../src/multichain/index.ts","../../../src/config/index.ts","../../../src/multichain/rpc/requestRouter.ts","../../../src/multichain/utils/index.ts","../../../src/multichain/rpc/handlers/rpcClient.ts","../../../src/multichain/transports/default/index.ts","../../../src/multichain/transports/mwp/index.ts","../../../src/multichain/transports/mwp/KeyManager.ts","../../../src/store/index.ts","../../../src/domain/errors/storage.ts","../../../src/ui/index.ts","../../../src/ui/qr.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable @typescript-eslint/parameter-properties */\nimport type { ErrorCodes } from './types';\n\nexport abstract class BaseErr<\n C extends string,\n T extends ErrorCodes,\n> extends Error {\n constructor(\n public readonly message: `${C}Err${T}: ${string}`,\n public readonly code: T,\n ) {\n super(message);\n }\n}\n","/* eslint-disable @typescript-eslint/parameter-properties */\nimport { BaseErr } from './base';\nimport type { RPCErrorCodes } from './types';\n\nexport class RPCHttpErr extends BaseErr<'RPC', RPCErrorCodes> {\n static readonly code = 50;\n\n constructor(\n readonly rpcEndpoint: string,\n readonly method: string,\n readonly httpStatus: number,\n ) {\n super(\n `RPCErr${RPCHttpErr.code}: ${httpStatus} on ${rpcEndpoint} for method ${method}`,\n RPCHttpErr.code,\n );\n }\n}\n\nexport class RPCReadonlyResponseErr extends BaseErr<'RPC', RPCErrorCodes> {\n static readonly code = 51;\n\n constructor(public readonly reason: string) {\n super(\n `RPCErr${RPCReadonlyResponseErr.code}: RPC Client response reason ${reason}`,\n RPCReadonlyResponseErr.code,\n );\n }\n}\n\nexport class RPCReadonlyRequestErr extends BaseErr<'RPC', RPCErrorCodes> {\n static readonly code = 52;\n\n constructor(public readonly reason: string) {\n super(\n `RPCErr${RPCReadonlyRequestErr.code}: RPC Client fetch reason ${reason}`,\n RPCReadonlyRequestErr.code,\n );\n }\n}\n\nexport class RPCInvokeMethodErr extends BaseErr<'RPC', RPCErrorCodes> {\n static readonly code = 53;\n\n constructor(public readonly reason: string) {\n super(\n `RPCErr${RPCInvokeMethodErr.code}: RPC Client invoke method reason (${reason})`,\n RPCInvokeMethodErr.code,\n );\n }\n}\n","export * from './rpc';\nexport type * from './types';\n","/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { EventEmitter as EventEmitter3 } from 'eventemitter3';\n\n/**\n * A type-safe event emitter that provides a strongly-typed wrapper around EventEmitter2.\n *\n * This class ensures type safety for event names and their corresponding argument types,\n * making it easier to work with events in a type-safe manner.\n *\n * @template TEvents - A record type mapping event names to their argument types.\n * Each key represents an event name, and the value is a tuple of argument types.\n */\nexport class EventEmitter<TEvents extends Record<string, unknown[]>> {\n readonly #emitter = new EventEmitter3();\n\n /**\n * Emits an event with the specified name and arguments.\n *\n * @template TEventName - The name of the event to emit (must be a key of TEvents)\n * @param eventName - The name of the event to emit\n * @param eventArg - The arguments to pass to the event handlers\n */\n emit<TEventName extends keyof TEvents & string>(\n eventName: TEventName,\n ...eventArg: TEvents[TEventName]\n ) {\n this.#emitter.emit(eventName, ...eventArg);\n }\n\n /**\n * Registers an event handler for the specified event.\n *\n * @template TEventName - The name of the event to listen for (must be a key of TEvents)\n * @param eventName - The name of the event to listen for\n * @param handler - The function to call when the event is emitted\n * @returns Nothing\n */\n on<TEventName extends keyof TEvents & string>(\n eventName: TEventName,\n handler: (...eventArg: TEvents[TEventName]) => void,\n ) {\n this.#emitter.on(eventName, handler as (...args: any[]) => void);\n return () => {\n this.off(eventName, handler as (...args: any[]) => void);\n };\n }\n\n /**\n * Removes a specific event handler for the specified event.\n *\n * @template TEventName - The name of the event to remove the handler from (must be a key of TEvents)\n * @param eventName - The name of the event to remove the handler from\n * @param handler - The specific handler function to remove\n */\n off<TEventName extends keyof TEvents & string>(\n eventName: TEventName,\n handler: (...eventArg: TEvents[TEventName]) => void,\n ) {\n this.#emitter.off(eventName, handler as (...args: any[]) => void);\n }\n}\n\nexport type * from './types';\n","/* eslint-disable no-restricted-globals */\n// eslint-disable-next-line import-x/no-extraneous-dependencies\nimport debug from 'debug';\n\nimport type { StoreClient } from '../store/client';\n\n/**\n * Supported debug namespace types for the MetaMask SDK logger.\n * These namespaces help categorize and filter debug output.\n */\nexport type LoggerNameSpaces =\n | 'metamask-sdk'\n | 'metamask-sdk:core'\n | 'metamask-sdk:provider'\n | 'metamask-sdk:ui'\n | 'metamask-sdk:transport';\n\n/**\n * Creates a debug logger instance with the specified namespace and color.\n *\n * This function initializes a debug logger using the 'debug' library,\n * which allows for conditional logging based on environment variables or storage settings.\n *\n * @param namespace - The debug namespace to use for this logger instance\n * @param color - The ANSI color code to use for log output (default: '214' for yellow)\n * @returns A configured debug logger instance\n */\nexport const createLogger = (\n namespace: LoggerNameSpaces = 'metamask-sdk',\n color = '214',\n): debug.Debugger => {\n const logger = debug(namespace);\n logger.color = color; // Yellow color (basic ANSI)\n return logger;\n};\n\n/**\n * Enables debug logging for the specified namespace.\n *\n * This function activates debug output for the given namespace,\n * allowing debug messages to be displayed in the console.\n *\n * @param namespace - The debug namespace to enable\n */\nexport const enableDebug = (\n namespace: LoggerNameSpaces = 'metamask-sdk',\n): void => {\n debug.enable(namespace);\n};\n\n/**\n * Checks if a specific namespace is enabled in the given debug value string.\n *\n * This function determines whether debug logging should be active for a namespace\n * by checking if the debug value contains the namespace, a wildcard pattern, or\n * the general MetaMask SDK wildcard.\n *\n * @param debugValue - The debug configuration string (e.g., from environment or storage)\n * @param namespace - The namespace to check for enablement\n * @returns True if the namespace should have debug logging enabled, false otherwise\n */\nfunction isNamespaceEnabled(\n debugValue: string,\n namespace: LoggerNameSpaces,\n): boolean {\n return (\n debugValue.includes(namespace) ||\n debugValue.includes('metamask-sdk:*') ||\n debugValue.includes('*')\n );\n}\n\n/**\n * Determines if debug logging is enabled for a specific namespace.\n *\n * This function checks multiple sources to determine if debug logging should be active:\n * 1. First checks the process environment variable 'debug'\n * 2. Falls back to checking the debug setting in storage\n * 3. Returns false if neither source enables the namespace\n *\n * @param namespace - The namespace to check for debug enablement\n * @param storage - The storage client to check for debug settings\n * @returns Promise that resolves to true if debug logging is enabled, false otherwise\n */\nexport const isEnabled = async (\n namespace: LoggerNameSpaces,\n storage: StoreClient,\n): Promise<boolean> => {\n if ('process' in globalThis && process?.env?.DEBUG) {\n const { DEBUG } = process.env;\n return isNamespaceEnabled(DEBUG, namespace);\n }\n\n const storageDebug = await storage.getDebug();\n if (storageDebug) {\n return isNamespaceEnabled(storageDebug, namespace);\n }\n\n return false;\n};\n","/* c8 ignore start */\nimport type { RpcUrlsMap } from './types';\n\nexport const infuraRpcUrls: RpcUrlsMap = {\n // ###### Ethereum ######\n // Mainnet\n 'eip155:1': 'https://mainnet.infura.io/v3/',\n // Goerli\n 'eip155:5': 'https://goerli.infura.io/v3/',\n // Sepolia 11155111\n 'eip155:11155111': 'https://sepolia.infura.io/v3/',\n // ###### Linea ######\n // Mainnet Alpha\n 'eip155:59144': 'https://linea-mainnet.infura.io/v3/',\n // Testnet ( linea goerli )\n 'eip155:59140': 'https://linea-goerli.infura.io/v3/',\n // ###### Polygon ######\n // Mainnet\n 'eip155:137': 'https://polygon-mainnet.infura.io/v3/',\n // Mumbai\n 'eip155:80001': 'https://polygon-mumbai.infura.io/v3/',\n // ###### Optimism ######\n // Mainnet\n 'eip155:10': 'https://optimism-mainnet.infura.io/v3/',\n // Goerli\n 'eip155:420': 'https://optimism-goerli.infura.io/v3/',\n // ###### Arbitrum ######\n // Mainnet\n 'eip155:42161': 'https://arbitrum-mainnet.infura.io/v3/',\n // Goerli\n 'eip155:421613': 'https://arbitrum-goerli.infura.io/v3/',\n // ###### Palm ######\n // Mainnet\n 'eip155:11297108109': 'https://palm-mainnet.infura.io/v3/',\n // Testnet\n 'eip155:11297108099': 'https://palm-testnet.infura.io/v3/',\n // ###### Avalanche C-Chain ######\n // Mainnet\n 'eip155:43114': 'https://avalanche-mainnet.infura.io/v3/',\n // Fuji\n 'eip155:43113': 'https://avalanche-fuji.infura.io/v3/',\n // // ###### NEAR ######\n // // Mainnet\n // 'near:mainnet': `https://near-mainnet.infura.io/v3/`,\n // // Testnet\n // 'near:testnet': `https://near-testnet.infura.io/v3/`,\n // ###### Aurora ######\n // Mainnet\n 'eip155:1313161554': 'https://aurora-mainnet.infura.io/v3/',\n // Testnet\n 'eip155:1313161555': 'https://aurora-testnet.infura.io/v3/',\n // ###### StarkNet ######\n // Mainnet\n //\n // 'starknet:SN_MAIN': `https://starknet-mainnet.infura.io/v3/`,\n // // Goerli\n // 'starknet:SN_GOERLI': `https://starknet-goerli.infura.io/v3/`,\n // // Goerli 2\n // 'starknet:SN_GOERLI2': `https://starknet-goerli2.infura.io/v3/`,\n // ###### Celo ######\n // Mainnet\n 'eip155:42220': 'https://celo-mainnet.infura.io/v3/',\n // Alfajores Testnet\n 'eip155:44787': 'https://celo-alfajores.infura.io/v3/',\n};\n\n// Methods that are passed through to the RPC node\nexport const RPC_HANDLED_METHODS = new Set([\n\t'eth_blockNumber',\n\t'eth_gasPrice',\n\t'eth_maxPriorityFeePerGas',\n\t'eth_blobBaseFee',\n\t'eth_feeHistory',\n\t'eth_getBalance',\n\t'eth_getCode',\n\t'eth_getStorageAt',\n\t'eth_call',\n\t'eth_estimateGas',\n\t'eth_getLogs',\n\t'eth_getProof',\n\t'eth_getTransactionCount',\n\t'eth_getBlockByNumber',\n\t'eth_getBlockByHash',\n\t'eth_getBlockTransactionCountByNumber',\n\t'eth_getBlockTransactionCountByHash',\n\t'eth_getUncleCountByBlockNumber',\n\t'eth_getUncleCountByBlockHash',\n\t'eth_getTransactionByHash',\n\t'eth_getTransactionByBlockNumberAndIndex',\n\t'eth_getTransactionByBlockHashAndIndex',\n\t'eth_getTransactionReceipt',\n\t'eth_getUncleByBlockNumberAndIndex',\n\t'eth_getUncleByBlockHashAndIndex',\n\t'eth_getFilterChanges',\n\t'eth_getFilterLogs',\n\t'eth_newBlockFilter',\n\t'eth_newFilter',\n\t'eth_newPendingTransactionFilter',\n\t'eth_sendRawTransaction',\n\t'eth_syncing',\n\t'eth_uninstallFilter',\n]);\n\n// Methods that are handled by the SDK directly\nexport const SDK_HANDLED_METHODS = new Set(['eth_accounts', 'eth_chainId']);\n","/* eslint-disable jsdoc/require-jsdoc */\nimport { infuraRpcUrls } from './constants';\nimport type { RpcUrlsMap } from './types';\n\nexport function getInfuraRpcUrls(infuraAPIKey: string): RpcUrlsMap {\n return Object.keys(infuraRpcUrls).reduce<RpcUrlsMap>((acc, key) => {\n const typedKey = key as keyof typeof infuraRpcUrls;\n acc[typedKey] = `${infuraRpcUrls[typedKey]}${infuraAPIKey}`;\n return acc;\n }, {});\n}\n","/* eslint-disable @typescript-eslint/parameter-properties */\n/* eslint-disable jsdoc/require-jsdoc */\nimport type {\n MultichainApiClient,\n Transport,\n} from '@metamask/multichain-api-client';\nimport type { CaipAccountId, Json } from '@metamask/utils';\n\nimport { EventEmitter, type SDKEvents } from '../events';\nimport type { StoreClient } from '../store/client';\nimport type { InvokeMethodOptions, RPCAPI, Scope } from './api/types';\nimport type { MultichainOptions } from './types';\n\nexport type SDKState =\n | 'pending'\n | 'loaded'\n | 'disconnected'\n | 'connected'\n | 'connecting';\n\nexport enum TransportType {\n Browser = 'browser',\n MPW = 'mwp',\n UNKNOWN = 'unknown',\n}\n\n/**\n * Abstract base class for the Multichain SDK implementation.\n *\n * This class defines the core interface that all Multichain SDK implementations\n * must provide, including session management, connection handling, and method invocation.\n */\nexport abstract class MultichainCore extends EventEmitter<SDKEvents> {\n abstract storage: StoreClient;\n\n abstract state: SDKState;\n\n abstract provider: MultichainApiClient<RPCAPI>;\n\n abstract transport: Transport;\n\n /**\n * Establishes a connection to the multichain provider, or re-use existing session\n *\n * @returns Promise that resolves to the session data\n */\n abstract connect(\n scopes: Scope[],\n caipAccountIds: CaipAccountId[],\n ): Promise<void>;\n\n /**\n * Disconnects from the multichain provider.\n *\n * @returns Promise that resolves when disconnection is complete\n */\n abstract disconnect(): Promise<void>;\n\n /**\n * Invokes an RPC method with the specified options.\n *\n * @param options - The method invocation options including scope and request details\n * @returns Promise that resolves to the method result\n */\n abstract invokeMethod(options: InvokeMethodOptions): Promise<Json>;\n\n constructor(protected readonly options: MultichainOptions) {\n super();\n }\n}\n/* c8 ignore end */\n\nexport function getTransportType(type: string): TransportType {\n switch (type) {\n case 'browser':\n return TransportType.Browser;\n case 'mwp':\n return TransportType.MPW;\n default:\n return TransportType.UNKNOWN;\n }\n}\n\nexport * from './api/constants';\nexport * from './api/infura';\nexport type * from './api/types';\nexport type * from './types';\n","/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable no-restricted-globals */\n/* eslint-disable jsdoc/require-jsdoc */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { parse } from 'bowser';\n\nexport enum PlatformType {\n // React Native or Nodejs\n NonBrowser = 'nodejs',\n // MetaMask Mobile in-app browser\n MetaMaskMobileWebview = 'in-app-browser',\n // Desktop Browser\n DesktopWeb = 'web-desktop',\n // Mobile Browser\n MobileWeb = 'web-mobile',\n // ReactNative\n ReactNative = 'react-native',\n}\n\nfunction isNotBrowser(): boolean {\n if (typeof window === 'undefined') {\n return true;\n }\n if (!window?.navigator) {\n return true;\n }\n if (\n typeof global !== 'undefined' &&\n global?.navigator?.product === 'ReactNative'\n ) {\n return true;\n }\n return navigator?.product === 'ReactNative';\n}\n\nfunction isReactNative(): boolean {\n const hasWindowNavigator =\n typeof window !== 'undefined' && window.navigator !== undefined;\n const nav = hasWindowNavigator ? window.navigator : undefined;\n\n if (!nav) {\n return false;\n }\n\n return hasWindowNavigator && window.navigator?.product === 'ReactNative';\n}\n\nfunction isMetaMaskMobileWebView(): boolean {\n return (\n typeof window !== 'undefined' &&\n // @ts-expect-error ReactNativeWebView should be defined\n Boolean(window.ReactNativeWebView) &&\n Boolean(window.navigator.userAgent.endsWith('MetaMaskMobile'))\n );\n}\n\nfunction isMobile(): boolean {\n const browser = parse(window.navigator.userAgent);\n return (\n browser?.platform?.type === 'mobile' || browser?.platform?.type === 'tablet'\n );\n}\n\nexport function getPlatformType(): PlatformType {\n if (isReactNative()) {\n return PlatformType.ReactNative;\n }\n if (isNotBrowser()) {\n return PlatformType.NonBrowser;\n }\n if (isMetaMaskMobileWebView()) {\n return PlatformType.MetaMaskMobileWebview;\n }\n if (isMobile()) {\n return PlatformType.MobileWeb;\n }\n return PlatformType.DesktopWeb;\n}\n\n/**\n * Check if MetaMask extension is installed\n *\n * @returns True if extension is installed, false otherwise\n */\nexport function isMetamaskExtensionInstalled(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n // @ts-expect-error ethereum should be defined\n return Boolean(window.ethereum?.isMetaMask);\n}\n\nexport function isSecure(): boolean {\n const platformType = getPlatformType();\n return isReactNative() || platformType === PlatformType.MobileWeb;\n}\n\n// Immediately start MetaMask detection when module loads\nconst detectionPromise: Promise<boolean> = (async () => {\n const pt = getPlatformType();\n if (pt === PlatformType.NonBrowser || pt === PlatformType.ReactNative) {\n return Promise.resolve(false);\n }\n\n return new Promise((resolve) => {\n const providers: any[] = [];\n\n const handler = (event: any) => {\n if (event?.detail?.info?.rdns) {\n providers.push(event.detail);\n }\n };\n\n window.addEventListener('eip6963:announceProvider', handler);\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n setTimeout(() => {\n window.removeEventListener('eip6963:announceProvider', handler);\n\n const hasMetaMask = providers.some(\n (provider) => provider?.info?.rdns === 'io.metamask',\n );\n\n resolve(hasMetaMask);\n }, 300); // default timeout\n });\n})();\n\nexport async function hasExtension(): Promise<boolean> {\n return detectionPromise;\n}\n","/* eslint-disable @typescript-eslint/parameter-properties */\n/* c8 ignore start */\n// biome-ignore lint/suspicious/noExplicitAny: Needed here\nexport type StoreOptions = Record<string, any>;\n\nexport abstract class StoreAdapter {\n abstract platform: 'web' | 'rn' | 'node';\n\n constructor(public options?: StoreOptions) {}\n\n abstract get(key: string): Promise<string | null>;\n\n abstract set(key: string, value: string): Promise<void>;\n\n abstract delete(key: string): Promise<void>;\n}\n","/* c8 ignore start */\nimport type { StoreAdapter } from '.';\nimport type { TransportType } from '../multichain';\n\nexport abstract class StoreClient {\n abstract adapter: StoreAdapter;\n\n abstract getAnonId(): Promise<string>;\n\n abstract getExtensionId(): Promise<string | null>;\n\n abstract setExtensionId(extensionId: string): Promise<void>;\n\n abstract getTransport(): Promise<TransportType | null>;\n\n abstract setTransport(transport: TransportType): Promise<void>;\n\n abstract removeTransport(): Promise<void>;\n\n abstract setAnonId(anonId: string): Promise<void>;\n\n abstract removeExtensionId(): Promise<void>;\n\n abstract removeAnonId(): Promise<void>;\n\n abstract getDebug(): Promise<string | null>;\n}\n","export * from './adapter';\nexport * from './client';\n","import type { Components } from '@metamask/multichain-ui';\n\nimport type { ConnectionRequest } from '../multichain';\n\nexport type OTPCode = string;\nexport type QRLink = string;\n\nexport type InstallWidgetProps = Components.MmInstallModal & {\n parentElement?: Element;\n connectionRequest: ConnectionRequest;\n onClose: (shouldTerminate?: boolean) => void;\n startDesktopOnboarding: () => void;\n createConnectionRequest: () => Promise<ConnectionRequest>;\n generateQRCode: (connectionRequest: ConnectionRequest) => Promise<QRLink>;\n};\n\nexport type OTPCodeWidgetProps = Components.MmOtpModal & {\n parentElement?: Element;\n onClose: () => Promise<void>;\n onDisconnect?: () => void;\n createOTPCode: () => Promise<OTPCode>;\n updateOTPCode: (otpValue: string) => void;\n};\n\nexport type DataType = OTPCode | QRLink;\n/**\n * Abstract Modal class with shared functionality across all models\n */\nexport abstract class Modal<Options, Data extends DataType = DataType> {\n protected abstract instance?:\n | HTMLMmInstallModalElement\n | HTMLMmOtpModalElement\n | undefined;\n\n abstract mount(): void;\n\n abstract unmount(): void;\n\n // eslint-disable-next-line @typescript-eslint/parameter-properties\n constructor(protected readonly options: Options) {}\n\n get isMounted(): boolean {\n return this.instance !== undefined;\n }\n\n get data(): Data {\n if (\n typeof this.options === 'object' &&\n this.options &&\n 'link' in this.options\n ) {\n return this.options.link as Data;\n }\n\n if (\n typeof this.options === 'object' &&\n this.options &&\n 'otpCode' in this.options\n ) {\n return this.options.otpCode as Data;\n }\n\n throw new Error('Invalid options');\n }\n\n set data(data: Data) {\n if (\n typeof this.options === 'object' &&\n this.options &&\n 'link' in this.options\n ) {\n this.options.link = data;\n }\n\n if (\n typeof this.options === 'object' &&\n this.options &&\n 'otpCode' in this.options\n ) {\n this.options.otpCode = data;\n }\n }\n}\n","export type * from './factory';\nexport * from './types';\n","/**\n * Returns the version of the Multichain SDK.\n *\n * @returns The version of the Multichain SDK.\n */\nexport function getVersion(): string {\n return '0.0.0';\n}\n","export * from './errors';\nexport * from './events';\nexport * from './logger';\nexport * from './multichain';\nexport * from './platform';\nexport * from './store';\nexport * from './ui';\nexport * from './utils';\n","export function formatRemainingTime(milliseconds: number): string {\n if (milliseconds <= 0) return 'EXPIRED';\n const seconds = Math.floor(milliseconds / 1000);\n return `${seconds}s`;\n}\n\nexport function shouldLogCountdown(remainingSeconds: number): boolean {\n // Log at specific intervals to avoid spam\n if (remainingSeconds <= 10) {\n // Log every second for the last 10 seconds\n return true;\n } else if (remainingSeconds <= 30) {\n // Log every 5 seconds for the last 30 seconds\n return remainingSeconds % 5 === 0;\n } else if (remainingSeconds <= 60) {\n // Log every 10 seconds for the last minute\n return remainingSeconds % 10 === 0;\n } else if (remainingSeconds <= 300) {\n // Log every 30 seconds for the last 5 minutes\n return remainingSeconds % 30 === 0;\n } else {\n // Log every minute for longer durations\n return remainingSeconds % 60 === 0;\n }\n}\n","import {\n type ConnectionRequest,\n createLogger,\n type InstallWidgetProps,\n Modal,\n type QRLink,\n} from '../../../domain';\nimport { formatRemainingTime, shouldLogCountdown } from './utils';\n\nconst logger = createLogger('metamask-sdk:ui');\n\nexport abstract class AbstractInstallModal extends Modal<\n InstallWidgetProps,\n QRLink\n> {\n protected instance?: HTMLMmInstallModalElement | undefined;\n private expirationInterval: NodeJS.Timeout | null = null;\n private lastLoggedCountdown: number = -1;\n\n abstract renderQRCode(\n link: QRLink,\n connectionRequest: ConnectionRequest,\n ): void;\n\n get link() {\n return this.data;\n }\n\n set link(link: QRLink) {\n this.data = link;\n }\n\n get connectionRequest() {\n return this.options.connectionRequest;\n }\n\n set connectionRequest(connectionRequest: ConnectionRequest) {\n this.options.connectionRequest = connectionRequest;\n }\n\n protected updateLink(link: QRLink) {\n this.link = link;\n if (this.instance) {\n this.instance.link = link;\n }\n }\n\n protected updateExpiresIn(expiresIn: number) {\n if (expiresIn >= 0 && this.instance) {\n this.instance.expiresIn = expiresIn;\n }\n }\n\n protected startExpirationCheck(connectionRequest: ConnectionRequest) {\n this.stopExpirationCheck();\n\n let currentConnectionRequest: ConnectionRequest = connectionRequest;\n\n this.expirationInterval = setInterval(async () => {\n const { sessionRequest } = currentConnectionRequest;\n const now = Date.now();\n const remainingMs = sessionRequest.expiresAt - now;\n\n const remainingSeconds = Math.floor(remainingMs / 1000);\n\n if (\n remainingMs > 0 &&\n shouldLogCountdown(remainingSeconds) &&\n this.lastLoggedCountdown !== remainingSeconds\n ) {\n const formattedTime = formatRemainingTime(remainingMs);\n logger(\n `[UI: InstallModal-nodejs()] QR code expires in: ${formattedTime} (${remainingSeconds}s)`,\n );\n this.lastLoggedCountdown = remainingSeconds;\n }\n\n if (now >= sessionRequest.expiresAt) {\n this.stopExpirationCheck();\n logger(\n '[UI: InstallModal-nodejs()] ⏰ QR code EXPIRED! Generating new one...',\n );\n try {\n // Generate new session request\n currentConnectionRequest =\n await this.options.createConnectionRequest();\n const generateQRCode = await this.options.generateQRCode(\n currentConnectionRequest,\n );\n this.lastLoggedCountdown = -1; // Reset countdown logging\n\n //Update local instances with new data\n this.updateLink(generateQRCode);\n this.updateExpiresIn(remainingSeconds);\n\n // Render QRCode on each platform\n this.renderQRCode(generateQRCode, currentConnectionRequest);\n } catch (error) {\n logger(\n `[UI: InstallModal-nodejs()] ❌ Error generating new QR code: ${error}`,\n );\n }\n } else {\n const generateQRCode = await this.options.generateQRCode(\n currentConnectionRequest,\n );\n this.renderQRCode(generateQRCode, currentConnectionRequest);\n }\n }, 1000);\n }\n\n protected stopExpirationCheck() {\n if (this.expirationInterval) {\n clearInterval(this.expirationInterval);\n this.expirationInterval = null;\n logger(\n '[UI: InstallModal-nodejs()] 🛑 Stopped QR code expiration checking',\n );\n }\n }\n}\n","import type { MmInstallModalCustomEvent } from '@metamask/multichain-ui';\n\nimport { AbstractInstallModal } from '../base/AbstractInstallModal';\n\nexport class InstallModal extends AbstractInstallModal {\n renderQRCode(): void {\n //Not needed for web as its using install Modal\n }\n\n mount() {\n const { options } = this;\n const modal = document.createElement(\n 'mm-install-modal',\n ) as HTMLMmInstallModalElement;\n\n modal.preferDesktop = options.preferDesktop;\n modal.sdkVersion = options.sdkVersion;\n modal.addEventListener('close', (ev: Event) => {\n const { detail } = ev as MmInstallModalCustomEvent<{\n shouldTerminate?: boolean;\n }>;\n options.onClose(detail?.shouldTerminate);\n });\n modal.addEventListener(\n 'startDesktopOnboarding',\n options.startDesktopOnboarding,\n );\n modal.link = options.link;\n\n this.instance = modal;\n options.parentElement?.appendChild(modal);\n\n this.startExpirationCheck(options.connectionRequest);\n }\n\n unmount() {\n const { options, instance: modal } = this;\n this.stopExpirationCheck();\n if (modal && options.parentElement?.contains(modal)) {\n options.parentElement.removeChild(modal);\n this.instance = undefined;\n }\n }\n}\n","import { Modal, type OTPCode, type OTPCodeWidgetProps } from '../../../domain';\n\nexport abstract class AbstractOTPCodeModal extends Modal<\n OTPCodeWidgetProps,\n OTPCode\n> {\n protected instance?: HTMLMmOtpModalElement | undefined;\n\n get otpCode() {\n return this.data;\n }\n\n set otpCode(code: string) {\n this.data = code;\n }\n\n updateOTPCode(code: string) {\n this.otpCode = code;\n if (this.instance) {\n this.instance.otpCode = code;\n }\n }\n}\n","import { AbstractOTPCodeModal } from '../base/AbstractOTPModal';\n\n/**\n * TODO: This is a placeholder for the OTP code modal.\n * It will be replaced with the actual OTP code modal once it is implemented.\n */\nexport class OTPCodeModal extends AbstractOTPCodeModal {\n mount() {}\n\n unmount() {}\n}\n","export { InstallModal } from './install';\nexport { OTPCodeModal } from './otp';\n","import { StoreAdapter } from '../../domain';\n\ntype kvStores = 'sdk-kv-store' | 'key-value-pairs';\n\nexport class StoreAdapterWeb extends StoreAdapter {\n static readonly stores: kvStores[] = ['sdk-kv-store', 'key-value-pairs'];\n static readonly DB_NAME = 'mmsdk';\n\n readonly platform = 'web';\n readonly dbPromise: Promise<IDBDatabase>;\n\n private get internal() {\n if (typeof window === 'undefined' || !window.indexedDB) {\n throw new Error('indexedDB is not available in this environment');\n }\n return window.indexedDB;\n }\n\n constructor(\n dbNameSuffix: `-${string}` = '-kv-store',\n private storeName: kvStores = StoreAdapterWeb.stores[0],\n ) {\n super();\n\n const dbName = `${StoreAdapterWeb.DB_NAME}${dbNameSuffix}`;\n this.dbPromise = new Promise((resolve, reject) => {\n try {\n const request = this.internal.open(dbName, 1);\n request.onerror = () => reject(new Error('Failed to open IndexedDB.'));\n request.onsuccess = () => resolve(request.result);\n request.onupgradeneeded = () => {\n const db = request.result;\n for (const name of StoreAdapterWeb.stores) {\n if (!db.objectStoreNames.contains(name)) {\n db.createObjectStore(name);\n }\n }\n };\n } catch (error) {\n reject(error);\n }\n });\n }\n\n async get(key: string): Promise<string | null> {\n const { storeName } = this;\n const db = await this.dbPromise;\n return new Promise((resolve, reject) => {\n try {\n const tx = db.transaction(storeName, 'readonly');\n const store = tx.objectStore(storeName);\n const request = store.get(key);\n request.onerror = () =>\n reject(new Error('Failed to get value from IndexedDB.'));\n request.onsuccess = () => resolve((request.result as string) ?? null);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n async set(key: string, value: string): Promise<void> {\n const { storeName } = this;\n const db = await this.dbPromise;\n return new Promise((resolve, reject) => {\n try {\n const tx = db.transaction(storeName, 'readwrite');\n const store = tx.objectStore(storeName);\n const request = store.put(value, key);\n request.onerror = () =>\n reject(new Error('Failed to set value in IndexedDB.'));\n request.onsuccess = () => resolve();\n } catch (error) {\n reject(error);\n }\n });\n }\n\n async delete(key: string): Promise<void> {\n const { storeName } = this;\n const db = await this.dbPromise;\n return new Promise((resolve, reject) => {\n try {\n const tx = db.transaction(storeName, 'readwrite');\n const store = tx.objectStore(storeName);\n const request = store.delete(key);\n request.onerror = () =>\n reject(new Error('Failed to delete value from IndexedDB.'));\n request.onsuccess = () => resolve();\n } catch (error) {\n reject(error);\n }\n });\n }\n}\n","import type { CreateMultichainFN, StoreClient } from './domain';\nimport { MultichainSDK } from './multichain';\nimport { Store } from './store';\nimport { ModalFactory } from './ui';\n\nexport * from './domain';\n\nexport const createMetamaskConnect: CreateMultichainFN = async (options) => {\n const uiModules = await import('./ui/modals/web');\n let storage: StoreClient;\n if (!options.storage) {\n const { StoreAdapterWeb } = await import('./store/adapters/web');\n const adapter = new StoreAdapterWeb();\n storage = new Store(adapter);\n } else {\n storage = options.storage;\n }\n const factory = new ModalFactory(uiModules);\n return MultichainSDK.create({\n ...options,\n storage,\n ui: {\n ...options.ui,\n factory,\n },\n });\n};\n","/* eslint-disable consistent-return */\n/* eslint-disable no-else-return */\n/* eslint-disable promise/no-return-wrap */\n/* eslint-disable promise/always-return */\n/* eslint-disable promise/catch-or-return */\n/* eslint-disable no-async-promise-executor */\n/* eslint-disable no-negated-condition */\n/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */\n/* eslint-disable promise/param-names */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n/* eslint-disable @typescript-eslint/promise-function-async */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable no-restricted-globals */\n/* eslint-disable @typescript-eslint/no-misused-promises */\n/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable no-restricted-syntax */\n/** biome-ignore-all lint/suspicious/noAsyncPromiseExecutor: <explanation> */\n\nimport { analytics } from '@metamask/analytics';\nimport {\n ErrorCode,\n ProtocolError,\n type SessionRequest,\n SessionStore,\n WebSocketTransport,\n} from '@metamask/mobile-wallet-protocol-core';\nimport { DappClient } from '@metamask/mobile-wallet-protocol-dapp-client';\nimport {\n getMultichainClient,\n type MultichainApiClient,\n type SessionData,\n} from '@metamask/multichain-api-client';\nimport type { CaipAccountId, Json } from '@metamask/utils';\n\nimport { MWP_RELAY_URL } from '../config';\nimport {\n getVersion,\n type InvokeMethodOptions,\n type MultichainOptions,\n type RPCAPI,\n type Scope,\n type StoreClient,\n TransportType,\n} from '../domain';\nimport {\n createLogger,\n enableDebug,\n isEnabled as isLoggerEnabled,\n} from '../domain/logger';\nimport {\n type ConnectionRequest,\n type ExtendedTransport,\n MultichainCore,\n type SDKState,\n} from '../domain/multichain';\nimport {\n getPlatformType,\n hasExtension,\n isSecure,\n PlatformType,\n} from '../domain/platform';\nimport { RequestRouter } from './rpc/requestRouter';\nimport { DefaultTransport } from './transports/default';\nimport { MWPTransport } from './transports/mwp';\nimport { keymanager } from './transports/mwp/KeyManager';\nimport {\n getDappId,\n openDeeplink,\n setupDappMetadata,\n setupInfuraProvider,\n} from './utils';\nimport { RpcClient } from './rpc/handlers/rpcClient';\n\n// ENFORCE NAMESPACE THAT CAN BE DISABLED\nconst logger = createLogger('metamask-sdk:core');\n\nexport class MultichainSDK extends MultichainCore {\n private __provider: MultichainApiClient<RPCAPI> | undefined = undefined;\n\n private __transport: ExtendedTransport | undefined = undefined;\n\n private __dappClient: DappClient | undefined = undefined;\n\n private __beforeUnloadListener: (() => void) | undefined;\n\n public __state: SDKState = 'pending';\n\n private listener: (() => void | Promise<void>) | undefined;\n\n get state(): SDKState {\n return this.__state;\n }\n\n set state(value: SDKState) {\n this.__state = value;\n this.options.transport?.onNotification?.({\n method: 'stateChanged',\n params: value,\n });\n }\n\n get provider(): MultichainApiClient<RPCAPI> {\n if (!this.__provider) {\n throw new Error('Provider not initialized, establish connection first');\n }\n return this.__provider;\n }\n\n get transport(): ExtendedTransport {\n if (!this.__transport) {\n throw new Error('Transport not initialized, establish connection first');\n }\n return this.__transport;\n }\n\n get dappClient(): DappClient {\n if (!this.__dappClient) {\n throw new Error('DappClient not initialized, establish connection first');\n }\n return this.__dappClient;\n }\n\n get storage(): StoreClient {\n return this.options.storage;\n }\n\n private get sdkInfo(): string {\n return `Sdk/Javascript SdkVersion/${getVersion()} Platform/${getPlatformType()} dApp/${this.options.dapp.url ?? this.options.dapp.name} dAppTitle/${this.options.dapp.name}`;\n }\n\n private constructor(options: MultichainOptions) {\n const withInfuraRPCMethods = setupInfuraProvider(options);\n const withDappMetadata = setupDappMetadata(withInfuraRPCMethods);\n const allOptions = {\n ...withDappMetadata,\n ui: {\n ...withDappMetadata.ui,\n preferExtension: withDappMetadata.ui.preferExtension ?? true,\n preferDesktop: withDappMetadata.ui.preferDesktop ?? false,\n headless: withDappMetadata.ui.headless ?? false,\n },\n analytics: {\n ...(options.analytics ?? {}),\n enabled: options.analytics?.enabled ?? true,\n integrationType: 'unknown',\n },\n };\n\n super(allOptions);\n }\n\n static async create(options: MultichainOptions): Promise<MultichainSDK> {\n const instance = new MultichainSDK(options);\n const isEnabled = await isLoggerEnabled(\n 'metamask-sdk:core',\n instance.options.storage,\n );\n if (isEnabled) {\n enableDebug('metamask-sdk:core');\n }\n await instance.init();\n return instance;\n }\n\n private async setupAnalytics(): Promise<void> {\n if (!this.options.analytics?.enabled) {\n return;\n }\n\n const platform = getPlatformType();\n const isBrowser =\n platform === PlatformType.MetaMaskMobileWebview ||\n platform === PlatformType.DesktopWeb ||\n platform === PlatformType.MobileWeb;\n\n const isReactNative = platform === PlatformType.ReactNative;\n\n if (!isBrowser && !isReactNative) {\n return;\n }\n\n const version = getVersion();\n const dappId = getDappId(this.options.dapp);\n const anonId = await this.storage.getAnonId();\n\n const { integrationType } = this.options.analytics ?? {\n integrationType: '',\n };\n analytics.setGlobalProperty('sdk_version', version);\n analytics.setGlobalProperty('dapp_id', dappId);\n analytics.setGlobalProperty('anon_id', anonId);\n analytics.setGlobalProperty('platform', platform);\n analytics.setGlobalProperty('integration_type', integrationType);\n analytics.enable();\n }\n\n private async onTransportNotification(payload: any): Promise<void> {\n if (\n typeof payload === 'object' &&\n payload !== null &&\n 'method' in payload\n ) {\n this.emit(payload.method as string, payload.params ?? payload.result);\n }\n }\n\n private async getStoredTransport(): Promise<\n DefaultTransport | MWPTransport | undefined\n > {\n const { ui } = this.options;\n const { preferExtension = true } = ui;\n const transportType = await this.storage.getTransport();\n const hasExtensionInstalled = await hasExtension();\n if (transportType) {\n if (transportType === TransportType.Browser) {\n // Check if the user still have the extension or not return the transport\n if (hasExtensionInstalled && preferExtension) {\n const apiTransport = new DefaultTransport();\n this.__transport = apiTransport;\n this.listener = apiTransport.onNotification(\n this.onTransportNotification.bind(this),\n );\n return apiTransport;\n }\n } else if (transportType === TransportType.MPW) {\n const { adapter: kvstore } = this.options.storage;\n const dappClient = await this.createDappClient();\n const apiTransport = new MWPTransport(dappClient, kvstore);\n this.__dappClient = dappClient;\n this.__transport = apiTransport;\n this.listener = apiTransport.onNotification(\n this.onTransportNotification.bind(this),\n );\n return apiTransport;\n }\n\n await this.storage.removeTransport();\n }\n\n return undefined;\n }\n\n private async setupTransport(): Promise<void> {\n const transport = await this.getStoredTransport();\n if (transport) {\n if (!this.transport.isConnected()) {\n this.state = 'connecting';\n await this.transport.connect();\n }\n this.state = 'connected';\n if (this.transport instanceof MWPTransport) {\n await this.storage.setTransport(TransportType.MPW);\n } else {\n await this.storage.setTransport(TransportType.Browser);\n }\n } else {\n this.state = 'loaded';\n }\n }\n\n private async init(): Promise<void> {\n try {\n // @ts-expect-error mmsdk should be accessible\n if (typeof window !== 'undefined' && window.mmsdk?.isInitialized) {\n logger('MetaMaskSDK: init already initialized');\n } else {\n await this.setupAnalytics();\n await this.setupTransport();\n analytics.track('sdk_initialized', {});\n if (typeof window !== 'undefined') {\n // @ts-expect-error mmsdk should be accessible\n window.mmsdk = this;\n }\n }\n } catch (error) {\n await this.storage.removeTransport();\n this.state = 'pending';\n logger('MetaMaskSDK error during initialization', error);\n }\n }\n\n private async createDappClient(): Promise<DappClient> {\n const { adapter: kvstore } = this.options.storage;\n const sessionstore = new SessionStore(kvstore);\n const websocket =\n // eslint-disable-next-line no-negated-condition\n typeof window !== 'undefined'\n ? WebSocket\n : (await import('ws')).WebSocket;\n const transport = await WebSocketTransport.create({\n url: MWP_RELAY_URL,\n kvstore,\n websocket,\n });\n const dappClient = new DappClient({ transport, sessionstore, keymanager });\n return dappClient;\n }\n\n private async setupMWP(): Promise<void> {\n if (this.__transport instanceof MWPTransport) {\n return;\n }\n // Only setup MWP if it is not already mwp\n const { adapter: kvstore } = this.options.storage;\n const dappClient = await this.createDappClient();\n this.__dappClient = dappClient;\n const apiTransport = new MWPTransport(dappClient, kvstore);\n this.__transport = apiTransport;\n this.listener = this.transport.onNotification(\n this.onTransportNotification.bind(this),\n );\n await this.storage.setTransport(TransportType.MPW);\n }\n\n private async onBeforeUnload(): Promise<void> {\n // Fixes glitch with \"connecting\" state when modal is still visible and we close screen or refresh\n if (this.options.ui.factory.modal?.isMounted) {\n await this.storage.removeTransport();\n }\n }\n\n private createBeforeUnloadListener() {\n if (\n typeof window !== 'undefined' &&\n typeof window.addEventListener !== 'undefined'\n ) {\n window.addEventListener('beforeunload', this.onBeforeUnload.bind(this));\n }\n return () => {\n if (\n typeof window !== 'undefined' &&\n typeof window.removeEventListener !== 'undefined'\n ) {\n window.removeEventListener(\n 'beforeunload',\n this.onBeforeUnload.bind(this),\n );\n }\n };\n }\n\n private async showInstallModal(\n desktopPreferred: boolean,\n scopes: Scope[],\n caipAccountIds: CaipAccountId[],\n ) {\n // create the listener only once to avoid memory leaks\n this.__beforeUnloadListener ??= this.createBeforeUnloadListener();\n return new Promise<void>((resolve, reject) => {\n // Use Connection Modal\n this.options.ui.factory.renderInstallModal(\n desktopPreferred,\n async () => {\n if (\n this.dappClient.state === 'CONNECTED' ||\n this.dappClient.state === 'CONNECTING'\n ) {\n await this.dappClient.disconnect();\n }\n return new Promise<ConnectionRequest>((resolveConnectionRequest) => {\n this.dappClient.on(\n 'session_request',\n (sessionRequest: SessionRequest) => {\n resolveConnectionRequest({\n sessionRequest,\n metadata: {\n dapp: this.options.dapp,\n sdk: {\n version: getVersion(),\n platform: getPlatformType(),\n },\n },\n });\n },\n );\n\n this.transport\n .connect({ scopes, caipAccountIds })\n .then(() => {\n this.options.ui.factory.unload();\n this.options.ui.factory.modal?.unmount();\n this.state = 'connected';\n return this.storage.setTransport(TransportType.MPW);\n })\n .catch((error) => {\n if (error instanceof ProtocolError) {\n // Ignore Request expired errors to allow modal to regenerate expired qr codes\n if (error.code !== ErrorCode.REQUEST_EXPIRED) {\n this.state = 'disconnected';\n reject(error);\n }\n // If request is expires, the QRCode will automatically be regenerated we can ignore this case\n } else {\n this.state = 'disconnected';\n reject(error);\n }\n });\n });\n },\n async (error?: Error) => {\n if (!error) {\n await this.storage.setTransport(TransportType.MPW);\n resolve();\n } else {\n await this.storage.removeTransport();\n reject(error);\n }\n },\n );\n });\n }\n\n private async setupDefaultTransport() {\n this.state = 'connecting';\n await this.storage.setTransport(TransportType.Browser);\n const transport = new DefaultTransport();\n this.listener = transport.onNotification(\n this.onTransportNotification.bind(this),\n );\n this.__transport = transport;\n return transport;\n }\n\n private async deeplinkConnect(\n scopes: Scope[],\n caipAccountIds: CaipAccountId[],\n ) {\n return new Promise<void>(async (resolve, reject) => {\n this.dappClient.on('message', (payload: any) => {\n const data = payload.data as Record<string, unknown>;\n if (typeof data === 'object' && data !== null) {\n if ('method' in data && data.method === 'wallet_createSession') {\n if (data.error) {\n this.state = 'loaded';\n return reject(data.error);\n }\n // TODO: is it .params or .result?\n const session = ((data as any).params ??\n (data as any).result) as SessionData;\n if (session) {\n // Initial request will be what resolves the connection when options is specified\n this.options.transport?.onNotification?.(payload.data);\n this.emit('wallet_sessionChanged', session);\n }\n }\n }\n });\n\n let timeout: NodeJS.Timeout | undefined;\n\n if (!this.transport.isConnected()) {\n this.dappClient.once(\n 'session_request',\n (sessionRequest: SessionRequest) => {\n const connectionRequest = {\n sessionRequest,\n metadata: {\n dapp: this.options.dapp,\n sdk: { version: getVersion(), platform: getPlatformType() },\n },\n };\n const deeplink =\n this.options.ui.factory.createDeeplink(connectionRequest);\n const universalLink =\n this.options.ui.factory.createUniversalLink(connectionRequest);\n if (this.options.mobile?.preferredOpenLink) {\n this.options.mobile.preferredOpenLink(deeplink, '_self');\n } else {\n openDeeplink(this.options, deeplink, universalLink);\n }\n },\n );\n } else {\n timeout = setTimeout(() => {\n const deeplink = this.options.ui.factory.createDeeplink();\n const universalLink = this.options.ui.factory.createUniversalLink();\n if (this.options.mobile?.preferredOpenLink) {\n this.options.mobile.preferredOpenLink(deeplink, '_self');\n } else {\n openDeeplink(this.options, deeplink, universalLink);\n }\n }, 250);\n }\n\n this.transport\n .connect({ scopes, caipAccountIds })\n .then(resolve)\n .catch((error) => {\n this.storage.removeTransport();\n reject(error);\n })\n .finally(() => {\n if (timeout) {\n clearTimeout(timeout);\n }\n });\n });\n }\n\n private async handleConnection(promise: Promise<void>) {\n this.state = 'connecting';\n return promise\n .then(() => {\n this.state = 'connected';\n })\n .catch((error) => {\n this.state = 'disconnected';\n return Promise.reject(error);\n });\n }\n\n async connect(\n scopes: Scope[],\n caipAccountIds: CaipAccountId[],\n ): Promise<void> {\n const { ui } = this.options;\n const platformType = getPlatformType();\n const isWeb =\n platformType === PlatformType.MetaMaskMobileWebview ||\n platformType === PlatformType.DesktopWeb;\n const { preferExtension = true, preferDesktop = false } = ui;\n const secure = isSecure();\n const hasExtensionInstalled = await hasExtension();\n\n if (this.__transport?.isConnected() && !secure) {\n return this.handleConnection(\n this.__transport.connect({ scopes, caipAccountIds }).then(() => {\n if (this.__transport instanceof MWPTransport) {\n return this.storage.setTransport(TransportType.MPW);\n } else {\n return this.storage.setTransport(TransportType.Browser);\n }\n }),\n );\n }\n\n if (isWeb && hasExtensionInstalled && preferExtension) {\n // If metamask extension is available, connect to it\n const defaultTransport = await this.setupDefaultTransport();\n // Web transport has no initial payload\n return this.handleConnection(\n defaultTransport.connect({ scopes, caipAccountIds }),\n );\n }\n\n // Connection will now be InstallModal + QRCodes or Deeplinks, both require mwp\n await this.setupMWP();\n\n // Determine preferred option for install modal\n const isDesktopPreferred = hasExtensionInstalled\n ? preferDesktop\n : !preferExtension || preferDesktop;\n\n if (secure && !isDesktopPreferred) {\n // Desktop is not preferred option, so we use deeplinks (mobile web)\n return this.handleConnection(\n this.deeplinkConnect(scopes, caipAccountIds),\n );\n }\n\n // Show install modal for RN, Web + Node\n return this.handleConnection(\n this.showInstallModal(isDesktopPreferred, scopes, caipAccountIds),\n );\n }\n\n public override emit(event: string, args: any): void {\n this.options.transport?.onNotification?.({ method: event, params: args });\n super.emit(event, args);\n }\n\n async disconnect(): Promise<void> {\n this.listener?.();\n this.__beforeUnloadListener?.();\n\n await this.__transport?.disconnect();\n await this.storage.removeTransport();\n\n this.emit('wallet_sessionChanged', undefined);\n this.emit('stateChanged', 'disconnected');\n\n this.listener = undefined;\n this.__beforeUnloadListener = undefined;\n this.__transport = undefined;\n this.__provider = undefined;\n this.__dappClient = undefined;\n }\n\n async invokeMethod(request: InvokeMethodOptions): Promise<Json> {\n const { sdkInfo, transport, options } = this;\n\n this.__provider ??= getMultichainClient({ transport });\n\n\t\tconst rpcClient = new RpcClient(options, sdkInfo);\n\t\tconst requestRouter = new RequestRouter(transport, rpcClient, options);\n\t\treturn requestRouter.invokeMethod(request) as Promise<Json>;\n }\n}\n","export const MWP_RELAY_URL =\n 'wss://mm-sdk-relay.api.cx.metamask.io/connection/websocket';\n\nexport const METAMASK_CONNECT_BASE_URL = 'https://metamask.app.link/connect';\nexport const METAMASK_DEEPLINK_BASE = 'metamask://connect';\n","import type { Json } from '@metamask/utils';\nimport { METAMASK_CONNECT_BASE_URL, METAMASK_DEEPLINK_BASE } from '../../config';\nimport { type ExtendedTransport, type InvokeMethodOptions, isSecure, type MultichainOptions, RPC_HANDLED_METHODS, RPCInvokeMethodErr, SDK_HANDLED_METHODS } from '../../domain';\n\nimport { openDeeplink } from '../utils';\nimport { MissingRpcEndpointErr, RpcClient } from './handlers/rpcClient';\n\nlet rpcId = 1;\n\nexport function getNextRpcId() {\n\trpcId += 1;\n\treturn rpcId;\n}\n\nexport class RequestRouter {\n\tconstructor(\n\t\tprivate readonly transport: ExtendedTransport,\n\t\tprivate readonly rpcClient: RpcClient,\n\t\tprivate readonly config: MultichainOptions,\n\t) {}\n\n\t/**\n\t * The main entry point for invoking an RPC method.\n\t * This method acts as a router, determining the correct handling strategy\n\t * for the request and delegating to the appropriate private handler.\n\t */\n\tasync invokeMethod(options: InvokeMethodOptions): Promise<Json> {\n\t\tconst method = options.request.method;\n\t\tif (RPC_HANDLED_METHODS.has(method)) {\n\t\t\treturn this.handleWithRpcNode(options);\n\t\t}\n\t\tif (SDK_HANDLED_METHODS.has(method)) {\n\t\t\treturn this.handleWithSdkState(options);\n\t\t}\n\t\treturn this.handleWithWallet(options);\n\t}\n\n\t/**\n\t * Forwards the request directly to the wallet via the transport.\n\t */\n\tprivate async handleWithWallet(options: InvokeMethodOptions): Promise<Json> {\n\t\ttry {\n\t\t\tconst request = this.transport.request({\n\t\t\t\tmethod: 'wallet_invokeMethod',\n\t\t\t\tparams: options,\n\t\t\t});\n\n\t\t\tconst { ui, mobile } = this.config;\n\t\t\tconst { preferDesktop = false } = ui ?? {};\n\t\t\tconst secure = isSecure();\n\t\t\tconst shouldOpenDeeplink = secure && !preferDesktop;\n\n\t\t\tif (shouldOpenDeeplink) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (mobile?.preferredOpenLink) {\n\t\t\t\t\t\tmobile.preferredOpenLink(METAMASK_DEEPLINK_BASE, '_self');\n\t\t\t\t\t} else {\n\t\t\t\t\t\topenDeeplink(this.config, METAMASK_DEEPLINK_BASE, METAMASK_CONNECT_BASE_URL);\n\t\t\t\t\t}\n\t\t\t\t}, 10); // small delay to ensure the message encryption and dispatch completes\n\t\t\t}\n\n\t\t\tconst response = await request;\n\t\t\tif (response.error) {\n\t\t\t\tthrow new RPCInvokeMethodErr(`RPC Request failed with code ${response.error.code}: ${response.error.message}`);\n\t\t\t}\n\t\t\treturn response.result as Json;\n\t\t} catch (error) {\n\t\t\tthrow new RPCInvokeMethodErr(error.message);\n\t\t}\n\t}\n\n\t/**\n\t * Routes the request to a configured RPC node.\n\t */\n\tprivate async handleWithRpcNode(options: InvokeMethodOptions): Promise<Json> {\n\t\ttry {\n\t\t\treturn await this.rpcClient.request(options);\n\t\t} catch (error) {\n\t\t\tif (error instanceof MissingRpcEndpointErr) {\n\t\t\t\treturn this.handleWithWallet(options);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Responds directly from the SDK's session state.\n\t */\n\tprivate async handleWithSdkState(options: InvokeMethodOptions): Promise<Json> {\n\t\t// TODO: to be implemented\n\t\tconsole.warn(`Method \"${options.request.method}\" is configured for SDK state handling, but this is not yet implemented. Falling back to wallet passthrough.`);\n\t\treturn this.handleWithWallet(options);\n\t}\n}\n","import { deflate } from 'pako';\nimport {\n type CaipAccountId,\n type CaipChainId,\n parseCaipAccountId,\n parseCaipChainId,\n} from '@metamask/utils';\nimport {\n type DappSettings,\n getInfuraRpcUrls,\n getPlatformType,\n type MultichainOptions,\n PlatformType,\n type Scope,\n type SessionData,\n} from '../../domain';\n\nexport type OptionalScopes = Record<Scope, SessionData['sessionScopes'][Scope]>;\n\n/**\n * Cross-platform base64 encoding\n * Works in browser, Node.js, and React Native environments\n */\nfunction base64Encode(str: string): string {\n if (typeof btoa !== 'undefined') {\n // Browser and React Native with polyfills\n return btoa(str);\n } else if (typeof Buffer !== 'undefined') {\n // Node.js\n return Buffer.from(str).toString('base64');\n }\n throw new Error('No base64 encoding method available');\n}\n\n/**\n * Compress a string using pako (deflateRaw)\n * Returns a base64-encoded compressed string\n */\nexport function compressString(str: string): string {\n const compressed = deflate(str);\n\n // Convert Uint8Array to string for base64 encoding\n const binaryString = String.fromCharCode.apply(null, Array.from(compressed));\n return base64Encode(binaryString);\n}\n\nexport function getDappId(dapp?: DappSettings) {\n if (typeof window === 'undefined' || typeof window.location === 'undefined') {\n return dapp?.name ?? dapp?.url ?? 'N/A';\n }\n\n return window.location.hostname;\n}\n\nexport function openDeeplink(\n options: MultichainOptions,\n deeplink: string,\n universalLink: string,\n) {\n const { mobile } = options;\n const useDeeplink =\n mobile && mobile.useDeeplink !== undefined ? mobile.useDeeplink : true;\n if (useDeeplink) {\n if (typeof window !== 'undefined') {\n // We don't need to open a deeplink in a new tab\n // It avoid the browser to display a blank page\n window.location.href = deeplink;\n }\n } else if (typeof document !== 'undefined') {\n // Workaround for https://github.com/rainbow-me/rainbowkit/issues/524.\n // Using 'window.open' causes issues on iOS in non-Safari browsers and\n // WebViews where a blank tab is left behind after connecting.\n // This is especially bad in some WebView scenarios (e.g. following a\n // link from Twitter) where the user doesn't have any mechanism for\n // closing the blank tab.\n // For whatever reason, links with a target of \"_blank\" don't suffer\n // from this problem, and programmatically clicking a detached link\n // element with the same attributes also avoids the issue.\n const link = document.createElement('a');\n link.href = universalLink;\n link.target = '_self';\n link.rel = 'noreferrer noopener';\n link.click();\n }\n}\n\nexport function getOptionalScopes(scopes: Scope[]) {\n return scopes.reduce<OptionalScopes>(\n (prev, scope) => ({\n // biome-ignore lint/performance/noAccumulatingSpread: Needed\n ...prev,\n [scope]: {\n methods: [],\n notifications: [],\n accounts: [],\n },\n }),\n {},\n );\n}\n\nexport const extractFavicon = () => {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n let favicon: string | undefined;\n const nodeList = document.getElementsByTagName('link');\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < nodeList.length; i++) {\n if (\n nodeList[i].getAttribute('rel') === 'icon' ||\n nodeList[i].getAttribute('rel') === 'shortcut icon'\n ) {\n favicon = nodeList[i].getAttribute('href') ?? undefined;\n }\n }\n return favicon;\n};\n\nexport function setupInfuraProvider(\n options: MultichainOptions,\n): MultichainOptions {\n const infuraAPIKey = options.api?.infuraAPIKey;\n if (!infuraAPIKey) {\n return options;\n }\n const urlsWithToken = getInfuraRpcUrls(infuraAPIKey);\n if (options.api?.readonlyRPCMap) {\n options.api.readonlyRPCMap = {\n ...options.api.readonlyRPCMap,\n ...urlsWithToken,\n };\n } else if (options.api) {\n options.api.readonlyRPCMap = urlsWithToken;\n }\n return options;\n}\n\nexport function setupDappMetadata(\n options: MultichainOptions,\n): MultichainOptions {\n const platform = getPlatformType();\n const isBrowser =\n platform === PlatformType.DesktopWeb ||\n platform === PlatformType.MobileWeb ||\n platform === PlatformType.MetaMaskMobileWebview;\n\n if (!options.dapp?.url) {\n // Automatically set dappMetadata on web env if not defined\n if (isBrowser) {\n options.dapp = {\n ...options.dapp,\n url: `${window.location.protocol}//${window.location.host}`,\n };\n } else {\n throw new Error('You must provide dapp url');\n }\n }\n const BASE_64_ICON_MAX_LENGTH = 163400;\n // Check if iconUrl and url are valid\n const urlPattern = /^(http|https):\\/\\/[^\\s]*$/; // Regular expression for URLs starting with http:// or https://\n if (options.dapp) {\n if ('iconUrl' in options.dapp) {\n if (options.dapp.iconUrl && !urlPattern.test(options.dapp.iconUrl)) {\n console.warn(\n 'Invalid dappMetadata.iconUrl: URL must start with http:// or https://',\n );\n options.dapp.iconUrl = undefined;\n }\n }\n // This check ensures that the base64Icon string in the dappMetadata does not exceed 163,400 characters.\n // The character limit is important because a longer base64-encoded string causes the connection to the mobile app to fail.\n // Keeping the base64Icon string length below this threshold ensures reliable communication and functionality.\n if ('base64Icon' in options.dapp) {\n if (\n options.dapp.base64Icon &&\n options.dapp.base64Icon.length > BASE_64_ICON_MAX_LENGTH\n ) {\n console.warn(\n 'Invalid dappMetadata.base64Icon: Base64-encoded icon string length must be less than 163400 characters',\n );\n\n options.dapp.base64Icon = undefined;\n }\n }\n if (options.dapp.url && !urlPattern.test(options.dapp.url)) {\n console.warn(\n 'Invalid dappMetadata.url: URL must start with http:// or https://',\n );\n }\n const favicon = extractFavicon();\n if (\n favicon &&\n !('iconUrl' in options.dapp) &&\n !('base64Icon' in options.dapp)\n ) {\n const faviconUrl = `${window.location.protocol}//${window.location.host}${favicon}`;\n // @ts-ignore\n options.dapp.iconUrl = faviconUrl;\n }\n }\n return options;\n}\n\n/**\n * Enhanced scope checking function that validates both scopes and accounts\n * @param currentScopes - Current scopes from the existing session\n * @param proposedScopes - Proposed scopes from the connect options\n * @param walletSession - The existing wallet session data\n * @param proposedCaipAccountIds - Proposed account IDs from the connect options\n * @returns true if scopes and accounts match, false otherwise\n */\nexport function isSameScopesAndAccounts(\n currentScopes: Scope[],\n proposedScopes: Scope[],\n walletSession: SessionData,\n proposedCaipAccountIds: CaipAccountId[],\n): boolean {\n const isSameScopes =\n currentScopes.every((scope) => proposedScopes.includes(scope)) &&\n proposedScopes.every((scope) => currentScopes.includes(scope));\n\n if (!isSameScopes) {\n return false;\n }\n\n const existingAccountIds: CaipAccountId[] = Object.values(\n walletSession.sessionScopes,\n )\n .filter(({ accounts }) => Boolean(accounts))\n .flatMap(({ accounts }) => accounts ?? []);\n\n const allProposedAccountsIncluded = proposedCaipAccountIds.every(\n (proposedAccountId) => existingAccountIds.includes(proposedAccountId),\n );\n\n return allProposedAccountsIncluded;\n}\n\nexport function getValidAccounts(caipAccountIds: CaipAccountId[]) {\n return caipAccountIds.reduce<ReturnType<typeof parseCaipAccountId>[]>(\n (caipAccounts, caipAccountId) => {\n try {\n // biome-ignore lint/performance/noAccumulatingSpread: Needed\n return [...caipAccounts, parseCaipAccountId(caipAccountId)];\n } catch (err) {\n const stringifiedAccountId = JSON.stringify(caipAccountId);\n console.error(`Invalid CAIP account ID: ${stringifiedAccountId}`, err);\n return caipAccounts;\n }\n },\n [],\n );\n}\n\n/**\n * Adds valid accounts to their corresponding scopes based on chain namespace and reference.\n * Returns a new OptionalScopes object without modifying the input.\n *\n * @param optionalScopes - The scopes to add accounts to\n * @param validAccounts - Array of parsed valid accounts\n * @returns A new OptionalScopes object with accounts added to matching scopes\n */\nexport function addValidAccounts(\n optionalScopes: OptionalScopes,\n validAccounts: ReturnType<typeof getValidAccounts>,\n): OptionalScopes {\n if (!optionalScopes || !validAccounts?.length) {\n return optionalScopes;\n }\n\n const result: OptionalScopes = Object.fromEntries(\n Object.entries(optionalScopes).map(([scope, scopeData]) => [\n scope,\n {\n methods: [...(scopeData?.methods ?? [])],\n notifications: [...(scopeData?.notifications ?? [])],\n accounts: [...(scopeData?.accounts ?? [])],\n },\n ]),\n );\n\n // Group accounts by their chain identifier for efficient lookup\n const accountsByChain = new Map<string, CaipAccountId[]>();\n for (const account of validAccounts) {\n const chainKey = `${account.chain.namespace}:${account.chain.reference}`;\n const accountId = `${account.chainId}:${account.address}` as CaipAccountId;\n\n if (!accountsByChain.has(chainKey)) {\n accountsByChain.set(chainKey, []);\n }\n accountsByChain.get(chainKey)?.push(accountId);\n }\n\n // Add accounts to matching scopes\n for (const [scopeKey, scopeData] of Object.entries(result)) {\n if (!scopeData?.accounts) {\n continue;\n }\n\n try {\n const scope = scopeKey as CaipChainId;\n const scopeDetails = parseCaipChainId(scope);\n const chainKey = `${scopeDetails.namespace}:${scopeDetails.reference}`;\n\n const matchingAccounts = accountsByChain.get(chainKey);\n if (matchingAccounts) {\n const existingAccounts = new Set(scopeData.accounts);\n const newAccounts = matchingAccounts.filter(\n (account) => !existingAccounts.has(account),\n );\n scopeData.accounts.push(...newAccounts);\n }\n } catch (error) {\n console.error(`Invalid scope format: ${scopeKey}`, error);\n }\n }\n\n return result;\n}\n","import type { Json } from '@metamask/utils';\nimport fetch from 'cross-fetch';\nimport {\n\tgetInfuraRpcUrls,\n\ttype InvokeMethodOptions,\n\ttype MultichainOptions,\n\tRPCHttpErr,\n\tRPCReadonlyRequestErr,\n\tRPCReadonlyResponseErr,\n\tRPCResponse,\n\tRpcUrlsMap,\n\tScope,\n} from '../../../domain';\n\nlet rpcId = 1;\n\nexport function getNextRpcId() {\n\trpcId += 1;\n\treturn rpcId;\n}\n\nexport class MissingRpcEndpointErr extends Error { };\n\nexport class RpcClient {\n\tconstructor(\n\t\tprivate readonly config: MultichainOptions,\n\t\tprivate readonly sdkInfo: string,\n\t) {}\n\n\t/**\n\t * Routes the request to a configured RPC node.\n\t */\n\tasync request(options: InvokeMethodOptions): Promise<Json> {\n\t\tconst { request } = options;\n\t\tconst body = JSON.stringify({\n\t\t\tjsonrpc: '2.0',\n\t\t\tmethod: request.method,\n\t\t\tparams: request.params,\n\t\t\tid: getNextRpcId(),\n\t\t});\n\t\tconst rpcEndpoint = this.getRpcEndpoint(options.scope);\n\t\tconst rpcRequest = await this.fetch(rpcEndpoint, body, 'POST', this.getHeaders(rpcEndpoint));\n\t\tconst response = await this.parseResponse(rpcRequest);\n\t\treturn response;\n\t}\n\n\tprivate getRpcEndpoint(scope: Scope) {\n\t\tlet infuraAPIKey = this.config?.api?.infuraAPIKey;\n\n\t\tlet readonlyRPCMap: RpcUrlsMap = this.config?.api?.readonlyRPCMap ?? {};\n\t\tif (infuraAPIKey) {\n\t\t\tconst urlsWithToken = getInfuraRpcUrls(infuraAPIKey);\n\t\t\tif (readonlyRPCMap) {\n\t\t\t\treadonlyRPCMap = {\n\t\t\t\t\t...urlsWithToken,\n\t\t\t\t\t...readonlyRPCMap,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treadonlyRPCMap = urlsWithToken;\n\t\t\t}\n\t\t}\n\t\tconst rpcEndpoint = readonlyRPCMap[scope];\n\t\tif (!rpcEndpoint) {\n\t\t\tthrow new MissingRpcEndpointErr(`No RPC endpoint found for scope ${scope}`);\n\t\t}\n\t\treturn rpcEndpoint;\n\t}\n\n\tprivate async fetch(endpoint: string, body: string, method: string, headers: Record<string, string>) {\n\t\ttry {\n\t\t\tconst response = await fetch(endpoint, {\n\t\t\t\tmethod,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t});\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new RPCHttpErr(endpoint, method, response.status);\n\t\t\t}\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tif (error instanceof RPCHttpErr) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new RPCReadonlyRequestErr(error.message);\n\t\t}\n\t}\n\n\tprivate async parseResponse(response: Response) {\n\t\ttry {\n\t\t\tconst rpcResponse = (await response.json()) as RPCResponse;\n\t\t\treturn rpcResponse.result as Json;\n\t\t} catch (error) {\n\t\t\tthrow new RPCReadonlyResponseErr(error.message);\n\t\t}\n\t}\n\n\tprivate getHeaders(rpcEndpoint: string) {\n\t\tconst defaultHeaders = {\n\t\t\tAccept: 'application/json',\n\t\t\t'Content-Type': 'application/json',\n\t\t};\n\t\tif (rpcEndpoint.includes('infura')) {\n\t\t\treturn {\n\t\t\t\t...defaultHeaders,\n\t\t\t\t'Metamask-Sdk-Info': this.sdkInfo,\n\t\t\t};\n\t\t}\n\t\treturn defaultHeaders;\n\t}\n}\n","import {\n type CreateSessionParams,\n getDefaultTransport,\n type Transport,\n type TransportRequest,\n type TransportResponse,\n} from '@metamask/multichain-api-client';\nimport type { CaipAccountId } from '@metamask/utils';\nimport type { ExtendedTransport, RPCAPI, Scope, SessionData } from 'src/domain';\n\nimport {\n addValidAccounts,\n getOptionalScopes,\n getValidAccounts,\n isSameScopesAndAccounts,\n} from '../../utils';\n\nconst DEFAULT_REQUEST_TIMEOUT = 60 * 1000;\n\nexport class DefaultTransport implements ExtendedTransport {\n #notificationCallbacks: Set<(data: unknown) => void> = new Set();\n #transport: Transport = getDefaultTransport();\n #defaultRequestOptions = {\n timeout: DEFAULT_REQUEST_TIMEOUT,\n };\n\n #notifyCallbacks(data: unknown) {\n for (const cb of this.#notificationCallbacks) {\n try {\n cb(data);\n } catch (err) {\n console.log('[WindowPostMessageTransport] notifyCallbacks error:', err);\n }\n }\n }\n\n async connect(options?: {\n scopes: Scope[];\n caipAccountIds: CaipAccountId[];\n }): Promise<void> {\n await this.#transport.connect();\n\n //Get wallet session\n const sessionRequest = await this.request(\n { method: 'wallet_getSession' },\n this.#defaultRequestOptions,\n );\n if (sessionRequest.error) {\n throw new Error(sessionRequest.error.message);\n }\n let walletSession = sessionRequest.result as SessionData;\n if (walletSession && options) {\n const currentScopes = Object.keys(\n walletSession?.sessionScopes ?? {},\n ) as Scope[];\n const proposedScopes = options?.scopes ?? [];\n const proposedCaipAccountIds = options?.caipAccountIds ?? [];\n const hasSameScopesAndAccounts = isSameScopesAndAccounts(\n currentScopes,\n proposedScopes,\n walletSession,\n proposedCaipAccountIds,\n );\n if (!hasSameScopesAndAccounts) {\n await this.request(\n { method: 'wallet_revokeSession', params: walletSession },\n this.#defaultRequestOptions,\n );\n const optionalScopes = addValidAccounts(\n getOptionalScopes(options?.scopes ?? []),\n getValidAccounts(options?.caipAccountIds ?? []),\n );\n const sessionRequest: CreateSessionParams<RPCAPI> = { optionalScopes };\n const response = await this.request(\n { method: 'wallet_createSession', params: sessionRequest },\n this.#defaultRequestOptions,\n );\n if (response.error) {\n throw new Error(response.error.message);\n }\n walletSession = response.result as SessionData;\n }\n } else if (!walletSession) {\n const optionalScopes = addValidAccounts(\n getOptionalScopes(options?.scopes ?? []),\n getValidAccounts(options?.caipAccountIds ?? []),\n );\n const sessionRequest: CreateSessionParams<RPCAPI> = { optionalScopes };\n const response = await this.request(\n { method: 'wallet_createSession', params: sessionRequest },\n this.#defaultRequestOptions,\n );\n if (response.error) {\n throw new Error(response.error.message);\n }\n walletSession = response.result as SessionData;\n }\n this.#notifyCallbacks({\n method: 'wallet_sessionChanged',\n params: walletSession,\n });\n }\n\n async disconnect(): Promise<void> {\n this.#notificationCallbacks.clear();\n return this.#transport.disconnect();\n }\n\n isConnected() {\n return this.#transport.isConnected();\n }\n\n async request<\n TRequest extends TransportRequest,\n TResponse extends TransportResponse,\n >(\n request: TRequest,\n options: { timeout?: number } = this.#defaultRequestOptions,\n ) {\n return this.#transport.request(request, options) as Promise<TResponse>;\n }\n\n onNotification(callback: (data: unknown) => void) {\n this.#transport.onNotification(callback);\n this.#notificationCallbacks.add(callback);\n return () => {\n this.#notificationCallbacks.delete(callback);\n };\n }\n}\n","/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */\n/* eslint-disable consistent-return */\n/* eslint-disable no-plusplus */\n/* eslint-disable promise/param-names */\n/* eslint-disable @typescript-eslint/no-misused-promises */\n/* eslint-disable @typescript-eslint/no-shadow */\n/* eslint-disable id-denylist */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n/* eslint-disable no-restricted-globals */\n/* eslint-disable @typescript-eslint/parameter-properties */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/prefer-readonly */\n/* eslint-disable no-restricted-syntax */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport type {\n Session,\n SessionRequest,\n} from '@metamask/mobile-wallet-protocol-core';\nimport { SessionStore } from '@metamask/mobile-wallet-protocol-core';\nimport type { DappClient } from '@metamask/mobile-wallet-protocol-dapp-client';\nimport {\n type CreateSessionParams,\n type TransportRequest,\n type TransportResponse,\n TransportTimeoutError,\n} from '@metamask/multichain-api-client';\nimport type { CaipAccountId } from '@metamask/utils';\n\nimport {\n createLogger,\n type ExtendedTransport,\n type RPCAPI,\n type Scope,\n type SessionData,\n type StoreAdapter,\n} from '../../../domain';\nimport {\n addValidAccounts,\n getOptionalScopes,\n getValidAccounts,\n isSameScopesAndAccounts,\n} from '../../utils';\n\nconst DEFAULT_REQUEST_TIMEOUT = 60 * 1000;\nconst CONNECTION_GRACE_PERIOD = 60 * 1000;\nconst DEFAULT_CONNECTION_TIMEOUT =\n DEFAULT_REQUEST_TIMEOUT + CONNECTION_GRACE_PERIOD;\nconst SESSION_STORE_KEY = 'cache_wallet_getSession';\n\nconst CACHED_METHOD_LIST = [\n 'wallet_getSession',\n 'wallet_createSession',\n 'wallet_sessionChanged',\n];\nconst CACHED_RESET_METHOD_LIST = ['wallet_revokeSession'];\n\ntype PendingRequests = {\n request: { jsonrpc: string; id: string } & TransportRequest;\n method: string;\n resolve: (value: TransportResponse) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n};\n\nconst logger = createLogger('metamask-sdk:transport');\n\n/**\n * Mobile Wallet Protocol transport implementation\n * Bridges the MWP DappClient with the multichain API client Transport interface\n */\nexport class MWPTransport implements ExtendedTransport {\n private __reqId = 0;\n\n private __pendingRequests = new Map<string, PendingRequests>();\n\n private notificationCallbacks = new Set<(data: unknown) => void>();\n\n private currentSessionRequest: SessionRequest | undefined;\n\n private windowFocusHandler: (() => void) | undefined;\n\n get pendingRequests() {\n return this.__pendingRequests;\n }\n\n set pendingRequests(pendingRequests: Map<string, PendingRequests>) {\n this.__pendingRequests = pendingRequests;\n }\n\n get sessionRequest() {\n return this.currentSessionRequest;\n }\n\n constructor(\n private dappClient: DappClient,\n private kvstore: StoreAdapter,\n private options: { requestTimeout: number; connectionTimeout: number } = {\n requestTimeout: DEFAULT_REQUEST_TIMEOUT,\n connectionTimeout: DEFAULT_CONNECTION_TIMEOUT,\n },\n ) {\n this.dappClient.on('message', this.handleMessage.bind(this));\n if (\n typeof window !== 'undefined' &&\n typeof window.addEventListener !== 'undefined'\n ) {\n this.windowFocusHandler = this.onWindowFocus.bind(this);\n window.addEventListener('focus', this.windowFocusHandler);\n }\n }\n\n private onWindowFocus(): void {\n if (!this.isConnected()) {\n this.dappClient.reconnect();\n }\n }\n\n private notifyCallbacks(data: unknown): void {\n this.notificationCallbacks.forEach((callback) => callback(data));\n }\n\n private rejectRequest(\n id: string,\n error = new Error('Request rejected'),\n ): void {\n const request = this.pendingRequests.get(id);\n if (request) {\n this.pendingRequests.delete(id);\n clearTimeout(request.timeout);\n request.reject(error);\n }\n }\n\n private handleMessage(message: unknown): void {\n if (typeof message === 'object' && message !== null) {\n if ('data' in message) {\n const messagePayload = message.data as Record<string, unknown>;\n if ('id' in messagePayload && typeof messagePayload.id === 'string') {\n const request = this.pendingRequests.get(messagePayload.id);\n if (request) {\n const requestWithName = {\n ...messagePayload,\n method:\n request.method === 'wallet_getSession' ||\n request.method === 'wallet_createSession'\n ? 'wallet_sessionChanged'\n : request.method,\n } as unknown as {\n jsonrpc: string;\n id: string;\n } & TransportResponse;\n\n const notification = {\n ...messagePayload,\n method:\n request.method === 'wallet_getSession' ||\n request.method === 'wallet_createSession'\n ? 'wallet_sessionChanged'\n : request.method,\n params: requestWithName.result,\n };\n\n clearTimeout(request.timeout);\n this.notifyCallbacks(notification);\n request.resolve(requestWithName);\n this.pendingRequests.delete(messagePayload.id);\n }\n } else {\n this.notifyCallbacks(message.data);\n }\n }\n }\n }\n\n private async onResumeSuccess(\n resumeResolve: () => void,\n resumeReject: (err: Error) => void,\n options?: { scopes: Scope[]; caipAccountIds: CaipAccountId[] },\n ): Promise<void> {\n try {\n const sessionRequest = await this.request({\n method: 'wallet_getSession',\n });\n if (sessionRequest.error) {\n return resumeReject(new Error(sessionRequest.error.message));\n }\n let walletSession = sessionRequest.result as SessionData;\n if (walletSession && options) {\n const currentScopes = Object.keys(\n walletSession?.sessionScopes ?? {},\n ) as Scope[];\n const proposedScopes = options?.scopes ?? [];\n const proposedCaipAccountIds = options?.caipAccountIds ?? [];\n const hasSameScopesAndAccounts = isSameScopesAndAccounts(\n currentScopes,\n proposedScopes,\n walletSession,\n proposedCaipAccountIds,\n );\n if (!hasSameScopesAndAccounts) {\n const optionalScopes = addValidAccounts(\n getOptionalScopes(options?.scopes ?? []),\n getValidAccounts(options?.caipAccountIds ?? []),\n );\n const sessionRequest: CreateSessionParams<RPCAPI> = {\n optionalScopes,\n };\n const response = await this.request({\n method: 'wallet_createSession',\n params: sessionRequest,\n });\n if (response.error) {\n return resumeReject(new Error(response.error.message));\n }\n // TODO: Maybe find a better way to revoke sessions on wallet without triggering an empty notification\n // Issue of this is it will send a session update event with an empty session and right after we may get the session recovered\n // await this.request({ method: 'wallet_revokeSession', params: walletSession });\n walletSession = response.result as SessionData;\n }\n } else if (!walletSession) {\n const optionalScopes = addValidAccounts(\n getOptionalScopes(options?.scopes ?? []),\n getValidAccounts(options?.caipAccountIds ?? []),\n );\n const sessionRequest: CreateSessionParams<RPCAPI> = { optionalScopes };\n const response = await this.request({\n method: 'wallet_createSession',\n params: sessionRequest,\n });\n if (response.error) {\n return resumeReject(new Error(response.error.message));\n }\n walletSession = response.result as SessionData;\n }\n this.notifyCallbacks({\n method: 'wallet_sessionChanged',\n params: walletSession,\n });\n return resumeResolve();\n } catch (err) {\n return resumeReject(err);\n }\n }\n\n async connect(options?: {\n scopes: Scope[];\n caipAccountIds: CaipAccountId[];\n }): Promise<void> {\n const { dappClient, kvstore } = this;\n const sessionStore = new SessionStore(kvstore);\n\n let session: Session | undefined;\n try {\n const [activeSession] = await sessionStore.list();\n if (activeSession) {\n logger('active session found', activeSession);\n session = activeSession;\n }\n } catch {\n /* empty */\n }\n\n let timeout: NodeJS.Timeout;\n const connectionPromise = new Promise<void>((resolve, reject) => {\n let connection: Promise<void>;\n if (session) {\n connection = new Promise<void>((resumeResolve, resumeReject) => {\n if (this.dappClient.state === 'CONNECTED') {\n this.onResumeSuccess(resumeResolve, resumeReject, options);\n } else {\n this.dappClient.once('connected', async () => {\n this.onResumeSuccess(resumeResolve, resumeReject, options);\n });\n dappClient.resume(session?.id ?? '');\n }\n });\n } else {\n connection = new Promise<void>(\n (resolveConnection, rejectConnection) => {\n const optionalScopes = addValidAccounts(\n getOptionalScopes(options?.scopes ?? []),\n getValidAccounts(options?.caipAccountIds ?? []),\n );\n const sessionRequest: CreateSessionParams<RPCAPI> = {\n optionalScopes,\n };\n const request = {\n jsonrpc: '2.0',\n id: `${this.__reqId++}`,\n method: 'wallet_createSession',\n params: sessionRequest,\n };\n\n this.dappClient.on('message', async (message: unknown) => {\n if (typeof message === 'object' && message !== null) {\n if ('data' in message) {\n const messagePayload = message.data as Record<\n string,\n unknown\n >;\n if (\n messagePayload.method === 'wallet_createSession' ||\n messagePayload.method === 'wallet_sessionChanged'\n ) {\n if (messagePayload.error) {\n return rejectConnection(messagePayload.error);\n }\n this.notifyCallbacks(message.data);\n await this.storeWalletSession(\n request,\n messagePayload as TransportResponse,\n );\n return resolveConnection();\n }\n }\n }\n });\n\n dappClient\n .connect({ mode: 'trusted', initialPayload: request })\n .catch(rejectConnection);\n },\n );\n }\n\n timeout = setTimeout(() => {\n reject(new TransportTimeoutError());\n }, this.options.connectionTimeout);\n\n connection.then(resolve).catch(reject);\n });\n\n return connectionPromise.finally(() => {\n if (timeout) {\n clearTimeout(timeout);\n }\n });\n }\n\n /**\n * Disconnects from the Mobile Wallet Protocol\n *\n * @returns Nothing\n */\n async disconnect(): Promise<void> {\n // Clean up window focus event listener\n if (\n typeof window !== 'undefined' &&\n typeof window.removeEventListener !== 'undefined' &&\n this.windowFocusHandler\n ) {\n window.removeEventListener('focus', this.windowFocusHandler);\n this.windowFocusHandler = undefined;\n }\n return this.dappClient.disconnect();\n }\n\n /**\n * Checks if the transport is connected\n *\n * @returns True if transport is connected, false otherwise\n */\n isConnected(): boolean {\n // biome-ignore lint/suspicious/noExplicitAny: required if state is not made public in dappClient\n return (this.dappClient as any).state === 'CONNECTED';\n }\n\n private async fetchCachedWalletSession(\n request: { jsonrpc: string; id: string } & TransportRequest,\n ): Promise<TransportResponse | undefined> {\n if (request.method === 'wallet_getSession') {\n const walletGetSession = await this.kvstore.get(SESSION_STORE_KEY);\n if (walletGetSession) {\n const walletSession = JSON.parse(walletGetSession);\n return {\n id: request.id,\n jsonrpc: '2.0',\n result: walletSession.params ?? walletSession.result,\n method: request.method,\n } as unknown as TransportResponse;\n }\n }\n }\n\n private async storeWalletSession(\n request: TransportRequest,\n response: TransportResponse,\n ): Promise<void> {\n if (CACHED_METHOD_LIST.includes(request.method)) {\n await this.kvstore.set(SESSION_STORE_KEY, JSON.stringify(response));\n } else if (CACHED_RESET_METHOD_LIST.includes(request.method)) {\n await this.kvstore.delete(SESSION_STORE_KEY);\n }\n }\n\n async request<\n TRequest extends TransportRequest,\n TResponse extends TransportResponse,\n >(payload: TRequest, options?: { timeout?: number }): Promise<TResponse> {\n const request = {\n jsonrpc: '2.0',\n id: `${this.__reqId++}`,\n ...payload,\n };\n\n const cachedWalletSession = await this.fetchCachedWalletSession(request);\n if (cachedWalletSession) {\n this.notifyCallbacks(cachedWalletSession);\n return cachedWalletSession as TResponse;\n }\n\n return new Promise<TResponse>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.rejectRequest(request.id, new TransportTimeoutError());\n }, options?.timeout ?? this.options.requestTimeout);\n\n this.pendingRequests.set(request.id, {\n request,\n method: request.method,\n resolve: async (response: TransportResponse) => {\n if (CACHED_METHOD_LIST.includes(request.method)) {\n await this.storeWalletSession(request, response);\n }\n return resolve(response as TResponse);\n },\n reject,\n timeout,\n });\n\n this.dappClient.sendRequest(request).catch(reject);\n });\n }\n\n onNotification(callback: (data: unknown) => void): () => void {\n this.notificationCallbacks.add(callback);\n return () => {\n this.notificationCallbacks.delete(callback);\n };\n }\n}\n","import type {\n IKeyManager,\n KeyPair,\n} from '@metamask/mobile-wallet-protocol-core';\nimport { decrypt, encrypt, PrivateKey } from 'eciesjs';\n\nclass KeyManager implements IKeyManager {\n generateKeyPair(): KeyPair {\n const privateKey = new PrivateKey();\n return {\n privateKey: new Uint8Array(privateKey.secret),\n publicKey: privateKey.publicKey.toBytes(true),\n };\n }\n\n async encrypt(\n plaintext: string,\n theirPublicKey: Uint8Array,\n ): Promise<string> {\n const plaintextBuffer = Buffer.from(plaintext, 'utf8');\n const encryptedBuffer = encrypt(theirPublicKey, plaintextBuffer);\n return encryptedBuffer.toString('base64');\n }\n\n async decrypt(\n encryptedB64: string,\n myPrivateKey: Uint8Array,\n ): Promise<string> {\n const encryptedBuffer = Buffer.from(encryptedB64, 'base64');\n const decryptedBuffer = await decrypt(myPrivateKey, encryptedBuffer);\n return Buffer.from(decryptedBuffer).toString('utf8');\n }\n}\n\nexport const keymanager = new KeyManager();\n","import * as uuid from 'uuid';\n\nimport type { StoreAdapter, TransportType } from '../domain';\nimport {\n StorageDeleteErr,\n StorageGetErr,\n StorageSetErr,\n} from '../domain/errors/storage';\nimport { getTransportType } from '../domain/multichain';\nimport { StoreClient } from '../domain/store/client';\n\nexport class Store extends StoreClient {\n constructor(public adapter: StoreAdapter) {\n super();\n }\n\n async getTransport(): Promise<TransportType | null> {\n try {\n const transport = await this.adapter.get('multichain-transport');\n if (!transport) {\n return null;\n }\n return getTransportType(transport);\n } catch (err) {\n throw new StorageGetErr(\n this.adapter.platform,\n 'multichain-transport',\n err.message,\n );\n }\n }\n\n async setTransport(transport: TransportType): Promise<void> {\n try {\n await this.adapter.set('multichain-transport', transport);\n } catch (err) {\n throw new StorageSetErr(\n this.adapter.platform,\n 'multichain-transport',\n err.message,\n );\n }\n }\n\n async removeTransport(): Promise<void> {\n try {\n await this.adapter.delete('multichain-transport');\n } catch (err) {\n throw new StorageDeleteErr(\n this.adapter.platform,\n 'multichain-transport',\n err.message,\n );\n }\n }\n\n async getAnonId(): Promise<string> {\n try {\n const anonId = await this.adapter.get('anonId');\n if (anonId) {\n return anonId;\n }\n const newAnonId = uuid.v4();\n await this.adapter.set('anonId', newAnonId);\n return newAnonId;\n } catch (err) {\n throw new StorageGetErr(this.adapter.platform, 'anonId', err.message);\n }\n }\n\n async getExtensionId(): Promise<string | null> {\n try {\n return await this.adapter.get('extensionId');\n } catch (err) {\n throw new StorageGetErr(\n this.adapter.platform,\n 'extensionId',\n err.message,\n );\n }\n }\n\n async setAnonId(anonId: string): Promise<void> {\n try {\n return await this.adapter.set('anonId', anonId);\n } catch (err) {\n throw new StorageSetErr(this.adapter.platform, 'anonId', err.message);\n }\n }\n\n async setExtensionId(extensionId: string): Promise<void> {\n try {\n return await this.adapter.set('extensionId', extensionId);\n } catch (err) {\n throw new StorageSetErr(\n this.adapter.platform,\n 'extensionId',\n err.message,\n );\n }\n }\n\n async removeExtensionId(): Promise<void> {\n try {\n return await this.adapter.delete('extensionId');\n } catch (err) {\n throw new StorageDeleteErr(\n this.adapter.platform,\n 'extensionId',\n err.message,\n );\n }\n }\n\n async removeAnonId(): Promise<void> {\n try {\n return await this.adapter.delete('anonId');\n } catch (err) {\n throw new StorageDeleteErr(this.adapter.platform, 'anonId', err.message);\n }\n }\n\n async getDebug(): Promise<string | null> {\n try {\n return await this.adapter.get('DEBUG');\n } catch (err) {\n throw new StorageGetErr(this.adapter.platform, 'DEBUG', err.message);\n }\n }\n}\n","/* eslint-disable @typescript-eslint/parameter-properties */\nimport { BaseErr } from './base';\nimport type { StorageErrorCodes } from './types';\n\nexport class StorageGetErr extends BaseErr<'Storage', StorageErrorCodes> {\n static readonly code = 60;\n\n constructor(\n public readonly platform: 'web' | 'rn' | 'node',\n public readonly key: string,\n public readonly reason: string,\n ) {\n super(\n `StorageErr${StorageGetErr.code}: ${platform} storage get error in key: ${key} - ${reason}`,\n StorageGetErr.code,\n );\n }\n}\n\nexport class StorageSetErr extends BaseErr<'Storage', StorageErrorCodes> {\n static readonly code = 61;\n\n constructor(\n public readonly platform: 'web' | 'rn' | 'node',\n public readonly key: string,\n public readonly reason: string,\n ) {\n super(\n `StorageErr${StorageSetErr.code}: ${platform} storage set error in key: ${key} - ${reason}`,\n StorageSetErr.code,\n );\n }\n}\n\nexport class StorageDeleteErr extends BaseErr<'Storage', StorageErrorCodes> {\n static readonly code = 62;\n\n constructor(\n public readonly platform: 'web' | 'rn' | 'node',\n public readonly key: string,\n public readonly reason: string,\n ) {\n super(\n `StorageErr${StorageDeleteErr.code}: ${platform} storage delete error in key: ${key} - ${reason}`,\n StorageDeleteErr.code,\n );\n }\n}\n","/* eslint-disable @typescript-eslint/no-shadow */\n/* eslint-disable @typescript-eslint/no-misused-promises */\n/* eslint-disable no-restricted-globals */\n/* eslint-disable jsdoc/require-returns */\n/* eslint-disable @typescript-eslint/parameter-properties */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable no-restricted-syntax */\n/* eslint-disable promise/no-return-wrap */\n/* eslint-disable require-atomic-updates */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport MetaMaskOnboarding from '@metamask/onboarding';\n\nimport { METAMASK_CONNECT_BASE_URL, METAMASK_DEEPLINK_BASE } from '../config';\nimport {\n type ConnectionRequest,\n getPlatformType,\n getVersion,\n type Modal,\n type OTPCode,\n PlatformType,\n} from '../domain';\nimport type { AbstractOTPCodeModal } from './modals/base/AbstractOTPModal';\nimport type { FactoryModals, ModalTypes } from './modals/types';\nimport { preloadQR } from './qr';\nimport { compressString } from '../multichain/utils';\n\nlet __instance;\n\n/**\n * Preload install modal custom elements only once\n */\nexport async function preload() {\n __instance ??= await import(\n // Use a non-literal specifier to avoid Vite static analysis of deep imports\n // and gracefully handle absence of the Stencil loader in this package build.\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n '@metamask/multichain-ui'.concat('/dist/loader/index.js') // Prefer ESM loader in browsers\n )\n .then(async (loader: any) => {\n if (typeof loader?.defineCustomElements === 'function') {\n loader.defineCustomElements();\n }\n return Promise.resolve(loader);\n })\n .catch(async (error) => {\n console.error(`Gracefully Failed to load modal customElements:`, error);\n return Promise.resolve(undefined);\n });\n}\n\nexport class ModalFactory<T extends FactoryModals = FactoryModals> {\n public modal!: Modal<any>;\n\n private readonly platform: PlatformType = getPlatformType();\n\n private successCallback!: (error?: Error) => Promise<void>;\n\n /**\n * Creates a new modal factory instance.\n *\n * @param options - The modals configuration object\n */\n constructor(protected readonly options: T) {\n this.validateModals();\n }\n\n private validateModals() {\n const requiredModals = ['InstallModal', 'OTPCodeModal'];\n const missingModals = requiredModals.filter(\n (modal) => !this.options[modal as ModalTypes],\n );\n if (missingModals.length > 0) {\n throw new Error(`Missing required modals: ${missingModals.join(', ')}`);\n }\n }\n\n async unload(error?: Error) {\n this.modal?.unmount();\n await this.successCallback?.(error);\n }\n\n /**\n * Determines if the current platform is a mobile native environment.\n * Currently only includes React Native.\n */\n get isMobile() {\n return this.platform === PlatformType.ReactNative;\n }\n\n /**\n * Determines if the current platform is a Node.js environment.\n * Used for server-side or non-browser environments.\n */\n get isNode() {\n return this.platform === PlatformType.NonBrowser;\n }\n\n /**\n * Determines if the current platform is a web environment.\n * Includes desktop web, MetaMask mobile webview, and mobile web.\n */\n get isWeb() {\n return (\n this.platform === PlatformType.DesktopWeb ||\n this.platform === PlatformType.MetaMaskMobileWebview ||\n this.platform === PlatformType.MobileWeb\n );\n }\n\n private getContainer() {\n return typeof document === 'undefined'\n ? undefined\n : document.createElement('div');\n }\n\n private getMountedContainer() {\n if (typeof document === 'undefined') {\n return undefined;\n }\n const container = this.getContainer();\n if (container) {\n document.body.appendChild(container);\n }\n return container;\n }\n\n createDeeplink(connectionRequest?: ConnectionRequest) {\n if (!connectionRequest) {\n return `${METAMASK_DEEPLINK_BASE}`;\n }\n const json = JSON.stringify(connectionRequest);\n const compressed = compressString(json);\n const urlEncoded = encodeURIComponent(compressed);\n return `${METAMASK_DEEPLINK_BASE}/mwp?p=${urlEncoded}&c=1`;\n }\n\n createUniversalLink(connectionRequest?: ConnectionRequest) {\n if (!connectionRequest) {\n return `${METAMASK_CONNECT_BASE_URL}`;\n }\n const json = JSON.stringify(connectionRequest);\n const compressed = compressString(json);\n const urlEncoded = encodeURIComponent(compressed);\n return `${METAMASK_CONNECT_BASE_URL}/mwp?p=${urlEncoded}&c=1`;\n }\n\n private async onCloseModal(shouldTerminate = true) {\n return this.unload(\n shouldTerminate ? new Error('User closed modal') : undefined,\n );\n }\n\n private onStartDesktopOnboarding() {\n new MetaMaskOnboarding().startOnboarding();\n }\n\n public async renderInstallModal(\n preferDesktop: boolean,\n createConnectionRequest: () => Promise<ConnectionRequest>,\n successCallback: (error?: Error) => Promise<void>,\n ) {\n this.modal?.unmount();\n await Promise.all([preload(), preloadQR()]);\n this.successCallback = successCallback;\n\n const parentElement = this.getMountedContainer();\n const connectionRequest = await createConnectionRequest();\n const qrCodeLink = this.createDeeplink(connectionRequest);\n\n const modal: Modal<any> = new this.options.InstallModal({\n expiresIn:\n (connectionRequest.sessionRequest.expiresAt - Date.now()) / 1000,\n connectionRequest,\n parentElement,\n preferDesktop,\n link: qrCodeLink,\n sdkVersion: getVersion(),\n generateQRCode: async (request: ConnectionRequest) =>\n this.createDeeplink(request),\n onClose: this.onCloseModal.bind(this),\n startDesktopOnboarding: this.onStartDesktopOnboarding.bind(this),\n createConnectionRequest,\n });\n\n this.modal = modal;\n modal.mount();\n }\n\n public async renderOTPCodeModal(\n createOTPCode: () => Promise<OTPCode>,\n successCallback: (error?: Error) => Promise<void>,\n updateOTPCode: (otpCode: OTPCode, modal: AbstractOTPCodeModal) => void,\n ) {\n this.modal?.unmount();\n await Promise.all([preload(), preloadQR()]);\n this.successCallback = successCallback;\n\n const container = this.getMountedContainer();\n const otpCode = await createOTPCode();\n\n const modal: AbstractOTPCodeModal = new this.options.OTPCodeModal({\n parentElement: container,\n sdkVersion: getVersion(),\n otpCode,\n onClose: this.onCloseModal.bind(this),\n createOTPCode,\n updateOTPCode: (otpCode: OTPCode) => updateOTPCode(otpCode, modal),\n });\n\n this.modal = modal;\n modal.mount();\n }\n}\n","/* eslint-disable require-atomic-updates */\n/* eslint-disable jsdoc/require-jsdoc */\n/*\n QR adapter that hides ESM import details and exposes a sync API.\n Consumers must call preloadQR() once before first use.\n*/\n\nlet encodeQRImpl: ((input: string, type: 'ascii') => string) | null = null;\n\ntype QREncode = (input: string, type: 'ascii') => string;\n\nexport async function preloadQR(): Promise<void> {\n if (encodeQRImpl) {\n return;\n }\n const mod = (await import('@paulmillr/qr')) as unknown as {\n default: QREncode;\n };\n encodeQRImpl = mod.default;\n}\n\nexport function encodeQRSync(input: string): string {\n if (!encodeQRImpl) {\n throw new Error('QR module not preloaded. Call preloadQR() first.');\n }\n return encodeQRImpl(input, 'ascii');\n}\n"],"mappings":"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","names":["EventEmitter3","logger","debug","TransportType","PlatformType","init_utils","logger","init_utils","web_exports","init_web","import_mobile_wallet_protocol_core","import_multichain_api_client","_a","fetch","sessionRequest","import_multichain_api_client","DEFAULT_REQUEST_TIMEOUT","sessionRequest","logger","isEnabled","isReactNative","_a","MetaMaskOnboarding","otpCode","StoreAdapterWeb"]}
@@ -0,0 +1 @@
1
+ {"inputs":{"src/config/index.ts":{"bytes":232,"imports":[],"format":"esm"},"src/domain/errors/base.ts":{"bytes":387,"imports":[],"format":"esm"},"src/domain/errors/rpc.ts":{"bytes":1371,"imports":[{"path":"src/domain/errors/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"src/domain/errors/index.ts":{"bytes":53,"imports":[{"path":"src/domain/errors/rpc.ts","kind":"import-statement","original":"./rpc"}],"format":"esm"},"src/domain/events/index.ts":{"bytes":2313,"imports":[{"path":"eventemitter3","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/domain/logger/index.ts":{"bytes":3262,"imports":[{"path":"debug","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/domain/multichain/api/constants.ts":{"bytes":3281,"imports":[],"format":"esm"},"src/domain/multichain/api/infura.ts":{"bytes":419,"imports":[{"path":"src/domain/multichain/api/constants.ts","kind":"import-statement","original":"./constants"}],"format":"esm"},"src/domain/multichain/index.ts":{"bytes":2336,"imports":[{"path":"src/domain/events/index.ts","kind":"import-statement","original":"../events"},{"path":"src/domain/multichain/api/constants.ts","kind":"import-statement","original":"./api/constants"},{"path":"src/domain/multichain/api/infura.ts","kind":"import-statement","original":"./api/infura"}],"format":"esm"},"src/domain/platform/index.ts":{"bytes":3452,"imports":[{"path":"bowser","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/domain/store/adapter.ts":{"bytes":485,"imports":[],"format":"esm"},"src/domain/store/client.ts":{"bytes":711,"imports":[],"format":"esm"},"src/domain/store/index.ts":{"bytes":53,"imports":[{"path":"src/domain/store/adapter.ts","kind":"import-statement","original":"./adapter"},{"path":"src/domain/store/client.ts","kind":"import-statement","original":"./client"}],"format":"esm"},"src/domain/ui/types.ts":{"bytes":2047,"imports":[],"format":"esm"},"src/domain/ui/index.ts":{"bytes":57,"imports":[{"path":"src/domain/ui/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"src/domain/utils/index.ts":{"bytes":163,"imports":[],"format":"esm"},"src/domain/index.ts":{"bytes":208,"imports":[{"path":"src/domain/errors/index.ts","kind":"import-statement","original":"./errors"},{"path":"src/domain/events/index.ts","kind":"import-statement","original":"./events"},{"path":"src/domain/logger/index.ts","kind":"import-statement","original":"./logger"},{"path":"src/domain/multichain/index.ts","kind":"import-statement","original":"./multichain"},{"path":"src/domain/platform/index.ts","kind":"import-statement","original":"./platform"},{"path":"src/domain/store/index.ts","kind":"import-statement","original":"./store"},{"path":"src/domain/ui/index.ts","kind":"import-statement","original":"./ui"},{"path":"src/domain/utils/index.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"src/multichain/utils/index.ts":{"bytes":10286,"imports":[{"path":"pako","kind":"import-statement","external":true},{"path":"@metamask/utils","kind":"import-statement","external":true},{"path":"src/domain/index.ts","kind":"import-statement","original":"../../domain"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/multichain/rpc/handlers/rpcClient.ts":{"bytes":2634,"imports":[{"path":"cross-fetch","kind":"import-statement","external":true},{"path":"src/domain/index.ts","kind":"import-statement","original":"../../../domain"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/multichain/rpc/requestRouter.ts":{"bytes":3028,"imports":[{"path":"src/config/index.ts","kind":"import-statement","original":"../../config"},{"path":"src/domain/index.ts","kind":"import-statement","original":"../../domain"},{"path":"src/multichain/utils/index.ts","kind":"import-statement","original":"../utils"},{"path":"src/multichain/rpc/handlers/rpcClient.ts","kind":"import-statement","original":"./handlers/rpcClient"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/multichain/transports/default/index.ts":{"bytes":3990,"imports":[{"path":"@metamask/multichain-api-client","kind":"import-statement","external":true},{"path":"src/multichain/utils/index.ts","kind":"import-statement","original":"../../utils"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/multichain/transports/mwp/index.ts":{"bytes":14387,"imports":[{"path":"@metamask/mobile-wallet-protocol-core","kind":"import-statement","external":true},{"path":"@metamask/multichain-api-client","kind":"import-statement","external":true},{"path":"src/domain/index.ts","kind":"import-statement","original":"../../../domain"},{"path":"src/multichain/utils/index.ts","kind":"import-statement","original":"../../utils"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/multichain/transports/mwp/KeyManager.ts":{"bytes":1011,"imports":[{"path":"eciesjs","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/multichain/index.ts":{"bytes":19237,"imports":[{"path":"@metamask/analytics","kind":"import-statement","external":true},{"path":"@metamask/mobile-wallet-protocol-core","kind":"import-statement","external":true},{"path":"@metamask/mobile-wallet-protocol-dapp-client","kind":"import-statement","external":true},{"path":"@metamask/multichain-api-client","kind":"import-statement","external":true},{"path":"src/config/index.ts","kind":"import-statement","original":"../config"},{"path":"src/domain/index.ts","kind":"import-statement","original":"../domain"},{"path":"src/domain/logger/index.ts","kind":"import-statement","original":"../domain/logger"},{"path":"src/domain/multichain/index.ts","kind":"import-statement","original":"../domain/multichain"},{"path":"src/domain/platform/index.ts","kind":"import-statement","original":"../domain/platform"},{"path":"src/multichain/rpc/requestRouter.ts","kind":"import-statement","original":"./rpc/requestRouter"},{"path":"src/multichain/transports/default/index.ts","kind":"import-statement","original":"./transports/default"},{"path":"src/multichain/transports/mwp/index.ts","kind":"import-statement","original":"./transports/mwp"},{"path":"src/multichain/transports/mwp/KeyManager.ts","kind":"import-statement","original":"./transports/mwp/KeyManager"},{"path":"src/multichain/utils/index.ts","kind":"import-statement","original":"./utils"},{"path":"src/multichain/rpc/handlers/rpcClient.ts","kind":"import-statement","original":"./rpc/handlers/rpcClient"},{"path":"ws","kind":"dynamic-import","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/domain/errors/storage.ts":{"bytes":1351,"imports":[{"path":"src/domain/errors/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"src/store/index.ts":{"bytes":3175,"imports":[{"path":"uuid","kind":"import-statement","external":true},{"path":"src/domain/errors/storage.ts","kind":"import-statement","original":"../domain/errors/storage"},{"path":"src/domain/multichain/index.ts","kind":"import-statement","original":"../domain/multichain"},{"path":"src/domain/store/client.ts","kind":"import-statement","original":"../domain/store/client"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/ui/qr.ts":{"bytes":759,"imports":[{"path":"@paulmillr/qr","kind":"dynamic-import","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/ui/index.ts":{"bytes":6663,"imports":[{"path":"@metamask/onboarding","kind":"import-statement","external":true},{"path":"src/config/index.ts","kind":"import-statement","original":"../config"},{"path":"src/domain/index.ts","kind":"import-statement","original":"../domain"},{"path":"src/ui/qr.ts","kind":"import-statement","original":"./qr"},{"path":"src/multichain/utils/index.ts","kind":"import-statement","original":"../multichain/utils"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/ui/modals/base/utils.ts":{"bytes":892,"imports":[],"format":"esm"},"src/ui/modals/base/AbstractInstallModal.ts":{"bytes":3463,"imports":[{"path":"src/domain/index.ts","kind":"import-statement","original":"../../../domain"},{"path":"src/ui/modals/base/utils.ts","kind":"import-statement","original":"./utils"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/ui/modals/web/install.ts":{"bytes":1256,"imports":[{"path":"src/ui/modals/base/AbstractInstallModal.ts","kind":"import-statement","original":"../base/AbstractInstallModal"}],"format":"esm"},"src/ui/modals/base/AbstractOTPModal.ts":{"bytes":466,"imports":[{"path":"src/domain/index.ts","kind":"import-statement","original":"../../../domain"}],"format":"esm"},"src/ui/modals/web/otp.ts":{"bytes":295,"imports":[{"path":"src/ui/modals/base/AbstractOTPModal.ts","kind":"import-statement","original":"../base/AbstractOTPModal"}],"format":"esm"},"src/ui/modals/web/index.ts":{"bytes":80,"imports":[{"path":"src/ui/modals/web/install.ts","kind":"import-statement","original":"./install"},{"path":"src/ui/modals/web/otp.ts","kind":"import-statement","original":"./otp"}],"format":"esm"},"src/store/adapters/web.ts":{"bytes":3007,"imports":[{"path":"src/domain/index.ts","kind":"import-statement","original":"../../domain"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/index.browser.ts":{"bytes":757,"imports":[{"path":"src/multichain/index.ts","kind":"import-statement","original":"./multichain"},{"path":"src/store/index.ts","kind":"import-statement","original":"./store"},{"path":"src/ui/index.ts","kind":"import-statement","original":"./ui"},{"path":"src/domain/index.ts","kind":"import-statement","original":"./domain"},{"path":"src/ui/modals/web/index.ts","kind":"dynamic-import","original":"./ui/modals/web"},{"path":"src/store/adapters/web.ts","kind":"dynamic-import","original":"./store/adapters/web"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/browser/umd/connect-multichain.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":147562},"dist/browser/umd/connect-multichain.js":{"imports":[{"path":"eventemitter3","kind":"require-call","external":true},{"path":"debug","kind":"require-call","external":true},{"path":"bowser","kind":"require-call","external":true},{"path":"@metamask/analytics","kind":"require-call","external":true},{"path":"@metamask/mobile-wallet-protocol-core","kind":"require-call","external":true},{"path":"@metamask/mobile-wallet-protocol-dapp-client","kind":"require-call","external":true},{"path":"@metamask/multichain-api-client","kind":"require-call","external":true},{"path":"pako","kind":"require-call","external":true},{"path":"@metamask/utils","kind":"require-call","external":true},{"path":"cross-fetch","kind":"require-call","external":true},{"path":"@metamask/multichain-api-client","kind":"require-call","external":true},{"path":"@metamask/mobile-wallet-protocol-core","kind":"require-call","external":true},{"path":"@metamask/multichain-api-client","kind":"require-call","external":true},{"path":"eciesjs","kind":"require-call","external":true},{"path":"ws","kind":"dynamic-import","external":true},{"path":"uuid","kind":"require-call","external":true},{"path":"@metamask/onboarding","kind":"require-call","external":true},{"path":"@paulmillr/qr","kind":"dynamic-import","external":true}],"exports":[],"entryPoint":"src/index.browser.ts","inputs":{"src/domain/errors/base.ts":{"bytesInOutput":265},"src/domain/errors/rpc.ts":{"bytesInOutput":1861},"src/domain/errors/index.ts":{"bytesInOutput":103},"src/domain/events/index.ts":{"bytesInOutput":1756},"src/domain/logger/index.ts":{"bytesInOutput":1125},"src/domain/multichain/api/constants.ts":{"bytesInOutput":3681},"src/domain/multichain/api/infura.ts":{"bytesInOutput":338},"src/domain/multichain/index.ts":{"bytesInOutput":790},"src/domain/platform/index.ts":{"bytesInOutput":3773},"src/domain/store/adapter.ts":{"bytesInOutput":210},"src/domain/store/client.ts":{"bytesInOutput":137},"src/domain/store/index.ts":{"bytesInOutput":124},"src/domain/ui/types.ts":{"bytesInOutput":994},"src/domain/ui/index.ts":{"bytesInOutput":97},"src/domain/utils/index.ts":{"bytesInOutput":129},"src/domain/index.ts":{"bytesInOutput":232},"src/ui/modals/base/utils.ts":{"bytesInOutput":643},"src/ui/modals/base/AbstractInstallModal.ts":{"bytesInOutput":3280},"src/ui/modals/web/install.ts":{"bytesInOutput":1312},"src/ui/modals/base/AbstractOTPModal.ts":{"bytesInOutput":470},"src/ui/modals/web/otp.ts":{"bytesInOutput":242},"src/ui/modals/web/index.ts":{"bytesInOutput":241},"src/store/adapters/web.ts":{"bytesInOutput":3627},"src/index.browser.ts":{"bytesInOutput":1818},"src/multichain/index.ts":{"bytesInOutput":17616},"src/config/index.ts":{"bytesInOutput":202},"src/multichain/rpc/requestRouter.ts":{"bytesInOutput":2718},"src/multichain/utils/index.ts":{"bytesInOutput":7282},"src/multichain/rpc/handlers/rpcClient.ts":{"bytesInOutput":2820},"src/multichain/transports/default/index.ts":{"bytesInOutput":4492},"src/multichain/transports/mwp/index.ts":{"bytesInOutput":11965},"src/multichain/transports/mwp/KeyManager.ts":{"bytesInOutput":932},"src/store/index.ts":{"bytesInOutput":3365},"src/domain/errors/storage.ts":{"bytesInOutput":1201},"src/ui/index.ts":{"bytesInOutput":5719},"src/ui/qr.ts":{"bytesInOutput":223}},"bytes":90973}}}