From 935b78be5450337a0d86ab15507db6a9811eac99 Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Fri, 10 Mar 2023 09:31:59 -0500 Subject: [PATCH 01/11] move third party wallet connections to sdk --- package.json | 1 + packages/@magic-sdk/provider/package.json | 2 + .../provider/src/core/sdk-environment.ts | 2 + packages/@magic-sdk/provider/src/core/sdk.ts | 7 +- .../@magic-sdk/provider/src/modules/wallet.ts | 261 ++- .../wallet/autoConnectIfWalletBrowser.spec.ts | 69 + .../wallet/connectToCoinbaseWallet.spec.ts | 41 + .../modules/wallet/connectToMetaMask.spec.ts | 27 + .../wallet/connectToThirdPartyWallet.spec.ts | 86 + .../wallet/connectToWalletConnect.spec.ts | 33 + .../spec/modules/wallet/connectWithUI.spec.ts | 26 +- .../spec/modules/wallet/disconnect.spec.ts | 8 +- .../wallet/getCoinbaseProvider.spec.ts | 46 + .../test/spec/modules/wallet/getInfo.spec.ts | 16 +- .../wallet/getMetaMaskProvider.spec.ts | 67 + .../spec/modules/wallet/getProvider.spec.ts | 14 + .../spec/modules/wallet/getUserEnv.spec.ts | 40 + .../wallet/getWalletConnectProvider.spec.ts | 34 + .../wallet/isCoinbaseWalletBrowser.spec.ts | 32 + .../wallet/isCoinbaseWalletInstalled.spec.ts | 65 + .../modules/wallet/isMetaMaskBrowser.spec.ts | 66 + .../wallet/isMetaMaskInstalled.spec.ts | 65 + .../test/spec/modules/wallet/isMobile.spec.ts | 26 + .../types/src/core/json-rpc-types.ts | 28 + .../src/core/third-party-wallet-options.ts | 69 + packages/@magic-sdk/types/src/index.ts | 1 + scripts/utils/esbuild.ts | 3 +- yarn.lock | 1606 ++++++++++++++++- 28 files changed, 2618 insertions(+), 123 deletions(-) create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/autoConnectIfWalletBrowser.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/connectToCoinbaseWallet.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/connectToMetaMask.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/connectToWalletConnect.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getMetaMaskProvider.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getUserEnv.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletBrowser.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletInstalled.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskBrowser.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskInstalled.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/isMobile.spec.ts create mode 100644 packages/@magic-sdk/types/src/core/third-party-wallet-options.ts diff --git a/package.json b/package.json index c62bc536f..862501c7d 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "postinstall": "husky install && lerna link" }, "devDependencies": { + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "@ikscodes/browser-env": "~0.3.1", "@ikscodes/eslint-config": "~7.0.2", "@ikscodes/prettier-config": "~2.0.1", diff --git a/packages/@magic-sdk/provider/package.json b/packages/@magic-sdk/provider/package.json index c981e4c24..c7a1acfbd 100644 --- a/packages/@magic-sdk/provider/package.json +++ b/packages/@magic-sdk/provider/package.json @@ -34,7 +34,9 @@ "tslib": "^2.3.1" }, "dependencies": { + "@coinbase/wallet-sdk": "3.6.3", "@magic-sdk/types": "^11.6.0", + "@walletconnect/web3-provider": "^1.8.0", "eventemitter3": "^4.0.4", "web3-core": "1.5.2" }, diff --git a/packages/@magic-sdk/provider/src/core/sdk-environment.ts b/packages/@magic-sdk/provider/src/core/sdk-environment.ts index 3ae3637c5..8f3d866ae 100644 --- a/packages/@magic-sdk/provider/src/core/sdk-environment.ts +++ b/packages/@magic-sdk/provider/src/core/sdk-environment.ts @@ -1,3 +1,4 @@ +import type { ThirdPartyWalletOptions } from '@magic-sdk/types'; import type localForage from 'localforage'; import type { ViewController } from './view-controller'; import type { SDKBase } from './sdk'; @@ -17,6 +18,7 @@ export interface SDKEnvironment { ViewController: ConstructorOf; configureStorage: () => Promise; bundleId?: string | null; + thirdPartyWalletOptions?: ThirdPartyWalletOptions; } export const SDKEnvironment: SDKEnvironment = {} as any; diff --git a/packages/@magic-sdk/provider/src/core/sdk.ts b/packages/@magic-sdk/provider/src/core/sdk.ts index a50999340..391156b3f 100644 --- a/packages/@magic-sdk/provider/src/core/sdk.ts +++ b/packages/@magic-sdk/provider/src/core/sdk.ts @@ -1,6 +1,6 @@ /* eslint-disable no-param-reassign */ -import { EthNetworkConfiguration, QueryParameters, SupportedLocale } from '@magic-sdk/types'; +import { EthNetworkConfiguration, QueryParameters, SupportedLocale, ThirdPartyWalletOptions } from '@magic-sdk/types'; import type { AbstractProvider } from 'web3-core'; import { coerce, satisfies } from '../util/semver'; import { encodeJSON } from '../util/base64-json'; @@ -94,6 +94,7 @@ export interface MagicSDKAdditionalConfiguration< network?: EthNetworkConfiguration; extensions?: TExt; testMode?: boolean; + thirdPartyWalletOptions?: ThirdPartyWalletOptions | undefined; } export class SDKBase { @@ -102,6 +103,7 @@ export class SDKBase { protected readonly endpoint: string; protected readonly parameters: string; public readonly testMode: boolean; + public readonly thirdPartyWalletOptions: ThirdPartyWalletOptions | undefined; /** * Contains methods for starting a Magic SDK authentication flow. @@ -136,9 +138,10 @@ export class SDKBase { createReactNativeEndpointConfigurationWarning().log(); } - const { defaultEndpoint, version } = SDKEnvironment; + const { defaultEndpoint, version, thirdPartyWalletOptions } = SDKEnvironment; this.testMode = !!options?.testMode; this.endpoint = createURL(options?.endpoint ?? defaultEndpoint).origin; + this.thirdPartyWalletOptions = thirdPartyWalletOptions || options?.thirdPartyWalletOptions; // Prepare built-in modules this.auth = new AuthModule(this); diff --git a/packages/@magic-sdk/provider/src/modules/wallet.ts b/packages/@magic-sdk/provider/src/modules/wallet.ts index e58fef080..7782b0209 100644 --- a/packages/@magic-sdk/provider/src/modules/wallet.ts +++ b/packages/@magic-sdk/provider/src/modules/wallet.ts @@ -1,37 +1,280 @@ -import { MagicPayloadMethod, RequestUserInfoScope, UserInfo, WalletInfo } from '@magic-sdk/types'; +import WalletConnectProvider from '@walletconnect/web3-provider'; +import { CoinbaseWalletProvider, CoinbaseWalletSDK } from '@coinbase/wallet-sdk'; +import { + Errors, + Events, + MagicPayloadMethod, + RequestUserInfoScope, + UserEnv, + UserInfo, + WalletInfo, + Wallets, +} from '@magic-sdk/types'; + import { BaseModule } from './base-module'; import { createJsonRpcRequestPayload } from '../core/json-rpc'; import { clearKeys } from '../util/web-crypto'; +import { setItem, getItem, removeItem } from '../util/storage'; export class WalletModule extends BaseModule { /* Prompt Magic's Login Form */ - public connectWithUI() { - const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.RequestAccounts); - return this.request(requestPayload); + public async connectWithUI() { + // If within metamask wallet browser, auto-connect without any UI (if dapp has metamask enabled) + if (this.isMetaMaskBrowser()) { + try { + const isMetaMaskEnabledPayload = createJsonRpcRequestPayload('mc_is_wallet_enabled', [ + { wallet: Wallets.MetaMask }, + ]); + const isMetaMaskEnabled = await this.request(isMetaMaskEnabledPayload); + if (isMetaMaskEnabled) { + return this.autoConnectIfWalletBrowser(Wallets.MetaMask); + } + // If not enabled, continue with normal flow + } catch (error) { + console.error(error); + } + } + // If within coinbase wallet browser, auto-connect without any UI (if dapp has coinbase enabled) + if (this.isCoinbaseWalletBrowser()) { + try { + const isCoinbaseWalletEnabledPayload = createJsonRpcRequestPayload('mc_is_wallet_enabled', [ + { wallet: Wallets.CoinbaseWallet }, + ]); + const isCoinbaseWalletEnabled = await this.request(isCoinbaseWalletEnabledPayload); + if (isCoinbaseWalletEnabled) { + return this.autoConnectIfWalletBrowser(Wallets.CoinbaseWallet); + } + // If not enabled, continue with normal flow + } catch (error) { + console.error(error); + } + } + + const userEnv = this.getUserEnv(); + const loginRequestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.Login, [userEnv]); + const loginRequest = this.request(loginRequestPayload); + + loginRequest.on(Events.WalletSelected as any, async (params: { wallet: Wallets; showModal: boolean }) => { + try { + const address = await this.connectToThirdPartyWallet(params.wallet, loginRequestPayload.id, params.showModal); + await setItem(this.localForageKey, params.wallet); + this.createIntermediaryEvent(Events.WalletConnected as any, loginRequestPayload.id as any)(address); + } catch (error) { + this.createIntermediaryEvent(Events.WalletRejected as any, loginRequestPayload.id as any)(); + } + }); + + return loginRequest; + } + + /* Returns the provider for the connected wallet */ + public async getProvider(): Promise { + const activeWallet = await getItem(this.localForageKey); + switch (activeWallet) { + case Wallets.MetaMask: + return this.getMetaMaskProvider(); + case Wallets.WalletConnect: + if (!this.sdk.thirdPartyWalletOptions?.walletConnect) { + throw new Error(Errors.WalletConnectError); + } + return this.getWalletConnectProvider(false); + case Wallets.CoinbaseWallet: + if (!this.sdk.thirdPartyWalletOptions?.coinbaseWallet) { + throw new Error(Errors.CoinbaseWalletError); + } + return this.getCoinbaseProvider().provider; + default: + return this.sdk.rpcProvider; + } } /* Prompt Magic's Wallet UI (not available for users logged in with third party wallets) */ - public showUI() { + public showUI(): Promise { const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.ShowUI); return this.request(requestPayload); } /* Get user info such as the wallet type they are logged in with */ - public getInfo() { - const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.GetInfo); + public async getInfo(): Promise { + const activeWallet = await getItem(this.localForageKey); + const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.GetInfo, [{ walletType: activeWallet }]); return this.request(requestPayload); } /* Request email address from logged in user */ - public requestUserInfoWithUI(scope?: RequestUserInfoScope) { + public requestUserInfoWithUI(scope?: RequestUserInfoScope): Promise { const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.RequestUserInfoWithUI, scope ? [scope] : []); return this.request(requestPayload); } /* Logout user */ - public disconnect() { + public async disconnect(): Promise { clearKeys(); + const activeWallet = await getItem(this.localForageKey); + if (activeWallet === Wallets.WalletConnect) { + const provider = await this.getWalletConnectProvider(false); + provider.disconnect(); + } + if (activeWallet === Wallets.CoinbaseWallet) { + const coinbase = this.getCoinbaseProvider(); + coinbase.provider.disconnect(); + } + removeItem(this.localForageKey); const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.Disconnect); return this.request(requestPayload); } + + /* Private methods */ + private localForageKey = 'mc_active_wallet'; + + /* MetaMask */ + private isMetaMaskInstalled(): boolean { + return ( + (window as any).ethereum?.isMetaMask || + !!(window as any).ethereum?.providers?.find((provider: any) => provider?.isMetaMask) + ); + } + + private isMetaMaskBrowser(): boolean { + return this.isMobile() && this.isMetaMaskInstalled(); + } + + private getMetaMaskProvider(): any { + return (window as any).ethereum?.providers?.find((p: any) => p?.isMetaMask) || (window as any).ethereum; + } + + private connectToMetaMask(): Promise { + // Redirect to MetaMask app if user selects MetaMask on mobile + if (this.isMobile() && !this.isMetaMaskInstalled()) { + const metaMaskDeepLink = `https://metamask.app.link/dapp/${window.location.href.replace(/(^\w+:|^)\/\//, '')}`; + window.location.href = metaMaskDeepLink; + } + return this.getMetaMaskProvider().request({ method: 'eth_requestAccounts' }); + } + + /* Wallet Connect */ + private async getWalletConnectProvider(showModal: boolean): Promise { + const providerConfig = this.sdk.thirdPartyWalletOptions?.walletConnect; + if (!providerConfig) { + throw new Error(Errors.WalletConnectError); + } + const provider = new WalletConnectProvider({ + ...(providerConfig as any), + qrcode: showModal, + }); + const activeWallet = await getItem(this.localForageKey); + const isConnected = localStorage.getItem('walletconnect'); + // Only enable Wallet Connect provider if wallet is still connected + if (activeWallet && isConnected) { + await provider.enable(); + } + return provider; + } + + private async connectToWalletConnect(payloadId: any, showModal?: boolean): Promise { + if (!this.sdk.thirdPartyWalletOptions?.walletConnect) { + throw new Error(Errors.WalletConnectError); + } + const provider = await this.getWalletConnectProvider(!!showModal); + provider.connector.on(Events.DisplayUri, (err, payload: any) => { + if (!showModal) { + const uri = payload.params[0]; + this.createIntermediaryEvent(Events.Uri as any, payloadId)(uri); + } + }); + return provider.enable(); + } + + /* Coinbase Wallet */ + private isCoinbaseWalletInstalled(): boolean { + return ( + (window as any).ethereum?.isCoinbaseWallet || + !!(window as any).ethereum?.providers?.find((provider: any) => provider?.isCoinbaseWallet) + ); + } + + private isCoinbaseWalletBrowser(): boolean { + return !!(window as any).ethereum?.isCoinbaseBrowser; + } + + private getCoinbaseProvider(): { provider: CoinbaseWalletProvider; qrCodeUrl: string | null } { + const providerConfig = this.sdk.thirdPartyWalletOptions?.coinbaseWallet?.provider; + const sdkConfig = this.sdk.thirdPartyWalletOptions?.coinbaseWallet?.sdk; + if (!providerConfig || !sdkConfig) { + throw new Error(Errors.CoinbaseWalletError); + } + const coinbaseWallet = new CoinbaseWalletSDK({ + ...sdkConfig, + overrideIsMetaMask: false, + headlessMode: true, + }); + const qrCodeUrl = coinbaseWallet.getQrUrl(); + const provider = coinbaseWallet.makeWeb3Provider(providerConfig.jsonRpcUrl, providerConfig.chainId); + return { provider, qrCodeUrl }; + } + + private connectToCoinbaseWallet(payloadId: any): Promise { + // Redirect to Coinbase Wallet app if user selects Coinbase Wallet on mobile + if (this.isMobile() && !this.isCoinbaseWalletBrowser()) { + const coinbaseWalletDeepLink = `https://go.cb-w.com/dapp?cb_url=${encodeURIComponent(window.location.href)}`; + window.location.href = coinbaseWalletDeepLink; + } + if (!this.sdk.thirdPartyWalletOptions?.coinbaseWallet) { + throw new Error(Errors.CoinbaseWalletError); + } + const coinbase = this.getCoinbaseProvider(); + if (coinbase.qrCodeUrl) { + this.createIntermediaryEvent(Events.Uri as any, payloadId)(coinbase.qrCodeUrl); + } + return coinbase.provider.request({ method: 'eth_requestAccounts' }); + } + + /* Helpers */ + private isMobile(): boolean { + return /Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Silk|Opera Mini/i.test( + navigator.userAgent, + ); + } + + private getUserEnv(): UserEnv { + return { + env: { + isMetaMaskInstalled: this.isMetaMaskInstalled(), + isCoinbaseWalletInstalled: this.isCoinbaseWalletInstalled(), + }, + }; + } + + private connectToThirdPartyWallet(provider: Wallets, payloadId: any, showModal?: boolean): Promise { + switch (provider) { + case Wallets.MetaMask: + return this.connectToMetaMask(); + case Wallets.WalletConnect: + return this.connectToWalletConnect(payloadId, showModal); + case Wallets.CoinbaseWallet: + return this.connectToCoinbaseWallet(payloadId); + default: + throw new Error( + `Invalid provider: ${provider}. Must be one of "metamask", "coinbase_wallet", or "wallet_connect".`, + ); + } + } + + private async autoConnectIfWalletBrowser(wallet: Wallets): Promise { + let address; + try { + if (wallet === Wallets.MetaMask) { + address = await this.getMetaMaskProvider().request({ method: 'eth_requestAccounts' }); + } + if (wallet === Wallets.CoinbaseWallet) { + address = await this.getCoinbaseProvider().provider.request({ method: 'eth_requestAccounts' }); + } + await setItem(this.localForageKey, wallet); + } catch (error) { + console.error(error); + } + const autoConnectPayload = createJsonRpcRequestPayload(MagicPayloadMethod.AutoConnect, [{ wallet, address }]); + const autoConnectRequest = this.request(autoConnectPayload); + return autoConnectRequest; + } } diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/autoConnectIfWalletBrowser.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/autoConnectIfWalletBrowser.spec.ts new file mode 100644 index 000000000..54b2249a4 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/autoConnectIfWalletBrowser.spec.ts @@ -0,0 +1,69 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('If metamask browser, wallet and address params should be populated', async () => { + const provider = { + isMetaMask: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + }; + window.ethereum = provider; + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + await magic.wallet.autoConnectIfWalletBrowser('metamask'); + const requestPayload = magic.wallet.request.mock.calls[0][0]; + expect(requestPayload.method).toBe('mc_auto_connect'); + expect(requestPayload.params).toEqual([ + { wallet: 'metamask', address: ['0x0000000000000000000000000000000000000000'] }, + ]); +}); + +test('If coinbase browser, wallet and address params should be populated', async () => { + const provider = { + isCoinbaseBrowser: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + }; + window.ethereum = provider; + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + + magic.wallet.getCoinbaseProvider = jest.fn(() => ({ + provider: window.ethereum, + })); + await magic.wallet.autoConnectIfWalletBrowser('coinbase_wallet'); + const requestPayload = magic.wallet.request.mock.calls[0][0]; + expect(requestPayload.method).toBe('mc_auto_connect'); + expect(requestPayload.params).toEqual([ + { wallet: 'coinbase_wallet', address: ['0x0000000000000000000000000000000000000000'] }, + ]); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToCoinbaseWallet.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToCoinbaseWallet.spec.ts new file mode 100644 index 000000000..8c9637c8c --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToCoinbaseWallet.spec.ts @@ -0,0 +1,41 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Returns connected wallet address in array', async () => { + const provider = { + isCoinbaseBrowser: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + }; + window.ethereum = provider; + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + magic.wallet.getCoinbaseProvider = jest.fn(() => ({ + provider: window.ethereum, + })); + const response = await magic.wallet.connectToCoinbaseWallet(); + expect(response).toEqual(['0x0000000000000000000000000000000000000000']); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToMetaMask.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToMetaMask.spec.ts new file mode 100644 index 000000000..6ae7845bb --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToMetaMask.spec.ts @@ -0,0 +1,27 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +const address = '0x0000000000000000000000000000000000000000'; + +const provider = { + isMetaMask: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return [address]; + } + return ''; + }, +}; + +beforeEach(() => { + browserEnv.restore(); + window.ethereum = provider; +}); + +test('Returns connected wallet address in array', async () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = await magic.wallet.connectToMetaMask(); + expect(response).toEqual([address]); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet.spec.ts new file mode 100644 index 000000000..7eaa18ed1 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet.spec.ts @@ -0,0 +1,86 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Connects to metamask', async () => { + const address = '0x0000000000000000000000000000000000000000'; + const provider = { + isMetaMask: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return [address]; + } + return ''; + }, + }; + window.ethereum = provider; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = await magic.wallet.connectToThirdPartyWallet('metamask'); + expect(response).toEqual([address]); +}); + +test('Connects to coinbase_wallet', async () => { + const provider = { + isCoinbaseBrowser: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + }; + window.ethereum = provider; + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + magic.wallet.getCoinbaseProvider = jest.fn(() => ({ + provider: window.ethereum, + qrCodeUrl: 'abc', + })); + + const response = await magic.wallet.connectToThirdPartyWallet('coinbase_wallet'); + expect(response).toEqual(['0x0000000000000000000000000000000000000000']); +}); + +test('Connects to wallet_connect', async () => { + const provider = { + connector: { + on: () => null, + }, + enable: async () => { + return ['0x0000000000000000000000000000000000000000']; + }, + }; + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + walletConnect: { + rpc: { 5: 'https://rpc.ankr.com/eth_goerli' }, + }, + }, + }); + magic.wallet.request = jest.fn(); + magic.wallet.getWalletConnectProvider = jest.fn(() => provider); + + const response = await magic.wallet.connectToThirdPartyWallet('wallet_connect'); + expect(response).toEqual(['0x0000000000000000000000000000000000000000']); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToWalletConnect.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToWalletConnect.spec.ts new file mode 100644 index 000000000..40bd13b57 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToWalletConnect.spec.ts @@ -0,0 +1,33 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Returns connected wallet address in array', async () => { + const provider = { + connector: { + on: () => null, + }, + enable: async () => { + return ['0x0000000000000000000000000000000000000000']; + }, + }; + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + walletConnect: { + rpc: { 5: 'https://rpc.ankr.com/eth_goerli' }, + }, + }, + }); + magic.wallet.request = jest.fn(() => { + return { + on: () => null, + }; + }); + magic.wallet.getWalletConnectProvider = jest.fn(() => provider); + + const response = await magic.wallet.connectToWalletConnect(); + expect(response).toEqual(['0x0000000000000000000000000000000000000000']); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI.spec.ts index 85f3cd539..f48f3766c 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI.spec.ts @@ -1,23 +1,29 @@ import browserEnv from '@ikscodes/browser-env'; import { createMagicSDK } from '../../../factories'; -import { isPromiEvent } from '../../../../src/util'; beforeEach(() => { browserEnv.restore(); }); -test('Generate JSON RPC request payload with method `eth_requestAccounts`', async () => { +test('Generate JSON RPC request payload with method `mc_login` and `env` params as an object', async () => { const magic = createMagicSDK(); - magic.wallet.request = jest.fn(); + magic.wallet.request = jest.fn(() => { + return { + on: () => null, + }; + }); - magic.wallet.connectWithUI(); + await magic.wallet.connectWithUI(); const requestPayload = magic.wallet.request.mock.calls[0][0]; - expect(requestPayload.method).toBe('eth_requestAccounts'); - expect(requestPayload.params).toEqual([]); -}); -test('method should return a PromiEvent', () => { - const magic = createMagicSDK(); - expect(isPromiEvent(magic.wallet.connectWithUI())).toBeTruthy(); + expect(requestPayload.method).toBe('mc_login'); + expect(requestPayload.params).toEqual([ + { + env: { + isCoinbaseWalletInstalled: false, + isMetaMaskInstalled: false, + }, + }, + ]); }); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect.spec.ts index 43ecea538..a179b2fbe 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect.spec.ts @@ -1,6 +1,5 @@ import browserEnv from '@ikscodes/browser-env'; import { createMagicSDK } from '../../../factories'; -import { isPromiEvent } from '../../../../src/util'; beforeEach(() => { browserEnv.restore(); @@ -10,14 +9,9 @@ test('Generate JSON RPC request payload with method `mc_disconnect`', async () = const magic = createMagicSDK(); magic.wallet.request = jest.fn(); - magic.wallet.disconnect(); + await magic.wallet.disconnect(); const requestPayload = magic.wallet.request.mock.calls[0][0]; expect(requestPayload.method).toBe('mc_disconnect'); expect(requestPayload.params).toEqual([]); }); - -test('method should return a PromiEvent', () => { - const magic = createMagicSDK(); - expect(isPromiEvent(magic.wallet.disconnect())).toBeTruthy(); -}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider.spec.ts new file mode 100644 index 000000000..cb688443a --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider.spec.ts @@ -0,0 +1,46 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Fetches coinbase provider', async () => { + const provider = { + isCoinbaseBrowser: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + }; + window.ethereum = provider; + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + magic.wallet.getCoinbaseProvider = jest.fn(() => ({ + provider: window.ethereum, + qrCodeUrl: 'abc', + })); + + const response = magic.wallet.getCoinbaseProvider(); + expect(response).toEqual({ + provider: window.ethereum, + qrCodeUrl: 'abc', + }); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getInfo.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getInfo.spec.ts index cffb22839..908a029de 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/getInfo.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getInfo.spec.ts @@ -1,6 +1,5 @@ import browserEnv from '@ikscodes/browser-env'; import { createMagicSDK } from '../../../factories'; -import { isPromiEvent } from '../../../../src/util'; beforeEach(() => { browserEnv.restore(); @@ -10,14 +9,15 @@ test('Generate JSON RPC request payload with method `mc_get_wallet_info`', async const magic = createMagicSDK(); magic.wallet.request = jest.fn(); - magic.wallet.getInfo(); + jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: () => 'metamask', + }; + }); + + await magic.wallet.getInfo(); const requestPayload = magic.wallet.request.mock.calls[0][0]; expect(requestPayload.method).toBe('mc_get_wallet_info'); - expect(requestPayload.params).toEqual([]); -}); - -test('method should return a PromiEvent', () => { - const magic = createMagicSDK(); - expect(isPromiEvent(magic.wallet.getInfo())).toBeTruthy(); + expect(requestPayload.params).toEqual([{ walletType: 'metamask' }]); }); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getMetaMaskProvider.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getMetaMaskProvider.spec.ts new file mode 100644 index 000000000..2df2f8369 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getMetaMaskProvider.spec.ts @@ -0,0 +1,67 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Return undefined if MetaMask is not installed', async () => { + window.ethereum = undefined; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.getMetaMaskProvider(); + expect(response).toEqual(undefined); +}); + +test('Return provider if MetaMask is installed, and no other providers', async () => { + const provider = { + isMetaMask: true, + }; + window.ethereum = provider; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.getMetaMaskProvider(); + expect(response).toEqual(provider); +}); + +test('Return MetaMask provider if multiple providers found, and MetaMask is one of them', async () => { + const ethereum = { + providers: [ + { + isMetaMask: true, + }, + { + isCoinbaseWallet: true, + }, + ], + }; + (window as any).ethereum = ethereum; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.getMetaMaskProvider(); + expect(response).toEqual({ + isMetaMask: true, + }); +}); + +test('Return provider at window.ethereum if multiple providers found, and MetaMask is not one of them', async () => { + const ethereum = { + providers: [ + { + isAnotherWalletProvider: true, + }, + { + isCoinbaseWallet: true, + }, + ], + }; + (window as any).ethereum = ethereum; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.getMetaMaskProvider(); + expect(response).toEqual(ethereum); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider.spec.ts new file mode 100644 index 000000000..0bed96b26 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider.spec.ts @@ -0,0 +1,14 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Should return magic.rpcProvider if no stored wallet', async () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const provider = await magic.wallet.getProvider(); + expect(provider).toEqual(magic.rpcProvider); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getUserEnv.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getUserEnv.spec.ts new file mode 100644 index 000000000..06e05295f --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getUserEnv.spec.ts @@ -0,0 +1,40 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Returns env object with isMetaMaskInstalled true', async () => { + const provider = { + isMetaMask: true, + }; + window.ethereum = provider; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.getUserEnv(); + expect(response).toEqual({ + env: { + isMetaMaskInstalled: true, + isCoinbaseWalletInstalled: false, + }, + }); +}); + +test('Returns env object with isCoinbaseWalletInstalled true', async () => { + const provider = { + isCoinbaseWallet: true, + }; + window.ethereum = provider; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.getUserEnv(); + expect(response).toEqual({ + env: { + isMetaMaskInstalled: false, + isCoinbaseWalletInstalled: true, + }, + }); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider.spec.ts new file mode 100644 index 000000000..7d824bd1d --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider.spec.ts @@ -0,0 +1,34 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Fetches wallet connect provider', async () => { + const provider = { + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + }; + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + walletConnect: { + rpc: { 5: 'https://rpc.ankr.com/eth_goerli' }, + }, + }, + }); + magic.wallet.request = jest.fn(() => { + return { + on: () => null, + }; + }); + magic.wallet.getWalletConnectProvider = jest.fn(() => provider); + + const response = magic.wallet.getWalletConnectProvider(false); + expect(response).toEqual(provider); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletBrowser.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletBrowser.spec.ts new file mode 100644 index 000000000..5ec3ad6fd --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletBrowser.spec.ts @@ -0,0 +1,32 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Returns true if isCoinbaseBrowser is true', async () => { + const provider = { + isCoinbaseBrowser: true, + }; + window.ethereum = provider; + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isCoinbaseWalletBrowser(); + expect(response).toEqual(true); +}); + +test('Returns false if isCoinbaseBrowser is false', async () => { + const provider = { + isMetaMask: true, + }; + window.ethereum = provider; + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isCoinbaseWalletBrowser(); + expect(response).toEqual(false); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletInstalled.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletInstalled.spec.ts new file mode 100644 index 000000000..a2994493a --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletInstalled.spec.ts @@ -0,0 +1,65 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Return false if Coinbase Wallet is not installed', async () => { + window.ethereum = undefined; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isCoinbaseWalletInstalled(); + expect(response).toEqual(false); +}); + +test('Return true if Coinbase Wallet is installed', async () => { + const provider = { + isCoinbaseWallet: true, + }; + window.ethereum = provider; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isCoinbaseWalletInstalled(); + expect(response).toEqual(true); +}); + +test('Return true if multiple providers found, and Coinbase Wallet is one of them', async () => { + const ethereum = { + providers: [ + { + isMetaMask: true, + }, + { + isCoinbaseWallet: true, + }, + ], + }; + (window as any).ethereum = ethereum; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isCoinbaseWalletInstalled(); + expect(response).toEqual(true); +}); + +test('Return false if multiple providers found, and Coinbase Wallet is not one of them', async () => { + const ethereum = { + providers: [ + { + isAnotherWalletProvider: true, + }, + { + isMetaMask: true, + }, + ], + }; + (window as any).ethereum = ethereum; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isCoinbaseWalletInstalled(); + expect(response).toEqual(false); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskBrowser.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskBrowser.spec.ts new file mode 100644 index 000000000..34fa35f4c --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskBrowser.spec.ts @@ -0,0 +1,66 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Returns true if is mobile and metamask is installed', async () => { + Object.defineProperty(window.navigator, 'userAgent', { value: 'iPhone', configurable: true }); + + const provider = { + isMetaMask: true, + }; + window.ethereum = provider; + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMetaMaskBrowser(); + expect(response).toEqual(true); +}); + +test('Returns false if is mobile and metamask is not installed', async () => { + Object.defineProperty(window.navigator, 'userAgent', { value: 'iPhone', configurable: true }); + + const provider = { + isCoinbaseWallet: true, + }; + window.ethereum = provider; + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMetaMaskBrowser(); + expect(response).toEqual(false); +}); + +test('Returns false if is not mobile and metamask is installed', async () => { + Object.defineProperty(window.navigator, 'userAgent', { value: 'Mozilla', configurable: true }); + + const provider = { + isMetaMask: true, + }; + window.ethereum = provider; + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMetaMaskBrowser(); + expect(response).toEqual(false); +}); + +test('Returns false if is not mobile and metamask is not installed', async () => { + Object.defineProperty(window.navigator, 'userAgent', { value: 'Mozilla', configurable: true }); + + const provider = { + isCoinbaseWallet: true, + }; + window.ethereum = provider; + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMetaMaskBrowser(); + expect(response).toEqual(false); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskInstalled.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskInstalled.spec.ts new file mode 100644 index 000000000..12502df18 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskInstalled.spec.ts @@ -0,0 +1,65 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Return false if MetaMask is not installed', async () => { + window.ethereum = undefined; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMetaMaskInstalled(); + expect(response).toEqual(false); +}); + +test('Return true if MetaMask is installed', async () => { + const provider = { + isMetaMask: true, + }; + window.ethereum = provider; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMetaMaskInstalled(); + expect(response).toEqual(true); +}); + +test('Return true if multiple providers found, and MetaMask is one of them', async () => { + const ethereum = { + providers: [ + { + isMetaMask: true, + }, + { + isCoinbaseWallet: true, + }, + ], + }; + (window as any).ethereum = ethereum; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMetaMaskInstalled(); + expect(response).toEqual(true); +}); + +test('Return false if multiple providers found, and MetaMask is not one of them', async () => { + const ethereum = { + providers: [ + { + isAnotherWalletProvider: true, + }, + { + isCoinbaseWallet: true, + }, + ], + }; + (window as any).ethereum = ethereum; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMetaMaskInstalled(); + expect(response).toEqual(false); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/isMobile.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/isMobile.spec.ts new file mode 100644 index 000000000..b37b68fd7 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/isMobile.spec.ts @@ -0,0 +1,26 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Returns true if navigator.userAgent includes a mobile user agent string', async () => { + Object.defineProperty(window.navigator, 'userAgent', { value: 'iPhone', configurable: true }); + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMobile(); + expect(response).toEqual(true); +}); + +test('Returns false if navigator.userAgent does not include a mobile user agent string', async () => { + Object.defineProperty(window.navigator, 'userAgent', { value: 'Mozilla', configurable: true }); + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMobile(); + expect(response).toEqual(false); +}); diff --git a/packages/@magic-sdk/types/src/core/json-rpc-types.ts b/packages/@magic-sdk/types/src/core/json-rpc-types.ts index 6a7b95070..a8374e341 100644 --- a/packages/@magic-sdk/types/src/core/json-rpc-types.ts +++ b/packages/@magic-sdk/types/src/core/json-rpc-types.ts @@ -47,6 +47,32 @@ export interface RequestUserInfoScope { }; } +export enum Wallets { + MetaMask = 'metamask', + WalletConnect = 'wallet_connect', + CoinbaseWallet = 'coinbase_wallet', +} + +export enum Events { + WalletSelected = 'wallet_selected', + WalletConnected = 'wallet_connected', + WalletRejected = 'wallet_rejected', + DisplayUri = 'display_uri', + Uri = 'uri', +} + +export enum Errors { + WalletConnectError = 'Missing Wallet Connect Config', + CoinbaseWalletError = 'Missing Coinbase Wallet Config', +} + +export interface UserEnv { + env: { + isMetaMaskInstalled: boolean; + isCoinbaseWalletInstalled: boolean; + }; +} + // --- Payload methods /** @@ -77,6 +103,8 @@ export enum MagicPayloadMethod { LogoutTestMode = 'magic_auth_logout_testing_mode', UpdateEmailTestMode = 'magic_auth_update_email_testing_mode', IntermediaryEvent = 'magic_intermediary_event', + AutoConnect = 'mc_auto_connect', + Login = 'mc_login', RequestAccounts = 'eth_requestAccounts', GetInfo = 'mc_get_wallet_info', ShowUI = 'mc_wallet', diff --git a/packages/@magic-sdk/types/src/core/third-party-wallet-options.ts b/packages/@magic-sdk/types/src/core/third-party-wallet-options.ts new file mode 100644 index 000000000..c967f6026 --- /dev/null +++ b/packages/@magic-sdk/types/src/core/third-party-wallet-options.ts @@ -0,0 +1,69 @@ +export interface ThirdPartyWalletOptions { + coinbaseWallet?: { + sdk: any; + provider: { + jsonRpcUrl?: string; + chainId?: number; + }; + }; + walletConnect?: WalletConnectSDKOptions; +} + +export interface WalletConnectSDKOptions { + bridge: string; + qrcode: boolean; + qrcodeModal: { + open: (uri: string, cb: any, qrcodeModalOptions?: IQRCodeModalOptions | undefined) => void; + close: () => void; + }; + qrcodeModalOptions: IQRCodeModalOptions | undefined; + rpc: IRPCMap | null; + infuraId: string; + http: any; + wc: any; + isConnecting: boolean; + connected: boolean; + connectCallbacks: any[]; + accounts: string[]; + chainId: number; + rpcUrl: string; +} + +interface IQRCodeModalOptions { + registryUrl?: string; + mobileLinks?: string[]; + desktopLinks?: string[]; +} + +interface IRPCMap { + [chainId: number]: string; +} + +/* Coinbase Wallet Types */ +export interface CoinbaseWalletSDKOptions { + /** Application name */ + appName: string; + /** @optional Application logo image URL; favicon is used if unspecified */ + appLogoUrl?: string | null; + /** @optional Use dark theme */ + darkMode?: boolean; + /** @optional Coinbase Wallet link server URL; for most, leave it unspecified */ + linkAPIUrl?: string; + /** @optional an implementation of WalletUI; for most, leave it unspecified */ + uiConstructor?: (options: any) => any; + /** @optional an implementation of EventListener for debugging; for most, leave it unspecified */ + /** @deprecated in favor of diagnosticLogger */ + eventListener?: EventListener; + /** @optional a diagnostic tool for debugging; for most, leave it unspecified */ + diagnosticLogger?: any; + /** @optional whether wallet link provider should override the isMetaMask property. */ + overrideIsMetaMask?: boolean; + /** @optional whether wallet link provider should override the isCoinbaseWallet property. */ + overrideIsCoinbaseWallet?: boolean; + /** @optional whether coinbase wallet provider should override the isCoinbaseBrowser property. */ + overrideIsCoinbaseBrowser?: boolean; + /** @optional whether or not onboarding overlay popup should be displayed */ + headlessMode?: boolean; + /** @optional whether or not to reload dapp automatically after disconnect, defaults to true */ + reloadOnDisconnect?: boolean; +} diff --git a/packages/@magic-sdk/types/src/index.ts b/packages/@magic-sdk/types/src/index.ts index d5db534f6..990de69e1 100644 --- a/packages/@magic-sdk/types/src/index.ts +++ b/packages/@magic-sdk/types/src/index.ts @@ -6,6 +6,7 @@ export * from './core/i18n'; export * from './core/json-rpc-types'; export * from './core/message-types'; export * from './core/query-types'; +export * from './core/third-party-wallet-options'; export * from './modules/auth-types'; export * from './modules/rpc-provider-types'; diff --git a/scripts/utils/esbuild.ts b/scripts/utils/esbuild.ts index 3fb2b8e63..2127147c5 100644 --- a/scripts/utils/esbuild.ts +++ b/scripts/utils/esbuild.ts @@ -1,4 +1,5 @@ import { build as esbuild, BuildFailure, BuildResult, Platform, Plugin, Format } from 'esbuild'; +import { NodeModulesPolyfillPlugin } from '@esbuild-plugins/node-modules-polyfill'; import path from 'path'; import fse from 'fs-extra'; import gzipSize from 'gzip-size'; @@ -41,7 +42,7 @@ export async function build(options: ESBuildOptions) { define: Object.fromEntries( Object.entries(environment).map(([key, value]) => [`process.env.${key}`, JSON.stringify(value)]), ), - plugins: [...globalsPlugin(options.globals || {})], + plugins: [...globalsPlugin(options.globals || {}), NodeModulesPolyfillPlugin()], // We need this footer because: https://github.com/evanw/esbuild/issues/1182 footer: diff --git a/yarn.lock b/yarn.lock index d6f659501..7ab715a56 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1029,7 +1029,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.0.0": +"@babel/plugin-transform-runtime@npm:^7.0.0, @babel/plugin-transform-runtime@npm:^7.5.5": version: 7.21.0 resolution: "@babel/plugin-transform-runtime@npm:7.21.0" dependencies: @@ -1147,7 +1147,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.6": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.6": version: 7.21.0 resolution: "@babel/runtime@npm:7.21.0" dependencies: @@ -1224,6 +1224,31 @@ __metadata: languageName: node linkType: hard +"@coinbase/wallet-sdk@npm:3.6.3": + version: 3.6.3 + resolution: "@coinbase/wallet-sdk@npm:3.6.3" + dependencies: + "@metamask/safe-event-emitter": 2.0.0 + "@solana/web3.js": ^1.70.1 + bind-decorator: ^1.0.11 + bn.js: ^5.1.1 + buffer: ^6.0.3 + clsx: ^1.1.0 + eth-block-tracker: 4.4.3 + eth-json-rpc-filters: 4.2.2 + eth-rpc-errors: 4.0.2 + json-rpc-engine: 6.1.0 + keccak: ^3.0.1 + preact: ^10.5.9 + qs: ^6.10.3 + rxjs: ^6.6.3 + sha.js: ^2.4.11 + stream-browserify: ^3.0.0 + util: ^0.12.4 + checksum: f2ffd553f64ced32b9e9cf7fd2ec5708a5a8a4c4e5726787d3499db50cc135912c8565ec3c349b716ad8e9c7efeea682a265ffc365c78074a81345d35347621d + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -1247,6 +1272,18 @@ __metadata: languageName: node linkType: hard +"@esbuild-plugins/node-modules-polyfill@npm:^0.2.2": + version: 0.2.2 + resolution: "@esbuild-plugins/node-modules-polyfill@npm:0.2.2" + dependencies: + escape-string-regexp: ^4.0.0 + rollup-plugin-node-polyfills: ^0.2.1 + peerDependencies: + esbuild: "*" + checksum: 73c247a7559c68b7df080ab08dd3d0b0ab44b934840a4933df9626357b7183a9a5d8cf4ffa9c744f1bad8d7131bce0fde14a23203f7b262f9f14f7b3485bfdb1 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.14.54": version: 0.14.54 resolution: "@esbuild/linux-loong64@npm:0.14.54" @@ -2731,7 +2768,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/algorand@workspace:packages/@magic-ext/algorand" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2739,7 +2776,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/avalanche@workspace:packages/@magic-ext/avalanche" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2747,7 +2784,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/bitcoin@workspace:packages/@magic-ext/bitcoin" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2755,7 +2792,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/conflux@workspace:packages/@magic-ext/conflux" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2763,7 +2800,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/connect@workspace:packages/@magic-ext/connect" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2771,7 +2808,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/cosmos@workspace:packages/@magic-ext/cosmos" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2779,7 +2816,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/ed25519@workspace:packages/@magic-ext/ed25519" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2787,7 +2824,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/flow@workspace:packages/@magic-ext/flow" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 "@onflow/fcl": 0.0.41 "@onflow/types": 0.0.3 peerDependencies: @@ -2800,7 +2837,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/harmony@workspace:packages/@magic-ext/harmony" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2808,7 +2845,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/icon@workspace:packages/@magic-ext/icon" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2816,18 +2853,18 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/near@workspace:packages/@magic-ext/near" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft -"@magic-ext/oauth@^7.5.0, @magic-ext/oauth@workspace:packages/@magic-ext/oauth": +"@magic-ext/oauth@^7.6.0, @magic-ext/oauth@workspace:packages/@magic-ext/oauth": version: 0.0.0-use.local resolution: "@magic-ext/oauth@workspace:packages/@magic-ext/oauth" dependencies: - "@magic-sdk/types": ^11.5.0 + "@magic-sdk/types": ^11.6.0 "@types/crypto-js": ~3.1.47 crypto-js: ^3.3.0 - magic-sdk: ^13.5.0 + magic-sdk: ^13.6.0 languageName: unknown linkType: soft @@ -2843,7 +2880,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/polkadot@workspace:packages/@magic-ext/polkadot" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2851,7 +2888,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/react-native-bare-oauth@workspace:packages/@magic-ext/react-native-bare-oauth" dependencies: - "@magic-sdk/react-native-bare": ^14.5.0 + "@magic-sdk/react-native-bare": ^14.6.0 "@magic-sdk/types": ^10.0.1 "@types/crypto-js": ~3.1.47 crypto-js: ^3.3.0 @@ -2867,7 +2904,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/react-native-expo-oauth@workspace:packages/@magic-ext/react-native-expo-oauth" dependencies: - "@magic-sdk/react-native-expo": ^14.5.0 + "@magic-sdk/react-native-expo": ^14.6.0 "@magic-sdk/types": ^10.0.0 "@types/crypto-js": ~3.1.47 crypto-js: ^3.3.0 @@ -2882,7 +2919,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/solana@workspace:packages/@magic-ext/solana" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2890,7 +2927,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/taquito@workspace:packages/@magic-ext/taquito" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2898,7 +2935,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/terra@workspace:packages/@magic-ext/terra" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2906,7 +2943,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/tezos@workspace:packages/@magic-ext/tezos" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2914,7 +2951,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/webauthn@workspace:packages/@magic-ext/webauthn" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft @@ -2922,16 +2959,16 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/zilliqa@workspace:packages/@magic-ext/zilliqa" dependencies: - "@magic-sdk/commons": ^9.5.0 + "@magic-sdk/commons": ^9.6.0 languageName: unknown linkType: soft -"@magic-sdk/commons@^9.5.0, @magic-sdk/commons@workspace:packages/@magic-sdk/commons": +"@magic-sdk/commons@^9.6.0, @magic-sdk/commons@workspace:packages/@magic-sdk/commons": version: 0.0.0-use.local resolution: "@magic-sdk/commons@workspace:packages/@magic-sdk/commons" dependencies: - "@magic-sdk/provider": ^13.5.0 - "@magic-sdk/types": ^11.5.0 + "@magic-sdk/provider": ^13.6.0 + "@magic-sdk/types": ^11.6.0 peerDependencies: "@magic-sdk/provider": ">=4.3.0" "@magic-sdk/types": ">=3.1.1" @@ -2955,18 +2992,20 @@ __metadata: "@babel/core": ^7.9.6 "@babel/plugin-proposal-optional-chaining": ^7.9.0 "@babel/runtime": ^7.9.6 - "@magic-ext/oauth": ^7.5.0 - magic-sdk: ^13.5.0 + "@magic-ext/oauth": ^7.6.0 + magic-sdk: ^13.6.0 languageName: unknown linkType: soft -"@magic-sdk/provider@^13.5.0, @magic-sdk/provider@workspace:packages/@magic-sdk/provider": +"@magic-sdk/provider@^13.6.0, @magic-sdk/provider@workspace:packages/@magic-sdk/provider": version: 0.0.0-use.local resolution: "@magic-sdk/provider@workspace:packages/@magic-sdk/provider" dependencies: "@babel/plugin-transform-modules-commonjs": ^7.9.6 - "@magic-sdk/types": ^11.5.0 + "@coinbase/wallet-sdk": 3.6.3 + "@magic-sdk/types": ^11.6.0 "@peculiar/webcrypto": ^1.1.7 + "@walletconnect/web3-provider": ^1.8.0 eventemitter3: ^4.0.4 localforage: ^1.7.4 localforage-driver-memory: ^1.0.5 @@ -2990,7 +3029,7 @@ __metadata: languageName: node linkType: hard -"@magic-sdk/react-native-bare@^14.5.0, @magic-sdk/react-native-bare@workspace:packages/@magic-sdk/react-native-bare": +"@magic-sdk/react-native-bare@^14.6.0, @magic-sdk/react-native-bare@workspace:packages/@magic-sdk/react-native-bare": version: 0.0.0-use.local resolution: "@magic-sdk/react-native-bare@workspace:packages/@magic-sdk/react-native-bare" dependencies: @@ -2998,9 +3037,9 @@ __metadata: "@babel/core": ^7.15.0 "@babel/plugin-transform-flow-strip-types": ^7.14.5 "@babel/runtime": ~7.10.4 - "@magic-sdk/commons": ^9.5.0 - "@magic-sdk/provider": ^13.5.0 - "@magic-sdk/types": ^11.5.0 + "@magic-sdk/commons": ^9.6.0 + "@magic-sdk/provider": ^13.6.0 + "@magic-sdk/types": ^11.6.0 "@react-native-async-storage/async-storage": ^1.15.5 "@react-native-community/async-storage": ^1.12.1 "@types/lodash": ^4.14.158 @@ -3027,7 +3066,7 @@ __metadata: languageName: unknown linkType: soft -"@magic-sdk/react-native-expo@^14.5.0, @magic-sdk/react-native-expo@workspace:packages/@magic-sdk/react-native-expo": +"@magic-sdk/react-native-expo@^14.6.0, @magic-sdk/react-native-expo@workspace:packages/@magic-sdk/react-native-expo": version: 0.0.0-use.local resolution: "@magic-sdk/react-native-expo@workspace:packages/@magic-sdk/react-native-expo" dependencies: @@ -3035,9 +3074,9 @@ __metadata: "@babel/core": ^7.15.0 "@babel/plugin-transform-flow-strip-types": ^7.14.5 "@babel/runtime": ~7.10.4 - "@magic-sdk/commons": ^9.5.0 - "@magic-sdk/provider": ^13.5.0 - "@magic-sdk/types": ^11.5.0 + "@magic-sdk/commons": ^9.6.0 + "@magic-sdk/provider": ^13.6.0 + "@magic-sdk/types": ^11.6.0 "@react-native-async-storage/async-storage": ^1.15.5 "@types/lodash": ^4.14.158 buffer: ~5.6.0 @@ -3063,7 +3102,7 @@ __metadata: languageName: unknown linkType: soft -"@magic-sdk/types@^11.5.0, @magic-sdk/types@workspace:packages/@magic-sdk/types": +"@magic-sdk/types@^11.6.0, @magic-sdk/types@workspace:packages/@magic-sdk/types": version: 0.0.0-use.local resolution: "@magic-sdk/types@workspace:packages/@magic-sdk/types" languageName: unknown @@ -3083,6 +3122,13 @@ __metadata: languageName: node linkType: hard +"@metamask/safe-event-emitter@npm:2.0.0, @metamask/safe-event-emitter@npm:^2.0.0": + version: 2.0.0 + resolution: "@metamask/safe-event-emitter@npm:2.0.0" + checksum: 8b717ac5d53df0027c05509f03d0534700b5898dd1c3a53fb2dc4c0499ca5971b14aae67f522d09eb9f509e77f50afa95fdb3eda1afbff8b071c18a3d2905e93 + languageName: node + linkType: hard + "@mrmlnc/readdir-enhanced@npm:^2.2.1": version: 2.2.1 resolution: "@mrmlnc/readdir-enhanced@npm:2.2.1" @@ -3093,6 +3139,27 @@ __metadata: languageName: node linkType: hard +"@noble/ed25519@npm:^1.7.0": + version: 1.7.3 + resolution: "@noble/ed25519@npm:1.7.3" + checksum: 45169927d51de513e47bbeebff3a603433c4ac7579e1b8c5034c380a0afedbe85e6959be3d69584a7a5ed6828d638f8f28879003b9bb2fb5f22d8aa2d88fd5fe + languageName: node + linkType: hard + +"@noble/hashes@npm:^1.1.2": + version: 1.2.0 + resolution: "@noble/hashes@npm:1.2.0" + checksum: 8ca080ce557b8f40fb2f78d3aedffd95825a415ac8e13d7ffe3643f8626a8c2d99a3e5975b555027ac24316d8b3c02a35b8358567c0c23af681e6573602aa434 + languageName: node + linkType: hard + +"@noble/secp256k1@npm:^1.6.3": + version: 1.7.1 + resolution: "@noble/secp256k1@npm:1.7.1" + checksum: d2301f1f7690368d8409a3152450458f27e54df47e3f917292de3de82c298770890c2de7c967d237eff9c95b70af485389a9695f73eb05a43e2bd562d18b18cb + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -3699,6 +3766,39 @@ __metadata: languageName: node linkType: hard +"@solana/buffer-layout@npm:^4.0.0": + version: 4.0.1 + resolution: "@solana/buffer-layout@npm:4.0.1" + dependencies: + buffer: ~6.0.3 + checksum: bf846888e813187243d4008a7a9f58b49d16cbd995b9d7f1b72898aa510ed77b1ce5e8468e7b2fd26dd81e557a4e74a666e21fccb95f123c1f740d41138bbacd + languageName: node + linkType: hard + +"@solana/web3.js@npm:^1.70.1": + version: 1.73.3 + resolution: "@solana/web3.js@npm:1.73.3" + dependencies: + "@babel/runtime": ^7.12.5 + "@noble/ed25519": ^1.7.0 + "@noble/hashes": ^1.1.2 + "@noble/secp256k1": ^1.6.3 + "@solana/buffer-layout": ^4.0.0 + agentkeepalive: ^4.2.1 + bigint-buffer: ^1.1.5 + bn.js: ^5.0.0 + borsh: ^0.7.0 + bs58: ^4.0.1 + buffer: 6.0.1 + fast-stable-stringify: ^1.0.0 + jayson: ^3.4.4 + node-fetch: ^2.6.7 + rpc-websockets: ^7.5.1 + superstruct: ^0.14.2 + checksum: bf00b2594590116079b1c9d078dd274622dec903d681cf38eafb249334fa5dfd2a2fe48ca49027f51e6afed3a4bbb9f1099c61f26dc9271358b847e807ad6ea9 + languageName: node + linkType: hard + "@tootallnate/once@npm:1": version: 1.1.2 resolution: "@tootallnate/once@npm:1.1.2" @@ -3782,7 +3882,7 @@ __metadata: languageName: node linkType: hard -"@types/bn.js@npm:^4.11.5": +"@types/bn.js@npm:^4.11.3, @types/bn.js@npm:^4.11.5": version: 4.11.6 resolution: "@types/bn.js@npm:4.11.6" dependencies: @@ -3814,6 +3914,15 @@ __metadata: languageName: node linkType: hard +"@types/connect@npm:^3.4.33": + version: 3.4.35 + resolution: "@types/connect@npm:3.4.35" + dependencies: + "@types/node": "*" + checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + languageName: node + linkType: hard + "@types/crypto-js@npm:~3.1.47": version: 3.1.47 resolution: "@types/crypto-js@npm:3.1.47" @@ -3983,7 +4092,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^12.12.6": +"@types/node@npm:^12.12.54, @types/node@npm:^12.12.6": version: 12.20.55 resolution: "@types/node@npm:12.20.55" checksum: e4f86785f4092706e0d3b0edff8dca5a13b45627e4b36700acd8dfe6ad53db71928c8dee914d4276c7fd3b6ccd829aa919811c9eb708a2c8e4c6eb3701178c37 @@ -4121,6 +4230,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^7.4.4": + version: 7.4.7 + resolution: "@types/ws@npm:7.4.7" + dependencies: + "@types/node": "*" + checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" @@ -4275,6 +4393,232 @@ __metadata: languageName: node linkType: hard +"@walletconnect/browser-utils@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/browser-utils@npm:1.8.0" + dependencies: + "@walletconnect/safe-json": 1.0.0 + "@walletconnect/types": ^1.8.0 + "@walletconnect/window-getters": 1.0.0 + "@walletconnect/window-metadata": 1.0.0 + detect-browser: 5.2.0 + checksum: cf4b55c9e8d53b1ffa99322ebcdfce7ad8df8e3ee90f57252da0b3882d3bfb592414cad09900c20619216c6a42d1184ad03728e6514e95a34467a8821aa5aef8 + languageName: node + linkType: hard + +"@walletconnect/client@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/client@npm:1.8.0" + dependencies: + "@walletconnect/core": ^1.8.0 + "@walletconnect/iso-crypto": ^1.8.0 + "@walletconnect/types": ^1.8.0 + "@walletconnect/utils": ^1.8.0 + checksum: 48aab7d11eeaaccf6612d335766eb6439f2ce3c446a87b7a974b6fb11076d3bc000f947c0822790fdaa6ba50df073c581750eb5dcda47359bf29c94b76919394 + languageName: node + linkType: hard + +"@walletconnect/core@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/core@npm:1.8.0" + dependencies: + "@walletconnect/socket-transport": ^1.8.0 + "@walletconnect/types": ^1.8.0 + "@walletconnect/utils": ^1.8.0 + checksum: 2d703ac417c1f0df33f35893aef24fd4ce7e1d9b274f6937dcdf0880ff46bf266e773e498f374e5f17a1e249c55e7c7af815c63676c5cea5fda737f326a28c14 + languageName: node + linkType: hard + +"@walletconnect/crypto@npm:^1.0.2": + version: 1.0.3 + resolution: "@walletconnect/crypto@npm:1.0.3" + dependencies: + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/environment": ^1.0.1 + "@walletconnect/randombytes": ^1.0.3 + aes-js: ^3.1.2 + hash.js: ^1.1.7 + tslib: 1.14.1 + checksum: 056c80451178d74be6237f24e53eb96951379ad2f556642b4f07231a9cac53512af182dfb58ee359d1d6803231030de747eb17b35a9a25577e20de3ef2d8fdec + languageName: node + linkType: hard + +"@walletconnect/encoding@npm:^1.0.1, @walletconnect/encoding@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/encoding@npm:1.0.2" + dependencies: + is-typedarray: 1.0.0 + tslib: 1.14.1 + typedarray-to-buffer: 3.1.5 + checksum: 648029d6a04e0e3675e1220b87c982e5d69764873e30a45a7c57f18223cd7c13e6758138d4644fd05d8fa03bd438fafb0a0ebc6ae168ed6f4a9bf1f93de1b82f + languageName: node + linkType: hard + +"@walletconnect/environment@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/environment@npm:1.0.1" + dependencies: + tslib: 1.14.1 + checksum: a18731d857bdca73910147e59992cef3c6e292c37ab3d3013307bd706f06cb216aa804f0f48b25a78df6493ad8127e633629f4b50acb4f69d3765d6ac0524f68 + languageName: node + linkType: hard + +"@walletconnect/http-connection@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/http-connection@npm:1.8.0" + dependencies: + "@walletconnect/types": ^1.8.0 + "@walletconnect/utils": ^1.8.0 + eventemitter3: 4.0.7 + xhr2-cookies: 1.1.0 + checksum: 7f8d5ea7c01063e900d567a5387fddbfbc512273abe8ad9d032642a2ceac20ff29b3812ab4a0bcb64d5e0121e6217985452c08d7c08bcfa140f34a0546bf4ea9 + languageName: node + linkType: hard + +"@walletconnect/iso-crypto@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/iso-crypto@npm:1.8.0" + dependencies: + "@walletconnect/crypto": ^1.0.2 + "@walletconnect/types": ^1.8.0 + "@walletconnect/utils": ^1.8.0 + checksum: ec1b361831c60b7d91d7be001d2b62266df64cd62710840ebf54193d008b46c70bde3d42d7e0df6107f020d4b0470435bfbb3defb9e918fdcb1b0f3eaf42e52f + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.2" + dependencies: + keyvaluestorage-interface: ^1.0.0 + tslib: 1.14.1 + checksum: 6878d184bfc49e5c8190586c451895eb48a576015f0556527df81b94f52977f61d456b237c662ffbff28e972f8f18b9cc4e06f0e94eddfb9fdeed6fdb4a98c5f + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-utils@npm:^1.0.3": + version: 1.0.6 + resolution: "@walletconnect/jsonrpc-utils@npm:1.0.6" + dependencies: + "@walletconnect/environment": ^1.0.1 + "@walletconnect/jsonrpc-types": ^1.0.2 + tslib: 1.14.1 + checksum: 5e36d0713a690f1666e254c8de6c9a80e744669a588f04e56907c5dfeca0d2457ab71218ce9c43512afe12aab5bfd2fa390f376bf90f4ef671abd340d7abf052 + languageName: node + linkType: hard + +"@walletconnect/mobile-registry@npm:^1.4.0": + version: 1.4.0 + resolution: "@walletconnect/mobile-registry@npm:1.4.0" + checksum: 06f18842e68f88e71e87f36daea143684afc49551974cf359fb55cc731e9b4fc0bce762d87b79b268e529def889e82fc2fbc2bc12d6a28a04ed0d6a060188020 + languageName: node + linkType: hard + +"@walletconnect/qrcode-modal@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/qrcode-modal@npm:1.8.0" + dependencies: + "@walletconnect/browser-utils": ^1.8.0 + "@walletconnect/mobile-registry": ^1.4.0 + "@walletconnect/types": ^1.8.0 + copy-to-clipboard: ^3.3.1 + preact: 10.4.1 + qrcode: 1.4.4 + checksum: 0abae2268579f55da87ed766fee32d428f951f18ab0a4addbfe8cbcbad1ce3a5642cc26ceb80654b158e537000ee5006b14eff43515619bc17af8c5da51adc55 + languageName: node + linkType: hard + +"@walletconnect/randombytes@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/randombytes@npm:1.0.3" + dependencies: + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/environment": ^1.0.1 + randombytes: ^2.1.0 + tslib: 1.14.1 + checksum: 3ba1d5906299256c64affcd03348ec1397e2fadb1e60baaa13d4f46ba0267580fc354e67839d3fa4faa8abb375723f7ab96334b4e842f5814ce2080ed15f3578 + languageName: node + linkType: hard + +"@walletconnect/safe-json@npm:1.0.0": + version: 1.0.0 + resolution: "@walletconnect/safe-json@npm:1.0.0" + checksum: a8ee161cad37242983522d19ace57c2d2725b5b1cf5fd4d61e3e5f4190a2b369acc4cd0fa40774b50cf4aa322f477e31b7841a6b8f0d84a3af12da8c4344e9b7 + languageName: node + linkType: hard + +"@walletconnect/socket-transport@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/socket-transport@npm:1.8.0" + dependencies: + "@walletconnect/types": ^1.8.0 + "@walletconnect/utils": ^1.8.0 + ws: 7.5.3 + checksum: 3c494399a3fd8165a8d631a66efd19779278dd6744b1e686a18394afad38a05450b9acb0117373e3376ac4721a2a298695fd550db79c1e456d4446e2b53f8a6d + languageName: node + linkType: hard + +"@walletconnect/types@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/types@npm:1.8.0" + checksum: 194d615888068030183489222641332987846aa5c6bcf0a62fa60ca7a282b9f94932c49fcd2b293a859e98624fe3e7a2d3c5fb66545fe30d3391e7ac91a99e34 + languageName: node + linkType: hard + +"@walletconnect/utils@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/utils@npm:1.8.0" + dependencies: + "@walletconnect/browser-utils": ^1.8.0 + "@walletconnect/encoding": ^1.0.1 + "@walletconnect/jsonrpc-utils": ^1.0.3 + "@walletconnect/types": ^1.8.0 + bn.js: 4.11.8 + js-sha3: 0.8.0 + query-string: 6.13.5 + checksum: 41b21fc6cb29c0714579dac8da988c14985fc0fcc0c5f02979e72509f42bf658e3ca8ea22ac4a50a9753d26b630d38a6b5fec84131a9eff0b78318b809b203dd + languageName: node + linkType: hard + +"@walletconnect/web3-provider@npm:^1.8.0": + version: 1.8.0 + resolution: "@walletconnect/web3-provider@npm:1.8.0" + dependencies: + "@walletconnect/client": ^1.8.0 + "@walletconnect/http-connection": ^1.8.0 + "@walletconnect/qrcode-modal": ^1.8.0 + "@walletconnect/types": ^1.8.0 + "@walletconnect/utils": ^1.8.0 + web3-provider-engine: 16.0.1 + checksum: aa6914088cb6197d9d12ab60f1cd0576015d1eb9ccb0e4df9a29e84d9207f4f63e9404dbd5e271ea86827b7abb819a0e3b7c586d573db4bbcc03c8f6188fbcda + languageName: node + linkType: hard + +"@walletconnect/window-getters@npm:1.0.0": + version: 1.0.0 + resolution: "@walletconnect/window-getters@npm:1.0.0" + checksum: 192af7acb2051d304addb2e5a3f121fedd8c83ba6750018e3b0da5757bad525336bc5d9cb571f63b09828658764151da181337ec0e898811ad7f506910bd3b5f + languageName: node + linkType: hard + +"@walletconnect/window-getters@npm:^1.0.0": + version: 1.0.1 + resolution: "@walletconnect/window-getters@npm:1.0.1" + dependencies: + tslib: 1.14.1 + checksum: fae312c4e1be5574d97f071de58e6aa0d0296869761499caf9d4a9a5fd2643458af32233a2120521b00873a599ff88457d405bd82ced5fb5bd6dc3191c07a3e5 + languageName: node + linkType: hard + +"@walletconnect/window-metadata@npm:1.0.0": + version: 1.0.0 + resolution: "@walletconnect/window-metadata@npm:1.0.0" + dependencies: + "@walletconnect/window-getters": ^1.0.0 + checksum: eec506ff6d35ae6e88db1e38b6f514f6cbf1a45b979878e5e50819d229b616fc645a2b0816145b61acda2701042160a4e0685f080927b87461853a62a887a9e9 + languageName: node + linkType: hard + "@zkochan/cmd-shim@npm:^3.1.0": version: 3.1.0 resolution: "@zkochan/cmd-shim@npm:3.1.0" @@ -4286,7 +4630,7 @@ __metadata: languageName: node linkType: hard -"JSONStream@npm:^1.0.4, JSONStream@npm:^1.3.4": +"JSONStream@npm:^1.0.4, JSONStream@npm:^1.3.4, JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" dependencies: @@ -4328,6 +4672,24 @@ __metadata: languageName: node linkType: hard +"abstract-leveldown@npm:~2.6.0": + version: 2.6.3 + resolution: "abstract-leveldown@npm:2.6.3" + dependencies: + xtend: ~4.0.0 + checksum: 87b18580467c303c34c305620e2c3227010f64187d6b1cd60c2d1b9adc058b0c4de716e111e9493aaad0080cb7836601032c5084990cd713f86b6a78f1fab791 + languageName: node + linkType: hard + +"abstract-leveldown@npm:~2.7.1": + version: 2.7.2 + resolution: "abstract-leveldown@npm:2.7.2" + dependencies: + xtend: ~4.0.0 + checksum: 97c45a05d8b5d24edf3855c1f9a19f919c4a189e387929745289a53116c80638339a7d4e50ad76d0ad2900166adaeaf2e0350dcdcd453e783cd8f04fd9bea17a + languageName: node + linkType: hard + "accepts@npm:~1.3.5, accepts@npm:~1.3.7": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -4415,6 +4777,13 @@ __metadata: languageName: node linkType: hard +"aes-js@npm:^3.1.2": + version: 3.1.2 + resolution: "aes-js@npm:3.1.2" + checksum: 062154d50b1e433cc8c3b8ca7879f3a6375d5e79c2a507b2b6c4ec920b4cd851bf2afa7f65c98761a9da89c0ab618cbe6529e8e9a1c71f93290b53128fb8f712 + languageName: node + linkType: hard + "agent-base@npm:4, agent-base@npm:^4.3.0": version: 4.3.0 resolution: "agent-base@npm:4.3.0" @@ -4974,7 +5343,39 @@ __metadata: languageName: node linkType: hard -"async@npm:^2.4.0": +"async-eventemitter@npm:^0.2.2": + version: 0.2.4 + resolution: "async-eventemitter@npm:0.2.4" + dependencies: + async: ^2.4.0 + checksum: b9e77e0f58ebd7188c50c23d613d1263e0ab501f5e677e02b57cc97d7032beaf60aafa189887e7105569c791e212df4af00b608be1e9a4c425911d577124911e + languageName: node + linkType: hard + +"async-limiter@npm:~1.0.0": + version: 1.0.1 + resolution: "async-limiter@npm:1.0.1" + checksum: 2b849695b465d93ad44c116220dee29a5aeb63adac16c1088983c339b0de57d76e82533e8e364a93a9f997f28bbfc6a92948cefc120652bd07f3b59f8d75cf2b + languageName: node + linkType: hard + +"async-mutex@npm:^0.2.6": + version: 0.2.6 + resolution: "async-mutex@npm:0.2.6" + dependencies: + tslib: ^2.0.0 + checksum: f50102e0c57f6a958528cff7dff13da070897f17107b42274417a7248905b927b6e51c3387f8aed1f5cd6005b0e692d64a83a0789be602e4e7e7da4afe08b889 + languageName: node + linkType: hard + +"async@npm:^1.4.2": + version: 1.5.2 + resolution: "async@npm:1.5.2" + checksum: fe5d6214d8f15bd51eee5ae8ec5079b228b86d2d595f47b16369dec2e11b3ff75a567bb5f70d12d79006665fbbb7ee0a7ec0e388524eefd454ecbe651c124ebd + languageName: node + linkType: hard + +"async@npm:^2.0.1, async@npm:^2.1.2, async@npm:^2.4.0, async@npm:^2.5.0": version: 2.6.4 resolution: "async@npm:2.6.4" dependencies: @@ -5234,6 +5635,15 @@ __metadata: languageName: node linkType: hard +"backoff@npm:^2.5.0": + version: 2.5.0 + resolution: "backoff@npm:2.5.0" + dependencies: + precond: 0.2 + checksum: ccdcf2a26acd9379d0d4f09e3fb3b7ee34dee94f07ab74d1e38b38f89a3675d9f3cbebb142d9c61c655f4c9eb63f1d6ec28cebeb3dc9215efd8fe7cef92725b9 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -5295,6 +5705,16 @@ __metadata: languageName: node linkType: hard +"bigint-buffer@npm:^1.1.5": + version: 1.1.5 + resolution: "bigint-buffer@npm:1.1.5" + dependencies: + bindings: ^1.3.0 + node-gyp: latest + checksum: d010c9f57758bcdaccb435d88b483ffcc95fe8bbc6e7fb3a44fb5221f29c894ffaf4a3c5a4a530e0e7d6608203c2cde9b79ee4f2386cd6d4462d1070bc8c9f4e + languageName: node + linkType: hard + "bignumber.js@npm:^9.0.0": version: 9.1.1 resolution: "bignumber.js@npm:9.1.1" @@ -5309,7 +5729,14 @@ __metadata: languageName: node linkType: hard -"bindings@npm:^1.5.0": +"bind-decorator@npm:^1.0.11": + version: 1.0.11 + resolution: "bind-decorator@npm:1.0.11" + checksum: 41b6c69af51ee7e6e01ea6f2939df94c9c760383f89f5befda0890951657baedbf499a0b96a789fd85cb77252465134f4e6184aae6639ed60cf59549ef15353d + languageName: node + linkType: hard + +"bindings@npm:^1.3.0, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" dependencies: @@ -5350,20 +5777,38 @@ __metadata: languageName: node linkType: hard -"bn.js@npm:^4.11.6, bn.js@npm:^4.11.9": +"bn.js@npm:4.11.8": + version: 4.11.8 + resolution: "bn.js@npm:4.11.8" + checksum: 80d4709cd58a21f0be8201e9e5859fea5ef133318e9800c8454cd334625c6e1caea593ca21f9b9a085fb560fbc12fb2fb3514363f8604258db924237fd039139 + languageName: node + linkType: hard + +"bn.js@npm:^4.11.0, bn.js@npm:^4.11.6, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 languageName: node linkType: hard -"bn.js@npm:^5.1.2, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": +"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1, bn.js@npm:^5.1.2, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": version: 5.2.1 resolution: "bn.js@npm:5.2.1" checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 languageName: node linkType: hard +"borsh@npm:^0.7.0": + version: 0.7.0 + resolution: "borsh@npm:0.7.0" + dependencies: + bn.js: ^5.2.0 + bs58: ^4.0.0 + text-encoding-utf-8: ^1.0.2 + checksum: e98bfb5f7cfb820819c2870b884dac58dd4b4ce6a86c286c8fbf5c9ca582e73a8c6094df67e81a28c418ff07a309c6b118b2e27fdfea83fd92b8100c741da0b5 + languageName: node + linkType: hard + "bottleneck@npm:^2.15.3": version: 2.19.5 resolution: "bottleneck@npm:2.19.5" @@ -5502,7 +5947,7 @@ __metadata: languageName: node linkType: hard -"bs58@npm:^4.0.0": +"bs58@npm:^4.0.0, bs58@npm:^4.0.1": version: 4.0.1 resolution: "bs58@npm:4.0.1" dependencies: @@ -5538,6 +5983,32 @@ __metadata: languageName: node linkType: hard +"btoa@npm:^1.2.1": + version: 1.2.1 + resolution: "btoa@npm:1.2.1" + bin: + btoa: bin/btoa.js + checksum: afbf004fb1b1d530e053ffa66ef5bd3878b101c59d808ac947fcff96810b4452abba2b54be687adadea2ba9efc7af48b04228742789bf824ef93f103767e690c + languageName: node + linkType: hard + +"buffer-alloc-unsafe@npm:^1.1.0": + version: 1.1.0 + resolution: "buffer-alloc-unsafe@npm:1.1.0" + checksum: c5e18bf51f67754ec843c9af3d4c005051aac5008a3992938dda1344e5cfec77c4b02b4ca303644d1e9a6e281765155ce6356d85c6f5ccc5cd21afc868def396 + languageName: node + linkType: hard + +"buffer-alloc@npm:^1.2.0": + version: 1.2.0 + resolution: "buffer-alloc@npm:1.2.0" + dependencies: + buffer-alloc-unsafe: ^1.1.0 + buffer-fill: ^1.0.0 + checksum: 560cd27f3cbe73c614867da373407d4506309c62fe18de45a1ce191f3785ec6ca2488d802ff82065798542422980ca25f903db078c57822218182c37c3576df5 + languageName: node + linkType: hard + "buffer-crc32@npm:^0.2.13": version: 0.2.13 resolution: "buffer-crc32@npm:0.2.13" @@ -5545,7 +6016,14 @@ __metadata: languageName: node linkType: hard -"buffer-from@npm:^1.0.0": +"buffer-fill@npm:^1.0.0": + version: 1.0.0 + resolution: "buffer-fill@npm:1.0.0" + checksum: c29b4723ddeab01e74b5d3b982a0c6828f2ded49cef049ddca3dac661c874ecdbcecb5dd8380cf0f4adbeb8cff90a7de724126750a1f1e5ebd4eb6c59a1315b1 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0, buffer-from@npm:^1.1.1": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb @@ -5566,7 +6044,17 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.5.0": +"buffer@npm:6.0.1": + version: 6.0.1 + resolution: "buffer@npm:6.0.1" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 0274c2c6c5c5d9e9e1fd48116c26a3e3f824fe262ff379f630771f590c2e4e7d1fa2604a58684bfc4471a3f9cc40c6317be26b50f15c4cca126249bfc84c4f8b + languageName: node + linkType: hard + +"buffer@npm:^5.4.3, buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -5576,6 +6064,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^6.0.3, buffer@npm:~6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + "buffer@npm:~5.6.0": version: 5.6.1 resolution: "buffer@npm:5.6.1" @@ -5886,6 +6384,15 @@ __metadata: languageName: node linkType: hard +"checkpoint-store@npm:^1.1.0": + version: 1.1.0 + resolution: "checkpoint-store@npm:1.1.0" + dependencies: + functional-red-black-tree: ^1.0.1 + checksum: 94e921ccb222c7970615e8b2bcd956dbd52f15a1c397af0447dbdef8ecd32ffe342e394d39e55f2912278a460f3736de777b5b57a5baf229c0a6bd04d2465511 + languageName: node + linkType: hard + "chownr@npm:^1.1.1, chownr@npm:^1.1.2, chownr@npm:^1.1.4": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -6072,6 +6579,20 @@ __metadata: languageName: node linkType: hard +"clone@npm:^2.0.0, clone@npm:^2.1.1": + version: 2.1.2 + resolution: "clone@npm:2.1.2" + checksum: aaf106e9bc025b21333e2f4c12da539b568db4925c0501a1bf4070836c9e848c892fa22c35548ce0d1132b08bbbfa17a00144fe58fccdab6fa900fec4250f67d + languageName: node + linkType: hard + +"clsx@npm:^1.1.0": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 + languageName: node + linkType: hard + "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -6224,7 +6745,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.19.0": +"commander@npm:^2.19.0, commander@npm:^2.20.3": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e @@ -6513,6 +7034,15 @@ __metadata: languageName: node linkType: hard +"copy-to-clipboard@npm:^3.3.1": + version: 3.3.3 + resolution: "copy-to-clipboard@npm:3.3.3" + dependencies: + toggle-selection: ^1.0.6 + checksum: e0a325e39b7615108e6c1c8ac110ae7b829cdc4ee3278b1df6a0e4228c490442cc86444cd643e2da344fbc424b3aab8909e2fec82f8bc75e7e5b190b7c24eecf + languageName: node + linkType: hard + "core-js-compat@npm:^3.25.1": version: 3.29.0 resolution: "core-js-compat@npm:3.29.0" @@ -6641,6 +7171,16 @@ __metadata: languageName: node linkType: hard +"cross-fetch@npm:^2.1.0": + version: 2.2.6 + resolution: "cross-fetch@npm:2.2.6" + dependencies: + node-fetch: ^2.6.7 + whatwg-fetch: ^2.0.4 + checksum: df9c6728b314ff96022dca468a3d2a05b4546cd318d82a7e1f1445e7160472d39029bccbe5f20d319b8ba3793930592b0b956244aef6a87a133fbcfed85fc8ca + languageName: node + linkType: hard + "cross-spawn@npm:^4": version: 4.0.2 resolution: "cross-spawn@npm:4.0.2" @@ -6965,6 +7505,15 @@ __metadata: languageName: node linkType: hard +"deferred-leveldown@npm:~1.2.1": + version: 1.2.2 + resolution: "deferred-leveldown@npm:1.2.2" + dependencies: + abstract-leveldown: ~2.6.0 + checksum: ad3a26d20dc80c702c85c4795cbb52ef25d8e500728c98098b468c499ca745051e6cc03bd12be97ff38c43466a7895879db76ffb761a75b0f009829d990a0ea9 + languageName: node + linkType: hard + "define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": version: 1.2.0 resolution: "define-properties@npm:1.2.0" @@ -7003,6 +7552,13 @@ __metadata: languageName: node linkType: hard +"delay@npm:^5.0.0": + version: 5.0.0 + resolution: "delay@npm:5.0.0" + checksum: 62f151151ecfde0d9afbb8a6be37a6d103c4cb24f35a20ef3fe56f920b0d0d0bb02bc9c0a3084d0179ef669ca332b91155f2ee4d9854622cd2cdba5fc95285f9 + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -7052,6 +7608,13 @@ __metadata: languageName: node linkType: hard +"detect-browser@npm:5.2.0": + version: 5.2.0 + resolution: "detect-browser@npm:5.2.0" + checksum: 63b5c38fecc657ff12de01a41e6c8c97b3d610dffa37aef1983ec5bfb4314687d588c0c44c5ee03bd45ef15b7fe465bce9349c373369e6a7405f318e0aae56f9 + languageName: node + linkType: hard + "detect-indent@npm:^5.0.0": version: 5.0.0 resolution: "detect-indent@npm:5.0.0" @@ -7090,6 +7653,13 @@ __metadata: languageName: node linkType: hard +"dijkstrajs@npm:^1.0.1": + version: 1.0.2 + resolution: "dijkstrajs@npm:1.0.2" + checksum: 8cd822441a26f190da24d69bfab7b433d080b09e069e41e046ac84e152f182a1ed9478d531b34126e000adaa7b73114a0f85fcac117a7d25b3edf302d57c0d09 + languageName: node + linkType: hard + "dir-glob@npm:^2.0.0, dir-glob@npm:^2.2.2": version: 2.2.2 resolution: "dir-glob@npm:2.2.2" @@ -7224,7 +7794,7 @@ __metadata: languageName: node linkType: hard -"elliptic@npm:6.5.4, elliptic@npm:^6.4.0, elliptic@npm:^6.5.4": +"elliptic@npm:6.5.4, elliptic@npm:^6.4.0, elliptic@npm:^6.5.2, elliptic@npm:^6.5.4": version: 6.5.4 resolution: "elliptic@npm:6.5.4" dependencies: @@ -7353,6 +7923,17 @@ __metadata: languageName: node linkType: hard +"errno@npm:~0.1.1": + version: 0.1.8 + resolution: "errno@npm:0.1.8" + dependencies: + prr: ~1.0.1 + bin: + errno: cli.js + checksum: 1271f7b9fbb3bcbec76ffde932485d1e3561856d21d847ec613a9722ee924cdd4e523a62dc71a44174d91e898fe21fdc8d5b50823f4b5e0ce8c35c8271e6ef4a + languageName: node + linkType: hard + "error-ex@npm:^1.2.0, error-ex@npm:^1.3.1": version: 1.3.2 resolution: "error-ex@npm:1.3.2" @@ -7757,6 +8338,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + "escodegen@npm:^1.11.1": version: 1.14.3 resolution: "escodegen@npm:1.14.3" @@ -8100,6 +8688,13 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^0.6.1": + version: 0.6.1 + resolution: "estree-walker@npm:0.6.1" + checksum: 9d6f82a4921f11eec18f8089fb3cce6e53bcf45a8e545c42a2674d02d055fb30f25f90495f8be60803df6c39680c80dcee7f944526867eb7aa1fc9254883b23d + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -8114,6 +8709,65 @@ __metadata: languageName: node linkType: hard +"eth-block-tracker@npm:4.4.3, eth-block-tracker@npm:^4.4.2": + version: 4.4.3 + resolution: "eth-block-tracker@npm:4.4.3" + dependencies: + "@babel/plugin-transform-runtime": ^7.5.5 + "@babel/runtime": ^7.5.5 + eth-query: ^2.1.0 + json-rpc-random-id: ^1.0.1 + pify: ^3.0.0 + safe-event-emitter: ^1.0.1 + checksum: 3ae7e459b19b65303ec7bd0df7ad2a69476adb01cf2f44699b3482fd14e9e058e9eb85a9612307ba33f565e29ca6d19466765122a1106d1def820f6bfe272d52 + languageName: node + linkType: hard + +"eth-json-rpc-filters@npm:4.2.2, eth-json-rpc-filters@npm:^4.2.1": + version: 4.2.2 + resolution: "eth-json-rpc-filters@npm:4.2.2" + dependencies: + "@metamask/safe-event-emitter": ^2.0.0 + async-mutex: ^0.2.6 + eth-json-rpc-middleware: ^6.0.0 + eth-query: ^2.1.2 + json-rpc-engine: ^6.1.0 + pify: ^5.0.0 + checksum: add6ef65c30c6dc85f9ab464325b509247b1be2596763d30cc23c66d32e0a835830daf14bc36fc2e43670d0c54b4a6010bb981c9006372c5520fd6abdf0d6c77 + languageName: node + linkType: hard + +"eth-json-rpc-infura@npm:^5.1.0": + version: 5.1.0 + resolution: "eth-json-rpc-infura@npm:5.1.0" + dependencies: + eth-json-rpc-middleware: ^6.0.0 + eth-rpc-errors: ^3.0.0 + json-rpc-engine: ^5.3.0 + node-fetch: ^2.6.0 + checksum: 29712d77741b6bc94634d32286095e30e65e793034d1ba80fa14719ddb1a85a34cc8eddc36f0bbe3f9aaa841b80217e5347bb919004068749e0e945eff637a98 + languageName: node + linkType: hard + +"eth-json-rpc-middleware@npm:^6.0.0": + version: 6.0.0 + resolution: "eth-json-rpc-middleware@npm:6.0.0" + dependencies: + btoa: ^1.2.1 + clone: ^2.1.1 + eth-query: ^2.1.2 + eth-rpc-errors: ^3.0.0 + eth-sig-util: ^1.4.2 + ethereumjs-util: ^5.1.2 + json-rpc-engine: ^5.3.0 + json-stable-stringify: ^1.0.1 + node-fetch: ^2.6.1 + pify: ^3.0.0 + safe-event-emitter: ^1.0.1 + checksum: d4ef8c6ba85cc0060c09ded79152d46cdd1a85124c655f40bb8ca72a4b52dfe7ef101b45dae1ac04558900ccb10b98e5c9570be22715a7dc158e822728e159b5 + languageName: node + linkType: hard + "eth-lib@npm:0.2.8": version: 0.2.8 resolution: "eth-lib@npm:0.2.8" @@ -8125,6 +8779,53 @@ __metadata: languageName: node linkType: hard +"eth-query@npm:^2.1.0, eth-query@npm:^2.1.2": + version: 2.1.2 + resolution: "eth-query@npm:2.1.2" + dependencies: + json-rpc-random-id: ^1.0.0 + xtend: ^4.0.1 + checksum: 83daa0e28452c54722aec78cd24d036bad5b6e7c08035d98e10d4bea11f71662f12cab63ebd8a848d4df46ad316503d54ecccb41c9244d2ea8b29364b0a20201 + languageName: node + linkType: hard + +"eth-rpc-errors@npm:4.0.2": + version: 4.0.2 + resolution: "eth-rpc-errors@npm:4.0.2" + dependencies: + fast-safe-stringify: ^2.0.6 + checksum: 1dbdee8f416090f1d318e17bdee2251d174d73c8faa4286fa364bc51ae9105672045f2d078ec23ca6a2b4b92af7cfbe7fa1ba17ad49e591fc653a363bf8cbab2 + languageName: node + linkType: hard + +"eth-rpc-errors@npm:^3.0.0": + version: 3.0.0 + resolution: "eth-rpc-errors@npm:3.0.0" + dependencies: + fast-safe-stringify: ^2.0.6 + checksum: c14db72bd28e8545ce8d6bbe22fa092b11695cfedc22632eda875324354edac813742c097cf56e214bd3adc14c8b1160a7b8ee371c93126e5abbb55ca75671eb + languageName: node + linkType: hard + +"eth-rpc-errors@npm:^4.0.2": + version: 4.0.3 + resolution: "eth-rpc-errors@npm:4.0.3" + dependencies: + fast-safe-stringify: ^2.0.6 + checksum: 5fa31d1a10fdb340733b9a55e38e7687222c501052ca20743cef4d0c911a9bbcc0cad54aa6bf3e4b428604c071ff519803060e1cbc79ddb7c9257c11d407d32a + languageName: node + linkType: hard + +"eth-sig-util@npm:^1.4.2": + version: 1.4.2 + resolution: "eth-sig-util@npm:1.4.2" + dependencies: + ethereumjs-abi: "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util: ^5.1.1 + checksum: 578f5c571c1bb0a86dc1bd4a5b56b8073b37823496d7afa74d772cf91ae6860f91bafcbee931be39a3d13f0c195df9f026a27fce350605ad5d15901a5a4ea94a + languageName: node + linkType: hard + "ethereum-bloom-filters@npm:^1.0.6": version: 1.0.10 resolution: "ethereum-bloom-filters@npm:1.0.10" @@ -8134,6 +8835,20 @@ __metadata: languageName: node linkType: hard +"ethereum-common@npm:0.2.0": + version: 0.2.0 + resolution: "ethereum-common@npm:0.2.0" + checksum: 5e80af27482530ac700676502cd4c02a7248c064999d01dced302f5f40a180c86f57caaab347dbd12482c2869539d321c8c0039db9e3dfb1411e6ad3d57b2547 + languageName: node + linkType: hard + +"ethereum-common@npm:^0.0.18": + version: 0.0.18 + resolution: "ethereum-common@npm:0.0.18" + checksum: 2244126199604abc17508ca249c6f8a66a2ed02e9c97115f234e311f42e2d67aedff08128569fa3dfb8a2d09e1c194eace39a1ce61bfeb2338b6d3f2ac324ee8 + languageName: node + linkType: hard + "ethereum-cryptography@npm:^0.1.3": version: 0.1.3 resolution: "ethereum-cryptography@npm:0.1.3" @@ -8157,6 +8872,110 @@ __metadata: languageName: node linkType: hard +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version: 0.6.8 + resolution: "ethereumjs-abi@https://github.com/ethereumjs/ethereumjs-abi.git#commit=ee3994657fa7a427238e6ba92a84d0b529bbcde0" + dependencies: + bn.js: ^4.11.8 + ethereumjs-util: ^6.0.0 + checksum: ae074be0bb012857ab5d3ae644d1163b908a48dd724b7d2567cfde309dc72222d460438f2411936a70dc949dc604ce1ef7118f7273bd525815579143c907e336 + languageName: node + linkType: hard + +"ethereumjs-account@npm:^2.0.3": + version: 2.0.5 + resolution: "ethereumjs-account@npm:2.0.5" + dependencies: + ethereumjs-util: ^5.0.0 + rlp: ^2.0.0 + safe-buffer: ^5.1.1 + checksum: 2e4546b8b0213168eebd3a5296da904b6f55470e39b4c742d252748927d2b268f8d6374b0178c1d5b7188646f97dae74a7ac1c7485fe96ea557c152b52223f18 + languageName: node + linkType: hard + +"ethereumjs-block@npm:^1.2.2": + version: 1.7.1 + resolution: "ethereumjs-block@npm:1.7.1" + dependencies: + async: ^2.0.1 + ethereum-common: 0.2.0 + ethereumjs-tx: ^1.2.2 + ethereumjs-util: ^5.0.0 + merkle-patricia-tree: ^2.1.2 + checksum: 9967c3674af77ea8475a3c023fa160ef6b614450ec50fa32ac083909ead22d3d1c3148f9407b6593d3ccfbe0c51f889c26aa1c15b17026fc2d35cbc542822af8 + languageName: node + linkType: hard + +"ethereumjs-block@npm:~2.2.0": + version: 2.2.2 + resolution: "ethereumjs-block@npm:2.2.2" + dependencies: + async: ^2.0.1 + ethereumjs-common: ^1.5.0 + ethereumjs-tx: ^2.1.1 + ethereumjs-util: ^5.0.0 + merkle-patricia-tree: ^2.1.2 + checksum: 91f7f60820394e072c9a115da2871a096414644109d2449d4a79b30be67b0080bc848dfa7e2ae7b2ab255de3be4f6736c6cb2b418c29eada794d018cc384e189 + languageName: node + linkType: hard + +"ethereumjs-common@npm:^1.1.0, ethereumjs-common@npm:^1.5.0": + version: 1.5.2 + resolution: "ethereumjs-common@npm:1.5.2" + checksum: 3fc64faced268e0c61da50c5db76d18cfd44325d5706792f32ac8c85c0e800d52db284f042c3bd0623daf59b946176ef7dbea476d1b0252492137fa4549a3349 + languageName: node + linkType: hard + +"ethereumjs-tx@npm:^1.2.0, ethereumjs-tx@npm:^1.2.2": + version: 1.3.7 + resolution: "ethereumjs-tx@npm:1.3.7" + dependencies: + ethereum-common: ^0.0.18 + ethereumjs-util: ^5.0.0 + checksum: fe2323fe7db7f5dda85715dc67c31dd1f2925bf5a88e393ba939dbe699b73df008f1332f711b1aa37e943193acf3b6976202a33f2fab1f7675b6d2dd70f424d4 + languageName: node + linkType: hard + +"ethereumjs-tx@npm:^2.1.1": + version: 2.1.2 + resolution: "ethereumjs-tx@npm:2.1.2" + dependencies: + ethereumjs-common: ^1.5.0 + ethereumjs-util: ^6.0.0 + checksum: a5b607b4e125ed696d76a9e4db8a95e03a967323c66694912d799619b16fa43985336924221f9e7582dc1b09ff88a62116bf2290ee14d952bf7e6715e5728525 + languageName: node + linkType: hard + +"ethereumjs-util@npm:^5.0.0, ethereumjs-util@npm:^5.1.1, ethereumjs-util@npm:^5.1.2, ethereumjs-util@npm:^5.1.5": + version: 5.2.1 + resolution: "ethereumjs-util@npm:5.2.1" + dependencies: + bn.js: ^4.11.0 + create-hash: ^1.1.2 + elliptic: ^6.5.2 + ethereum-cryptography: ^0.1.3 + ethjs-util: ^0.1.3 + rlp: ^2.0.0 + safe-buffer: ^5.1.1 + checksum: 20db6c639d92b35739fd5f7a71e64a92e85442ea0d176b59b5cd5828265b6cf42bd4868cf81a9b20a83738db1ffa7a2f778f1d850d663627a1a5209f7904b44f + languageName: node + linkType: hard + +"ethereumjs-util@npm:^6.0.0": + version: 6.2.1 + resolution: "ethereumjs-util@npm:6.2.1" + dependencies: + "@types/bn.js": ^4.11.3 + bn.js: ^4.11.0 + create-hash: ^1.1.2 + elliptic: ^6.5.2 + ethereum-cryptography: ^0.1.3 + ethjs-util: 0.1.6 + rlp: ^2.2.3 + checksum: e3cb4a2c034a2529281fdfc21a2126fe032fdc3038863f5720352daa65ddcc50fc8c67dbedf381a882dc3802e05d979287126d7ecf781504bde1fd8218693bde + languageName: node + linkType: hard + "ethereumjs-util@npm:^7.1.5": version: 7.1.5 resolution: "ethereumjs-util@npm:7.1.5" @@ -8170,6 +8989,25 @@ __metadata: languageName: node linkType: hard +"ethereumjs-vm@npm:^2.3.4": + version: 2.6.0 + resolution: "ethereumjs-vm@npm:2.6.0" + dependencies: + async: ^2.1.2 + async-eventemitter: ^0.2.2 + ethereumjs-account: ^2.0.3 + ethereumjs-block: ~2.2.0 + ethereumjs-common: ^1.1.0 + ethereumjs-util: ^6.0.0 + fake-merkle-patricia-tree: ^1.0.1 + functional-red-black-tree: ^1.0.1 + merkle-patricia-tree: ^2.3.2 + rustbn.js: ~0.2.0 + safe-buffer: ^5.1.1 + checksum: 3b3098b2ac3d5335797e4d73fceb76d1b776e453abb5fa4d1cd94f6391f493e95e3c89a8ee602558bc2a3b36b89977e66473de73faa87c8540b1954aa7b8c3fd + languageName: node + linkType: hard + "ethjs-unit@npm:0.1.6": version: 0.1.6 resolution: "ethjs-unit@npm:0.1.6" @@ -8180,6 +9018,16 @@ __metadata: languageName: node linkType: hard +"ethjs-util@npm:0.1.6, ethjs-util@npm:^0.1.3": + version: 0.1.6 + resolution: "ethjs-util@npm:0.1.6" + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + checksum: 1f42959e78ec6f49889c49c8a98639e06f52a15966387dd39faf2930db48663d026efb7db2702dcffe7f2a99c4a0144b7ce784efdbf733f4077aae95de76d65f + languageName: node + linkType: hard + "event-stream@npm:=3.3.4": version: 3.3.4 resolution: "event-stream@npm:3.3.4" @@ -8209,6 +9057,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:4.0.7, eventemitter3@npm:^4.0.4, eventemitter3@npm:^4.0.7": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 + languageName: node + linkType: hard + "eventemitter3@npm:^3.0.0, eventemitter3@npm:^3.1.0": version: 3.1.2 resolution: "eventemitter3@npm:3.1.2" @@ -8216,10 +9071,10 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.4": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 +"events@npm:^3.0.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 languageName: node linkType: hard @@ -8466,6 +9321,22 @@ __metadata: languageName: node linkType: hard +"eyes@npm:^0.1.8": + version: 0.1.8 + resolution: "eyes@npm:0.1.8" + checksum: c31703a92bf36ba75ee8d379ee7985c24ee6149f3a6175f44cec7a05b178c38bce9836d3ca48c9acb0329a960ac2c4b2ead4e60cdd4fe6e8c92cad7cd6913687 + languageName: node + linkType: hard + +"fake-merkle-patricia-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "fake-merkle-patricia-tree@npm:1.0.1" + dependencies: + checkpoint-store: ^1.1.0 + checksum: 8f9fe05bb5beabb31e4fbb8d2cfe83cfb36fd9f6ba78193dea8fab7a679470d45bb04c6f052d4f79da03e81129c5b5bed528902430184e1e11b4959f397019ac + languageName: node + linkType: hard + "fancy-log@npm:^1.3.2": version: 1.3.3 resolution: "fancy-log@npm:1.3.3" @@ -8540,6 +9411,20 @@ __metadata: languageName: node linkType: hard +"fast-safe-stringify@npm:^2.0.6": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d + languageName: node + linkType: hard + +"fast-stable-stringify@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-stable-stringify@npm:1.0.0" + checksum: ef1203d246a7e8ac15e2bfbda0a89fa375947bccf9f7910be0ea759856dbe8ea5024a0d8cc2cceabe18a9cb67e95927b78bb6173a3ae37ec55a518cf36e5244b + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.15.0 resolution: "fastq@npm:1.15.0" @@ -9846,7 +10731,7 @@ fsevents@^2.3.2: languageName: node linkType: hard -"ieee754@npm:^1.1.13": +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e @@ -9892,6 +10777,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"immediate@npm:^3.2.3": + version: 3.3.0 + resolution: "immediate@npm:3.3.0" + checksum: 634b4305101e2452eba6c07d485bf3e415995e533c94b9c3ffbc37026fa1be34def6e4f2276b0dc2162a3f91628564a4bfb26280278b89d3ee54624e854d2f5f + languageName: node + linkType: hard + "immediate@npm:~3.0.5": version: 3.0.6 resolution: "immediate@npm:3.0.6" @@ -10008,7 +10900,7 @@ fsevents@^2.3.2: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -10364,6 +11256,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"is-fn@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fn@npm:1.0.0" + checksum: eeea1e536716f93a92dc1a8550b2c0909fe74bb5144d0fb6d65e0d31eb9c06c30559f69d83a9351d2288cc7293b43bc074e0fab5fae19e312ff38aa0c7672827 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^1.0.0": version: 1.0.0 resolution: "is-fullwidth-code-point@npm:1.0.0" @@ -10621,7 +11520,7 @@ fsevents@^2.3.2: languageName: node linkType: hard -"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": +"is-typedarray@npm:1.0.0, is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 @@ -10665,6 +11564,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: 49191f1425681df4a18c2f0f93db3adb85573bcdd6a4482539d98eac9e705d8961317b01175627e860516a2fc45f8f9302db26e5a380a97a520e272e2a40a8d4 + languageName: node + linkType: hard + "isarray@npm:1.0.0, isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -10672,6 +11578,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"isarray@npm:^2.0.1": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -10705,6 +11618,15 @@ fsevents@^2.3.2: languageName: node linkType: hard +"isomorphic-ws@npm:^4.0.1": + version: 4.0.1 + resolution: "isomorphic-ws@npm:4.0.1" + peerDependencies: + ws: "*" + checksum: d7190eadefdc28bdb93d67b5f0c603385aaf87724fa2974abb382ac1ec9756ed2cfb27065cbe76122879c2d452e2982bc4314317f3d6c737ddda6c047328771a + languageName: node + linkType: hard + "isstream@npm:~0.1.2": version: 0.1.2 resolution: "isstream@npm:0.1.2" @@ -10842,6 +11764,29 @@ fsevents@^2.3.2: languageName: node linkType: hard +"jayson@npm:^3.4.4": + version: 3.7.0 + resolution: "jayson@npm:3.7.0" + dependencies: + "@types/connect": ^3.4.33 + "@types/node": ^12.12.54 + "@types/ws": ^7.4.4 + JSONStream: ^1.3.5 + commander: ^2.20.3 + delay: ^5.0.0 + es6-promisify: ^5.0.0 + eyes: ^0.1.8 + isomorphic-ws: ^4.0.1 + json-stringify-safe: ^5.0.1 + lodash: ^4.17.20 + uuid: ^8.3.2 + ws: ^7.4.5 + bin: + jayson: bin/jayson.js + checksum: 4218a4829168a4927e657bde953ff9699f02af561ec72edcc7464446772b50a0c5c7e9f11d4ee5976e4794d0f1040c0f351a0fee51c542bf8492743d30b7a971 + languageName: node + linkType: hard + "jest-changed-files@npm:^24.9.0": version: 24.9.0 resolution: "jest-changed-files@npm:24.9.0" @@ -11610,6 +12555,33 @@ fsevents@^2.3.2: languageName: node linkType: hard +"json-rpc-engine@npm:6.1.0, json-rpc-engine@npm:^6.1.0": + version: 6.1.0 + resolution: "json-rpc-engine@npm:6.1.0" + dependencies: + "@metamask/safe-event-emitter": ^2.0.0 + eth-rpc-errors: ^4.0.2 + checksum: 33b6c9bbd81abf8e323a0281ee05871713203c40d34a4d0bda27706cd0a0935c7b51845238ba89b73027e44ebc8034bbd82db9f962e6c578eb922d9b95acc8bd + languageName: node + linkType: hard + +"json-rpc-engine@npm:^5.3.0": + version: 5.4.0 + resolution: "json-rpc-engine@npm:5.4.0" + dependencies: + eth-rpc-errors: ^3.0.0 + safe-event-emitter: ^1.0.1 + checksum: 310af9dc256a14e3695f917912046afcab1fe716d6243616702bc2ebcbc7d164e3c2c04a5ff267e3930ef451e4cd8905651b656988bceb96a7034bf144eb8e67 + languageName: node + linkType: hard + +"json-rpc-random-id@npm:^1.0.0, json-rpc-random-id@npm:^1.0.1": + version: 1.0.1 + resolution: "json-rpc-random-id@npm:1.0.1" + checksum: fcd2e884193a129ace4002bd65a86e9cdb206733b4693baea77bd8b372cf8de3043fbea27716a2c9a716581a908ca8d978d9dfec4847eb2cf77edb4cf4b2252c + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -11740,7 +12712,7 @@ fsevents@^2.3.2: languageName: node linkType: hard -"keccak@npm:^3.0.0": +"keccak@npm:^3.0.0, keccak@npm:^3.0.1": version: 3.0.3 resolution: "keccak@npm:3.0.3" dependencies: @@ -11752,6 +12724,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"keyvaluestorage-interface@npm:^1.0.0": + version: 1.0.0 + resolution: "keyvaluestorage-interface@npm:1.0.0" + checksum: e20530e71b738dc094ad170a91a98d4b9bdc772dd9044b23cdaaa102aafa8997b1ac867550a1e66ba1d64fcaa949214df31aed18413b4bac31e5fe1f2c76c9de + languageName: node + linkType: hard + "kind-of@npm:^1.1.0": version: 1.1.0 resolution: "kind-of@npm:1.1.0" @@ -11863,6 +12842,68 @@ fsevents@^2.3.2: languageName: node linkType: hard +"level-codec@npm:~7.0.0": + version: 7.0.1 + resolution: "level-codec@npm:7.0.1" + checksum: 2565c131d93aea0786af5eda9bb907e3f5152fade03fd7a7751e2f95301fc5241063eb927c2f7df086fac33592523aab8df86bcf7ecc46ed53de11453b600329 + languageName: node + linkType: hard + +"level-errors@npm:^1.0.3": + version: 1.1.2 + resolution: "level-errors@npm:1.1.2" + dependencies: + errno: ~0.1.1 + checksum: 18c22fd574ff31567642a85d9a306604a32cbe969b8469fee29620c10488214a6b5e6bbf19e3b5e2042859e4b81041af537319c18132a1aaa56d4ed5981157b7 + languageName: node + linkType: hard + +"level-errors@npm:~1.0.3": + version: 1.0.5 + resolution: "level-errors@npm:1.0.5" + dependencies: + errno: ~0.1.1 + checksum: a62df2a24987c0100855ec03f03655ddc6170b33a83987a53858ba0a7dbe125b4b5382e01068a1dc899ccf7f9d12b824702da15488bd06b4b3ee7a1e4232cb0a + languageName: node + linkType: hard + +"level-iterator-stream@npm:~1.3.0": + version: 1.3.1 + resolution: "level-iterator-stream@npm:1.3.1" + dependencies: + inherits: ^2.0.1 + level-errors: ^1.0.3 + readable-stream: ^1.0.33 + xtend: ^4.0.0 + checksum: bf57d8dcee6e7ec68e6c580edc768d2e3960f93e741d7d4adcc7d86f267c741ebcfba5353b3b6551ca10d12e30939c90f1a13303313b1b719325111f0ff14540 + languageName: node + linkType: hard + +"level-ws@npm:0.0.0": + version: 0.0.0 + resolution: "level-ws@npm:0.0.0" + dependencies: + readable-stream: ~1.0.15 + xtend: ~2.1.1 + checksum: fcc3e6993b538ed8931612a74ef26cf32b53d71c059a819bb1006c075f0c1198afb79026a69aeeafcbd4598c45b4b214315b4216b44eca68587fce1b5ad61b75 + languageName: node + linkType: hard + +"levelup@npm:^1.2.1": + version: 1.3.9 + resolution: "levelup@npm:1.3.9" + dependencies: + deferred-leveldown: ~1.2.1 + level-codec: ~7.0.0 + level-errors: ~1.0.3 + level-iterator-stream: ~1.3.0 + prr: ~1.0.1 + semver: ~5.4.1 + xtend: ~4.0.0 + checksum: df3b534b948c17d724050f6ecc2b21eb2fde357bd0c68582cd3a5eb4bf943a3057cd2e9db6bd7253020fcb853c83a70943bff9264f5132afa8cf3c25c3c7cd8e + languageName: node + linkType: hard + "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -12159,7 +13200,7 @@ fsevents@^2.3.2: languageName: node linkType: hard -"lodash@npm:^4.17.12, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.2.1, lodash@npm:^4.3.0, lodash@npm:^4.7.0, lodash@npm:~4.17.15": +"lodash@npm:^4.17.12, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.2.1, lodash@npm:^4.3.0, lodash@npm:^4.7.0, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -12266,6 +13307,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"ltgt@npm:~2.2.0": + version: 2.2.1 + resolution: "ltgt@npm:2.2.1" + checksum: 7e3874296f7538bc8087b428ac4208008d7b76916354b34a08818ca7c83958c1df10ec427eeeaad895f6b81e41e24745b18d30f89abcc21d228b94f6961d50a2 + languageName: node + linkType: hard + "macos-release@npm:^2.2.0": version: 2.5.1 resolution: "macos-release@npm:2.5.1" @@ -12277,6 +13325,7 @@ fsevents@^2.3.2: version: 0.0.0-use.local resolution: "magic-sdk-monorepo@workspace:." dependencies: + "@esbuild-plugins/node-modules-polyfill": ^0.2.2 "@ikscodes/browser-env": ~0.3.1 "@ikscodes/eslint-config": ~7.0.2 "@ikscodes/prettier-config": ~2.0.1 @@ -12338,16 +13387,16 @@ fsevents@^2.3.2: languageName: unknown linkType: soft -"magic-sdk@^13.5.0, magic-sdk@workspace:packages/magic-sdk": +"magic-sdk@^13.6.0, magic-sdk@workspace:packages/magic-sdk": version: 0.0.0-use.local resolution: "magic-sdk@workspace:packages/magic-sdk" dependencies: "@babel/core": ^7.9.6 "@babel/plugin-proposal-optional-chaining": ^7.9.0 "@babel/runtime": ^7.9.6 - "@magic-sdk/commons": ^9.5.0 - "@magic-sdk/provider": ^13.5.0 - "@magic-sdk/types": ^11.5.0 + "@magic-sdk/commons": ^9.6.0 + "@magic-sdk/provider": ^13.6.0 + "@magic-sdk/types": ^11.6.0 localforage: ^1.7.4 localforage-driver-memory: ^1.0.5 languageName: unknown @@ -12365,6 +13414,15 @@ fsevents@^2.3.2: languageName: node linkType: hard +"magic-string@npm:^0.25.3": + version: 0.25.9 + resolution: "magic-string@npm:0.25.9" + dependencies: + sourcemap-codec: ^1.4.8 + checksum: 9a0e55a15c7303fc360f9572a71cffba1f61451bc92c5602b1206c9d17f492403bf96f946dfce7483e66822d6b74607262e24392e87b0ac27b786e69a40e9b1a + languageName: node + linkType: hard + "make-dir@npm:^1.0.0, make-dir@npm:^1.3.0": version: 1.3.0 resolution: "make-dir@npm:1.3.0" @@ -12539,6 +13597,20 @@ fsevents@^2.3.2: languageName: node linkType: hard +"memdown@npm:^1.0.0": + version: 1.4.1 + resolution: "memdown@npm:1.4.1" + dependencies: + abstract-leveldown: ~2.7.1 + functional-red-black-tree: ^1.0.1 + immediate: ^3.2.3 + inherits: ~2.0.1 + ltgt: ~2.2.0 + safe-buffer: ~5.1.1 + checksum: 3f89142a12389b1ebfc7adaf3be19ed57cd073f84160eb7419b61c8e188e2b82eb787dad168d7b00ca68355b6b952067d9badaa5ac88c8ee014e4b0af2bfaea0 + languageName: node + linkType: hard + "memorystream@npm:^0.3.1": version: 0.3.1 resolution: "memorystream@npm:0.3.1" @@ -12661,6 +13733,22 @@ fsevents@^2.3.2: languageName: node linkType: hard +"merkle-patricia-tree@npm:^2.1.2, merkle-patricia-tree@npm:^2.3.2": + version: 2.3.2 + resolution: "merkle-patricia-tree@npm:2.3.2" + dependencies: + async: ^1.4.2 + ethereumjs-util: ^5.0.0 + level-ws: 0.0.0 + levelup: ^1.2.1 + memdown: ^1.0.0 + readable-stream: ^2.0.0 + rlp: ^2.0.0 + semaphore: ">=1.0.1" + checksum: f6066a16e08190b9e8d3aa28d8e861a3e884ee0be8109c4f5e879965fdfb8181cfc04bae3aaf97c7fb6d07446d94b4f3e1cce502dde4a5699a03acf6df518b12 + languageName: node + linkType: hard + "metro-babel-register@npm:0.58.0": version: 0.58.0 resolution: "metro-babel-register@npm:0.58.0" @@ -13639,7 +14727,7 @@ fsevents@^2.3.2: languageName: node linkType: hard -"node-fetch@npm:^2.2.0, node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.2.0, node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": version: 2.6.9 resolution: "node-fetch@npm:2.6.9" dependencies: @@ -14055,6 +15143,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"object-keys@npm:~0.4.0": + version: 0.4.0 + resolution: "object-keys@npm:0.4.0" + checksum: 1be3ebe9b48c0d5eda8e4a30657d887a748cb42435e0e2eaf49faf557bdd602cd2b7558b8ce90a4eb2b8592d16b875a1900bce859cbb0f35b21c67e11a45313c + languageName: node + linkType: hard + "object-visit@npm:^1.0.0": version: 1.0.1 resolution: "object-visit@npm:1.0.1" @@ -14792,6 +15887,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"pify@npm:^5.0.0": + version: 5.0.0 + resolution: "pify@npm:5.0.0" + checksum: 443e3e198ad6bfa8c0c533764cf75c9d5bc976387a163792fb553ffe6ce923887cf14eebf5aea9b7caa8eab930da8c33612990ae85bd8c2bc18bedb9eae94ecb + languageName: node + linkType: hard + "pinkie-promise@npm:^2.0.0": version: 2.0.1 resolution: "pinkie-promise@npm:2.0.1" @@ -14882,6 +15984,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"pngjs@npm:^3.3.0": + version: 3.4.0 + resolution: "pngjs@npm:3.4.0" + checksum: 8bd40bd698abd16b72c97b85cb858c80894fbedc76277ce72a784aa441e14795d45d9856e97333ca469b34b67528860ffc8a7317ca6beea349b645366df00bcd + languageName: node + linkType: hard + "posix-character-classes@npm:^0.1.0": version: 0.1.1 resolution: "posix-character-classes@npm:0.1.1" @@ -14889,6 +15998,27 @@ fsevents@^2.3.2: languageName: node linkType: hard +"preact@npm:10.4.1": + version: 10.4.1 + resolution: "preact@npm:10.4.1" + checksum: e8c5eae6dca469226177394cf49994d6beab5b9b10d31e000d8b16d9b00bfa52cdd10b41331759d68646e7b8f601430d78eb025f9026263adc90150699800ed3 + languageName: node + linkType: hard + +"preact@npm:^10.5.9": + version: 10.13.1 + resolution: "preact@npm:10.13.1" + checksum: a10555d18f60a42e29b4ef5bf42f7a6ce4097a2e772c047fab53226e3edef4cfceb6d709452485a41017479750aa6834ab02b6a8269ceb06d489d7c3495b3d04 + languageName: node + linkType: hard + +"precond@npm:0.2": + version: 0.2.3 + resolution: "precond@npm:0.2.3" + checksum: c613e7d68af3e0b43a294a994bf067cc2bc44b03fd17bc4fb133e30617a4f5b49414b08e9b392d52d7c6822d8a71f66a7fe93a8a1e7d02240177202cff3f63ef + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -15034,6 +16164,16 @@ fsevents@^2.3.2: languageName: node linkType: hard +"promise-to-callback@npm:^1.0.0": + version: 1.0.0 + resolution: "promise-to-callback@npm:1.0.0" + dependencies: + is-fn: ^1.0.0 + set-immediate-shim: ^1.0.1 + checksum: 8c9e1327386e00f799589cdf96fff2586a13b52b0185222bc3199e1305ba9344589eedfd4038dcbaf5592d85d567097d1507b81e948b7fff6ffdd3de49d54e14 + languageName: node + linkType: hard + "promise@npm:^7.1.1": version: 7.3.1 resolution: "promise@npm:7.3.1" @@ -15103,6 +16243,13 @@ fsevents@^2.3.2: languageName: node linkType: hard +"prr@npm:~1.0.1": + version: 1.0.1 + resolution: "prr@npm:1.0.1" + checksum: 3bca2db0479fd38f8c4c9439139b0c42dcaadcc2fbb7bb8e0e6afaa1383457f1d19aea9e5f961d5b080f1cfc05bfa1fe9e45c97a1d3fd6d421950a73d3108381 + languageName: node + linkType: hard + "ps-tree@npm:^1.2.0": version: 1.2.0 resolution: "ps-tree@npm:1.2.0" @@ -15196,6 +16343,32 @@ fsevents@^2.3.2: languageName: node linkType: hard +"qrcode@npm:1.4.4": + version: 1.4.4 + resolution: "qrcode@npm:1.4.4" + dependencies: + buffer: ^5.4.3 + buffer-alloc: ^1.2.0 + buffer-from: ^1.1.1 + dijkstrajs: ^1.0.1 + isarray: ^2.0.1 + pngjs: ^3.3.0 + yargs: ^13.2.4 + bin: + qrcode: ./bin/qrcode + checksum: 8c1a7ee3092c0ed60f0413594af879ac6dffb897d4921144a8e7ae3dce40c04ba6457ab21664ca43934ba3fe19cced85abaf0b87b07916239d7254d4bb4fcf13 + languageName: node + linkType: hard + +"qs@npm:^6.10.3": + version: 6.11.1 + resolution: "qs@npm:6.11.1" + dependencies: + side-channel: ^1.0.4 + checksum: 82ee78ef12a16f3372fae5b64f76f8aedecb000feea882bbff1af146c147f6eb66b08f9c3f34d7e076f28563586956318b9b2ca41141846cdd6d5ad6f241d52f + languageName: node + linkType: hard + "qs@npm:^6.9.4": version: 6.11.0 resolution: "qs@npm:6.11.0" @@ -15212,6 +16385,17 @@ fsevents@^2.3.2: languageName: node linkType: hard +"query-string@npm:6.13.5": + version: 6.13.5 + resolution: "query-string@npm:6.13.5" + dependencies: + decode-uri-component: ^0.2.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: 1019dea0ab277bdf606bcc022ec223a9ab9947608d2696114ef9198f72ae553be039705d6c52e16af43d9b79bac67385f63fb7fe9241cd2f7b703dd23c7ab8d3 + languageName: node + linkType: hard + "query-string@npm:^5.0.1": version: 5.1.1 resolution: "query-string@npm:5.1.1" @@ -15561,7 +16745,7 @@ fsevents@^2.3.2: languageName: node linkType: hard -"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.6, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": +"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.6, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.2.9, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -15576,7 +16760,7 @@ fsevents@^2.3.2: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": version: 3.6.1 resolution: "readable-stream@npm:3.6.1" dependencies: @@ -15587,6 +16771,30 @@ fsevents@^2.3.2: languageName: node linkType: hard +"readable-stream@npm:^1.0.33": + version: 1.1.14 + resolution: "readable-stream@npm:1.1.14" + dependencies: + core-util-is: ~1.0.0 + inherits: ~2.0.1 + isarray: 0.0.1 + string_decoder: ~0.10.x + checksum: 17dfeae3e909945a4a1abc5613ea92d03269ef54c49288599507fc98ff4615988a1c39a999dcf9aacba70233d9b7040bc11a5f2bfc947e262dedcc0a8b32b5a0 + languageName: node + linkType: hard + +"readable-stream@npm:~1.0.15": + version: 1.0.34 + resolution: "readable-stream@npm:1.0.34" + dependencies: + core-util-is: ~1.0.0 + inherits: ~2.0.1 + isarray: 0.0.1 + string_decoder: ~0.10.x + checksum: 85042c537e4f067daa1448a7e257a201070bfec3dd2706abdbd8ebc7f3418eb4d3ed4b8e5af63e2544d69f88ab09c28d5da3c0b77dc76185fddd189a59863b60 + languageName: node + linkType: hard + "readdir-scoped-modules@npm:^1.0.0": version: 1.1.0 resolution: "readdir-scoped-modules@npm:1.1.0" @@ -15820,7 +17028,7 @@ fsevents@^2.3.2: languageName: node linkType: hard -"request@npm:^2.88.0": +"request@npm:^2.85.0, request@npm:^2.88.0": version: 2.88.2 resolution: "request@npm:2.88.2" dependencies: @@ -16091,7 +17299,7 @@ resolve@~1.7.1: languageName: node linkType: hard -"rlp@npm:^2.2.4": +"rlp@npm:^2.0.0, rlp@npm:^2.2.3, rlp@npm:^2.2.4": version: 2.2.7 resolution: "rlp@npm:2.2.7" dependencies: @@ -16102,6 +17310,54 @@ resolve@~1.7.1: languageName: node linkType: hard +"rollup-plugin-inject@npm:^3.0.0": + version: 3.0.2 + resolution: "rollup-plugin-inject@npm:3.0.2" + dependencies: + estree-walker: ^0.6.1 + magic-string: ^0.25.3 + rollup-pluginutils: ^2.8.1 + checksum: a014972c80fe34b8c8154056fa2533a8440066a31de831e3793fc21b15d108d92c22d8f7f472397bd5783d7c5e04d8cbf112fb72c5a26e997726e4eb090edad1 + languageName: node + linkType: hard + +"rollup-plugin-node-polyfills@npm:^0.2.1": + version: 0.2.1 + resolution: "rollup-plugin-node-polyfills@npm:0.2.1" + dependencies: + rollup-plugin-inject: ^3.0.0 + checksum: e84645212c443aca3cfae2ba69f01c6d8c5c250f0bf651416b69a4572b60aae9da7cdd687de3ab9b903f7a1ab96b06b71f0c4927d1b02a37485360d2b563937b + languageName: node + linkType: hard + +"rollup-pluginutils@npm:^2.8.1": + version: 2.8.2 + resolution: "rollup-pluginutils@npm:2.8.2" + dependencies: + estree-walker: ^0.6.1 + checksum: 339fdf866d8f4ff6e408fa274c0525412f7edb01dc46b5ccda51f575b7e0d20ad72965773376fb5db95a77a7fcfcab97bf841ec08dbadf5d6b08af02b7a2cf5e + languageName: node + linkType: hard + +"rpc-websockets@npm:^7.5.1": + version: 7.5.1 + resolution: "rpc-websockets@npm:7.5.1" + dependencies: + "@babel/runtime": ^7.17.2 + bufferutil: ^4.0.1 + eventemitter3: ^4.0.7 + utf-8-validate: ^5.0.2 + uuid: ^8.3.2 + ws: ^8.5.0 + dependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 9dda8c63a1d3e85e11597e1c364835ec6aa9a8de1b5cfb1629d0eafc3ae04509011d485025ed4f717c0b1dd048e2aafdd75080e866540b93e55fd8a2cd91bcfe + languageName: node + linkType: hard + "rsvp@npm:^4.8.4": version: 4.8.5 resolution: "rsvp@npm:4.8.5" @@ -16134,6 +17390,13 @@ resolve@~1.7.1: languageName: node linkType: hard +"rustbn.js@npm:~0.2.0": + version: 0.2.0 + resolution: "rustbn.js@npm:0.2.0" + checksum: 2148e7ba34e70682907ee29df4784639e6eb025481b2c91249403b7ec57181980161868d9aa24822a5075dd1bb5a180dfedc77309e5f0d27b6301f9b563af99a + languageName: node + linkType: hard + "rx-lite-aggregates@npm:^4.0.8": version: 4.0.8 resolution: "rx-lite-aggregates@npm:4.0.8" @@ -16150,7 +17413,7 @@ resolve@~1.7.1: languageName: node linkType: hard -"rxjs@npm:^6.4.0": +"rxjs@npm:^6.4.0, rxjs@npm:^6.6.3": version: 6.6.7 resolution: "rxjs@npm:6.6.7" dependencies: @@ -16182,6 +17445,15 @@ resolve@~1.7.1: languageName: node linkType: hard +"safe-event-emitter@npm:^1.0.1": + version: 1.0.1 + resolution: "safe-event-emitter@npm:1.0.1" + dependencies: + events: ^3.0.0 + checksum: 2a15094bd28b0966571693f219b5a846949ae24f7ba87c6024f0ed552bef63ebe72970a784b85b77b1f03f1c95e78fabe19306d44538dbc4a3a685bed31c18c4 + languageName: node + linkType: hard + "safe-regex-test@npm:^1.0.0": version: 1.0.0 resolution: "safe-regex-test@npm:1.0.0" @@ -16289,6 +17561,13 @@ resolve@~1.7.1: languageName: node linkType: hard +"semaphore@npm:>=1.0.1, semaphore@npm:^1.0.3": + version: 1.1.0 + resolution: "semaphore@npm:1.1.0" + checksum: d2445d232ad9959048d4748ef54eb01bc7b60436be2b42fb7de20c4cffacf70eafeeecd3772c1baf408cfdce3805fa6618a4389590335671f18cde54ef3cfae4 + languageName: node + linkType: hard + "semver-compare@npm:^1.0.0": version: 1.0.0 resolution: "semver-compare@npm:1.0.0" @@ -16325,6 +17604,15 @@ resolve@~1.7.1: languageName: node linkType: hard +"semver@npm:~5.4.1": + version: 5.4.1 + resolution: "semver@npm:5.4.1" + bin: + semver: ./bin/semver + checksum: d4bf8cc6a95b065a545ab35082b6ac6c5f4ebe1e1c570f72c252afe9b7e622f2479fb2a5cef3e937d8807d37bfdad2d1feebcc8610e06f556e552c22cad070a2 + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -16372,6 +17660,13 @@ resolve@~1.7.1: languageName: node linkType: hard +"set-immediate-shim@npm:^1.0.1": + version: 1.0.1 + resolution: "set-immediate-shim@npm:1.0.1" + checksum: 5085c84039d1e5eee73d2bf48ce765fcec76159021d0cc7b40e23bcdf62cb6d450ffb781e3c62c1118425242c48eae96df712cba0a20a437e86b0d4a15d51a11 + languageName: node + linkType: hard + "set-value@npm:^2.0.0, set-value@npm:^2.0.1": version: 2.0.1 resolution: "set-value@npm:2.0.1" @@ -16398,7 +17693,7 @@ resolve@~1.7.1: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": version: 2.4.11 resolution: "sha.js@npm:2.4.11" dependencies: @@ -16740,6 +18035,13 @@ resolve@~1.7.1: languageName: node linkType: hard +"sourcemap-codec@npm:^1.4.8": + version: 1.4.8 + resolution: "sourcemap-codec@npm:1.4.8" + checksum: b57981c05611afef31605732b598ccf65124a9fcb03b833532659ac4d29ac0f7bfacbc0d6c5a28a03e84c7510e7e556d758d0bb57786e214660016fb94279316 + languageName: node + linkType: hard + "spawn-wrap@npm:^1.4.2": version: 1.4.3 resolution: "spawn-wrap@npm:1.4.3" @@ -16951,6 +18253,16 @@ resolve@~1.7.1: languageName: node linkType: hard +"stream-browserify@npm:^3.0.0": + version: 3.0.0 + resolution: "stream-browserify@npm:3.0.0" + dependencies: + inherits: ~2.0.4 + readable-stream: ^3.5.0 + checksum: 4c47ef64d6f03815a9ca3874e2319805e8e8a85f3550776c47ce523b6f4c6cd57f40e46ec6a9ab8ad260fde61863c2718f250d3bedb3fe9052444eb9abfd9921 + languageName: node + linkType: hard + "stream-buffers@npm:2.2.x": version: 2.2.0 resolution: "stream-buffers@npm:2.2.0" @@ -17123,6 +18435,13 @@ resolve@~1.7.1: languageName: node linkType: hard +"string_decoder@npm:~0.10.x": + version: 0.10.31 + resolution: "string_decoder@npm:0.10.31" + checksum: fe00f8e303647e5db919948ccb5ce0da7dea209ab54702894dd0c664edd98e5d4df4b80d6fabf7b9e92b237359d21136c95bf068b2f7760b772ca974ba970202 + languageName: node + linkType: hard + "string_decoder@npm:~1.1.1": version: 1.1.1 resolution: "string_decoder@npm:1.1.1" @@ -17286,6 +18605,13 @@ resolve@~1.7.1: languageName: node linkType: hard +"superstruct@npm:^0.14.2": + version: 0.14.2 + resolution: "superstruct@npm:0.14.2" + checksum: c5c4840f432da82125b923ec45faca5113217e83ae416e314d80eae012b8bb603d2e745025d173450758d116348820bc7028157f8c9a72b6beae879f94b837c0 + languageName: node + linkType: hard + "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -17470,6 +18796,13 @@ resolve@~1.7.1: languageName: node linkType: hard +"text-encoding-utf-8@npm:^1.0.2": + version: 1.0.2 + resolution: "text-encoding-utf-8@npm:1.0.2" + checksum: ec4c15d50e738c5dba7327ad432ebf0725ec75d4d69c0bd55609254c5a3bc5341272d7003691084a0a73d60d981c8eb0e87603676fdb6f3fed60f4c9192309f9 + languageName: node + linkType: hard + "text-extensions@npm:^1.0.0": version: 1.9.0 resolution: "text-extensions@npm:1.9.0" @@ -17653,6 +18986,13 @@ resolve@~1.7.1: languageName: node linkType: hard +"toggle-selection@npm:^1.0.6": + version: 1.0.6 + resolution: "toggle-selection@npm:1.0.6" + checksum: a90dc80ed1e7b18db8f4e16e86a5574f87632dc729cfc07d9ea3ced50021ad42bb4e08f22c0913e0b98e3837b0b717e0a51613c65f30418e21eb99da6556a74c + languageName: node + linkType: hard + "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -17867,6 +19207,13 @@ resolve@~1.7.1: languageName: node linkType: hard +"tslib@npm:1.14.1, tslib@npm:^1.14.1, tslib@npm:^1.6.0, tslib@npm:^1.8.1, tslib@npm:^1.9.0": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + "tslib@npm:2.1.0": version: 2.1.0 resolution: "tslib@npm:2.1.0" @@ -17874,13 +19221,6 @@ resolve@~1.7.1: languageName: node linkType: hard -"tslib@npm:^1.14.1, tslib@npm:^1.6.0, tslib@npm:^1.8.1, tslib@npm:^1.9.0": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd - languageName: node - linkType: hard - "tslib@npm:^2, tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1": version: 2.5.0 resolution: "tslib@npm:2.5.0" @@ -18007,7 +19347,7 @@ resolve@~1.7.1: languageName: node linkType: hard -"typedarray-to-buffer@npm:^3.1.5": +"typedarray-to-buffer@npm:3.1.5, typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" dependencies: @@ -18398,7 +19738,7 @@ typescript@~4.4.2: languageName: node linkType: hard -"util@npm:^0.12.0": +"util@npm:^0.12.0, util@npm:^0.12.4": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: @@ -18427,6 +19767,15 @@ typescript@~4.4.2: languageName: node linkType: hard +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -18624,6 +19973,36 @@ typescript@~4.4.2: languageName: node linkType: hard +"web3-provider-engine@npm:16.0.1": + version: 16.0.1 + resolution: "web3-provider-engine@npm:16.0.1" + dependencies: + async: ^2.5.0 + backoff: ^2.5.0 + clone: ^2.0.0 + cross-fetch: ^2.1.0 + eth-block-tracker: ^4.4.2 + eth-json-rpc-filters: ^4.2.1 + eth-json-rpc-infura: ^5.1.0 + eth-json-rpc-middleware: ^6.0.0 + eth-rpc-errors: ^3.0.0 + eth-sig-util: ^1.4.2 + ethereumjs-block: ^1.2.2 + ethereumjs-tx: ^1.2.0 + ethereumjs-util: ^5.1.5 + ethereumjs-vm: ^2.3.4 + json-stable-stringify: ^1.0.1 + promise-to-callback: ^1.0.0 + readable-stream: ^2.2.9 + request: ^2.85.0 + semaphore: ^1.0.3 + ws: ^5.1.1 + xhr: ^2.2.0 + xtend: ^4.0.1 + checksum: 5a4e2da10efaa96128b28c8962d2a522dc56678ae5fa7f3f64c0c6a824344e49f026760c8754b137180da85afcf65af17de1eff6f8ecebd648aae794a267873b + languageName: node + linkType: hard + "web3-providers-http@npm:1.5.2": version: 1.5.2 resolution: "web3-providers-http@npm:1.5.2" @@ -18741,6 +20120,13 @@ typescript@~4.4.2: languageName: node linkType: hard +"whatwg-fetch@npm:^2.0.4": + version: 2.0.4 + resolution: "whatwg-fetch@npm:2.0.4" + checksum: de7c65a68d7d62e2f144a6b30293370b3ad82b65ebcd68f2ac8e8bbe7ede90febd98ba9486b78c1cbc950e0e8838fa5c2727f939899ab3fc7b71a04be52d33a5 + languageName: node + linkType: hard + "whatwg-mimetype@npm:^2.2.0, whatwg-mimetype@npm:^2.3.0": version: 2.3.0 resolution: "whatwg-mimetype@npm:2.3.0" @@ -19009,6 +20395,21 @@ typescript@~4.4.2: languageName: node linkType: hard +"ws@npm:7.5.3": + version: 7.5.3 + resolution: "ws@npm:7.5.3" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 423dc0d859fa74020f5555140905b862470a60ea1567bb9ad55a087263d7718b9c94f69678be1cee9868925c570f1e6fc79d09f90c39057bc63fa2edbb2c547b + languageName: node + linkType: hard + "ws@npm:^1.1.0, ws@npm:^1.1.5": version: 1.1.5 resolution: "ws@npm:1.1.5" @@ -19019,7 +20420,16 @@ typescript@~4.4.2: languageName: node linkType: hard -"ws@npm:^7, ws@npm:^7.0.0, ws@npm:^7.4.6": +"ws@npm:^5.1.1": + version: 5.2.3 + resolution: "ws@npm:5.2.3" + dependencies: + async-limiter: ~1.0.0 + checksum: bdb2223a40c2c68cf91b25a6c9b8c67d5275378ec6187f343314d3df7530e55b77cb9fe79fb1c6a9758389ac5aefc569d24236924b5c65c5dbbaff409ef739fc + languageName: node + linkType: hard + +"ws@npm:^7, ws@npm:^7.0.0, ws@npm:^7.4.5, ws@npm:^7.4.6": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -19034,6 +20444,21 @@ typescript@~4.4.2: languageName: node linkType: hard +"ws@npm:^8.5.0": + version: 8.12.1 + resolution: "ws@npm:8.12.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 97301c1c4d838fc81bd413f370f75c12aabe44527b31323b761eab3043a9ecb7e32ffd668548382c9a6a5ad3a1c3a9249608e8338e6b939f2f9540f1e21970b5 + languageName: node + linkType: hard + "wsrun@npm:^5.2.1": version: 5.2.4 resolution: "wsrun@npm:5.2.4" @@ -19096,7 +20521,7 @@ typescript@~4.4.2: languageName: node linkType: hard -"xhr@npm:^2.0.4": +"xhr@npm:^2.0.4, xhr@npm:^2.2.0": version: 2.6.0 resolution: "xhr@npm:2.6.0" dependencies: @@ -19145,13 +20570,22 @@ typescript@~4.4.2: languageName: node linkType: hard -"xtend@npm:^4.0.0, xtend@npm:~4.0.1": +"xtend@npm:^4.0.0, xtend@npm:^4.0.1, xtend@npm:~4.0.0, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a languageName: node linkType: hard +"xtend@npm:~2.1.1": + version: 2.1.2 + resolution: "xtend@npm:2.1.2" + dependencies: + object-keys: ~0.4.0 + checksum: a8b79f31502c163205984eaa2b196051cd2fab0882b49758e30f2f9018255bc6c462e32a090bf3385d1bda04755ad8cc0052a09e049b0038f49eb9b950d9c447 + languageName: node + linkType: hard + "y18n@npm:^3.2.1": version: 3.2.2 resolution: "y18n@npm:3.2.2" @@ -19281,7 +20715,7 @@ typescript@~4.4.2: languageName: node linkType: hard -"yargs@npm:^13.0.0": +"yargs@npm:^13.0.0, yargs@npm:^13.2.4": version: 13.3.2 resolution: "yargs@npm:13.3.2" dependencies: From 5377aacccb9ca1fe513169fb01583292f05a64bd Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Fri, 10 Mar 2023 09:36:24 -0500 Subject: [PATCH 02/11] add coinbasewallet.sdk type --- .../@magic-sdk/types/src/core/third-party-wallet-options.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@magic-sdk/types/src/core/third-party-wallet-options.ts b/packages/@magic-sdk/types/src/core/third-party-wallet-options.ts index c967f6026..004bf5c56 100644 --- a/packages/@magic-sdk/types/src/core/third-party-wallet-options.ts +++ b/packages/@magic-sdk/types/src/core/third-party-wallet-options.ts @@ -1,6 +1,6 @@ export interface ThirdPartyWalletOptions { coinbaseWallet?: { - sdk: any; + sdk: CoinbaseWalletSDKOptions; provider: { jsonRpcUrl?: string; chainId?: number; From 3b83a1251f29db42ac4cb3bd0e145eb377f226d9 Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Fri, 10 Mar 2023 09:38:44 -0500 Subject: [PATCH 03/11] update coinbasewallet.sdk type --- packages/@magic-sdk/provider/src/modules/wallet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@magic-sdk/provider/src/modules/wallet.ts b/packages/@magic-sdk/provider/src/modules/wallet.ts index 7782b0209..872d9f400 100644 --- a/packages/@magic-sdk/provider/src/modules/wallet.ts +++ b/packages/@magic-sdk/provider/src/modules/wallet.ts @@ -204,7 +204,7 @@ export class WalletModule extends BaseModule { throw new Error(Errors.CoinbaseWalletError); } const coinbaseWallet = new CoinbaseWalletSDK({ - ...sdkConfig, + ...(sdkConfig as any), overrideIsMetaMask: false, headlessMode: true, }); From ea1fd8c74793cd3a70c63b88fdd969f7fb1cb0fd Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Tue, 21 Mar 2023 17:39:58 -0400 Subject: [PATCH 04/11] add test coverage --- jest.config.ts | 4 +- .../@magic-sdk/provider/src/modules/wallet.ts | 60 +++++------ .../wallet/autoConnectIfWalletBrowser.spec.ts | 7 +- .../wallet/connectToCoinbaseWallet.spec.ts | 75 ++++++++++--- .../modules/wallet/connectToMetaMask.spec.ts | 62 ++++++++--- ...connectToThirdPartyWallet-coinbase.spec.ts | 59 +++++++++++ ...connectToThirdPartyWallet-metamask.spec.ts | 34 ++++++ ...tToThirdPartyWallet-wallet-connect.spec.ts | 28 +++++ .../wallet/connectToThirdPartyWallet.spec.ts | 86 --------------- .../wallet/connectToWalletConnect.spec.ts | 31 +++--- .../wallet/connectWithUI-errors.spec.ts | 52 +++++++++ .../spec/modules/wallet/connectWithUI.spec.ts | 100 +++++++++++++++++- .../wallet/disconnect-wallet-connect.spec.ts | 38 +++++++ .../spec/modules/wallet/disconnect.spec.ts | 50 ++++++++- .../getCoinbaseProvider-config-error.spec.ts | 90 ++++++++++++++++ .../wallet/getCoinbaseProvider.spec.ts | 35 +++--- .../test/spec/modules/wallet/getInfo.spec.ts | 2 +- .../wallet/getMetaMaskProvider.spec.ts | 28 ++--- .../wallet/getProvider-coinbase-error.spec.ts | 19 ++++ .../wallet/getProvider-coinbase.spec.ts | 43 ++++++++ .../wallet/getProvider-metamask.spec.ts | 24 +++++ .../getProvider-wallet-connect-error.spec.ts | 23 ++++ .../wallet/getProvider-wallet-connect.spec.ts | 41 +++++++ .../spec/modules/wallet/getProvider.spec.ts | 6 ++ .../spec/modules/wallet/getUserEnv.spec.ts | 14 +++ .../getWalletConnectProvider-error.spec.ts | 27 +++++ .../wallet/getWalletConnectProvider.spec.ts | 41 ++++--- .../wallet/handleWalletSelected.spec.ts | 31 ++++++ .../wallet/isCoinbaseWalletBrowser.spec.ts | 4 +- .../wallet/isCoinbaseWalletInstalled.spec.ts | 15 ++- .../wallet/isMetaMaskInstalled.spec.ts | 25 ++++- .../modules/wallet/isWalletEnabled.spec.ts | 18 ++++ 32 files changed, 936 insertions(+), 236 deletions(-) create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-coinbase.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-metamask.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-wallet-connect.spec.ts delete mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI-errors.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect-wallet-connect.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider-config-error.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-coinbase-error.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-coinbase.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-metamask.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-wallet-connect-error.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-wallet-connect.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider-error.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/handleWalletSelected.spec.ts create mode 100644 packages/@magic-sdk/provider/test/spec/modules/wallet/isWalletEnabled.spec.ts diff --git a/jest.config.ts b/jest.config.ts index 79f24699e..1c0c14ae2 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -11,9 +11,9 @@ const config: Config.InitialOptions = { global: { lines: 99, statements: 99, - functions: 99, + functions: 98, branches: 99, - } + }, }, setupFilesAfterEnv: ['./test/setup.ts'], globals: { diff --git a/packages/@magic-sdk/provider/src/modules/wallet.ts b/packages/@magic-sdk/provider/src/modules/wallet.ts index 872d9f400..51a72b0b8 100644 --- a/packages/@magic-sdk/provider/src/modules/wallet.ts +++ b/packages/@magic-sdk/provider/src/modules/wallet.ts @@ -22,10 +22,7 @@ export class WalletModule extends BaseModule { // If within metamask wallet browser, auto-connect without any UI (if dapp has metamask enabled) if (this.isMetaMaskBrowser()) { try { - const isMetaMaskEnabledPayload = createJsonRpcRequestPayload('mc_is_wallet_enabled', [ - { wallet: Wallets.MetaMask }, - ]); - const isMetaMaskEnabled = await this.request(isMetaMaskEnabledPayload); + const isMetaMaskEnabled = await this.isWalletEnabled(Wallets.MetaMask); if (isMetaMaskEnabled) { return this.autoConnectIfWalletBrowser(Wallets.MetaMask); } @@ -37,10 +34,7 @@ export class WalletModule extends BaseModule { // If within coinbase wallet browser, auto-connect without any UI (if dapp has coinbase enabled) if (this.isCoinbaseWalletBrowser()) { try { - const isCoinbaseWalletEnabledPayload = createJsonRpcRequestPayload('mc_is_wallet_enabled', [ - { wallet: Wallets.CoinbaseWallet }, - ]); - const isCoinbaseWalletEnabled = await this.request(isCoinbaseWalletEnabledPayload); + const isCoinbaseWalletEnabled = await this.isWalletEnabled(Wallets.CoinbaseWallet); if (isCoinbaseWalletEnabled) { return this.autoConnectIfWalletBrowser(Wallets.CoinbaseWallet); } @@ -49,21 +43,12 @@ export class WalletModule extends BaseModule { console.error(error); } } - const userEnv = this.getUserEnv(); const loginRequestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.Login, [userEnv]); const loginRequest = this.request(loginRequestPayload); - - loginRequest.on(Events.WalletSelected as any, async (params: { wallet: Wallets; showModal: boolean }) => { - try { - const address = await this.connectToThirdPartyWallet(params.wallet, loginRequestPayload.id, params.showModal); - await setItem(this.localForageKey, params.wallet); - this.createIntermediaryEvent(Events.WalletConnected as any, loginRequestPayload.id as any)(address); - } catch (error) { - this.createIntermediaryEvent(Events.WalletRejected as any, loginRequestPayload.id as any)(); - } - }); - + loginRequest.on(Events.WalletSelected as any, (params) => + this.handleWalletSelected({ ...params, showModal: !!params.showModal, payloadId: loginRequestPayload.id }), + ); return loginRequest; } @@ -113,7 +98,7 @@ export class WalletModule extends BaseModule { const activeWallet = await getItem(this.localForageKey); if (activeWallet === Wallets.WalletConnect) { const provider = await this.getWalletConnectProvider(false); - provider.disconnect(); + await provider.disconnect(); } if (activeWallet === Wallets.CoinbaseWallet) { const coinbase = this.getCoinbaseProvider(); @@ -125,6 +110,7 @@ export class WalletModule extends BaseModule { } /* Private methods */ + private localForageKey = 'mc_active_wallet'; /* MetaMask */ @@ -260,19 +246,31 @@ export class WalletModule extends BaseModule { } } - private async autoConnectIfWalletBrowser(wallet: Wallets): Promise { - let address; + private isWalletEnabled(wallet: Wallets): Promise { + const isWalletEnabled = createJsonRpcRequestPayload('mc_is_wallet_enabled', [{ wallet }]); + return this.request(isWalletEnabled); + } + + /* Triggers connection to wallet, emits success/reject event back to iframe */ + private async handleWalletSelected(params: { wallet: Wallets; showModal: boolean; payloadId: number }) { try { - if (wallet === Wallets.MetaMask) { - address = await this.getMetaMaskProvider().request({ method: 'eth_requestAccounts' }); - } - if (wallet === Wallets.CoinbaseWallet) { - address = await this.getCoinbaseProvider().provider.request({ method: 'eth_requestAccounts' }); - } - await setItem(this.localForageKey, wallet); + const address = await this.connectToThirdPartyWallet(params.wallet, params.payloadId, params.showModal); + await setItem(this.localForageKey, params.wallet); + this.createIntermediaryEvent(Events.WalletConnected as any, params.payloadId as any)(address); } catch (error) { - console.error(error); + this.createIntermediaryEvent(Events.WalletRejected as any, params.payloadId as any)(); + } + } + + private async autoConnectIfWalletBrowser(wallet: Wallets): Promise { + let address; + if (wallet === Wallets.MetaMask) { + address = await this.getMetaMaskProvider().request({ method: 'eth_requestAccounts' }); + } + if (wallet === Wallets.CoinbaseWallet) { + address = await this.getCoinbaseProvider().provider.request({ method: 'eth_requestAccounts' }); } + await setItem(this.localForageKey, wallet); const autoConnectPayload = createJsonRpcRequestPayload(MagicPayloadMethod.AutoConnect, [{ wallet, address }]); const autoConnectRequest = this.request(autoConnectPayload); return autoConnectRequest; diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/autoConnectIfWalletBrowser.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/autoConnectIfWalletBrowser.spec.ts index 54b2249a4..1b51323c5 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/autoConnectIfWalletBrowser.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/autoConnectIfWalletBrowser.spec.ts @@ -2,6 +2,7 @@ import browserEnv from '@ikscodes/browser-env'; import { createMagicSDK } from '../../../factories'; beforeEach(() => { + browserEnv({ url: 'http://localhost' }); browserEnv.restore(); }); @@ -38,7 +39,6 @@ test('If coinbase browser, wallet and address params should be populated', async return ''; }, }; - window.ethereum = provider; const magic = createMagicSDK({ thirdPartyWalletOptions: { @@ -57,9 +57,8 @@ test('If coinbase browser, wallet and address params should be populated', async }); magic.wallet.request = jest.fn(); - magic.wallet.getCoinbaseProvider = jest.fn(() => ({ - provider: window.ethereum, - })); + magic.wallet.getCoinbaseProvider = jest.fn(() => ({ provider })); + await magic.wallet.autoConnectIfWalletBrowser('coinbase_wallet'); const requestPayload = magic.wallet.request.mock.calls[0][0]; expect(requestPayload.method).toBe('mc_auto_connect'); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToCoinbaseWallet.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToCoinbaseWallet.spec.ts index 8c9637c8c..b308f5c1c 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToCoinbaseWallet.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToCoinbaseWallet.spec.ts @@ -1,21 +1,38 @@ import browserEnv from '@ikscodes/browser-env'; +import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'; import { createMagicSDK } from '../../../factories'; +jest.mock('@coinbase/wallet-sdk'); + beforeEach(() => { + browserEnv({ url: 'http://localhost' }); browserEnv.restore(); }); +test('Throws error if no `coinbasewallet` in `thirdPartyWalletOptions`', () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: {}, + }); + magic.wallet.request = jest.fn(); + + expect(() => magic.wallet.getCoinbaseProvider()).toThrowError('Missing Coinbase Wallet Config'); +}); + test('Returns connected wallet address in array', async () => { - const provider = { - isCoinbaseBrowser: true, - request: async (request: { method: string; params?: Array }) => { - if (request.method === 'eth_requestAccounts') { - return ['0x0000000000000000000000000000000000000000']; - } - return ''; - }, - }; - window.ethereum = provider; + jest.spyOn(CoinbaseWalletSDK.prototype, 'getQrUrl').mockImplementation(() => { + return 'qrCodeUrl'; + }); + + const mockedProvider = jest.spyOn(CoinbaseWalletSDK.prototype, 'makeWeb3Provider').mockImplementation(() => { + return { + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + } as any; + }); const magic = createMagicSDK({ thirdPartyWalletOptions: { @@ -33,9 +50,41 @@ test('Returns connected wallet address in array', async () => { }, }); magic.wallet.request = jest.fn(); - magic.wallet.getCoinbaseProvider = jest.fn(() => ({ - provider: window.ethereum, - })); const response = await magic.wallet.connectToCoinbaseWallet(); + expect(mockedProvider).toBeCalled(); expect(response).toEqual(['0x0000000000000000000000000000000000000000']); }); + +test('Redirects to coinbase deep link if isMobile and is not coinbase wallet browser', async () => { + const mockResponse = jest.fn(); + Object.defineProperty(window, 'location', { + value: { + href: 'http://localhost', + assign: mockResponse, + }, + writable: true, + }); + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + + magic.wallet.isMobile = jest.fn(() => true); + magic.wallet.isCoinbaseWalletBrowser = jest.fn(() => false); + + await magic.wallet.connectToCoinbaseWallet(); + expect(window.location.href).toEqual('https://go.cb-w.com/dapp?cb_url=http%3A%2F%2Flocalhost'); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToMetaMask.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToMetaMask.spec.ts index 6ae7845bb..ab338e317 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToMetaMask.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToMetaMask.spec.ts @@ -1,27 +1,63 @@ import browserEnv from '@ikscodes/browser-env'; import { createMagicSDK } from '../../../factories'; -const address = '0x0000000000000000000000000000000000000000'; - -const provider = { - isMetaMask: true, - request: async (request: { method: string; params?: Array }) => { - if (request.method === 'eth_requestAccounts') { - return [address]; - } - return ''; - }, -}; - beforeEach(() => { + browserEnv({ url: 'http://localhost' }); browserEnv.restore(); +}); + +test('Returns connected wallet address in array and does not change the window.href', async () => { + const address = '0x0000000000000000000000000000000000000000'; + + const provider = { + isMetaMask: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return [address]; + } + return ''; + }, + }; window.ethereum = provider; + + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = await magic.wallet.connectToMetaMask(); + expect(response).toEqual([address]); + expect(window.location.href).toEqual('http://localhost/'); }); -test('Returns connected wallet address in array', async () => { +test('Redirects to metamask deep link if isMobile and metamask is not installed', async () => { + const mockResponse = jest.fn(); + Object.defineProperty(window, 'location', { + value: { + href: 'http://localhost', + assign: mockResponse, + }, + writable: true, + }); + + const address = '0x0000000000000000000000000000000000000000'; + + const provider = { + isMetaMask: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return [address]; + } + return ''; + }, + }; + window.ethereum = provider; + const magic = createMagicSDK(); magic.wallet.request = jest.fn(); + magic.wallet.isMobile = jest.fn(() => true); + magic.wallet.isMetaMaskInstalled = jest.fn(() => false); + const response = await magic.wallet.connectToMetaMask(); + expect(window.location.href).toEqual('https://metamask.app.link/dapp/localhost'); expect(response).toEqual([address]); }); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-coinbase.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-coinbase.spec.ts new file mode 100644 index 000000000..0961efeee --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-coinbase.spec.ts @@ -0,0 +1,59 @@ +import browserEnv from '@ikscodes/browser-env'; +import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'; +import { createMagicSDK } from '../../../factories'; + +jest.mock('@coinbase/wallet-sdk'); + +beforeEach(() => { + browserEnv({ url: 'http://localhost' }); + browserEnv.restore(); +}); + +test('Throws error trying to connect to coinbase_wallet if invalid sdk params', async () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: {}, + }); + magic.wallet.request = jest.fn(); + + expect(() => magic.wallet.connectToThirdPartyWallet('coinbase_wallet')).toThrowError( + 'Missing Coinbase Wallet Config', + ); +}); + +test('Connects to coinbase_wallet', async () => { + jest.spyOn(CoinbaseWalletSDK.prototype, 'getQrUrl').mockImplementation(() => { + return 'qrCodeUrl'; + }); + + const mockedProvider = jest.spyOn(CoinbaseWalletSDK.prototype, 'makeWeb3Provider').mockImplementation(() => { + return { + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + } as any; + }); + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + + const response = await magic.wallet.connectToThirdPartyWallet('coinbase_wallet'); + expect(mockedProvider).toBeCalled(); + expect(response).toEqual(['0x0000000000000000000000000000000000000000']); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-metamask.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-metamask.spec.ts new file mode 100644 index 000000000..124d5eb84 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-metamask.spec.ts @@ -0,0 +1,34 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv({ url: 'http://localhost' }); + browserEnv.restore(); +}); + +test('Throws error if invalid provider', async () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + expect(() => magic.wallet.connectToThirdPartyWallet('invalid-provider')).toThrowError( + 'Invalid provider: invalid-provider. Must be one of "metamask", "coinbase_wallet", or "wallet_connect".', + ); +}); + +test('Connects to metamask', async () => { + const address = '0x0000000000000000000000000000000000000000'; + const provider = { + isMetaMask: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return [address]; + } + return ''; + }, + }; + window.ethereum = provider; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = await magic.wallet.connectToThirdPartyWallet('metamask'); + expect(response).toEqual([address]); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-wallet-connect.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-wallet-connect.spec.ts new file mode 100644 index 000000000..0bfe28bde --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet-wallet-connect.spec.ts @@ -0,0 +1,28 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv({ url: 'http://localhost' }); + browserEnv.restore(); +}); + +test('Throws error trying to connect to wallet_connect if invalid sdk params', async () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: {}, + }); + magic.wallet.request = jest.fn(); + expect(() => magic.wallet.connectToThirdPartyWallet('wallet_connect')).rejects.toThrow(); +}); + +test('Connects to wallet_connect', async () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + walletConnect: { + rpc: { 5: 'https://rpc.ankr.com/eth_goerli' }, + }, + }, + }); + magic.wallet.request = jest.fn(); + const response = magic.wallet.connectToThirdPartyWallet('wallet_connect', 1); + expect(response).toEqual(new Promise(() => null)); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet.spec.ts deleted file mode 100644 index 7eaa18ed1..000000000 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToThirdPartyWallet.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import browserEnv from '@ikscodes/browser-env'; -import { createMagicSDK } from '../../../factories'; - -beforeEach(() => { - browserEnv.restore(); -}); - -test('Connects to metamask', async () => { - const address = '0x0000000000000000000000000000000000000000'; - const provider = { - isMetaMask: true, - request: async (request: { method: string; params?: Array }) => { - if (request.method === 'eth_requestAccounts') { - return [address]; - } - return ''; - }, - }; - window.ethereum = provider; - const magic = createMagicSDK(); - magic.wallet.request = jest.fn(); - - const response = await magic.wallet.connectToThirdPartyWallet('metamask'); - expect(response).toEqual([address]); -}); - -test('Connects to coinbase_wallet', async () => { - const provider = { - isCoinbaseBrowser: true, - request: async (request: { method: string; params?: Array }) => { - if (request.method === 'eth_requestAccounts') { - return ['0x0000000000000000000000000000000000000000']; - } - return ''; - }, - }; - window.ethereum = provider; - - const magic = createMagicSDK({ - thirdPartyWalletOptions: { - coinbaseWallet: { - sdk: { - appName: 'Magic Test', - appLogoUrl: '', - darkMode: false, - }, - provider: { - jsonRpcUrl: '', - chainId: 1, - }, - }, - }, - }); - magic.wallet.request = jest.fn(); - magic.wallet.getCoinbaseProvider = jest.fn(() => ({ - provider: window.ethereum, - qrCodeUrl: 'abc', - })); - - const response = await magic.wallet.connectToThirdPartyWallet('coinbase_wallet'); - expect(response).toEqual(['0x0000000000000000000000000000000000000000']); -}); - -test('Connects to wallet_connect', async () => { - const provider = { - connector: { - on: () => null, - }, - enable: async () => { - return ['0x0000000000000000000000000000000000000000']; - }, - }; - - const magic = createMagicSDK({ - thirdPartyWalletOptions: { - walletConnect: { - rpc: { 5: 'https://rpc.ankr.com/eth_goerli' }, - }, - }, - }); - magic.wallet.request = jest.fn(); - magic.wallet.getWalletConnectProvider = jest.fn(() => provider); - - const response = await magic.wallet.connectToThirdPartyWallet('wallet_connect'); - expect(response).toEqual(['0x0000000000000000000000000000000000000000']); -}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToWalletConnect.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToWalletConnect.spec.ts index 40bd13b57..1a779853f 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToWalletConnect.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectToWalletConnect.spec.ts @@ -2,18 +2,18 @@ import browserEnv from '@ikscodes/browser-env'; import { createMagicSDK } from '../../../factories'; beforeEach(() => { + browserEnv({ url: 'http://localhost' }); browserEnv.restore(); }); -test('Returns connected wallet address in array', async () => { - const provider = { - connector: { - on: () => null, - }, - enable: async () => { - return ['0x0000000000000000000000000000000000000000']; - }, - }; +test('Throws error if missing configuration', async () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + expect(() => magic.wallet.connectToWalletConnect()).rejects.toThrow(); +}); + +test('Connects to wallet connect', async () => { const magic = createMagicSDK({ thirdPartyWalletOptions: { walletConnect: { @@ -21,13 +21,10 @@ test('Returns connected wallet address in array', async () => { }, }, }); - magic.wallet.request = jest.fn(() => { - return { - on: () => null, - }; - }); - magic.wallet.getWalletConnectProvider = jest.fn(() => provider); + magic.wallet.request = jest.fn(); + + jest.mock('@walletconnect/web3-provider'); - const response = await magic.wallet.connectToWalletConnect(); - expect(response).toEqual(['0x0000000000000000000000000000000000000000']); + const response = magic.wallet.connectToWalletConnect(); + expect(response).toEqual(new Promise(() => null)); }); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI-errors.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI-errors.spec.ts new file mode 100644 index 000000000..5e32acb38 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI-errors.spec.ts @@ -0,0 +1,52 @@ +import browserEnv from '@ikscodes/browser-env'; +import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'; +import { createMagicSDK } from '../../../factories'; + +jest.mock('@coinbase/wallet-sdk'); + +beforeEach(() => { + browserEnv({ url: 'http://localhost' }); + browserEnv.restore(); +}); + +test('Throws error auto-connecting to coinbase wallet', async () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(() => { + return { + on: () => null, + }; + }); + + magic.wallet.isCoinbaseWalletBrowser = jest.fn(() => true); + + jest.mock('@magic-sdk/provider/src/core/json-rpc.ts', () => { + return { + createJsonRpcRequestPayload: () => { + throw new Error('error'); + }, + }; + }); + + expect(() => magic.wallet.connectWithUI()).rejects.toThrow(); +}); + +test('Throws error auto-connecting to metamask', async () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(() => { + return { + on: () => null, + }; + }); + + magic.wallet.isMetaMaskBrowser = jest.fn(() => true); + + jest.mock('@magic-sdk/provider/src/core/json-rpc.ts', () => { + return { + createJsonRpcRequestPayload: () => { + throw new Error('error'); + }, + }; + }); + + expect(() => magic.wallet.connectWithUI()).rejects.toThrow(); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI.spec.ts index f48f3766c..c4323249a 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/connectWithUI.spec.ts @@ -1,7 +1,11 @@ import browserEnv from '@ikscodes/browser-env'; +import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'; import { createMagicSDK } from '../../../factories'; +jest.mock('@coinbase/wallet-sdk'); + beforeEach(() => { + browserEnv({ url: 'http://localhost' }); browserEnv.restore(); }); @@ -9,12 +13,11 @@ test('Generate JSON RPC request payload with method `mc_login` and `env` params const magic = createMagicSDK(); magic.wallet.request = jest.fn(() => { return { - on: () => null, + on: () => '', }; }); await magic.wallet.connectWithUI(); - const requestPayload = magic.wallet.request.mock.calls[0][0]; expect(requestPayload.method).toBe('mc_login'); @@ -27,3 +30,96 @@ test('Generate JSON RPC request payload with method `mc_login` and `env` params }, ]); }); + +test('auto-connect if metamask browser', async () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(() => { + return { + on: () => null, + }; + }); + + magic.wallet.isMetaMaskBrowser = jest.fn(() => true); + + jest.mock('@magic-sdk/provider/src/core/json-rpc.ts', () => { + return { + createJsonRpcRequestPayload: () => true, + }; + }); + + const provider = { + isMetaMask: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + }; + window.ethereum = provider; + + await magic.wallet.connectWithUI(); + + const requestPayload = magic.wallet.request.mock.calls[0][0]; + expect(requestPayload.method).toBe('mc_is_wallet_enabled'); + expect(requestPayload.params).toEqual([{ wallet: 'metamask' }]); +}); + +test('auto-connect if coinbase wallet browser', async () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(() => { + return { + on: () => null, + }; + }); + + magic.wallet.isCoinbaseWalletBrowser = jest.fn(() => true); + + jest.mock('@magic-sdk/provider/src/core/json-rpc.ts', () => { + return { + createJsonRpcRequestPayload: () => true, + }; + }); + + jest.spyOn(CoinbaseWalletSDK.prototype, 'makeWeb3Provider').mockImplementation(() => { + return { + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + } as any; + }); + + const provider = { + isCoinbaseWalletBrowser: true, + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + }; + window.ethereum = provider; + + await magic.wallet.connectWithUI(); + + const requestPayload = magic.wallet.request.mock.calls[0][0]; + expect(requestPayload.method).toBe('mc_is_wallet_enabled'); + expect(requestPayload.params).toEqual([{ wallet: 'coinbase_wallet' }]); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect-wallet-connect.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect-wallet-connect.spec.ts new file mode 100644 index 000000000..76df135d6 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect-wallet-connect.spec.ts @@ -0,0 +1,38 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Call disconnect on wallet connect if thats the active wallet', async () => { + const localForageMock = jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: async () => 'wallet_connect', + removeItem: async () => null, + }; + }); + const localStorageMock = (function () { + return { + getItem(key) { + return null; + }, + }; + })(); + Object.defineProperty(window, 'localStorage', { value: localStorageMock }); + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + walletConnect: { + rpc: { 5: 'https://rpc.ankr.com/eth_goerli' }, + }, + }, + }); + magic.wallet.request = jest.fn(); + + await magic.wallet.disconnect(); + + const requestPayload = magic.wallet.request.mock.calls[0][0]; + expect(requestPayload.method).toBe('mc_disconnect'); + expect(requestPayload.params).toEqual([]); + localForageMock.clearAllMocks(); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect.spec.ts index a179b2fbe..64ca411ea 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect.spec.ts @@ -1,17 +1,57 @@ import browserEnv from '@ikscodes/browser-env'; +import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'; import { createMagicSDK } from '../../../factories'; +jest.mock('@coinbase/wallet-sdk'); + beforeEach(() => { browserEnv.restore(); }); -test('Generate JSON RPC request payload with method `mc_disconnect`', async () => { - const magic = createMagicSDK(); +test('Call disconnect on coinbase wallet if thats the active wallet', async () => { + const localForageMock = jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: async () => 'coinbase_wallet', + removeItem: async () => null, + }; + }); + const localStorageMock = (function () { + return { + getItem(key) { + return null; + }, + setItem() { + return null; + }, + }; + })(); + + Object.defineProperty(window, 'localStorage', { value: localStorageMock }); + const mockedProvider = jest.spyOn(CoinbaseWalletSDK.prototype, 'makeWeb3Provider' as any).mockImplementation(() => { + return { + disconnect: () => null, + }; + }); + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); magic.wallet.request = jest.fn(); await magic.wallet.disconnect(); - const requestPayload = magic.wallet.request.mock.calls[0][0]; - expect(requestPayload.method).toBe('mc_disconnect'); - expect(requestPayload.params).toEqual([]); + expect(mockedProvider).toBeCalled(); + localForageMock.clearAllMocks(); }); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider-config-error.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider-config-error.spec.ts new file mode 100644 index 000000000..b5dfa8ee0 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider-config-error.spec.ts @@ -0,0 +1,90 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv({ url: 'http://localhost' }); + browserEnv.restore(); +}); + +test('Throws error if no provider config', () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + + expect(() => magic.wallet.getCoinbaseProvider()).toThrowError('Missing Coinbase Wallet Config'); +}); + +test('Throws error if coinbaseWallet is undefined', () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: undefined, + }, + }); + magic.wallet.request = jest.fn(); + + expect(() => magic.wallet.getCoinbaseProvider()).toThrowError('Missing Coinbase Wallet Config'); +}); + +test('Throws error if thirdPartyWalletOptions is undefined', () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: undefined, + }); + magic.wallet.request = jest.fn(); + + expect(() => magic.wallet.getCoinbaseProvider()).toThrowError('Missing Coinbase Wallet Config'); +}); + +test('Throws error if no sdk config', () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + + expect(() => magic.wallet.getCoinbaseProvider()).toThrowError('Missing Coinbase Wallet Config'); +}); + +test('Fetches coinbase provider with window provider', () => { + const provider = { + isCoinbaseBrowser: true, + }; + window.ethereum = provider; + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.getCoinbaseProvider(); + expect(response).toEqual({ + provider: window.ethereum, + qrCodeUrl: null, + }); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider.spec.ts index cb688443a..1929720ba 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getCoinbaseProvider.spec.ts @@ -1,21 +1,22 @@ import browserEnv from '@ikscodes/browser-env'; +import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'; import { createMagicSDK } from '../../../factories'; +jest.mock('@coinbase/wallet-sdk'); + beforeEach(() => { + browserEnv({ url: 'http://localhost' }); browserEnv.restore(); }); -test('Fetches coinbase provider', async () => { - const provider = { - isCoinbaseBrowser: true, - request: async (request: { method: string; params?: Array }) => { - if (request.method === 'eth_requestAccounts') { - return ['0x0000000000000000000000000000000000000000']; - } - return ''; - }, - }; - window.ethereum = provider; +test('Fetches coinbase provider without a window provider', () => { + const mockedQrCodeUrl = jest.spyOn(CoinbaseWalletSDK.prototype, 'getQrUrl').mockImplementation(() => { + return 'qrCodeUrl'; + }); + + const mockedProvider = jest.spyOn(CoinbaseWalletSDK.prototype, 'makeWeb3Provider').mockImplementation(() => { + return 'provider' as any; + }); const magic = createMagicSDK({ thirdPartyWalletOptions: { @@ -33,14 +34,8 @@ test('Fetches coinbase provider', async () => { }, }); magic.wallet.request = jest.fn(); - magic.wallet.getCoinbaseProvider = jest.fn(() => ({ - provider: window.ethereum, - qrCodeUrl: 'abc', - })); - const response = magic.wallet.getCoinbaseProvider(); - expect(response).toEqual({ - provider: window.ethereum, - qrCodeUrl: 'abc', - }); + magic.wallet.getCoinbaseProvider(); + expect(mockedQrCodeUrl).toBeCalled(); + expect(mockedProvider).toBeCalled(); }); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getInfo.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getInfo.spec.ts index 908a029de..0955621b1 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/getInfo.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getInfo.spec.ts @@ -5,7 +5,7 @@ beforeEach(() => { browserEnv.restore(); }); -test('Generate JSON RPC request payload with method `mc_get_wallet_info`', async () => { +test('Generate JSON RPC request payload with method `mc_get_wallet_info` and the active wallet', async () => { const magic = createMagicSDK(); magic.wallet.request = jest.fn(); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getMetaMaskProvider.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getMetaMaskProvider.spec.ts index 2df2f8369..59dad63ab 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/getMetaMaskProvider.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getMetaMaskProvider.spec.ts @@ -14,6 +14,15 @@ test('Return undefined if MetaMask is not installed', async () => { expect(response).toEqual(undefined); }); +test('Return window.ethereum if providers array contains undefined', async () => { + window.ethereum = { providers: [undefined] }; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.getMetaMaskProvider(); + expect(response).toEqual(window.ethereum); +}); + test('Return provider if MetaMask is installed, and no other providers', async () => { const provider = { isMetaMask: true, @@ -46,22 +55,3 @@ test('Return MetaMask provider if multiple providers found, and MetaMask is one isMetaMask: true, }); }); - -test('Return provider at window.ethereum if multiple providers found, and MetaMask is not one of them', async () => { - const ethereum = { - providers: [ - { - isAnotherWalletProvider: true, - }, - { - isCoinbaseWallet: true, - }, - ], - }; - (window as any).ethereum = ethereum; - const magic = createMagicSDK(); - magic.wallet.request = jest.fn(); - - const response = magic.wallet.getMetaMaskProvider(); - expect(response).toEqual(ethereum); -}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-coinbase-error.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-coinbase-error.spec.ts new file mode 100644 index 000000000..ea4fe90e8 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-coinbase-error.spec.ts @@ -0,0 +1,19 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Throws error if no provider config', () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: () => 'coinbase_wallet', + }; + }); + + expect(() => magic.wallet.getProvider()).rejects.toThrow(); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-coinbase.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-coinbase.spec.ts new file mode 100644 index 000000000..c64daa1c0 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-coinbase.spec.ts @@ -0,0 +1,43 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Should return coinbase provider if coinbase is the stored wallet', async () => { + const provider = { + isCoinbaseWallet: true, + }; + window.ethereum = provider; + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + coinbaseWallet: { + sdk: { + appName: 'Magic Test', + appLogoUrl: '', + darkMode: false, + }, + provider: { + jsonRpcUrl: '', + chainId: 1, + }, + }, + }, + }); + magic.wallet.request = jest.fn(); + magic.wallet.getCoinbaseProvider = jest.fn(() => ({ + provider: window.ethereum, + qrCodeUrl: 'abc', + })); + + jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: () => 'coinbase_wallet', + }; + }); + + const response = await magic.wallet.getProvider(); + expect(response).toEqual(provider); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-metamask.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-metamask.spec.ts new file mode 100644 index 000000000..b78f01e47 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-metamask.spec.ts @@ -0,0 +1,24 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Should return metamask provider if metamask is the stored wallet', async () => { + const provider = { + isMetaMask: true, + }; + window.ethereum = provider; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: () => 'metamask', + }; + }); + + const response = await magic.wallet.getProvider(); + expect(response).toEqual(provider); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-wallet-connect-error.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-wallet-connect-error.spec.ts new file mode 100644 index 000000000..a9f52259a --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-wallet-connect-error.spec.ts @@ -0,0 +1,23 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Should throw error if incorrect wallet connect config passed to sdk', async () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(() => { + return { + on: () => null, + }; + }); + + jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: () => 'wallet_connect', + }; + }); + + expect(() => magic.wallet.getProvider()).rejects.toThrow(); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-wallet-connect.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-wallet-connect.spec.ts new file mode 100644 index 000000000..761d60077 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider-wallet-connect.spec.ts @@ -0,0 +1,41 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Should return wallet connect provider if wallet connect is the stored wallet', async () => { + const provider = { + request: async (request: { method: string; params?: Array }) => { + if (request.method === 'eth_requestAccounts') { + return ['0x0000000000000000000000000000000000000000']; + } + return ''; + }, + }; + + const magic = createMagicSDK({ + thirdPartyWalletOptions: { + walletConnect: { + rpc: { 5: 'https://rpc.ankr.com/eth_goerli' }, + }, + }, + }); + magic.wallet.request = jest.fn(() => { + return { + on: () => null, + }; + }); + + magic.wallet.getWalletConnectProvider = jest.fn(() => provider); + + jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: () => 'wallet_connect', + }; + }); + + const response = await magic.wallet.getProvider(); + expect(response).toEqual(provider); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider.spec.ts index 0bed96b26..238dd32e5 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getProvider.spec.ts @@ -9,6 +9,12 @@ test('Should return magic.rpcProvider if no stored wallet', async () => { const magic = createMagicSDK(); magic.wallet.request = jest.fn(); + jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: () => null, + }; + }); + const provider = await magic.wallet.getProvider(); expect(provider).toEqual(magic.rpcProvider); }); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getUserEnv.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getUserEnv.spec.ts index 06e05295f..a09c755db 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/getUserEnv.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getUserEnv.spec.ts @@ -38,3 +38,17 @@ test('Returns env object with isCoinbaseWalletInstalled true', async () => { }, }); }); + +test('Returns env object with isMetaMaskInstalled false and isCoinbaseWalletInstalled false', async () => { + window.ethereum = undefined; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.getUserEnv(); + expect(response).toEqual({ + env: { + isMetaMaskInstalled: false, + isCoinbaseWalletInstalled: false, + }, + }); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider-error.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider-error.spec.ts new file mode 100644 index 000000000..0bc0d620c --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider-error.spec.ts @@ -0,0 +1,27 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv({ url: 'http://localhost' }); + browserEnv.restore(); +}); + +test('Throws error if incorrect params passed in', async () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: {}, + }); + + magic.wallet.request = jest.fn(); + + expect(() => magic.wallet.getWalletConnectProvider()).rejects.toThrow(); +}); + +test('Throws error if incorrect params passed in', async () => { + const magic = createMagicSDK({ + thirdPartyWalletOptions: undefined, + }); + + magic.wallet.request = jest.fn(); + + expect(() => magic.wallet.getWalletConnectProvider()).rejects.toThrow(); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider.spec.ts index 7d824bd1d..4effe96d7 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/getWalletConnectProvider.spec.ts @@ -2,18 +2,24 @@ import browserEnv from '@ikscodes/browser-env'; import { createMagicSDK } from '../../../factories'; beforeEach(() => { + browserEnv({ url: 'http://localhost' }); browserEnv.restore(); }); -test('Fetches wallet connect provider', async () => { - const provider = { - request: async (request: { method: string; params?: Array }) => { - if (request.method === 'eth_requestAccounts') { - return ['0x0000000000000000000000000000000000000000']; - } - return ''; - }, - }; +test('Fetches wallet connect provider and calls enable()', async () => { + const localForageMock = jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + getItem: async () => 'wallet_connect', + }; + }); + const localStorageMock = (function () { + return { + getItem(key) { + return 'abc'; + }, + }; + })(); + Object.defineProperty(window, 'localStorage', { value: localStorageMock }); const magic = createMagicSDK({ thirdPartyWalletOptions: { @@ -22,13 +28,16 @@ test('Fetches wallet connect provider', async () => { }, }, }); - magic.wallet.request = jest.fn(() => { - return { - on: () => null, - }; + + magic.wallet.request = jest.fn(); + + jest.mock('@walletconnect/web3-provider', () => { + return jest.fn(() => { + return { enable: () => {} }; + }); }); - magic.wallet.getWalletConnectProvider = jest.fn(() => provider); - const response = magic.wallet.getWalletConnectProvider(false); - expect(response).toEqual(provider); + const response = await magic.wallet.getWalletConnectProvider(false); + expect(response).toBeTruthy(); + localForageMock.clearAllMocks(); }); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/handleWalletSelected.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/handleWalletSelected.spec.ts new file mode 100644 index 000000000..28616a3cf --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/handleWalletSelected.spec.ts @@ -0,0 +1,31 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Sends `wallet_connected` intermediary event to iframe', async () => { + jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + setItem: async () => null, + }; + }); + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + magic.wallet.connectToThirdPartyWallet = jest.fn(() => '0x'); + const response = await magic.wallet.handleWalletSelected({ wallet: 'metamask', payloadId: 1, showModal: false }); + expect(response).toBe(undefined); +}); + +test('Sends `wallet_rejected` intermediary event to iframe', async () => { + jest.mock('@magic-sdk/provider/src/util/storage.ts', () => { + return { + setItem: async () => null, + }; + }); + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + const response = await magic.wallet.handleWalletSelected({ wallet: 'metamask', payloadId: 1, showModal: false }); + expect(response).toBe(undefined); +}); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletBrowser.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletBrowser.spec.ts index 5ec3ad6fd..95c70e818 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletBrowser.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletBrowser.spec.ts @@ -5,7 +5,7 @@ beforeEach(() => { browserEnv.restore(); }); -test('Returns true if isCoinbaseBrowser is true', async () => { +test('Returns true if provider.isCoinbaseBrowser is true', async () => { const provider = { isCoinbaseBrowser: true, }; @@ -18,7 +18,7 @@ test('Returns true if isCoinbaseBrowser is true', async () => { expect(response).toEqual(true); }); -test('Returns false if isCoinbaseBrowser is false', async () => { +test('Returns false if provider.isCoinbaseBrowser is not true', async () => { const provider = { isMetaMask: true, }; diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletInstalled.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletInstalled.spec.ts index a2994493a..76b51489c 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletInstalled.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/isCoinbaseWalletInstalled.spec.ts @@ -5,8 +5,7 @@ beforeEach(() => { browserEnv.restore(); }); -test('Return false if Coinbase Wallet is not installed', async () => { - window.ethereum = undefined; +test('Return false if window.ethereum is undefined', async () => { const magic = createMagicSDK(); magic.wallet.request = jest.fn(); @@ -14,7 +13,17 @@ test('Return false if Coinbase Wallet is not installed', async () => { expect(response).toEqual(false); }); -test('Return true if Coinbase Wallet is installed', async () => { +test('Return false if window.ethereum is array of undefined', async () => { + const provider = { providers: [undefined] }; + window.ethereum = provider; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isCoinbaseWalletInstalled(); + expect(response).toEqual(false); +}); + +test('Return true if window.ethereum.isCoinbaseWallet is true', async () => { const provider = { isCoinbaseWallet: true, }; diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskInstalled.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskInstalled.spec.ts index 12502df18..16fa5e146 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskInstalled.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/isMetaMaskInstalled.spec.ts @@ -5,16 +5,27 @@ beforeEach(() => { browserEnv.restore(); }); -test('Return false if MetaMask is not installed', async () => { +test('Return false if provider.isMetaMask is undefined', async () => { window.ethereum = undefined; const magic = createMagicSDK(); + + const response = magic.wallet.isMetaMaskInstalled(); + expect(response).toEqual(false); +}); + +test('Return false if window.ethereum.isMetaMask is false', async () => { + const provider = { + isMetaMask: false, + }; + window.ethereum = provider; + const magic = createMagicSDK(); magic.wallet.request = jest.fn(); const response = magic.wallet.isMetaMaskInstalled(); expect(response).toEqual(false); }); -test('Return true if MetaMask is installed', async () => { +test('Return true if window.ethereum.isMetaMask is true', async () => { const provider = { isMetaMask: true, }; @@ -26,8 +37,18 @@ test('Return true if MetaMask is installed', async () => { expect(response).toEqual(true); }); +test('Return false if providers is array of undefined and is not metamask', async () => { + window.ethereum = { providers: [undefined] }; + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + const response = magic.wallet.isMetaMaskInstalled(); + expect(response).toEqual(false); +}); + test('Return true if multiple providers found, and MetaMask is one of them', async () => { const ethereum = { + isMetaMask: false, providers: [ { isMetaMask: true, diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/isWalletEnabled.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/isWalletEnabled.spec.ts new file mode 100644 index 000000000..a63f9e1a4 --- /dev/null +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/isWalletEnabled.spec.ts @@ -0,0 +1,18 @@ +import browserEnv from '@ikscodes/browser-env'; +import { createMagicSDK } from '../../../factories'; +import { isPromiEvent } from '../../../../src/util'; + +beforeEach(() => { + browserEnv.restore(); +}); + +test('Generate JSON RPC request payload with method `mc_wallet`', async () => { + const magic = createMagicSDK(); + magic.wallet.request = jest.fn(); + + magic.wallet.isWalletEnabled('metamask'); + + const requestPayload = magic.wallet.request.mock.calls[0][0]; + expect(requestPayload.method).toBe('mc_is_wallet_enabled'); + expect(requestPayload.params).toEqual([{ wallet: 'metamask' }]); +}); From 161972db57769fa56e4aaf5d4c90813c2e96b6f5 Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Tue, 21 Mar 2023 17:43:31 -0400 Subject: [PATCH 05/11] update types --- packages/@magic-sdk/provider/package.json | 2 +- yarn.lock | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/@magic-sdk/provider/package.json b/packages/@magic-sdk/provider/package.json index c7a1acfbd..7240fd587 100644 --- a/packages/@magic-sdk/provider/package.json +++ b/packages/@magic-sdk/provider/package.json @@ -35,7 +35,7 @@ }, "dependencies": { "@coinbase/wallet-sdk": "3.6.3", - "@magic-sdk/types": "^11.6.0", + "@magic-sdk/types": "^11.6.2", "@walletconnect/web3-provider": "^1.8.0", "eventemitter3": "^4.0.4", "web3-core": "1.5.2" diff --git a/yarn.lock b/yarn.lock index 7ab715a56..137eead8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3003,7 +3003,7 @@ __metadata: dependencies: "@babel/plugin-transform-modules-commonjs": ^7.9.6 "@coinbase/wallet-sdk": 3.6.3 - "@magic-sdk/types": ^11.6.0 + "@magic-sdk/types": ^11.6.2 "@peculiar/webcrypto": ^1.1.7 "@walletconnect/web3-provider": ^1.8.0 eventemitter3: ^4.0.4 @@ -3115,6 +3115,13 @@ __metadata: languageName: node linkType: hard +"@magic-sdk/types@npm:^11.6.2": + version: 11.6.2 + resolution: "@magic-sdk/types@npm:11.6.2" + checksum: e07ae7f2e267475f76b5cf0c7dfbc3739681759663ca5ddb5626c3d817025cb308a54fea88187585ce6c932ad0e90666a9449722e45cffd258444b77e2aed05c + languageName: node + linkType: hard + "@magic-sdk/types@npm:^8.1.0": version: 8.1.0 resolution: "@magic-sdk/types@npm:8.1.0" From 7dda8b69e76039ea051fb3f879119876e40382fa Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Tue, 21 Mar 2023 17:52:33 -0400 Subject: [PATCH 06/11] update yarn.lock --- yarn.lock | 94 ++++++++++++++++++++++++++----------------------------- 1 file changed, 44 insertions(+), 50 deletions(-) diff --git a/yarn.lock b/yarn.lock index fedc7e2f9..b2071baab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2768,7 +2768,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/algorand@workspace:packages/@magic-ext/algorand" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2776,7 +2776,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/avalanche@workspace:packages/@magic-ext/avalanche" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2784,7 +2784,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/bitcoin@workspace:packages/@magic-ext/bitcoin" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2792,7 +2792,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/conflux@workspace:packages/@magic-ext/conflux" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2800,7 +2800,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/connect@workspace:packages/@magic-ext/connect" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2808,7 +2808,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/cosmos@workspace:packages/@magic-ext/cosmos" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2816,7 +2816,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/ed25519@workspace:packages/@magic-ext/ed25519" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2824,7 +2824,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/flow@workspace:packages/@magic-ext/flow" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 "@onflow/fcl": 0.0.41 "@onflow/types": 0.0.3 peerDependencies: @@ -2837,7 +2837,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/harmony@workspace:packages/@magic-ext/harmony" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2845,7 +2845,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/icon@workspace:packages/@magic-ext/icon" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2853,18 +2853,18 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/near@workspace:packages/@magic-ext/near" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft -"@magic-ext/oauth@^7.6.1, @magic-ext/oauth@workspace:packages/@magic-ext/oauth": +"@magic-ext/oauth@^7.6.2, @magic-ext/oauth@workspace:packages/@magic-ext/oauth": version: 0.0.0-use.local resolution: "@magic-ext/oauth@workspace:packages/@magic-ext/oauth" dependencies: - "@magic-sdk/types": ^11.6.1 + "@magic-sdk/types": ^11.6.2 "@types/crypto-js": ~3.1.47 crypto-js: ^3.3.0 - magic-sdk: ^13.6.1 + magic-sdk: ^13.6.2 languageName: unknown linkType: soft @@ -2880,7 +2880,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/polkadot@workspace:packages/@magic-ext/polkadot" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2888,7 +2888,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/react-native-bare-oauth@workspace:packages/@magic-ext/react-native-bare-oauth" dependencies: - "@magic-sdk/react-native-bare": ^14.6.1 + "@magic-sdk/react-native-bare": ^14.6.2 "@magic-sdk/types": ^10.0.1 "@types/crypto-js": ~3.1.47 crypto-js: ^3.3.0 @@ -2904,7 +2904,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/react-native-expo-oauth@workspace:packages/@magic-ext/react-native-expo-oauth" dependencies: - "@magic-sdk/react-native-expo": ^14.6.1 + "@magic-sdk/react-native-expo": ^14.6.2 "@magic-sdk/types": ^10.0.0 "@types/crypto-js": ~3.1.47 crypto-js: ^3.3.0 @@ -2919,7 +2919,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/solana@workspace:packages/@magic-ext/solana" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2927,7 +2927,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/taquito@workspace:packages/@magic-ext/taquito" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2935,7 +2935,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/terra@workspace:packages/@magic-ext/terra" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2943,7 +2943,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/tezos@workspace:packages/@magic-ext/tezos" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2951,7 +2951,7 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/webauthn@workspace:packages/@magic-ext/webauthn" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft @@ -2959,16 +2959,16 @@ __metadata: version: 0.0.0-use.local resolution: "@magic-ext/zilliqa@workspace:packages/@magic-ext/zilliqa" dependencies: - "@magic-sdk/commons": ^9.6.1 + "@magic-sdk/commons": ^9.6.2 languageName: unknown linkType: soft -"@magic-sdk/commons@^9.6.1, @magic-sdk/commons@workspace:packages/@magic-sdk/commons": +"@magic-sdk/commons@^9.6.2, @magic-sdk/commons@workspace:packages/@magic-sdk/commons": version: 0.0.0-use.local resolution: "@magic-sdk/commons@workspace:packages/@magic-sdk/commons" dependencies: - "@magic-sdk/provider": ^13.6.1 - "@magic-sdk/types": ^11.6.1 + "@magic-sdk/provider": ^13.6.2 + "@magic-sdk/types": ^11.6.2 peerDependencies: "@magic-sdk/provider": ">=4.3.0" "@magic-sdk/types": ">=3.1.1" @@ -2992,17 +2992,18 @@ __metadata: "@babel/core": ^7.9.6 "@babel/plugin-proposal-optional-chaining": ^7.9.0 "@babel/runtime": ^7.9.6 - "@magic-ext/oauth": ^7.6.1 - magic-sdk: ^13.6.1 + "@magic-ext/oauth": ^7.6.2 + magic-sdk: ^13.6.2 languageName: unknown linkType: soft -"@magic-sdk/provider@^13.6.1, @magic-sdk/provider@workspace:packages/@magic-sdk/provider": +"@magic-sdk/provider@^13.6.2, @magic-sdk/provider@workspace:packages/@magic-sdk/provider": version: 0.0.0-use.local resolution: "@magic-sdk/provider@workspace:packages/@magic-sdk/provider" dependencies: "@babel/plugin-transform-modules-commonjs": ^7.9.6 - "@magic-sdk/types": ^11.6.1 + "@coinbase/wallet-sdk": 3.6.3 + "@magic-sdk/types": ^11.6.2 "@peculiar/webcrypto": ^1.1.7 "@walletconnect/web3-provider": ^1.8.0 eventemitter3: ^4.0.4 @@ -3028,7 +3029,7 @@ __metadata: languageName: node linkType: hard -"@magic-sdk/react-native-bare@^14.6.1, @magic-sdk/react-native-bare@workspace:packages/@magic-sdk/react-native-bare": +"@magic-sdk/react-native-bare@^14.6.2, @magic-sdk/react-native-bare@workspace:packages/@magic-sdk/react-native-bare": version: 0.0.0-use.local resolution: "@magic-sdk/react-native-bare@workspace:packages/@magic-sdk/react-native-bare" dependencies: @@ -3036,9 +3037,9 @@ __metadata: "@babel/core": ^7.15.0 "@babel/plugin-transform-flow-strip-types": ^7.14.5 "@babel/runtime": ~7.10.4 - "@magic-sdk/commons": ^9.6.1 - "@magic-sdk/provider": ^13.6.1 - "@magic-sdk/types": ^11.6.1 + "@magic-sdk/commons": ^9.6.2 + "@magic-sdk/provider": ^13.6.2 + "@magic-sdk/types": ^11.6.2 "@react-native-async-storage/async-storage": ^1.15.5 "@react-native-community/async-storage": ^1.12.1 "@types/lodash": ^4.14.158 @@ -3065,7 +3066,7 @@ __metadata: languageName: unknown linkType: soft -"@magic-sdk/react-native-expo@^14.6.1, @magic-sdk/react-native-expo@workspace:packages/@magic-sdk/react-native-expo": +"@magic-sdk/react-native-expo@^14.6.2, @magic-sdk/react-native-expo@workspace:packages/@magic-sdk/react-native-expo": version: 0.0.0-use.local resolution: "@magic-sdk/react-native-expo@workspace:packages/@magic-sdk/react-native-expo" dependencies: @@ -3073,9 +3074,9 @@ __metadata: "@babel/core": ^7.15.0 "@babel/plugin-transform-flow-strip-types": ^7.14.5 "@babel/runtime": ~7.10.4 - "@magic-sdk/commons": ^9.6.1 - "@magic-sdk/provider": ^13.6.1 - "@magic-sdk/types": ^11.6.1 + "@magic-sdk/commons": ^9.6.2 + "@magic-sdk/provider": ^13.6.2 + "@magic-sdk/types": ^11.6.2 "@react-native-async-storage/async-storage": ^1.15.5 "@types/lodash": ^4.14.158 buffer: ~5.6.0 @@ -3101,7 +3102,7 @@ __metadata: languageName: unknown linkType: soft -"@magic-sdk/types@^11.6.1, @magic-sdk/types@workspace:packages/@magic-sdk/types": +"@magic-sdk/types@^11.6.2, @magic-sdk/types@workspace:packages/@magic-sdk/types": version: 0.0.0-use.local resolution: "@magic-sdk/types@workspace:packages/@magic-sdk/types" languageName: unknown @@ -3114,13 +3115,6 @@ __metadata: languageName: node linkType: hard -"@magic-sdk/types@npm:^11.6.2": - version: 11.6.2 - resolution: "@magic-sdk/types@npm:11.6.2" - checksum: e07ae7f2e267475f76b5cf0c7dfbc3739681759663ca5ddb5626c3d817025cb308a54fea88187585ce6c932ad0e90666a9449722e45cffd258444b77e2aed05c - languageName: node - linkType: hard - "@magic-sdk/types@npm:^8.1.0": version: 8.1.0 resolution: "@magic-sdk/types@npm:8.1.0" @@ -13393,16 +13387,16 @@ fsevents@^2.3.2: languageName: unknown linkType: soft -"magic-sdk@^13.6.1, magic-sdk@workspace:packages/magic-sdk": +"magic-sdk@^13.6.2, magic-sdk@workspace:packages/magic-sdk": version: 0.0.0-use.local resolution: "magic-sdk@workspace:packages/magic-sdk" dependencies: "@babel/core": ^7.9.6 "@babel/plugin-proposal-optional-chaining": ^7.9.0 "@babel/runtime": ^7.9.6 - "@magic-sdk/commons": ^9.6.1 - "@magic-sdk/provider": ^13.6.1 - "@magic-sdk/types": ^11.6.1 + "@magic-sdk/commons": ^9.6.2 + "@magic-sdk/provider": ^13.6.2 + "@magic-sdk/types": ^11.6.2 localforage: ^1.7.4 localforage-driver-memory: ^1.0.5 languageName: unknown From 6a1f00649d0a1f2e17a66c995f4ace47bafca10a Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Tue, 21 Mar 2023 18:14:22 -0400 Subject: [PATCH 07/11] remove await --- packages/@magic-sdk/provider/src/modules/wallet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@magic-sdk/provider/src/modules/wallet.ts b/packages/@magic-sdk/provider/src/modules/wallet.ts index 51a72b0b8..f9907fe61 100644 --- a/packages/@magic-sdk/provider/src/modules/wallet.ts +++ b/packages/@magic-sdk/provider/src/modules/wallet.ts @@ -98,7 +98,7 @@ export class WalletModule extends BaseModule { const activeWallet = await getItem(this.localForageKey); if (activeWallet === Wallets.WalletConnect) { const provider = await this.getWalletConnectProvider(false); - await provider.disconnect(); + provider.disconnect(); } if (activeWallet === Wallets.CoinbaseWallet) { const coinbase = this.getCoinbaseProvider(); From 2f75fa332884093c59c8a3b4f8cc4a62db870f1f Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Tue, 21 Mar 2023 18:36:33 -0400 Subject: [PATCH 08/11] remove walletconnect disconnect --- packages/@magic-sdk/provider/src/modules/wallet.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/@magic-sdk/provider/src/modules/wallet.ts b/packages/@magic-sdk/provider/src/modules/wallet.ts index f9907fe61..86cd11e85 100644 --- a/packages/@magic-sdk/provider/src/modules/wallet.ts +++ b/packages/@magic-sdk/provider/src/modules/wallet.ts @@ -96,10 +96,10 @@ export class WalletModule extends BaseModule { public async disconnect(): Promise { clearKeys(); const activeWallet = await getItem(this.localForageKey); - if (activeWallet === Wallets.WalletConnect) { - const provider = await this.getWalletConnectProvider(false); - provider.disconnect(); - } + // if (activeWallet === Wallets.WalletConnect) { + // const provider = await this.getWalletConnectProvider(false); + // await provider.disconnect(); + // } if (activeWallet === Wallets.CoinbaseWallet) { const coinbase = this.getCoinbaseProvider(); coinbase.provider.disconnect(); From ade4daf20c3abcbb7063d9cf2b9a92d31b26b269 Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Wed, 22 Mar 2023 09:50:41 -0400 Subject: [PATCH 09/11] re-add wallet-connect disconnect --- packages/@magic-sdk/provider/src/modules/wallet.ts | 12 ++++++++---- .../modules/wallet/disconnect-wallet-connect.spec.ts | 6 ++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/@magic-sdk/provider/src/modules/wallet.ts b/packages/@magic-sdk/provider/src/modules/wallet.ts index 86cd11e85..4950bbf0a 100644 --- a/packages/@magic-sdk/provider/src/modules/wallet.ts +++ b/packages/@magic-sdk/provider/src/modules/wallet.ts @@ -96,10 +96,14 @@ export class WalletModule extends BaseModule { public async disconnect(): Promise { clearKeys(); const activeWallet = await getItem(this.localForageKey); - // if (activeWallet === Wallets.WalletConnect) { - // const provider = await this.getWalletConnectProvider(false); - // await provider.disconnect(); - // } + if (activeWallet === Wallets.WalletConnect) { + try { + const provider = await this.getWalletConnectProvider(false); + await provider.disconnect(); + } catch (error) { + console.error(error); + } + } if (activeWallet === Wallets.CoinbaseWallet) { const coinbase = this.getCoinbaseProvider(); coinbase.provider.disconnect(); diff --git a/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect-wallet-connect.spec.ts b/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect-wallet-connect.spec.ts index 76df135d6..8df1cdb74 100644 --- a/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect-wallet-connect.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/modules/wallet/disconnect-wallet-connect.spec.ts @@ -29,6 +29,12 @@ test('Call disconnect on wallet connect if thats the active wallet', async () => }); magic.wallet.request = jest.fn(); + magic.wallet.getWalletConnectProvider = jest.fn(() => { + return { + disconnect: () => null, + }; + }); + await magic.wallet.disconnect(); const requestPayload = magic.wallet.request.mock.calls[0][0]; From a28ce38af2306195e6e558bbc7fe0df4217f9210 Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Thu, 23 Mar 2023 16:02:36 -0400 Subject: [PATCH 10/11] pass in reloadOnDisconnect false --- packages/@magic-sdk/provider/src/modules/wallet.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/@magic-sdk/provider/src/modules/wallet.ts b/packages/@magic-sdk/provider/src/modules/wallet.ts index 4950bbf0a..f167750dd 100644 --- a/packages/@magic-sdk/provider/src/modules/wallet.ts +++ b/packages/@magic-sdk/provider/src/modules/wallet.ts @@ -197,6 +197,7 @@ export class WalletModule extends BaseModule { ...(sdkConfig as any), overrideIsMetaMask: false, headlessMode: true, + reloadOnDisconnect: false, }); const qrCodeUrl = coinbaseWallet.getQrUrl(); const provider = coinbaseWallet.makeWeb3Provider(providerConfig.jsonRpcUrl, providerConfig.chainId); From 0f305a6c11681820ea2b374209c801cde745d5de Mon Sep 17 00:00:00 2001 From: Hunter Cote Date: Fri, 24 Mar 2023 09:37:40 -0400 Subject: [PATCH 11/11] fix return type --- packages/@magic-sdk/provider/src/modules/wallet.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/@magic-sdk/provider/src/modules/wallet.ts b/packages/@magic-sdk/provider/src/modules/wallet.ts index f167750dd..1fa78b58b 100644 --- a/packages/@magic-sdk/provider/src/modules/wallet.ts +++ b/packages/@magic-sdk/provider/src/modules/wallet.ts @@ -74,26 +74,26 @@ export class WalletModule extends BaseModule { } /* Prompt Magic's Wallet UI (not available for users logged in with third party wallets) */ - public showUI(): Promise { + public showUI() { const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.ShowUI); return this.request(requestPayload); } /* Get user info such as the wallet type they are logged in with */ - public async getInfo(): Promise { + public async getInfo() { const activeWallet = await getItem(this.localForageKey); const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.GetInfo, [{ walletType: activeWallet }]); return this.request(requestPayload); } /* Request email address from logged in user */ - public requestUserInfoWithUI(scope?: RequestUserInfoScope): Promise { + public requestUserInfoWithUI(scope?: RequestUserInfoScope) { const requestPayload = createJsonRpcRequestPayload(MagicPayloadMethod.RequestUserInfoWithUI, scope ? [scope] : []); return this.request(requestPayload); } /* Logout user */ - public async disconnect(): Promise { + public async disconnect() { clearKeys(); const activeWallet = await getItem(this.localForageKey); if (activeWallet === Wallets.WalletConnect) {