diff --git a/packages/metamask/README.md b/packages/metamask/README.md index fc298b987..ae71b5ffb 100644 --- a/packages/metamask/README.md +++ b/packages/metamask/README.md @@ -1,8 +1,10 @@ # @web3-onboard/metamask -## Wallet module for connecting MetaMask Wallet SDK to web3-onboard +## Wallet module for connecting MetaMask Connect EVM to web3-onboard + The MetaMask Web3-Onboard module provides a reliable, secure, and seamless connection from your dapp to the MetaMask browser extension and MetaMask Mobile. -See [MetaMask SDK Developer Docs](https://docs.metamask.io/wallet/how-to/connect/set-up-sdk/) + +This module uses [MetaMask Connect EVM](https://docs.metamask.io/metamask-connect/evm/) (`@metamask/connect-evm`) under the hood — the successor to the legacy `@metamask/sdk`. The integration surface for `@web3-onboard/metamask` is unchanged: the legacy options below are mapped to their MetaMask Connect EVM equivalents internally so existing dapps keep working without code changes. ![MetaMask SDK ConnectionFlow](https://github.com/blocknative/web3-onboard/blob/develop/assets/metaMaskSDK-connect.gif?raw=true 'MetaMask SDK ConnectionFlow') @@ -11,23 +13,51 @@ See [MetaMask SDK Developer Docs](https://docs.metamask.io/wallet/how-to/connect `npm i @web3-onboard/metamask` ### If using this package with the `@web3-onboard/injected-wallets` module -_When utilizing this package alongside the `@web3-onboard/injected-wallets` module, ensure to list this package prior to the initialized injected-wallets module within the wallets list of the Web3-Onboard init._ -_This order prioritizes the SDK when a MetaMask browser wallet is detected, allowing the SDK to take precedence._ + +_When utilizing this package alongside the `@web3-onboard/injected-wallets` module, ensure to list this package prior to the initialized injected-wallets module within the wallets list of the Web3-Onboard init._ +_This order prioritizes the MetaMask Connect EVM client when a MetaMask browser wallet is detected, allowing it to take precedence._ ## Options ```typescript -// For a complete list of options check https://docs.metamask.io/wallet/how-to/connect/set-up-sdk/ +// All fields are optional. Legacy MetaMaskSDK option names are accepted for +// backwards compatibility and mapped to MetaMask Connect EVM internally. interface MetaMaskSDKOptions { - dappMetadata: { - url?: string; - name?: string; - base64Icon?: string; - }, /** - * If MetaMask browser extension is detected, directly use it without prompting the user. + * Dapp identity forwarded to MetaMask Connect EVM (used for the mobile + * connection prompt). Only the values you supply here are passed through. + * web3-onboard's `appMetadata.icon` is NOT automatically base64-encoded into + * `base64Icon`, because inline SVGs can overflow the QR/deeplink payload — + * prefer `iconUrl` for the MetaMask-side icon. */ - extensionOnly?: boolean; + dappMetadata?: { + url?: string + name?: string + iconUrl?: string + base64Icon?: string + } + /** + * If `true`, prefer the MetaMask browser extension over the mobile flow. + * Mapped to `ui.preferExtension`. The legacy default of `false` is a no-op + * because Connect EVM already prefers the extension when it is installed. + */ + extensionOnly?: boolean + /** Mapped to `ui.headless`. */ + headless?: boolean + /** + * Whether to let Connect EVM render its own install/QR modal. Mapped to + * `ui.showInstallModal`. Defaults to `false` because web3-onboard already + * provides the surrounding wallet-selection UI. + */ + showInstallModal?: boolean + /** Used to populate `api.supportedNetworks` via `getInfuraRpcUrls`. */ + infuraAPIKey?: string + /** Merged into `api.supportedNetworks` (keys are normalized to hex). */ + readonlyRPCMap?: Record + /** Mapped to `mobile.preferredOpenLink`. */ + openDeeplink?: (deeplink: string) => void + /** Mapped to `mobile.useDeeplink`. */ + useDeeplink?: boolean } ``` @@ -38,12 +68,13 @@ import Onboard from '@web3-onboard/core' import metamaskSDK from '@web3-onboard/metamask' // initialize the module with options -const metamaskSDKWallet = metamaskSDK({options: { - extensionOnly: false, - dappMetadata: { - name: 'Demo Web3Onboard' +const metamaskSDKWallet = metamaskSDK({ + options: { + dappMetadata: { + name: 'Demo Web3Onboard' + } } -}}) +}) const onboard = Onboard({ // ... other Onboard options diff --git a/packages/metamask/package.json b/packages/metamask/package.json index fcbedc0fb..caf0b0aa9 100644 --- a/packages/metamask/package.json +++ b/packages/metamask/package.json @@ -1,67 +1,69 @@ { - "name": "@web3-onboard/metamask", - "version": "2.2.1", - "description": "MetaMask SDK wallet module for connecting to Web3-Onboard. Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardised spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, multi-chain and multi-account support, reactive wallet state subscriptions and real-time transaction state change notifications.", - "keywords": [ - "Ethereum", - "Web3", - "EVM", - "dapp", - "Multichain", - "Wallet", - "Transaction", - "Provider", - "Hardware Wallet", - "Notifications", - "React", - "Svelte", - "Vue", - "Next", - "Nuxt", - "MetaMask", - "Coinbase", - "WalletConnect", - "Ledger", - "Trezor", - "Connect Wallet", - "Ethereum Hooks", - "Blocknative", - "Mempool", - "pending", - "confirmed", - "Injected Wallet", - "Crypto", - "Crypto Wallet" - ], - "repository": { - "type": "git", - "url": "https://github.com/blocknative/web3-onboard.git", - "directory": "packages/metamask" - }, - "homepage": "https://web3onboard.thirdweb.com", - "bugs": "https://github.com/blocknative/web3-onboard/issues", - "module": "dist/index.js", - "browser": "dist/index.js", - "main": "dist/index.js", - "type": "module", - "typings": "dist/index.d.ts", - "files": ["dist"], - "license": "MIT", - "scripts": { - "build": "tsc", - "dev": "tsc -w", - "type-check": "tsc --noEmit" - }, - "devDependencies": { - "@types/node": "^20.5.7", - "ts-node": "^10.9.1", - "typescript": "^5.2.2" - }, - "dependencies": { - "@metamask/sdk": "^0.32.0", - "@web3-onboard/common": "^2.4.1" - }, - "engines": { - "node": ">=18.18" - } + "name": "@web3-onboard/metamask", + "version": "2.3.0", + "description": "MetaMask Connect EVM wallet module for connecting to Web3-Onboard. Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardised spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, multi-chain and multi-account support, reactive wallet state subscriptions and real-time transaction state change notifications.", + "keywords": [ + "Ethereum", + "Web3", + "EVM", + "dapp", + "Multichain", + "Wallet", + "Transaction", + "Provider", + "Hardware Wallet", + "Notifications", + "React", + "Svelte", + "Vue", + "Next", + "Nuxt", + "MetaMask", + "Coinbase", + "WalletConnect", + "Ledger", + "Trezor", + "Connect Wallet", + "Ethereum Hooks", + "Blocknative", + "Mempool", + "pending", + "confirmed", + "Injected Wallet", + "Crypto", + "Crypto Wallet" + ], + "repository": { + "type": "git", + "url": "https://github.com/blocknative/web3-onboard.git", + "directory": "packages/metamask" + }, + "homepage": "https://web3onboard.thirdweb.com", + "bugs": "https://github.com/blocknative/web3-onboard/issues", + "module": "dist/index.js", + "browser": "dist/index.js", + "main": "dist/index.js", + "type": "module", + "typings": "dist/index.d.ts", + "files": [ + "dist" + ], + "license": "MIT", + "scripts": { + "build": "tsc", + "dev": "tsc -w", + "type-check": "tsc --noEmit" + }, + "devDependencies": { + "@types/node": "^20.5.7", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + }, + "dependencies": { + "@metamask/connect-evm": "^1.3.1", + "@web3-onboard/common": "^2.4.1" + }, + "engines": { + "node": ">=18.18" + } } diff --git a/packages/metamask/src/index.ts b/packages/metamask/src/index.ts index 6b947c72a..8532c91ae 100644 --- a/packages/metamask/src/index.ts +++ b/packages/metamask/src/index.ts @@ -1,95 +1,323 @@ -import type { WalletInit } from '@web3-onboard/common' -import type { MetaMaskSDK, MetaMaskSDKOptions } from '@metamask/sdk' -import type { createEIP1193Provider } from '@web3-onboard/common' +import type { Chain, WalletInit } from '@web3-onboard/common' +import type { + createEVMClient as CreateEVMClientFn, + getInfuraRpcUrls as GetInfuraRpcUrlsFn, + MetamaskConnectEVM +} from '@metamask/connect-evm' -type ImportSDK = { - createEIP1193Provider: typeof createEIP1193Provider - MetaMaskSDKConstructor: typeof MetaMaskSDK -} +/** + * Public Mainnet RPC used as a last-resort fallback when no + * `supportedNetworks` can be derived from user options or the chains web3- + * onboard was configured with. `@metamask/connect-evm` requires the map to + * contain at least one chain. + */ +const FALLBACK_MAINNET_RPC = 'https://1.rpc.thirdweb.com' -const loadImports = async () => { - if (importPromise) { - return await importPromise +/** + * Legacy MetaMask SDK options that this module continues to accept for + * backwards compatibility. Each field is mapped to its + * `@metamask/connect-evm` equivalent inside `getInterface` so callers can + * upgrade transparently without changing their integration code. + */ +export type MetaMaskSDKOptions = { + /** + * Dapp identity forwarded to `@metamask/connect-evm` (used for the + * MetaMask Mobile connection prompt). Only the explicitly provided + * fields are passed through — web3-onboard's `appMetadata.icon` is not + * automatically base64-encoded into `base64Icon`, because inline SVGs + * can overflow the QR/deeplink payload. Provide an explicit `iconUrl` + * (recommended) or `base64Icon` here when you want a dapp icon on the + * MetaMask side. + */ + dappMetadata?: { + name?: string + url?: string + iconUrl?: string + base64Icon?: string } + /** + * When `true`, prefer the MetaMask browser extension over the mobile/QR + * flow. Maps to `ui.preferExtension`. The default mirrors the new + * `@metamask/connect-evm` default (extension is preferred when installed). + */ + extensionOnly?: boolean + /** Maps to `ui.headless` in `@metamask/connect-evm`. */ + headless?: boolean + /** + * When `true`, allow `@metamask/connect-evm` to render its own + * install/QR modal. Defaults to `false` because web3-onboard already + * supplies the surrounding wallet-selection UI and a second modal would + * sit on top of it. + */ + showInstallModal?: boolean + /** Used to populate `api.supportedNetworks` via `getInfuraRpcUrls`. */ + infuraAPIKey?: string + /** Merged into `api.supportedNetworks`. */ + readonlyRPCMap?: Record + /** Maps to `mobile.preferredOpenLink`. */ + openDeeplink?: (deeplink: string) => void + /** Maps to `mobile.useDeeplink`. */ + useDeeplink?: boolean + // Allow legacy/forward-compat fields (e.g. `i18nOptions`, `_source`, + // `enableAnalytics`) without a type error. They are silently ignored. + [key: string]: unknown +} + +type EvmClientOptions = Parameters[0] + +type ConnectEvmImports = { + createEVMClient: typeof CreateEVMClientFn + getInfuraRpcUrls: typeof GetInfuraRpcUrlsFn +} + +let importPromise: Promise | null = null +let client: MetamaskConnectEVM | null = null + +const loadImports = async (): Promise => { + const mmConnect = await import('@metamask/connect-evm') - const { createEIP1193Provider } = await import('@web3-onboard/common') - const importedSDK = await import('@metamask/sdk') - const MetaMaskSDKConstructor = + const createEVMClient = + // @ts-ignore — handle both ESM and CJS default-export shapes + mmConnect.createEVMClient || mmConnect.default?.createEVMClient + + const getInfuraRpcUrls = // @ts-ignore - importedSDK.MetaMaskSDK || importedSDK.default.MetaMaskSDK + mmConnect.getInfuraRpcUrls || mmConnect.default?.getInfuraRpcUrls - if (!MetaMaskSDKConstructor) { - throw new Error('Error importing and initializing MetaMask SDK') + if (!createEVMClient) { + throw new Error('Error importing and initializing @metamask/connect-evm') } - return { createEIP1193Provider, MetaMaskSDKConstructor } + return { createEVMClient, getInfuraRpcUrls } } -let importPromise: Promise | null = null -let sdk: MetaMaskSDK | null = null - function metamask({ options }: { options: Partial }): WalletInit { return () => { - importPromise = loadImports().catch(error => { - throw error - }) + // Cache the dynamic import so we only fetch the SDK once per page load. + // On rejection (e.g. transient network failure during `import(...)`) + // clear the cache so the next `getInterface` call can retry instead of + // permanently surfacing the original error. + if (!importPromise) { + importPromise = loadImports().catch(error => { + importPromise = null + throw error + }) + } return { label: 'MetaMask', getIcon: async () => (await import('./icon.js')).default, - getInterface: async ({ appMetadata }) => { - sdk = (window as any).mmsdk || sdk // Prevent conflict with existing mmsdk instances - - if (sdk) { - // Prevent re-initializing instance as it causes issues with MetaMask sdk mobile provider. + getInterface: async ({ appMetadata, chains }) => { + // Reuse the existing client/provider if we have already initialized + // it. Re-initializing would needlessly reset state and historically + // caused issues with the MetaMask mobile provider. + if (client) { + const existingProvider = client.getProvider() + attachDisconnectShim(existingProvider) return { - provider: sdk.getProvider() as any, - instance: sdk + provider: existingProvider as any, + instance: client } } - const { name, icon } = appMetadata || {} - const base64 = window.btoa(icon || '') - const appLogoUrl = `data:image/svg+xml;base64,${base64}` const imports = await importPromise - if (!imports?.MetaMaskSDKConstructor) { - throw new Error('Error importing and initializing MetaMask SDK') + if (!imports?.createEVMClient) { + throw new Error( + 'Error importing and initializing @metamask/connect-evm' + ) } - const { MetaMaskSDKConstructor } = imports + const { createEVMClient, getInfuraRpcUrls } = imports - sdk = new MetaMaskSDKConstructor({ - ...options, - dappMetadata: { - name: options.dappMetadata?.name || name || '', - url: options.dappMetadata?.url || window.location.origin, - base64Icon: appLogoUrl - }, - _source: 'web3-onboard' + const { name, icon } = appMetadata || {} + + const evmOptions = mapLegacyOptions({ + options, + getInfuraRpcUrls, + fallbackName: name, + fallbackIconUrl: isHttpUrl(icon) ? icon : undefined, + chains }) - await sdk.init() - const provider = sdk.getProvider() + client = await createEVMClient(evmOptions) - if (provider) { - ;(provider as any).disconnect = () => { - sdk?.terminate() - } - } - + const provider = client.getProvider() + attachDisconnectShim(provider) return { - provider, - instance: sdk + provider: provider as any, + instance: client } } } } } +function attachDisconnectShim(provider: unknown): void { + // Web3-Onboard expects a `disconnect` method on the provider so it can + // tear down the wallet session when the user disconnects from the dapp. + // The MetaMask Connect EVM client exposes this via `client.disconnect()`. + ;(provider as { disconnect?: () => void }).disconnect = () => { + void client?.disconnect() + } +} + +/** + * Build a `{ '0xHexChainId': rpcUrl }` map from web3-onboard's `chains` + * config, normalizing chain IDs to lower-case hex (the format + * `@metamask/connect-evm` expects). + */ +function chainsToRpcMap(chains: Chain[]): Record { + const map: Record = {} + for (const chain of chains) { + if (!chain.rpcUrl) continue + const hexId = toHexChainId(chain.id) + if (!hexId) continue + map[hexId] = chain.rpcUrl + } + return map +} + +function toHexChainId(id: string | number): string | null { + if (typeof id === 'number') { + return Number.isFinite(id) ? `0x${id.toString(16)}` : null + } + const trimmed = id.trim().toLowerCase() + if (trimmed.startsWith('0x')) return trimmed + if (/^\d+$/.test(trimmed)) { + return `0x${BigInt(trimmed).toString(16)}` + } + return null +} + +function isHttpUrl(value: unknown): value is string { + return typeof value === 'string' && /^https?:\/\//i.test(value.trim()) +} + +function normalizeReadonlyRPCMap( + map: Record | undefined +): Record { + if (!map) return {} + const normalized: Record = {} + for (const [key, value] of Object.entries(map)) { + const hexId = toHexChainId(key) + if (!hexId) continue + normalized[hexId] = value + } + return normalized +} + +function mapLegacyOptions({ + options, + getInfuraRpcUrls, + fallbackName, + fallbackIconUrl, + chains +}: { + options: Partial + getInfuraRpcUrls: typeof GetInfuraRpcUrlsFn + fallbackName?: string + fallbackIconUrl?: string + chains: Chain[] +}): EvmClientOptions { + // `api.supportedNetworks` must be a non-empty `Record`. + // We derive it from (in priority order): + // 1. `options.infuraAPIKey` -> `getInfuraRpcUrls` + // 2. RPC URLs of the chains web3-onboard itself was configured with + // 3. `options.readonlyRPCMap` (keys normalized to hex) + // 4. A public Mainnet RPC, so the client always has at least one chain. + const fromInfura = + typeof options.infuraAPIKey === 'string' && options.infuraAPIKey + ? getInfuraRpcUrls({ infuraApiKey: options.infuraAPIKey }) + : {} + + const fromChains = chainsToRpcMap(chains) + const fromReadonly = normalizeReadonlyRPCMap(options.readonlyRPCMap) + + const supportedNetworks: Record = { + ...fromInfura, + ...fromChains, + ...fromReadonly + } + + if (Object.keys(supportedNetworks).length === 0) { + supportedNetworks['0x1'] = FALLBACK_MAINNET_RPC + } + + // Resolve dapp icon metadata. Connect EVM accepts either `iconUrl` (an + // http(s) URL) or `base64Icon` (a base64-encoded string up to ~163KB). + // The dapp metadata is embedded in mobile connection requests and + // compressed into the QR/deeplink payload, so inlining a large SVG via + // `base64Icon` can overflow the QR capacity. We therefore only pass an + // explicit icon when the integrator supplies one through + // `options.dappMetadata`, or when web3-onboard's `appMetadata.icon` is + // already an http(s) URL (forwarded via `iconUrl`). Raw SVG strings from + // `appMetadata.icon` are intentionally dropped — Connect EVM falls back + // to the page favicon in that case. + const iconField: { iconUrl?: string } | { base64Icon?: string } = + typeof options.dappMetadata?.base64Icon === 'string' + ? { base64Icon: options.dappMetadata.base64Icon } + : isHttpUrl(options.dappMetadata?.iconUrl) + ? { iconUrl: options.dappMetadata!.iconUrl } + : fallbackIconUrl + ? { iconUrl: fallbackIconUrl } + : {} + + const evmOptions: EvmClientOptions = { + dapp: { + name: options.dappMetadata?.name || fallbackName || '', + url: options.dappMetadata?.url || window.location.origin, + ...iconField + }, + api: { + supportedNetworks: supportedNetworks as Record<`0x${string}`, string> + } + } + + // Build the `ui` block. + // + // - The legacy `extensionOnly` option is intentionally only honored when + // set to `true`, mapping to `preferExtension: true`. The legacy default + // (`false`) meant "fall back to mobile/QR if no extension"; in the new + // client that behavior is the default of `preferExtension: true` (use + // the extension when present, otherwise the modal). Mapping + // `extensionOnly: false` to `preferExtension: false` would force the + // install/QR modal to open even when the extension is installed, which + // matches what users have been reporting. + // - `showInstallModal` defaults to `false` because web3-onboard already + // renders its own connect modal; layering the MetaMask install modal on + // top breaks click-through. + evmOptions.ui = { + ...(typeof options.headless === 'boolean' + ? { headless: options.headless } + : {}), + ...(options.extensionOnly === true ? { preferExtension: true } : {}), + showInstallModal: + typeof options.showInstallModal === 'boolean' + ? options.showInstallModal + : false + } + + if ( + typeof options.openDeeplink === 'function' || + typeof options.useDeeplink === 'boolean' + ) { + evmOptions.mobile = { + ...(typeof options.openDeeplink === 'function' + ? { preferredOpenLink: options.openDeeplink } + : {}), + ...(typeof options.useDeeplink === 'boolean' + ? { useDeeplink: options.useDeeplink } + : {}) + } + } + + return evmOptions +} + export default metamask diff --git a/yarn.lock b/yarn.lock index b5c8313dd..9bd72332c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1028,6 +1028,11 @@ resolved "https://registry.yarnpkg.com/@ecies/ciphers/-/ciphers-0.2.2.tgz#82a15b10a6e502b63fb30915d944b2eaf3ff17ff" integrity sha512-ylfGR7PyTd+Rm2PqQowG08BCKA22QuX8NzrL+LxAAvazN10DMwdJ2fWwAzRj05FI/M8vNFGm3cv9Wq/GFWCBLg== +"@ecies/ciphers@^0.2.5": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@ecies/ciphers/-/ciphers-0.2.6.tgz#e7cdc4688de3c224e03d479e3227bcece44cbeab" + integrity sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g== + "@emotion/is-prop-valid@1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" @@ -2868,6 +2873,45 @@ "@metamask/utils" "^8.0.0" superstruct "^1.0.3" +"@metamask/analytics@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@metamask/analytics/-/analytics-0.5.0.tgz#6dd79f5b399fd4653e2e2d31fc762c8821cb5881" + integrity sha512-BXY7frsjCg1eJcxj7DAqFXyrECYspCVC8+inKfTC/IdW5i4wrMFei02VthnRvLjXAUNZ4c/i4NZvL9DT6HxOnw== + dependencies: + openapi-fetch "^0.13.5" + +"@metamask/connect-evm@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@metamask/connect-evm/-/connect-evm-1.3.1.tgz#fe68311540cf0d52d1fa72ea58b016aa55833262" + integrity sha512-PYUtAXdd0o9tmihavjOnY9skr/PzJf7Yo2VsM3635r98+ce2HC/OeLFI2bO7N7gFOCbYU+PtL+2aE9xNJALEFA== + dependencies: + "@metamask/analytics" "^0.5.0" + "@metamask/connect-multichain" "^0.14.0" + "@metamask/utils" "^11.8.1" + +"@metamask/connect-multichain@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@metamask/connect-multichain/-/connect-multichain-0.14.0.tgz#40c71f71260caea1900eb44eef6b24d75a79cd43" + integrity sha512-G1bOsOBF7Xy269fbiD+zdTX5wv2sAKEICUafOj51TK4uRGIo8vHWuGdqP1sxfrutCRo3SmqjF4mAI9n8UijuFQ== + dependencies: + "@metamask/analytics" "^0.5.0" + "@metamask/mobile-wallet-protocol-core" "^0.4.0" + "@metamask/mobile-wallet-protocol-dapp-client" "^0.3.0" + "@metamask/multichain-api-client" "^0.10.1" + "@metamask/multichain-ui" "^0.4.1" + "@metamask/onboarding" "^1.0.1" + "@metamask/rpc-errors" "^7.0.3" + "@metamask/utils" "^11.8.1" + "@paulmillr/qr" "^0.2.1" + bowser "^2.11.0" + buffer "^6.0.3" + cross-fetch "^4.1.0" + eciesjs "0.4.17" + eventemitter3 "^5.0.1" + pako "^2.1.0" + uuid "^11.1.0" + ws "^8.18.3" + "@metamask/eth-json-rpc-middleware@^12.0.0": version "12.1.0" resolved "https://registry.yarnpkg.com/@metamask/eth-json-rpc-middleware/-/eth-json-rpc-middleware-12.1.0.tgz#237f018a1a3c99297fcb5a8263b6c669379b168c" @@ -2940,6 +2984,38 @@ "@metamask/utils" "^8.3.0" readable-stream "^3.6.2" +"@metamask/mobile-wallet-protocol-core@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@metamask/mobile-wallet-protocol-core/-/mobile-wallet-protocol-core-0.4.0.tgz#05ef73ed3a70f7c96f0cba4e461c461e7357317a" + integrity sha512-rB1wMogvSUsFaxyH/eVUCczIkTxVaPPETlD/wgm+gw7EbWP0LlZPY7Bh+DICSfUCJ0zqnoFuwr77WNJvZ6ZiWw== + dependencies: + async-mutex "^0.5.0" + centrifuge "^5.3.5" + eventemitter3 "^5.0.1" + uuid "^11.1.0" + +"@metamask/mobile-wallet-protocol-dapp-client@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@metamask/mobile-wallet-protocol-dapp-client/-/mobile-wallet-protocol-dapp-client-0.3.0.tgz#0fbb5757219edaaaa51ca52e1c9ed91f8278c282" + integrity sha512-rXStrvIa57a8OaeM+3HeR6Z9ETHOvmQi/9s6CLplDwH2hn2MWjI6WW3EUrxq2KGmGuhbO5Oo21ANnD23QKfduw== + dependencies: + "@metamask/mobile-wallet-protocol-core" "^0.4.0" + "@metamask/utils" "^9.1.0" + uuid "^11.1.0" + +"@metamask/multichain-api-client@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@metamask/multichain-api-client/-/multichain-api-client-0.10.1.tgz#b5f891a2c9783b8ebb9f097a04c89939b790545a" + integrity sha512-LsqO2SiDcTgOuXyVYEB0zgBaVNhryhP2tYI3L7tLa7PoeDqMkNIreFhDeu8jM5tPWkCimQvMwCkG3DF4P5dD3A== + +"@metamask/multichain-ui@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@metamask/multichain-ui/-/multichain-ui-0.4.1.tgz#cc832e12a0507d5153bb9401ae9aa6665b7d8b16" + integrity sha512-tJgTot8Pfkda895A6biJu7rE+jlQdVCNVzGgW+2wM9aFG20G+GEbQy3KO7uC4ImUvaKV4SyJ45r6Ir/Yf55mqw== + dependencies: + "@paulmillr/qr" "^0.2.1" + qr-code-styling "^1.9.2" + "@metamask/object-multiplex@^1.1.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@metamask/object-multiplex/-/object-multiplex-1.2.0.tgz#38fc15c142f61939391e1b9a8eed679696c7e4f4" @@ -3024,6 +3100,14 @@ "@metamask/utils" "^8.3.0" fast-safe-stringify "^2.0.6" +"@metamask/rpc-errors@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-7.0.3.tgz#68fe7d1dcb7913c7e89ec48f549e2ab498ecff14" + integrity sha512-nrEaeBawm8yFU7hetJKok/CUs0tQsWtTqp3OLbFhPUMXYqU7uI5LAV5vi9o7rTjFkUyof7Nzbw5bea5+1ou+dg== + dependencies: + "@metamask/utils" "^11.4.2" + fast-safe-stringify "^2.0.6" + "@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" @@ -3050,17 +3134,6 @@ utf-8-validate "^5.0.2" uuid "^8.3.2" -"@metamask/sdk-communication-layer@0.32.0": - version "0.32.0" - resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.32.0.tgz#89710e807806836138ea5018b087731d6acab627" - integrity sha512-dmj/KFjMi1fsdZGIOtbhxdg3amxhKL/A5BqSU4uh/SyDKPub/OT+x5pX8bGjpTL1WPWY/Q0OIlvFyX3VWnT06Q== - dependencies: - bufferutil "^4.0.8" - date-fns "^2.29.3" - debug "^4.3.4" - utf-8-validate "^5.0.2" - uuid "^8.3.2" - "@metamask/sdk-install-modal-web@0.31.5": version "0.31.5" resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.31.5.tgz#b5e903b63f936b9ae795f31137b4c9f0873c382d" @@ -3068,13 +3141,6 @@ dependencies: "@paulmillr/qr" "^0.2.1" -"@metamask/sdk-install-modal-web@0.32.0": - version "0.32.0" - resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.32.0.tgz#86f80420ca364fa0d7710016fa5c81f95537ab23" - integrity sha512-TFoktj0JgfWnQaL3yFkApqNwcaqJ+dw4xcnrJueMP3aXkSNev2Ido+WVNOg4IIMxnmOrfAC9t0UJ0u/dC9MjOQ== - dependencies: - "@paulmillr/qr" "^0.2.1" - "@metamask/sdk@0.31.5": version "0.31.5" resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.31.5.tgz#804b68382d9f4c74ab0296f1b5c54143622ef2c8" @@ -3100,30 +3166,27 @@ util "^0.12.4" uuid "^8.3.2" -"@metamask/sdk@^0.32.0": - version "0.32.0" - resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.32.0.tgz#f0e179746fe69dccd032a9026884b45b519c1975" - integrity sha512-WmGAlP1oBuD9hk4CsdlG1WJFuPtYJY+dnTHJMeCyohTWD2GgkcLMUUuvu9lO1/NVzuOoSi1OrnjbuY1O/1NZ1g== +"@metamask/superstruct@^3.1.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@metamask/superstruct/-/superstruct-3.2.1.tgz#fca933017c5b78529f8f525560cef32c57e889d2" + integrity sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g== + +"@metamask/utils@^11.4.2", "@metamask/utils@^11.8.1": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-11.11.0.tgz#6675946df767da6cbe306c7b5e76685320a6c826" + integrity sha512-0nF2CWjWQr/m0Y2t2lJnBTU1/CZPPTvKvcESLplyWe/tyeb8zFOi/FeneDmaFnML6LYRIGZU6f+xR0jKAIUZfw== dependencies: - "@babel/runtime" "^7.26.0" - "@metamask/onboarding" "^1.0.1" - "@metamask/providers" "16.1.0" - "@metamask/sdk-communication-layer" "0.32.0" - "@metamask/sdk-install-modal-web" "0.32.0" - "@paulmillr/qr" "^0.2.1" - bowser "^2.9.0" - cross-fetch "^4.0.0" + "@ethereumjs/tx" "^4.2.0" + "@metamask/superstruct" "^3.1.0" + "@noble/hashes" "^1.3.1" + "@scure/base" "^1.1.3" + "@types/debug" "^4.1.7" + "@types/lodash" "^4.17.20" debug "^4.3.4" - eciesjs "^0.4.11" - eth-rpc-errors "^4.0.3" - eventemitter2 "^6.4.9" - obj-multiplex "^1.0.0" - pump "^3.0.0" - readable-stream "^3.6.2" - socket.io-client "^4.5.1" - tslib "^2.6.0" - util "^0.12.4" - uuid "^8.3.2" + lodash "^4.17.21" + pony-cause "^2.1.10" + semver "^7.5.4" + uuid "^9.0.1" "@metamask/utils@^5.0.0", "@metamask/utils@^5.0.1": version "5.0.2" @@ -3165,6 +3228,21 @@ semver "^7.5.4" superstruct "^1.0.3" +"@metamask/utils@^9.1.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-9.3.0.tgz#4726bd7f5d6a43ea8425b6d663ab9207f617c2d1" + integrity sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g== + dependencies: + "@ethereumjs/tx" "^4.2.0" + "@metamask/superstruct" "^3.1.0" + "@noble/hashes" "^1.3.1" + "@scure/base" "^1.1.3" + "@types/debug" "^4.1.7" + debug "^4.3.4" + pony-cause "^2.1.10" + semver "^7.5.4" + uuid "^9.0.1" + "@mobily/ts-belt@^3.13.1": version "3.13.1" resolved "https://registry.yarnpkg.com/@mobily/ts-belt/-/ts-belt-3.13.1.tgz#8f8ce2a2eca41d88c2ca70c84d0f47d0f7f5cd5f" @@ -3386,7 +3464,7 @@ dependencies: "@noble/hashes" "1.8.0" -"@noble/curves@1.9.7", "@noble/curves@^1.9.1", "@noble/curves@~1.9.0": +"@noble/curves@1.9.7", "@noble/curves@^1.9.1", "@noble/curves@^1.9.7", "@noble/curves@~1.9.0": version "1.9.7" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951" integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== @@ -3656,6 +3734,11 @@ resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== +"@protobufjs/codegen@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.5.tgz#d9315ad7cf3f30aac70bda3c068443dc6f143659" + integrity sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g== + "@protobufjs/eventemitter@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" @@ -3679,6 +3762,11 @@ resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== +"@protobufjs/inquire@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.1.tgz#6cb936f4ac50965230af1e9d0bbfd57ea3675aa4" + integrity sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew== + "@protobufjs/path@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" @@ -3694,6 +3782,11 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@protobufjs/utf8@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.1.tgz#eaee5900122c110a3dbcb728c0597014a2621774" + integrity sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg== + "@ramp-network/ramp-instant-sdk@^4.0.5": version "4.0.7" resolved "https://registry.yarnpkg.com/@ramp-network/ramp-instant-sdk/-/ramp-instant-sdk-4.0.7.tgz#a474ec091afef5a2f3aa37c8bbc90dfff9aa880e" @@ -5691,6 +5784,11 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== +"@types/lodash@^4.17.20": + version "4.17.24" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.24.tgz#4ae334fc62c0e915ca8ed8e35dcc6d4eeb29215f" + integrity sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ== + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -8737,6 +8835,14 @@ cbor-web@8.1.0: preact "^10.16.0" sha.js "^2.4.11" +centrifuge@^5.3.5: + version "5.5.3" + resolved "https://registry.yarnpkg.com/centrifuge/-/centrifuge-5.5.3.tgz#d08155a950b81d2fce3a6309d2f2a611a5642da4" + integrity sha512-LPkWnsAxu7JaE5S738XiREzJIko3Pf/qnWb3kd0q/OR0OJONUbSdnZ5pKsEI2yFi/odQ89SYsHPhLuEeZFhp/g== + dependencies: + events "^3.3.0" + protobufjs "^7.2.5" + chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -9246,6 +9352,13 @@ cross-fetch@^4.0.0: dependencies: node-fetch "^2.6.12" +cross-fetch@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.1.0.tgz#8f69355007ee182e47fa692ecbaa37a52e43c3d2" + integrity sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw== + dependencies: + node-fetch "^2.7.0" + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -9792,6 +9905,16 @@ eccrypto@1.1.6, eccrypto@^1.1.6: optionalDependencies: secp256k1 "3.7.1" +eciesjs@0.4.17: + version "0.4.17" + resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.4.17.tgz#5aca58bf8c794ec6cf971ce51b10c8d21292189a" + integrity sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w== + dependencies: + "@ecies/ciphers" "^0.2.5" + "@noble/ciphers" "^1.3.0" + "@noble/curves" "^1.9.7" + "@noble/hashes" "^1.8.0" + eciesjs@^0.4.11: version "0.4.13" resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.4.13.tgz#89fbe2bc37d6dced8c3d1bccac21cceb20bcdcf3" @@ -14068,6 +14191,18 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" +openapi-fetch@^0.13.5: + version "0.13.8" + resolved "https://registry.yarnpkg.com/openapi-fetch/-/openapi-fetch-0.13.8.tgz#1769da06e30d19f7568cd0e60db8ca61ea83a2fa" + integrity sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ== + dependencies: + openapi-typescript-helpers "^0.0.15" + +openapi-typescript-helpers@^0.0.15: + version "0.0.15" + resolved "https://registry.yarnpkg.com/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz#96ffa762a5e01ef66a661b163d5f1109ed1967ed" + integrity sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw== + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -14234,6 +14369,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pako@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -14655,6 +14795,24 @@ protobufjs@7.4.0: "@types/node" ">=13.7.0" long "^5.0.0" +protobufjs@^7.2.5: + version "7.5.6" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.6.tgz#11af832ebc4b4326f658a5b1308e6141eb57edfd" + integrity sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.5" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.1" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.1" + "@types/node" ">=13.7.0" + long "^5.0.0" + protocol-buffers-encodings@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/protocol-buffers-encodings/-/protocol-buffers-encodings-1.1.1.tgz#f1e4a386711823137330171d2c82b49d062e75d3" @@ -14747,6 +14905,13 @@ pushdata-bitcoin@^1.0.1: dependencies: bitcoin-ops "^1.3.0" +qr-code-styling@^1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/qr-code-styling/-/qr-code-styling-1.9.2.tgz#071714860a7e59829e8822c9575e989042139d2d" + integrity sha512-RgJaZJ1/RrXJ6N0j7a+pdw3zMBmzZU4VN2dtAZf8ZggCfRB5stEQ3IoDNGaNhYY3nnZKYlYSLl5YkfWN5dPutg== + dependencies: + qrcode-generator "^1.4.4" + qr.js@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f" @@ -14757,6 +14922,11 @@ qrcode-generator@^1.4.1: resolved "https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz#63f771224854759329a99048806a53ed278740e7" integrity sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw== +qrcode-generator@^1.4.4: + version "1.5.2" + resolved "https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.5.2.tgz#43faea8061a60d2b4ca5e9b0c0c0fb99e2d93e3a" + integrity sha512-pItrW0Z9HnDBnFmgiNrY1uxRdri32Uh9EjNYLPVC2zZ3ZRIIEqBoDgm4DkvDwNNDHTK7FNkmr8zAa77BYc9xNw== + qrcode-with-logos@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/qrcode-with-logos/-/qrcode-with-logos-1.1.1.tgz#87b04fb2606b81391c94b60cd600c9c81fb1adec" @@ -17278,6 +17448,11 @@ uuid@9.0.1, uuid@^9.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== +uuid@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz#f6d81d2e1c65d00762e5e29b16c5d2d995e208ad" + integrity sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ== + uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -18868,6 +19043,11 @@ ws@^7.5.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== +ws@^8.18.3: + version "8.20.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.0.tgz#4cd9532358eba60bc863aad1623dfb045a4d4af8" + integrity sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA== + ws@^8.4.2: version "8.5.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"