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"