diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bda5b368..a9b363e49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [[v2.39.0]](https://github.com/multiversx/mx-sdk-dapp/pull/1251)] - 2024-09-03 +- [Fixed websocket connection is not closed on logout](https://github.com/multiversx/mx-sdk-dapp/pull/1250) - [Upgrade sdk-dapp-utils, webview-provider, metamask-proxy-provider and cross-window-provider packages](https://github.com/multiversx/mx-sdk-dapp/pull/1247) +- [Add passkey provider and replace MetamaskProxyProvider with IframeProvider](https://github.com/multiversx/mx-sdk-dapp/pull/1249) ## [[v2.38.8]](https://github.com/multiversx/mx-sdk-dapp/pull/1246)] - 2024-08-29 - [Added sign screens cached tokens functionality](https://github.com/multiversx/mx-sdk-dapp/pull/1245) diff --git a/package.json b/package.json index e6a2943c0..4311578d3 100644 --- a/package.json +++ b/package.json @@ -161,12 +161,13 @@ "@multiversx/sdk-extension-provider": "3.0.0", "@multiversx/sdk-hw-provider": "6.4.0", "@multiversx/sdk-metamask-provider": "0.0.5", - "@multiversx/sdk-metamask-proxy-provider": "1.0.0", "@multiversx/sdk-native-auth-client": "1.0.7", "@multiversx/sdk-opera-provider": "1.0.0-alpha.1", + "@multiversx/sdk-passkey-provider": "1.0.0", "@multiversx/sdk-wallet": "4.2.0", "@multiversx/sdk-wallet-connect-provider": "4.1.3", "@multiversx/sdk-web-wallet-cross-window-provider": "1.0.0", + "@multiversx/sdk-web-wallet-iframe-provider": "1.0.2", "@multiversx/sdk-web-wallet-provider": "3.2.1", "@multiversx/sdk-webview-provider": "1.0.0", "@reduxjs/toolkit": "1.8.2", diff --git a/src/UI/SignTransactionsModals/SignTransactionsModals.tsx b/src/UI/SignTransactionsModals/SignTransactionsModals.tsx index 524f20c61..f2417cc15 100644 --- a/src/UI/SignTransactionsModals/SignTransactionsModals.tsx +++ b/src/UI/SignTransactionsModals/SignTransactionsModals.tsx @@ -7,10 +7,11 @@ import { ConfirmationScreen, DeviceConfirmationScreen } from './components'; import { SignWithCrossWindowWalletModal } from './SignWithCrossWindowWalletModal'; import { SignWithExtensionModal } from './SignWithExtensionModal'; import { SignWithExtraModal } from './SignWithExtraModal'; +import { SignWithIframeModal } from './SignWithIframeModal'; import { SignWithLedgerModal } from './SignWithLedgerModal'; import { SignWithMetamaskModal } from './SignWithMetamaskModal'; -import { SignWithMetamaskProxyModal } from './SignWithMetamaskProxyModal'; import { SignWithOperaModal } from './SignWithOperaModal'; +import { SignWithPasskeyModal } from './SignWithPasskeyModal'; import { SignWithWalletConnectModal } from './SignWithWalletConnectModal'; import { CustomConfirmScreensType, @@ -38,9 +39,9 @@ export const SignTransactionsModals = ({ WalletConnect: CustomConfirmScreens?.WalletConnect ?? SignWithWalletConnectModal, Extension: CustomConfirmScreens?.Extension ?? SignWithExtensionModal, + Passkey: CustomConfirmScreens?.Passkey ?? SignWithPasskeyModal, Metamask: CustomConfirmScreens?.Metamask ?? SignWithMetamaskModal, - MetamaskProxy: - CustomConfirmScreens?.MetamaskProxy ?? SignWithMetamaskProxyModal, + Iframe: CustomConfirmScreens?.Iframe ?? SignWithIframeModal, Opera: CustomConfirmScreens?.Opera ?? SignWithOperaModal, CrossWindow: CustomConfirmScreens?.CrossWindow ?? SignWithCrossWindowWalletModal, @@ -75,14 +76,16 @@ export const SignTransactionsModals = ({ return renderScreen({ Screen: ConfirmScreens.WalletConnect }); case LoginMethodsEnum.extension: return renderScreen({ Screen: ConfirmScreens.Extension }); + case LoginMethodsEnum.passkey: + return renderScreen({ Screen: ConfirmScreens.Passkey }); case LoginMethodsEnum.metamask: return renderScreen({ Screen: ConfirmScreens.Metamask, isDevice: true }); case LoginMethodsEnum.opera: return renderScreen({ Screen: ConfirmScreens.Opera }); case LoginMethodsEnum.crossWindow: return renderScreen({ Screen: ConfirmScreens.CrossWindow }); - case LoginMethodsEnum.metamaskProxy: - return renderScreen({ Screen: ConfirmScreens.MetamaskProxy }); + case LoginMethodsEnum.iframe: + return renderScreen({ Screen: ConfirmScreens.Iframe }); case LoginMethodsEnum.wallet: return renderScreen({ Screen: ConfirmScreens.Wallet }); case LoginMethodsEnum.extra: diff --git a/src/UI/SignTransactionsModals/SignWithMetamaskProxyModal/SignWithMetamaskProxyModal.tsx b/src/UI/SignTransactionsModals/SignWithIframeModal/SignWithIframeModal.tsx similarity index 81% rename from src/UI/SignTransactionsModals/SignWithMetamaskProxyModal/SignWithMetamaskProxyModal.tsx rename to src/UI/SignTransactionsModals/SignWithIframeModal/SignWithIframeModal.tsx index 09dd44c36..ef6700f32 100644 --- a/src/UI/SignTransactionsModals/SignWithMetamaskProxyModal/SignWithMetamaskProxyModal.tsx +++ b/src/UI/SignTransactionsModals/SignWithIframeModal/SignWithIframeModal.tsx @@ -6,7 +6,7 @@ import { SignWaitingScreenModalPropsType } from '../components'; -export const SignWithMetamaskProxyModal = (props: SignModalPropsType) => { +export const SignWithIframeModal = (props: SignModalPropsType) => { const description = props.error ? props.error : props.transactions?.length > 1 @@ -16,7 +16,7 @@ export const SignWithMetamaskProxyModal = (props: SignModalPropsType) => { const waitingScreenProps: SignWaitingScreenModalPropsType = { ...props, description, - title: 'Confirm on Metamask Extension' + title: 'Confirm on your authenticated provider' }; return ; diff --git a/src/UI/SignTransactionsModals/SignWithIframeModal/index.tsx b/src/UI/SignTransactionsModals/SignWithIframeModal/index.tsx new file mode 100644 index 000000000..911b79d07 --- /dev/null +++ b/src/UI/SignTransactionsModals/SignWithIframeModal/index.tsx @@ -0,0 +1 @@ +export * from './SignWithIframeModal'; diff --git a/src/UI/SignTransactionsModals/SignWithMetamaskProxyModal/index.tsx b/src/UI/SignTransactionsModals/SignWithMetamaskProxyModal/index.tsx deleted file mode 100644 index deaf98310..000000000 --- a/src/UI/SignTransactionsModals/SignWithMetamaskProxyModal/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export * from './SignWithMetamaskProxyModal'; diff --git a/src/UI/SignTransactionsModals/SignWithPasskeyModal/SignWithPasskeyModal.tsx b/src/UI/SignTransactionsModals/SignWithPasskeyModal/SignWithPasskeyModal.tsx new file mode 100644 index 000000000..d00ffd24f --- /dev/null +++ b/src/UI/SignTransactionsModals/SignWithPasskeyModal/SignWithPasskeyModal.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { SignModalPropsType } from 'types'; + +import { + SignWaitingScreenModal, + SignWaitingScreenModalPropsType +} from '../components'; + +export const SignWithPasskeyModal = (props: SignModalPropsType) => { + const description = props.error + ? props.error + : props.transactions?.length > 1 + ? 'Please signin with your passkey in order to sign the transactions' + : 'Please signin with your passkey in order to sign the transaction'; + + const waitingScreenProps: SignWaitingScreenModalPropsType = { + ...props, + description, + title: 'Confirm by signing in with passkey' + }; + + return ; +}; diff --git a/src/UI/SignTransactionsModals/SignWithPasskeyModal/index.tsx b/src/UI/SignTransactionsModals/SignWithPasskeyModal/index.tsx new file mode 100644 index 000000000..9c723676c --- /dev/null +++ b/src/UI/SignTransactionsModals/SignWithPasskeyModal/index.tsx @@ -0,0 +1 @@ +export * from './SignWithPasskeyModal'; diff --git a/src/UI/SignTransactionsModals/types/signTransactionsModals.types.ts b/src/UI/SignTransactionsModals/types/signTransactionsModals.types.ts index bddb55a90..3f6f193d3 100644 --- a/src/UI/SignTransactionsModals/types/signTransactionsModals.types.ts +++ b/src/UI/SignTransactionsModals/types/signTransactionsModals.types.ts @@ -20,11 +20,12 @@ export type ScreenType = (signProps: SignPropsType) => JSX.Element; export interface CustomConfirmScreensType { Ledger?: ScreenType; Extension?: ScreenType; + Passkey?: ScreenType; Metamask?: ScreenType; Opera?: ScreenType; CrossWindow?: ScreenType; WalletConnect?: ScreenType; Wallet?: ScreenType; Extra?: ScreenType; - MetamaskProxy?: ScreenType; + Iframe?: ScreenType; } diff --git a/src/UI/metamaskProxy/MetamaskProxyLoginButton/MetamaskProxyButton.tsx b/src/UI/iframe/IframeLoginButton/IframeButton.tsx similarity index 61% rename from src/UI/metamaskProxy/MetamaskProxyLoginButton/MetamaskProxyButton.tsx rename to src/UI/iframe/IframeLoginButton/IframeButton.tsx index a8f4c909e..f4e809b73 100644 --- a/src/UI/metamaskProxy/MetamaskProxyLoginButton/MetamaskProxyButton.tsx +++ b/src/UI/iframe/IframeLoginButton/IframeButton.tsx @@ -1,22 +1,24 @@ import React, { ReactNode } from 'react'; +import { IframeLoginTypes } from '@multiversx/sdk-web-wallet-iframe-provider/out/constants'; import { withStyles, WithStylesImportType } from 'hocs/withStyles'; -import { useMetamaskProxyLogin } from 'hooks/login/useMetamaskProxyLogin'; +import { useIframeLogin } from 'hooks/login/useIframeLogin'; import { getIsNativeAuthSingingForbidden } from 'services/nativeAuth/helpers'; import { LoginButton } from 'UI/LoginButton/LoginButton'; import { OnProviderLoginType } from '../../../types'; import { WithClassnameType } from '../../types'; -export interface MetamaskProxyLoginButtonPropsType +export interface IframeLoginButtonPropsType extends WithClassnameType, OnProviderLoginType { children?: ReactNode; buttonClassName?: string; loginButtonText?: string; disabled?: boolean; + loginType?: IframeLoginTypes; } -const MetamaskProxyLoginButtonComponent: ( - props: MetamaskProxyLoginButtonPropsType & WithStylesImportType +const IframeLoginButtonComponent: ( + props: IframeLoginButtonPropsType & WithStylesImportType ) => JSX.Element = ({ token, className = 'dapp-metamask-proxy-login', @@ -26,9 +28,10 @@ const MetamaskProxyLoginButtonComponent: ( nativeAuth, loginButtonText = 'Metamask Proxy', onLoginRedirect, - disabled + disabled, + loginType = IframeLoginTypes.metamask }) => { - const [onInitiateLogin] = useMetamaskProxyLogin({ + const [onInitiateLogin] = useIframeLogin({ callbackRoute, token, onLoginRedirect, @@ -37,7 +40,7 @@ const MetamaskProxyLoginButtonComponent: ( const disabledConnectButton = getIsNativeAuthSingingForbidden(token); const handleLogin = () => { - onInitiateLogin(); + onInitiateLogin(loginType); }; return ( @@ -53,15 +56,9 @@ const MetamaskProxyLoginButtonComponent: ( ); }; -export const MetamaskProxyButton = withStyles( - MetamaskProxyLoginButtonComponent, - { - ssrStyles: () => - import( - 'UI/metamaskProxy/MetamaskProxyLoginButton/metamaskProxyLoginButton.styles.scss' - ), - clientStyles: () => - require('UI/metamaskProxy/MetamaskProxyLoginButton/metamaskProxyLoginButton.styles.scss') - .default - } -); +export const IframeButton = withStyles(IframeLoginButtonComponent, { + ssrStyles: () => + import('UI/iframe/IframeLoginButton/iframeLoginButton.styles.scss'), + clientStyles: () => + require('UI/iframe/IframeLoginButton/iframeLoginButton.styles.scss').default +}); diff --git a/src/UI/metamaskProxy/MetamaskProxyLoginButton/metamaskProxyLoginButton.styles.scss b/src/UI/iframe/IframeLoginButton/iframeLoginButton.styles.scss similarity index 88% rename from src/UI/metamaskProxy/MetamaskProxyLoginButton/metamaskProxyLoginButton.styles.scss rename to src/UI/iframe/IframeLoginButton/iframeLoginButton.styles.scss index d60e781d7..2b8626d66 100644 --- a/src/UI/metamaskProxy/MetamaskProxyLoginButton/metamaskProxyLoginButton.styles.scss +++ b/src/UI/iframe/IframeLoginButton/iframeLoginButton.styles.scss @@ -10,7 +10,7 @@ box-sizing: border-box; } -.noMetamaskProxyButtonContent { +.noIframeButtonContent { box-sizing: border-box; } diff --git a/src/UI/iframe/IframeLoginButton/index.ts b/src/UI/iframe/IframeLoginButton/index.ts new file mode 100644 index 000000000..6a65c504a --- /dev/null +++ b/src/UI/iframe/IframeLoginButton/index.ts @@ -0,0 +1 @@ +export * from './IframeButton'; diff --git a/src/UI/index.ts b/src/UI/index.ts index 7785bbf25..0ffc3d91e 100644 --- a/src/UI/index.ts +++ b/src/UI/index.ts @@ -4,6 +4,7 @@ export * from './Denominate'; export * from './FormatAmount'; export * from './ExplorerLink'; export * from './extension/ExtensionLoginButton'; +export * from './passkey/PasskeyLoginButton'; export * from './operaWallet/OperaWalletLoginButton'; export * from './ledger/LedgerLoginButton'; export * from './ledger/LedgerLoginContainer'; @@ -30,4 +31,4 @@ export * from './TransactionsTable'; export * from './ScamPhishingAlert'; export * from './TimeAgo'; export * from './metamask/MetamaskLoginButton'; -export * from './metamaskProxy/MetamaskProxyLoginButton'; +export * from './iframe/IframeLoginButton'; diff --git a/src/UI/metamaskProxy/MetamaskProxyLoginButton/index.ts b/src/UI/metamaskProxy/MetamaskProxyLoginButton/index.ts deleted file mode 100644 index 7cd1b0dde..000000000 --- a/src/UI/metamaskProxy/MetamaskProxyLoginButton/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './MetamaskProxyButton'; diff --git a/src/UI/pages/UnlockPage/index.tsx b/src/UI/pages/UnlockPage/index.tsx index 9d1f4ce03..50ceb829d 100644 --- a/src/UI/pages/UnlockPage/index.tsx +++ b/src/UI/pages/UnlockPage/index.tsx @@ -3,9 +3,10 @@ import classNames from 'classnames'; import { withStyles, WithStylesImportType } from 'hocs/withStyles'; import { useGetLoginInfo } from 'hooks'; import { ExtensionLoginButton } from 'UI/extension/ExtensionLoginButton'; +import { IframeButton } from 'UI/iframe/IframeLoginButton'; import { LedgerLoginButton } from 'UI/ledger/LedgerLoginButton'; -import { MetamaskProxyButton } from 'UI/metamaskProxy/MetamaskProxyLoginButton'; import { OperaWalletLoginButton } from 'UI/operaWallet/OperaWalletLoginButton'; +import { PasskeyLoginButton } from 'UI/passkey/PasskeyLoginButton'; import { WalletConnectLoginButton } from 'UI/walletConnect/WalletConnectLoginButton'; import { WebWalletLoginButton } from 'UI/webWallet/WebWalletLoginButton'; @@ -16,9 +17,10 @@ export interface Props { loginRoute: string; LedgerLoginButtonText?: string; ExtensionLoginButtonText?: string; + PasskeyLoginButtonText?: string; OperaWalletLoginButtonText?: string; CrossWindowLoginButtonText?: string; - MetamaskProxyLoginButtonText?: string; + IframeLoginButtonText?: string; WebWalletLoginButtonText?: string; WalletConnectLoginButtonText?: string; WalletConnectV2LoginButtonText?: string; @@ -33,8 +35,9 @@ const UnlockPageComponent = ({ description = 'Pick a login method', WalletConnectLoginButtonText = 'xPortal App', ExtensionLoginButtonText = 'Extension', + PasskeyLoginButtonText = 'Passkey', OperaWalletLoginButtonText = 'Opera Crypto Wallet', - MetamaskProxyLoginButtonText = 'Metamask Proxy', + IframeLoginButtonText = 'Embeded web wallet', WebWalletLoginButtonText = 'Web wallet', globalStyles, styles @@ -87,9 +90,14 @@ const UnlockPageComponent = ({ loginButtonText={ExtensionLoginButtonText} /> - + + JSX.Element = ({ + token, + className = 'dapp-passkey-login', + children, + callbackRoute, + buttonClassName = 'dapp-default-login-button', + nativeAuth, + loginButtonText = 'Passkey', + onLoginRedirect, + disabled +}) => { + const [onInitiateLogin] = usePasskeyLogin({ + callbackRoute, + token, + onLoginRedirect, + nativeAuth + }); + const disabledConnectButton = getIsNativeAuthSingingForbidden(token); + + const handleLogin = () => { + onInitiateLogin(); + }; + + return ( + + {children} + + ); +}; + +export const PasskeyLoginButton = withStyles(PasskeyLoginButtonComponent, { + ssrStyles: () => + import( + 'UI/extension/ExtensionLoginButton/extensionLoginButton.styles.scss' + ), + clientStyles: () => + require('UI/extension/ExtensionLoginButton/extensionLoginButton.styles.scss') + .default +}); diff --git a/src/UI/passkey/PasskeyLoginButton/index.ts b/src/UI/passkey/PasskeyLoginButton/index.ts new file mode 100644 index 000000000..691827930 --- /dev/null +++ b/src/UI/passkey/PasskeyLoginButton/index.ts @@ -0,0 +1 @@ +export * from './PasskeyLoginButton'; diff --git a/src/UI/passkey/PasskeyLoginButton/passkeyLoginButton.styles.scss b/src/UI/passkey/PasskeyLoginButton/passkeyLoginButton.styles.scss new file mode 100644 index 000000000..f04c87541 --- /dev/null +++ b/src/UI/passkey/PasskeyLoginButton/passkeyLoginButton.styles.scss @@ -0,0 +1,19 @@ +.passkey-login { + box-sizing: border-box; +} + +.login-text { + box-sizing: border-box; +} + +.no-passkey-button-wrapper { + box-sizing: border-box; +} + +.nopasskeyButtonContent { + box-sizing: border-box; +} + +.no-passkey-button-title { + box-sizing: border-box; +} diff --git a/src/components/ProviderInitializer/ProviderInitializer.tsx b/src/components/ProviderInitializer/ProviderInitializer.tsx index f84e6a710..0dbf7f7b2 100644 --- a/src/components/ProviderInitializer/ProviderInitializer.tsx +++ b/src/components/ProviderInitializer/ProviderInitializer.tsx @@ -53,9 +53,10 @@ import { getOperaProvider, getCrossWindowProvider, getExtensionProvider, + getPasskeyProvider, processModifiedAccount, getMetamaskProvider, - getMetamaskProxyProvider + getIframeProvider } from './helpers'; import { useSetLedgerProvider } from './hooks'; @@ -274,6 +275,14 @@ export function ProviderInitializer() { } } + async function setPasskeyProvider() { + const address = await getAddress(); + const provider = await getPasskeyProvider(address); + if (provider) { + setAccountProvider(provider); + } + } + async function setMetamaskProvider() { const address = await getAddress(); const provider = await getMetamaskProvider(address); @@ -301,13 +310,13 @@ export function ProviderInitializer() { } } - async function setMetamaskProxyProvider() { + async function setIframeProvider() { const address = await getAddress(); if (!network.metamaskSnapWalletAddress) { throw new Error('Metamask snap wallet URL is not set.'); } - const provider = await getMetamaskProxyProvider({ + const provider = await getIframeProvider({ address, walletUrl: network.metamaskSnapWalletAddress }); @@ -350,6 +359,12 @@ export function ProviderInitializer() { setExtensionProvider(); break; } + + case LoginMethodsEnum.passkey: { + setPasskeyProvider(); + break; + } + case LoginMethodsEnum.metamask: { setMetamaskProvider(); break; @@ -365,8 +380,8 @@ export function ProviderInitializer() { break; } - case LoginMethodsEnum.metamaskProxy: - setMetamaskProxyProvider(); + case LoginMethodsEnum.iframe: + setIframeProvider(); break; case LoginMethodsEnum.extra: { diff --git a/src/components/ProviderInitializer/helpers/getMetamaskProxyProvider.ts b/src/components/ProviderInitializer/helpers/getIframeProvider.ts similarity index 51% rename from src/components/ProviderInitializer/helpers/getMetamaskProxyProvider.ts rename to src/components/ProviderInitializer/helpers/getIframeProvider.ts index 9329ba9bf..00cec88d7 100644 --- a/src/components/ProviderInitializer/helpers/getMetamaskProxyProvider.ts +++ b/src/components/ProviderInitializer/helpers/getIframeProvider.ts @@ -1,6 +1,6 @@ -import { MetamaskProxyProvider } from 'lib/sdkWebWalletCrossWindowProvider'; +import { IframeProvider } from '@multiversx/sdk-web-wallet-iframe-provider/out'; -export async function getMetamaskProxyProvider({ +export async function getIframeProvider({ address, walletUrl }: { @@ -8,7 +8,7 @@ export async function getMetamaskProxyProvider({ walletUrl: string; }) { try { - const provider = MetamaskProxyProvider.getInstance(); + const provider = IframeProvider.getInstance(); if (provider.isInitialized()) { return provider; @@ -21,9 +21,9 @@ export async function getMetamaskProxyProvider({ return provider; } - console.error('Could not initialise MetamaskProxyProvider'); + console.error('Could not initialise IframeProvider'); } catch (err) { - console.error('Unable to login to MetamaskProxyProvider', err); + console.error('Unable to login to IframeProvider', err); } return null; } diff --git a/src/components/ProviderInitializer/helpers/getPasskeyProvider.ts b/src/components/ProviderInitializer/helpers/getPasskeyProvider.ts new file mode 100644 index 000000000..865ccfa83 --- /dev/null +++ b/src/components/ProviderInitializer/helpers/getPasskeyProvider.ts @@ -0,0 +1,18 @@ +import { PasskeyProvider } from '@multiversx/sdk-passkey-provider/out'; + +export async function getPasskeyProvider(address: string) { + try { + const provider = PasskeyProvider.getInstance().setAddress(address); + + const success = await provider.init(); + + if (success) { + return provider; + } else { + console.error('Could not initialise passkey provider'); + } + } catch (err) { + console.error('Unable to login to PasskeyProvider', err); + } + return null; +} diff --git a/src/components/ProviderInitializer/helpers/index.ts b/src/components/ProviderInitializer/helpers/index.ts index 32372861a..bd6247d5a 100644 --- a/src/components/ProviderInitializer/helpers/index.ts +++ b/src/components/ProviderInitializer/helpers/index.ts @@ -1,7 +1,8 @@ export * from './getOperaProvider'; export * from './getExtensionProvider'; export * from './getCrossWindowProvider'; -export * from './getMetamaskProxyProvider'; +export * from './getIframeProvider'; export * from './processModifiedAccount'; export * from './getModifiedLoginToken'; export * from './getMetamaskProvider'; +export * from './getPasskeyProvider'; diff --git a/src/constants/dataTestIds.enum.ts b/src/constants/dataTestIds.enum.ts index 07fdf4b32..e5c623351 100644 --- a/src/constants/dataTestIds.enum.ts +++ b/src/constants/dataTestIds.enum.ts @@ -15,7 +15,7 @@ export enum DataTestIdsEnum { deleteToastButton = 'deleteToastButton', errorScreen = 'errorScreen', extensionLoginButton = 'extensionLoginButton', - metamaskProxyLoginButton = 'metamaskProxyLoginButton', + iframeLoginButton = 'iframeLoginButton', formatAmountComponent = 'formatAmountComponent', formatAmountDecimals = 'formatAmountDecimals', formatAmountInt = 'formatAmountInt', diff --git a/src/hooks/login/helpers/clearInitiatedLogins.ts b/src/hooks/login/helpers/clearInitiatedLogins.ts index bd31da4c9..414844403 100644 --- a/src/hooks/login/helpers/clearInitiatedLogins.ts +++ b/src/hooks/login/helpers/clearInitiatedLogins.ts @@ -1,7 +1,5 @@ -import { - CrossWindowProvider, - MetamaskProxyProvider -} from 'lib/sdkWebWalletCrossWindowProvider'; +import { IframeProvider } from '@multiversx/sdk-web-wallet-iframe-provider/out'; +import { CrossWindowProvider } from 'lib/sdkWebWalletCrossWindowProvider'; import { LoginMethodsEnum } from 'types'; export const clearInitiatedLogins = (props?: { skip: LoginMethodsEnum }) => { @@ -13,9 +11,9 @@ export const clearInitiatedLogins = (props?: { skip: LoginMethodsEnum }) => { if (crossWindowProvider.isInitialized()) { crossWindowProvider.dispose(); } - const metamaskProvider = MetamaskProxyProvider.getInstance(); - if (metamaskProvider.isInitialized()) { - metamaskProvider.dispose(); + const iframeProvider = IframeProvider.getInstance(); + if (iframeProvider.isInitialized()) { + iframeProvider.dispose(); } }); diff --git a/src/hooks/login/index.ts b/src/hooks/login/index.ts index 36b46beda..402dbbd26 100644 --- a/src/hooks/login/index.ts +++ b/src/hooks/login/index.ts @@ -7,3 +7,4 @@ export { useLedgerLogin } from './useLedgerLogin'; export { useXaliasLogin } from './useXaliasLogin'; export { useWalletConnectV2Login } from './useWalletConnectV2Login'; export { useMetamaskLogin } from './useMetamaskLogin'; +export { usePasskeyLogin } from './usePasskeyLogin'; diff --git a/src/hooks/login/useMetamaskProxyLogin.ts b/src/hooks/login/useIframeLogin.ts similarity index 85% rename from src/hooks/login/useMetamaskProxyLogin.ts rename to src/hooks/login/useIframeLogin.ts index b9697ab40..ca806f20c 100644 --- a/src/hooks/login/useMetamaskProxyLogin.ts +++ b/src/hooks/login/useIframeLogin.ts @@ -1,14 +1,14 @@ import { useState } from 'react'; +import { IframeProvider } from '@multiversx/sdk-web-wallet-iframe-provider/out'; +import { IframeLoginTypes } from '@multiversx/sdk-web-wallet-iframe-provider/out/constants'; import { processModifiedAccount } from 'components/ProviderInitializer/helpers/processModifiedAccount'; import { SECOND_LOGIN_ATTEMPT_ERROR } from 'constants/errorsMessages'; -import { MetamaskProxyProvider } from 'lib/sdkWebWalletCrossWindowProvider'; import { setAccountProvider } from 'providers/accountProvider'; import { loginAction } from 'reduxStore/commonActions'; import { useDispatch, useSelector } from 'reduxStore/DappProviderContext'; import { networkSelector } from 'reduxStore/selectors/networkConfigSelectors'; import { setAccount } from 'reduxStore/slices'; import { - InitiateLoginFunctionType, LoginHookGenericStateType, LoginMethodsEnum, OnProviderLoginType @@ -19,19 +19,19 @@ import { getWindowLocation } from 'utils/window/getWindowLocation'; import { clearInitiatedLogins } from './helpers'; import { useLoginService } from './useLoginService'; -export type UseMetamaskProxyLoginReturnType = [ - InitiateLoginFunctionType, +export type UseIframeLoginReturnType = [ + (loginType: IframeLoginTypes) => void, LoginHookGenericStateType ]; -export const useMetamaskProxyLogin = ({ +export const useIframeLogin = ({ callbackRoute, token: tokenToSign, nativeAuth, walletAddress }: OnProviderLoginType & { walletAddress?: string; -}): UseMetamaskProxyLoginReturnType => { +}): UseIframeLoginReturnType => { const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const hasNativeAuth = nativeAuth != null; @@ -42,24 +42,26 @@ export const useMetamaskProxyLogin = ({ const dispatch = useDispatch(); const isLoggedIn = getIsLoggedIn(); - async function initiateLogin() { + async function initiateLogin(loginType = IframeLoginTypes.metamask) { if (isLoggedIn) { throw new Error(SECOND_LOGIN_ATTEMPT_ERROR); } clearInitiatedLogins({ - skip: LoginMethodsEnum.metamaskProxy + skip: LoginMethodsEnum.iframe }); setIsLoading(true); - const provider = MetamaskProxyProvider.getInstance(); + const provider = IframeProvider.getInstance(); const walletUrl = walletAddress ?? network.metamaskSnapWalletAddress; if (!walletUrl) { - setError('Metamask snap wallet URL is not set'); + setError('Iframe snap wallet URL is not set'); return; } + + provider.setLoginType(loginType); provider.setWalletUrl(walletUrl); const isSuccessfullyInitialized: boolean = await provider.init(); @@ -122,7 +124,7 @@ export const useMetamaskProxyLogin = ({ dispatch( loginAction({ address: account.address, - loginMethod: LoginMethodsEnum.metamaskProxy + loginMethod: LoginMethodsEnum.iframe }) ); diff --git a/src/hooks/login/usePasskeyLogin.ts b/src/hooks/login/usePasskeyLogin.ts new file mode 100644 index 000000000..b6c3f0003 --- /dev/null +++ b/src/hooks/login/usePasskeyLogin.ts @@ -0,0 +1,132 @@ +import { useState } from 'react'; + +import { PasskeyProvider } from '@multiversx/sdk-passkey-provider/out'; +import { SECOND_LOGIN_ATTEMPT_ERROR } from 'constants/errorsMessages'; +import { setAccountProvider } from 'providers/accountProvider'; +import { loginAction } from 'reduxStore/commonActions'; +import { useDispatch } from 'reduxStore/DappProviderContext'; +import { + InitiateLoginFunctionType, + LoginHookGenericStateType, + OnProviderLoginType +} from 'types'; +import { LoginMethodsEnum } from 'types/enums.types'; +import { getIsLoggedIn } from 'utils/getIsLoggedIn'; +import { optionalRedirect } from 'utils/internal'; +import { addOriginToLocationPath } from 'utils/window'; +import { getDefaultCallbackUrl } from 'utils/window'; +import { clearInitiatedLogins } from './helpers'; +import { useLoginService } from './useLoginService'; + +export type UsePasskeyLoginReturnType = [ + InitiateLoginFunctionType, + LoginHookGenericStateType +]; + +export const usePasskeyLogin = ({ + callbackRoute, + token: tokenToSign, + nativeAuth, + onLoginRedirect +}: OnProviderLoginType): UsePasskeyLoginReturnType => { + const [error, setError] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const hasNativeAuth = nativeAuth != null; + const loginService = useLoginService(nativeAuth); + let token = tokenToSign; + + const dispatch = useDispatch(); + const isLoggedIn = getIsLoggedIn(); + + async function initiateLogin() { + if (isLoggedIn) { + throw new Error(SECOND_LOGIN_ATTEMPT_ERROR); + } + + clearInitiatedLogins(); + + setIsLoading(true); + const provider: PasskeyProvider = PasskeyProvider.getInstance(); + + try { + const isSuccessfullyInitialized: boolean = await provider.init(); + + if (!isSuccessfullyInitialized) { + console.warn( + 'Something went wrong trying to redirect to wallet login..' + ); + return; + } + + const defaultCallbackUrl = getDefaultCallbackUrl(); + const callbackUrl: string = encodeURIComponent( + addOriginToLocationPath(callbackRoute ?? defaultCallbackUrl) + ); + + if (hasNativeAuth && !token) { + token = await loginService.getNativeAuthLoginToken(); + + // Fetching block failed + if (!token) { + console.warn('Fetching block failed. Login cancelled.'); + return; + } + } + + if (token) { + loginService.setLoginToken(token); + } + + const providerLoginData = { + callbackUrl, + ...(token && { token }) + }; + + await provider.login(providerLoginData); + + setAccountProvider(provider); + + const { signature, address } = provider.account; + + if (!address) { + setIsLoading(false); + console.warn('Login cancelled.'); + setError('Login cancelled'); + return; + } + + if (signature && token) { + loginService.setTokenLoginInfo({ + signature, + address + }); + } + + dispatch(loginAction({ address, loginMethod: LoginMethodsEnum.passkey })); + + optionalRedirect({ + callbackRoute, + onLoginRedirect, + options: { signature, address } + }); + } catch (error) { + console.error('error logging in', error); + // TODO: can be any or typed error + setError('Error logging in: ' + (error as any).message); + } finally { + setIsLoading(false); + } + } + + const loginFailed = Boolean(error); + + return [ + initiateLogin, + { + loginFailed, + error, + isLoading: isLoading && !loginFailed, + isLoggedIn: isLoggedIn && !loginFailed + } + ]; +}; diff --git a/src/hooks/transactions/useSignTransactions.tsx b/src/hooks/transactions/useSignTransactions.tsx index 2a68871a7..0f3657bde 100644 --- a/src/hooks/transactions/useSignTransactions.tsx +++ b/src/hooks/transactions/useSignTransactions.tsx @@ -8,6 +8,8 @@ import { import { ExtensionProvider } from '@multiversx/sdk-extension-provider'; import { MetamaskProvider } from '@multiversx/sdk-metamask-provider/out/metamaskProvider'; +import { PasskeyProvider } from '@multiversx/sdk-passkey-provider/out'; +import { IframeProvider } from '@multiversx/sdk-web-wallet-iframe-provider/out'; import uniq from 'lodash/uniq'; import { useGetAccountFromApi } from 'apiCalls/accounts/useGetAccountFromApi'; import { @@ -22,10 +24,7 @@ import { import { useGetAccount } from 'hooks/account'; import { useGetAccountProvider } from 'hooks/account/useGetAccountProvider'; import { useParseSignedTransactions } from 'hooks/transactions/useParseSignedTransactions'; -import { - CrossWindowProvider, - MetamaskProxyProvider -} from 'lib/sdkWebWalletCrossWindowProvider'; +import { CrossWindowProvider } from 'lib/sdkWebWalletCrossWindowProvider'; import { ExperimentalWebviewProvider } from 'providers/experimentalWebViewProvider'; import { getProviderType } from 'providers/utils'; @@ -98,8 +97,9 @@ export const useSignTransactions = () => { const clearSignInfo = (sessionId?: string) => { const isExtensionProvider = provider instanceof ExtensionProvider; + const isPasskeyProvider = provider instanceof PasskeyProvider; const isCrossWindowProvider = provider instanceof CrossWindowProvider; - const isMetamaskProxyProvider = provider instanceof MetamaskProxyProvider; + const isIframeProvider = provider instanceof IframeProvider; const isMetamaskProvider = provider instanceof MetamaskProvider; const isExperiementalWebviewProvider = provider instanceof ExperimentalWebviewProvider; @@ -112,7 +112,8 @@ export const useSignTransactions = () => { if ( !isExtensionProvider && !isCrossWindowProvider && - !isMetamaskProxyProvider && + !isIframeProvider && + !isPasskeyProvider && !isMetamaskProvider ) { return; @@ -123,14 +124,17 @@ export const useSignTransactions = () => { if (isExtensionProvider) { ExtensionProvider.getInstance()?.cancelAction?.(); } + if (isPasskeyProvider) { + PasskeyProvider.getInstance()?.cancelAction?.(); + } if (isMetamaskProvider) { MetamaskProvider.getInstance()?.cancelAction?.(); } if (isCrossWindowProvider) { CrossWindowProvider.getInstance()?.cancelAction?.(); } - if (isMetamaskProxyProvider) { - MetamaskProxyProvider.getInstance()?.cancelAction?.(); + if (isIframeProvider) { + IframeProvider.getInstance()?.cancelAction?.(); } if (isExperiementalWebviewProvider) { ExperimentalWebviewProvider.getInstance()?.cancelAction?.(); @@ -229,7 +233,6 @@ export const useSignTransactions = () => { if (isCrossWindowProvider && hasConsentPopup) { (provider as CrossWindowProvider).setShouldShowConsentPopup(true); } - const signedTransactions: Transaction[] = (await provider.signTransactions( isGuarded && allowGuardian diff --git a/src/hooks/transactions/useSignTransactionsCommonData.tsx b/src/hooks/transactions/useSignTransactionsCommonData.tsx index bdaa61d80..2c35cf229 100644 --- a/src/hooks/transactions/useSignTransactionsCommonData.tsx +++ b/src/hooks/transactions/useSignTransactionsCommonData.tsx @@ -3,13 +3,12 @@ import { useEffect, useState } from 'react'; import { Transaction } from '@multiversx/sdk-core/out'; import { ExtensionProvider } from '@multiversx/sdk-extension-provider'; import { MetamaskProvider } from '@multiversx/sdk-metamask-provider/out/metamaskProvider'; +import { PasskeyProvider } from '@multiversx/sdk-passkey-provider/out'; +import { IframeProvider } from '@multiversx/sdk-web-wallet-iframe-provider/out'; import { useGetAccount } from 'hooks/account'; import { useGetAccountProvider } from 'hooks/account/useGetAccountProvider'; import { useParseSignedTransactions } from 'hooks/transactions/useParseSignedTransactions'; -import { - CrossWindowProvider, - MetamaskProxyProvider -} from 'lib/sdkWebWalletCrossWindowProvider'; +import { CrossWindowProvider } from 'lib/sdkWebWalletCrossWindowProvider'; import { ExperimentalWebviewProvider } from 'providers/experimentalWebViewProvider'; import { useDispatch, useSelector } from 'reduxStore/DappProviderContext'; @@ -71,8 +70,9 @@ export const useSignTransactionsCommonData = () => { function clearSignInfo(sessionId?: string) { const isExtensionProvider = provider instanceof ExtensionProvider; + const isPasskeyProvider = provider instanceof PasskeyProvider; const isCrossWindowProvider = provider instanceof CrossWindowProvider; - const isMetamaskProxyProvider = provider instanceof MetamaskProxyProvider; + const isIframeProvider = provider instanceof IframeProvider; const isMetamaskProvider = provider instanceof MetamaskProvider; const isExperimentalWebviewProvider = provider instanceof ExperimentalWebviewProvider; @@ -83,7 +83,8 @@ export const useSignTransactionsCommonData = () => { if ( !isExtensionProvider && !isCrossWindowProvider && - !isMetamaskProxyProvider && + !isIframeProvider && + !isPasskeyProvider && !isMetamaskProvider ) { return; @@ -95,6 +96,10 @@ export const useSignTransactionsCommonData = () => { ExtensionProvider.getInstance()?.cancelAction?.(); } + if (isPasskeyProvider) { + PasskeyProvider.getInstance()?.cancelAction?.(); + } + if (isMetamaskProvider) { MetamaskProvider.getInstance()?.cancelAction?.(); } @@ -103,8 +108,8 @@ export const useSignTransactionsCommonData = () => { CrossWindowProvider.getInstance()?.cancelAction?.(); } - if (isMetamaskProxyProvider) { - MetamaskProxyProvider.getInstance()?.cancelAction?.(); + if (isIframeProvider) { + IframeProvider.getInstance()?.cancelAction?.(); } if (isExperimentalWebviewProvider) { diff --git a/src/hooks/transactions/useSignTransactionsWithDevice.tsx b/src/hooks/transactions/useSignTransactionsWithDevice.tsx index a656704db..f79549f40 100644 --- a/src/hooks/transactions/useSignTransactionsWithDevice.tsx +++ b/src/hooks/transactions/useSignTransactionsWithDevice.tsx @@ -156,7 +156,6 @@ export function useSignTransactionsWithDevice( if (!transaction) { return null; } - return await connectedProvider.signTransaction(transaction); } diff --git a/src/hooks/websocketListener/useInitializeWebsocketConnection.tsx b/src/hooks/websocketListener/useInitializeWebsocketConnection.tsx index 0bb2db165..f3f53bada 100644 --- a/src/hooks/websocketListener/useInitializeWebsocketConnection.tsx +++ b/src/hooks/websocketListener/useInitializeWebsocketConnection.tsx @@ -23,17 +23,15 @@ const DISCONNECT = 'disconnect'; export function useInitializeWebsocketConnection() { const messageTimeout = useRef(null); const batchTimeout = useRef(null); - const { address } = useGetAccount(); - const dispatch = useDispatch(); - const { network } = useGetNetworkConfig(); const handleMessageReceived = (message: string) => { if (messageTimeout.current) { clearTimeout(messageTimeout.current); } + messageTimeout.current = setTimeout(() => { dispatch(setWebsocketEvent(message)); }, MESSAGE_DELAY); @@ -43,14 +41,29 @@ export function useInitializeWebsocketConnection() { if (batchTimeout.current) { clearTimeout(batchTimeout.current); } + batchTimeout.current = setTimeout(() => { dispatch(setWebsocketBatchEvent(data)); }, MESSAGE_DELAY); }; + const unsubscribeWS = () => { + websocketConnection.current?.close(); + websocketConnection.current = null; + websocketConnection.status = WebsocketConnectionStatusEnum.NOT_INITIALIZED; + + if (messageTimeout.current) { + clearTimeout(messageTimeout.current); + } + }; + const initializeWebsocketConnection = useCallback( retryMultipleTimes( async () => { + if (!address) { + return; + } + // If there are many components that use this hook, the initialize method is triggered many times. // To avoid multiple connections to the same endpoint, we have to guard the initialization before the logic started websocketConnection.status = WebsocketConnectionStatusEnum.PENDING; @@ -82,11 +95,18 @@ export function useInitializeWebsocketConnection() { }); websocketConnection.current.on(DISCONNECT, () => { - console.warn('Websocket disconnected. Trying to reconnect...'); - setTimeout(() => { - console.log('Websocket reconnecting...'); - websocketConnection.current?.connect(); - }, RETRY_INTERVAL); + if (address) { + // Make sure we are still logged in before retrying to connect to the websocket + console.warn('Websocket disconnected. Trying to reconnect...'); + + setTimeout(() => { + if (address) { + // Make sure we are still logged in when the timeout is finished + console.log('Websocket reconnecting...'); + websocketConnection.current?.connect(); + } + }, RETRY_INTERVAL); + } }); }, { @@ -105,17 +125,18 @@ export function useInitializeWebsocketConnection() { !websocketConnection.current?.active ) { initializeWebsocketConnection(); + return; + } + + if (!address) { + // Close the websocket connection when we are not logged in + unsubscribeWS(); } }, [address, initializeWebsocketConnection]); useEffect(() => { return () => { - websocketConnection.current?.close(); - websocketConnection.status = - WebsocketConnectionStatusEnum.NOT_INITIALIZED; - if (messageTimeout.current) { - clearTimeout(messageTimeout.current); - } + unsubscribeWS(); }; }, []); } diff --git a/src/lib/sdkWebWalletCrossWindowProvider.ts b/src/lib/sdkWebWalletCrossWindowProvider.ts index bf0e541c5..7bf070682 100644 --- a/src/lib/sdkWebWalletCrossWindowProvider.ts +++ b/src/lib/sdkWebWalletCrossWindowProvider.ts @@ -1,2 +1 @@ export { CrossWindowProvider } from '@multiversx/sdk-web-wallet-cross-window-provider/out/CrossWindowProvider/CrossWindowProvider'; -export { MetamaskProxyProvider } from '@multiversx/sdk-metamask-proxy-provider/out/MetamaskProxyProvider/MetamaskProxyProvider'; diff --git a/src/providers/accountProvider.ts b/src/providers/accountProvider.ts index cf0b79243..983ff8c13 100644 --- a/src/providers/accountProvider.ts +++ b/src/providers/accountProvider.ts @@ -2,11 +2,10 @@ import { ExtensionProvider } from '@multiversx/sdk-extension-provider'; import { HWProvider } from '@multiversx/sdk-hw-provider'; import { MetamaskProvider } from '@multiversx/sdk-metamask-provider/out/metamaskProvider'; import { OperaProvider } from '@multiversx/sdk-opera-provider'; +import { PasskeyProvider } from '@multiversx/sdk-passkey-provider/out'; +import { IframeProvider } from '@multiversx/sdk-web-wallet-iframe-provider/out'; import { WalletProvider } from '@multiversx/sdk-web-wallet-provider'; -import { - CrossWindowProvider, - MetamaskProxyProvider -} from 'lib/sdkWebWalletCrossWindowProvider'; +import { CrossWindowProvider } from 'lib/sdkWebWalletCrossWindowProvider'; import { IDappProvider } from 'types'; import { WalletConnectV2Provider } from 'utils/walletconnect/__sdkWalletconnectProvider'; import { emptyProvider } from './utils'; @@ -14,10 +13,11 @@ import { emptyProvider } from './utils'; export type ProvidersType = | IDappProvider | ExtensionProvider + | PasskeyProvider | MetamaskProvider | WalletProvider | CrossWindowProvider - | MetamaskProxyProvider + | IframeProvider | HWProvider | OperaProvider | WalletConnectV2Provider; diff --git a/src/providers/utils.ts b/src/providers/utils.ts index ef7e67fef..e89fca72e 100644 --- a/src/providers/utils.ts +++ b/src/providers/utils.ts @@ -4,12 +4,11 @@ import { HWProvider } from '@multiversx/sdk-hw-provider'; import { IHWWalletApp } from '@multiversx/sdk-hw-provider/out/interface'; import { MetamaskProvider } from '@multiversx/sdk-metamask-provider/out/metamaskProvider'; import { OperaProvider } from '@multiversx/sdk-opera-provider'; +import { PasskeyProvider } from '@multiversx/sdk-passkey-provider/out'; +import { IframeProvider } from '@multiversx/sdk-web-wallet-iframe-provider/out'; import { WalletProvider } from '@multiversx/sdk-web-wallet-provider'; import { LEDGER_CONTRACT_DATA_ENABLED_VALUE } from 'constants/index'; -import { - CrossWindowProvider, - MetamaskProxyProvider -} from 'lib/sdkWebWalletCrossWindowProvider'; +import { CrossWindowProvider } from 'lib/sdkWebWalletCrossWindowProvider'; import { IDappProvider } from 'types'; import { LoginMethodsEnum } from 'types/enums.types'; import { @@ -31,14 +30,16 @@ export const getProviderType = ( return LoginMethodsEnum.ledger; case ExtensionProvider: return LoginMethodsEnum.extension; + case PasskeyProvider: + return LoginMethodsEnum.passkey; case MetamaskProvider: return LoginMethodsEnum.metamask; case OperaProvider: return LoginMethodsEnum.opera; case CrossWindowProvider: return LoginMethodsEnum.crossWindow; - case MetamaskProxyProvider: - return LoginMethodsEnum.metamaskProxy; + case IframeProvider: + return LoginMethodsEnum.iframe; case EmptyProvider: return LoginMethodsEnum.none; default: diff --git a/src/reduxStore/slices/loginInfoSlice.ts b/src/reduxStore/slices/loginInfoSlice.ts index 223293b78..ff41aa8c7 100644 --- a/src/reduxStore/slices/loginInfoSlice.ts +++ b/src/reduxStore/slices/loginInfoSlice.ts @@ -31,9 +31,10 @@ export interface LoginInfoStateType { tokenLogin: TokenLoginType | null; walletLogin: LoginInfoType | null; extensionLogin: LoginInfoType | null; + passkeyLogin: LoginInfoType | null; operaLogin: LoginInfoType | null; crossWindowLogin: LoginInfoType | null; - metamaskProxyWindowLogin: LoginInfoType | null; + iframeWindowLogin: LoginInfoType | null; webviewLogin: LoginInfoType | null; isLoginSessionInvalid: boolean; logoutRoute?: string; @@ -47,9 +48,10 @@ const initialState: LoginInfoStateType = { tokenLogin: null, walletLogin: null, extensionLogin: null, + passkeyLogin: null, operaLogin: null, crossWindowLogin: null, - metamaskProxyWindowLogin: null, + iframeWindowLogin: null, isLoginSessionInvalid: false, webviewLogin: null }; diff --git a/src/types/enums.types.ts b/src/types/enums.types.ts index c4f89c32e..cbdd1ed28 100644 --- a/src/types/enums.types.ts +++ b/src/types/enums.types.ts @@ -36,8 +36,9 @@ export enum LoginMethodsEnum { walletconnectv2 = 'walletconnectv2', wallet = 'wallet', crossWindow = 'crossWindow', - metamaskProxy = 'metamaskProxy', + iframe = 'iframe', extension = 'extension', + passkey = 'passkey', metamask = 'metamask', opera = 'opera', extra = 'extra', diff --git a/yarn.lock b/yarn.lock index 4828d7546..8b0ff99c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -92,12 +92,12 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.18.13", "@babel/generator@^7.21.5", "@babel/generator@^7.25.0", "@babel/generator@^7.25.4", "@babel/generator@^7.7.2": - version "7.25.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.5.tgz#b31cf05b3fe8c32d206b6dad03bb0aacbde73450" - integrity sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w== +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.18.13", "@babel/generator@^7.21.5", "@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== dependencies: - "@babel/types" "^7.25.4" + "@babel/types" "^7.25.6" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -288,12 +288,12 @@ "@babel/types" "^7.25.0" "@babel/helpers@^7.12.5", "@babel/helpers@^7.21.5", "@babel/helpers@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" - integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== dependencies: "@babel/template" "^7.25.0" - "@babel/types" "^7.25.0" + "@babel/types" "^7.25.6" "@babel/highlight@^7.24.7": version "7.24.7" @@ -305,12 +305,12 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.4.tgz#af4f2df7d02440286b7de57b1c21acfb2a6f257a" - integrity sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== dependencies: - "@babel/types" "^7.25.4" + "@babel/types" "^7.25.6" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": version "7.25.3" @@ -500,18 +500,18 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-import-assertions@^7.23.3", "@babel/plugin-syntax-import-assertions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" - integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz#bb918905c58711b86f9710d74a3744b6c56573b5" + integrity sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-import-attributes@^7.23.3", "@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" - integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -1329,9 +1329,9 @@ regenerator-runtime "^0.13.2" "@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.5.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee" - integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== dependencies: regenerator-runtime "^0.14.0" @@ -1352,22 +1352,22 @@ "@babel/types" "^7.25.0" "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.21.5", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4", "@babel/traverse@^7.7.2": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.4.tgz#648678046990f2957407e3086e97044f13c3e18e" - integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.4" - "@babel/parser" "^7.25.4" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" "@babel/template" "^7.25.0" - "@babel/types" "^7.25.4" + "@babel/types" "^7.25.6" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.14.8", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.5", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.4.tgz#6bcb46c72fdf1012a209d016c07f769e10adcb5f" - integrity sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ== +"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.14.8", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.5", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" @@ -2293,9 +2293,9 @@ uuid "^9.0.1" "@metamask/utils@^9.0.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-9.1.0.tgz#54e5afcec07e6032d4dd4171e862b36daa52d77e" - integrity sha512-g2REf+xSt0OZfMoNNdC4+/Yy8eP3KUqvIArel54XRFKPoXbHI6+YjFfrLtfykWBjffOp7DTfIc3Kvk5TLfuiyg== + version "9.2.1" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-9.2.1.tgz#d9f84706ff97e0c8d1bde5778549365b14269e81" + integrity sha512-/u663aUaB6+Xe75i3Mt/1cCljm41HDYIsna5oBrwGvgkY2zH7/9k9Zjd706cxoAbxN7QgLSVAReUiGnuxCuXrQ== dependencies: "@ethereumjs/tx" "^4.2.0" "@metamask/superstruct" "^3.1.0" @@ -2357,9 +2357,9 @@ protobufjs "7.2.4" "@multiversx/sdk-core@>= 12.18.0": - version "13.4.2" - resolved "https://registry.yarnpkg.com/@multiversx/sdk-core/-/sdk-core-13.4.2.tgz#bfe524b9b18b631bef96acead7713d2d1ccab15c" - integrity sha512-+XdBSaX+iUMm9BRv86Tmzy16H3XS7TQ2/+HN12hCgP9TF003K8KABTCJnlyIrQ1oM5iI3ffbY+fEQpAwo+wQEQ== + version "13.5.0" + resolved "https://registry.yarnpkg.com/@multiversx/sdk-core/-/sdk-core-13.5.0.tgz#e3d97fd92e3da534095ead2164a263e8d8a48482" + integrity sha512-J20WHxN7muUDrnGRbDhfgGJJEP1f27gdnSNx/7pa5urY/5z5Zh+a9XedUtJ/OXBcSuTp88ZelUpYFNEdenrJXA== dependencies: "@multiversx/sdk-transaction-decoder" "1.0.2" bech32 "1.1.4" @@ -2400,15 +2400,6 @@ "@metamask/providers" "16.0.0" "@multiversx/sdk-core" "12.18.0" -"@multiversx/sdk-metamask-proxy-provider@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@multiversx/sdk-metamask-proxy-provider/-/sdk-metamask-proxy-provider-1.0.0.tgz#ea7d32ee43e756f73f2d661d7ce854b23c3b9e68" - integrity sha512-fdfUKfWLSHvdEPdvT/CZE56VbpreOgOYzn/QneuT/n1xMGuB++o3TFB4eGF06wEyDLmbtMMG4FEOvi9HFuFVbA== - dependencies: - "@types/jest" "^29.5.11" - "@types/qs" "6.9.10" - qs "6.11.2" - "@multiversx/sdk-native-auth-client@1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@multiversx/sdk-native-auth-client/-/sdk-native-auth-client-1.0.7.tgz#ae3c4afbd88349059c606e47c9515825ed4047ac" @@ -2421,6 +2412,13 @@ resolved "https://registry.yarnpkg.com/@multiversx/sdk-opera-provider/-/sdk-opera-provider-1.0.0-alpha.1.tgz#2beebd5423fdc2e667b33660f17cbff325449097" integrity sha512-5hrqn+kNpuy/S6eV5wh5mE4lvQo0PduZ7fLsh/2Srcaz3K5kM5lE1VyQmWk4DTxToZSldrGbgWz/olezoC6fPg== +"@multiversx/sdk-passkey-provider@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@multiversx/sdk-passkey-provider/-/sdk-passkey-provider-1.0.0.tgz#f96d9956f3e9376eea86e8556219d4e88ff00bb9" + integrity sha512-lUY2ZSWNPN6X3RIMtSXjQFL5Owh+zxPZoiIQkkbBG+IUepk3MzPpASvgPfcEMSEM755Ud9hJb13Jr1HtCtmazg== + dependencies: + "@types/jest" "^29.5.11" + "@multiversx/sdk-transaction-decoder@1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@multiversx/sdk-transaction-decoder/-/sdk-transaction-decoder-1.0.2.tgz#83ded4f6d4b877b4421234856eb19709be2af31b" @@ -2464,6 +2462,15 @@ "@types/qs" "6.9.10" qs "6.11.2" +"@multiversx/sdk-web-wallet-iframe-provider@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@multiversx/sdk-web-wallet-iframe-provider/-/sdk-web-wallet-iframe-provider-1.0.2.tgz#968a3038b778d85e86724e2759cb1646672c3915" + integrity sha512-2WpmhjfOaZySf1NOFV2L5yjfRiukaOLU3+zkmwg106oMNJq7+mP7ZM7rMe7y95xYPFgMW+1Ivtdc1DTKycIn+g== + dependencies: + "@types/jest" "^29.5.11" + "@types/qs" "6.9.10" + qs "6.11.2" + "@multiversx/sdk-web-wallet-provider@3.2.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@multiversx/sdk-web-wallet-provider/-/sdk-web-wallet-provider-3.2.1.tgz#94ba12140f4f9f35f30b8e13186baa78db4ddaae" @@ -2502,11 +2509,16 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== -"@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@~1.4.0": +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== +"@noble/hashes@^1.3.1": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== + "@node-rs/xxhash-android-arm-eabi@1.7.3": version "1.7.3" resolved "https://registry.yarnpkg.com/@node-rs/xxhash-android-arm-eabi/-/xxhash-android-arm-eabi-1.7.3.tgz#271a935e7f373a07927fd02311e81d0ffd7a95d5" @@ -4839,9 +4851,9 @@ form-data "^4.0.0" "@types/node@*", "@types/node@>=13.7.0": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560" - integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw== + version "22.5.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.2.tgz#e42344429702e69e28c839a7e16a8262a8086793" + integrity sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg== dependencies: undici-types "~6.19.2" @@ -6178,9 +6190,9 @@ axios@^0.21.1: follow-redirects "^1.14.0" axios@^1.6.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.5.tgz#21eed340eb5daf47d29b6e002424b3e88c8c54b1" - integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw== + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -6900,9 +6912,9 @@ can-bind-to-host@^1.1.1: integrity sha512-CqsgmaqiyFRNtP17Ihqa/uHbZxRirntNVNl/kJz31DLKuNRfzvzionkLoUSkElQ6Cz+cpXKA3mhHq4tjbieujA== caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001646: - version "1.0.30001653" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz#b8af452f8f33b1c77f122780a4aecebea0caca56" - integrity sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw== + version "1.0.30001655" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f" + integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg== capture-exit@^2.0.0: version "2.0.0" @@ -8746,9 +8758,9 @@ esbuild@^0.14.13: esbuild-windows-arm64 "0.14.54" escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" @@ -8834,9 +8846,9 @@ eslint-import-resolver-typescript@2.4.0: tsconfig-paths "^3.9.0" eslint-module-utils@^2.7.3: - version "2.8.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz#2ecad69d71e1fa81f17f7f24d5d3e46b168de663" - integrity sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg== + version "2.9.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.9.0.tgz#95d4ac038a68cd3f63482659dffe0883900eb342" + integrity sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ== dependencies: debug "^3.2.7" @@ -13050,9 +13062,9 @@ nanomatch@^1.2.9: to-regex "^3.0.1" napi-wasm@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/napi-wasm/-/napi-wasm-1.1.0.tgz#bbe617823765ae9c1bc12ff5942370eae7b2ba4e" - integrity sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg== + version "1.1.3" + resolved "https://registry.yarnpkg.com/napi-wasm/-/napi-wasm-1.1.3.tgz#7bb95c88e6561f84880bb67195437b1cfbe99224" + integrity sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg== natural-compare@^1.4.0: version "1.4.0" @@ -13867,9 +13879,9 @@ picocolors@^0.2.1: integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: version "2.3.1" @@ -14145,9 +14157,9 @@ postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0 source-map "^0.6.1" postcss@^8.2.15: - version "8.4.41" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" - integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== + version "8.4.44" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.44.tgz#d56834ef6508610ba224bb22b2457b2169ed0480" + integrity sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw== dependencies: nanoid "^3.3.7" picocolors "^1.0.1" @@ -16563,9 +16575,9 @@ ufo@^1.4.0, ufo@^1.5.3: integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== uglify-js@^3.1.4: - version "3.19.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.2.tgz#319ae26a5fbd18d03c7dc02496cfa1d6f1cd4307" - integrity sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ== + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== uint8arrays@3.1.0: version "3.1.0"