diff --git a/client/package.json b/client/package.json index b8349f9f46..1a3a72b20f 100644 --- a/client/package.json +++ b/client/package.json @@ -35,7 +35,7 @@ "dependencies": { "@ethersproject/constants": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@rainbow-me/rainbowkit": "^2.1.1", + "@rainbow-me/rainbowkit": "^2.1.5", "@sentry/react": "^8.4.0", "@sentry/vite-plugin": "^2.17.0", "@tanstack/react-query": "^5.37.1", @@ -62,7 +62,7 @@ "react-toastify": "^10.0.5", "react-vis": "^1.12.1", "socket.io-client": "^4.7.5", - "viem": "^2.12.1", + "viem": "^2.21.1", "wagmi": "^2.12.25", "yup": "^1.4.0", "zustand": "^4.5.2" diff --git a/client/src/api/clients/client-wagmi.ts b/client/src/api/clients/client-wagmi.ts index 91d9a10285..7c7b06b7b7 100644 --- a/client/src/api/clients/client-wagmi.ts +++ b/client/src/api/clients/client-wagmi.ts @@ -39,7 +39,7 @@ if (env.jsonRpcEndpoint) { const connectors = connectorsForWallets( [ { - groupName: 'recommended', + groupName: 'Recommended', wallets: [injectedWallet, walletConnectWallet, ledgerWallet], }, ], diff --git a/client/src/components/shared/Layout/LayoutConnectWallet/LayoutConnectWallet.scss b/client/src/components/shared/Layout/LayoutConnectWallet/LayoutConnectWallet.scss new file mode 100644 index 0000000000..4dc4a2f34d --- /dev/null +++ b/client/src/components/shared/Layout/LayoutConnectWallet/LayoutConnectWallet.scss @@ -0,0 +1,122 @@ +// Custom styles for RainbowKit connect modal. +// !important are required, since most of these styles are being overwritten by direct CSS rules. + +.rainbowKitCustomFontFamily { + font-family: 'Inter', sans-serif !important; +} + +.modalWidth { + width: $modalDesktopWidth !important; +} + +.primaryWrapper { + padding: $modalPadding !important; + margin: 0 !important; +} + +.modalHeader { + line-height: $modalHeaderHeight !important; + height: $modalHeaderHeight !important; + align-items: center !important; +} + +.dummyDiv { + display: none !important; +} + +.headerTextWrapper { + padding: 0 !important; +} + +.headerText { + font-size: $modalHeaderFontSize !important; + font-weight: $font-weight-bold !important; +} + +.optionsWrapper { + padding: 0 !important; + margin: 0 !important; +} + +.walletOptionsButtonsWrapper { + display: flex !important; + flex-direction: row !important; +} + +.walletOptionsButtons { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + width: 100% !important; + gap: 1.6rem !important; +} + +.walletOptionsButtonsContent { + height: 9.6rem; + padding: 0 !important; + background: $color-octant-grey3 !important; + + &:hover { + .walletOptionsIcons { + filter: none !important; + } + } +} + +.walletOptionsButtonsOuter { + width: 10.9rem; +} + +.walletOptionsContent { + flex-direction: column !important; + + > div:nth-child(2) > div { + text-align: center; + font-size: 1.4rem !important; + } +} + +.walletOptionsText { + font-weight: $font-weight-bold !important; + font-size: $font-size-12 !important; +} + +.walletOptionsIcons { + filter: grayscale(1) !important; +} + +.buttonClose { + position: absolute !important; + top: 1.6rem !important; + right: 1.6rem !important; + height: 3.2rem !important; + width: 3.2rem !important; + background: none !important; + border: none !important; + border-radius: $border-radius-10 !important; + + &:hover { + transform: none !important; + background: $color-octant-grey3 !important; + } + + > svg > path { + fill: $color-octant-purple2 !important; + } +} + +.sectionHeaders { + display: none !important; +} + +.walletSections { + display: none !important; +} + +.linkBoxTopDividerLine { + display: none !important; +} + +.linkBox { + display: none !important; +} diff --git a/client/src/components/shared/Layout/LayoutConnectWallet/LayoutConnectWallet.tsx b/client/src/components/shared/Layout/LayoutConnectWallet/LayoutConnectWallet.tsx index 92250331f5..c310689a33 100644 --- a/client/src/components/shared/Layout/LayoutConnectWallet/LayoutConnectWallet.tsx +++ b/client/src/components/shared/Layout/LayoutConnectWallet/LayoutConnectWallet.tsx @@ -1,6 +1,6 @@ import { useConnectModal, WalletButton } from '@rainbow-me/rainbowkit'; import cx from 'classnames'; -import React, { FC, Fragment } from 'react'; +import React, { FC, Fragment, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useConnect } from 'wagmi'; @@ -8,12 +8,36 @@ import BoxRounded from 'components/ui/BoxRounded'; import Loader from 'components/ui/Loader'; import Svg from 'components/ui/Svg'; import networkConfig from 'constants/networkConfig'; +import useMediaQuery from 'hooks/helpers/useMediaQuery'; import useDelegationStore from 'store/delegation/store'; import { browserWallet, walletConnect, ledgerConnect } from 'svg/wallet'; import styles from './LayoutConnectWallet.module.scss'; +import { setCustomStylesForRainbowKitModal } from './utils'; + +import './LayoutConnectWallet.scss'; + +/** + * Determines when RainbwKit modal is in "list of wallets" mode. + * Mutations on RainbowKit modal DOM fire when: + * 1. User chooses any of the wallets (opens wallet-specific loading state). + * 2. User cancels the signature and goes back to the list. + * 3. Custom styles (setCustomStylesForRainbowKitModal) are applied. + * + * Custom styles can not be applied when wallet-specific loading state is visible, because: + * 1. It is not designed. + * 2. Some of the DOM elements are not available then. + * + * Hence, the logic triggers setCustomStylesForRainbowKitModal when modal is being opened + * and then when user goes back to the list of wallets. + * + * Observer checks for childList-type changes and whether user is in list mode, + * then applies custom styles. + */ +let isInListMode = false; const LayoutConnectWallet: FC = () => { + const { isDesktop } = useMediaQuery(); const { t } = useTranslation('translation', { keyPrefix: 'components.dedicated.connectWallet', }); @@ -23,11 +47,34 @@ const LayoutConnectWallet: FC = () => { setIsDelegationConnectModalOpen: state.setIsDelegationConnectModalOpen, })); const { connectors, status, connect: onConnectAnyConnector } = useConnect(); - const { connectModalOpen: isOpen } = useConnectModal(); + const { openConnectModal, connectModalOpen: isConnectModalOpen } = useConnectModal(); + + useEffect(() => { + if (!isConnectModalOpen) { + return; + } + + setCustomStylesForRainbowKitModal(t); + isInListMode = true; + + const target = document.querySelector('.iekbcc0.ju367va.ju367v14'); + + const observer = new MutationObserver(mutations => { + if (mutations.every(({ type }) => type === 'childList') && !isInListMode) { + setCustomStylesForRainbowKitModal(t); + } + isInListMode = !isInListMode; + }); + + observer.observe(target as Element, { attributes: true, characterData: true, childList: true }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isConnectModalOpen]); const browserWalletConnector = connectors.find( // eslint-disable-next-line @typescript-eslint/naming-convention ({ id }) => id === 'injected', + // Actually, probably type should be used combined with .filter, user select and ... [0]. + // ({ type }) => type === 'injected', ); const isBrowserWalletConnecting = status === 'pending'; @@ -46,6 +93,14 @@ const LayoutConnectWallet: FC = () => { onConnectAnyConnector({ connector: browserWalletConnector }); }; + const onBrowserWalletClick = useMemo(() => { + if (isBrowserWalletConnecting) { + return undefined; + } + return isDesktop ? openConnectModal : connectBrowserWallet; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isBrowserWalletConnecting, isDesktop]); + return ( {browserWalletConnector && ( @@ -54,7 +109,7 @@ const LayoutConnectWallet: FC = () => { dataTest="ConnectWallet__BoxRounded--browserWallet" isGrey justifyContent="start" - onClick={isBrowserWalletConnecting ? undefined : connectBrowserWallet} + onClick={onBrowserWalletClick} > {isBrowserWalletConnecting ? ( <> @@ -91,7 +146,7 @@ const LayoutConnectWallet: FC = () => { if ( window.Cypress === undefined && - (!isReady || isOpen || isBrowserWalletConnecting) + (!isReady || isConnectModalOpen || isBrowserWalletConnecting) ) { return undefined; } @@ -100,14 +155,17 @@ const LayoutConnectWallet: FC = () => { }} >
{t('walletConnect')}
@@ -122,10 +180,14 @@ const LayoutConnectWallet: FC = () => { dataTest="ConnectWallet__BoxRounded--ledgerConnect" isGrey justifyContent="start" - onClick={!isReady || isOpen || isBrowserWalletConnecting ? undefined : onConnect} + onClick={ + !isReady || isConnectModalOpen || isBrowserWalletConnecting ? undefined : onConnect + } > {
{t('ledgerConnect')} diff --git a/client/src/components/shared/Layout/LayoutConnectWallet/utils.ts b/client/src/components/shared/Layout/LayoutConnectWallet/utils.ts new file mode 100644 index 0000000000..60d2baac06 --- /dev/null +++ b/client/src/components/shared/Layout/LayoutConnectWallet/utils.ts @@ -0,0 +1,127 @@ +import { TFunction } from 'i18next'; + +import { RAINBOW_KIT_PROVIDER } from 'constants/domElementsIds'; + +export const setCustomStylesForRainbowKitModal = (t: TFunction): void => { + const modalRootWrapper = document.querySelector(`[data-rk="${RAINBOW_KIT_PROVIDER}"]`); + + if (!modalRootWrapper) { + return; + } + + // RaibowKit connect modal. + const rainbowkitConnectModal = modalRootWrapper?.parentNode; + + if (!rainbowkitConnectModal) { + return; + } + + const allChildren = rainbowkitConnectModal.querySelectorAll('*'); + // font-family is set for all children, as inherited !important doesn't work here. + allChildren.forEach(element => { + // eslint-disable-next-line no-param-reassign + element.classList.add('rainbowKitCustomFontFamily'); + }); + + // Wrapper that sets the width. + const modalWidth = document.querySelector( + '.iekbcc0._1ckjpok4._1ckjpok1.ju367vb6.ju367vdr.ju367vp.ju367vt.ju367vv.ju367vel.ju367va.ju367v15.ju367v6c.ju367v8r', + ); + modalWidth?.classList.add('modalWidth'); + + // Primary content wrapper to set the padding. + const primaryWrapper = document.querySelector('.iekbcc0.ju367va.ju367v15.ju367v4y._1vwt0cg4'); + primaryWrapper?.classList.add('primaryWrapper'); + + // Header. + const modalHeader = document.querySelector('.iekbcc0.ju367va.ju367v2r'); + modalHeader?.classList.add('modalHeader'); + + // Dummy div in the header. Causes problems with the flexbox, display none. + const dummyDiv = document.querySelector('.iekbcc0.ju367v3s.ju367v94'); + dummyDiv?.classList.add('dummyDiv'); + + // Wrapper for the text in the header. + const headerTextWrapper = document.querySelector( + '.iekbcc0.ju367v7a.ju367v7v.ju367v3h.ju367v6k.ju367v86', + ); + headerTextWrapper?.classList.add('headerTextWrapper'); + + // Text in the header. + const headerText = modalHeader?.querySelector('div:nth-child(2) > h1'); + headerText?.classList.add('headerText'); + + if (headerText) { + headerText.textContent = t('walletSelectHeader'); + } + + const optionsWrapper = document.querySelector('.iekbcc0.ju367v6p._1vwt0cg2.ju367v7a.ju367v7v'); + optionsWrapper?.classList.add('optionsWrapper'); + + const walletOptionsButtonsWrappers = document.querySelectorAll( + '.iekbcc0.ju367va.ju367v15.ju367v1n', + ); + walletOptionsButtonsWrappers.forEach(element => { + element?.classList.add('walletOptionsButtonsWrapper'); + }); + + const walletOptionsButtons = document.querySelectorAll('.iekbcc0.ju367va.ju367v15.ju367v1n'); + walletOptionsButtons.forEach(element => { + element.classList.add('walletOptionsButtons'); + }); + + const walletOptionsButtonsOuter = document.querySelectorAll('.iekbcc0.ju367va.ju367v15'); + walletOptionsButtonsOuter.forEach(element => { + element.classList.add('walletOptionsButtonsOuter'); + }); + + const walletOptionsButtonsContent = document.querySelectorAll( + '.iekbcc0.iekbcc9.ju367v89.ju367v6i.ju367v73.ju367v7o.ju367vo.ju367vt.ju367vv.ju367v8u.ju367v9f.ju367vb1.g5kl0l0._12cbo8i3.ju367v8r._12cbo8i6', + ); + walletOptionsButtonsContent.forEach(element => { + element.classList.add('walletOptionsButtonsContent'); + }); + + const walletOptionsContents = document.querySelectorAll( + '.iekbcc0.ju367v4.ju367va.ju367v14.ju367v1s', + ); + walletOptionsContents.forEach(element => { + element?.classList.add('walletOptionsContent'); + }); + + const walletOptionsText = document.querySelectorAll('.iekbcc0.ju367v5p'); + walletOptionsText.forEach(element => { + element.classList.add('walletOptionsText'); + }); + + const buttonClose = document.querySelectorAll( + '.iekbcc0.iekbcc9.ju367v4.ju367va0.ju367vc6.ju367vs.ju367vt.ju367vv.ju367vff.ju367va.ju367v2b.ju367v2q.ju367v8u.ju367v94._12cbo8i3.ju367v8r._12cbo8i5._12cbo8i7', + )[0]; + + buttonClose.classList.add('buttonClose'); + + const walletOptionsIcons = document.querySelectorAll('.iekbcc0.ju367v2m.ju367v8p.ju367v9f'); + walletOptionsIcons.forEach(element => { + element.classList.add('walletOptionsIcons'); + }); + + // Installed, recommended. + const sectionHeaders = document.querySelectorAll('.iekbcc0.ju367v3n.ju367v48.ju367v33.ju367v4y'); + sectionHeaders.forEach(element => { + element.classList.add('sectionHeaders'); + }); + + const walletSections = document.querySelectorAll('.iekbcc0.ju367va.ju367v15.ju367v1n'); + if (walletSections) { + walletSections[1].classList.add('walletSections'); + } + + const linkBoxTopDividerLine = document.querySelector('.iekbcc0.ju367vau.ju367v24.ju367v57'); + linkBoxTopDividerLine?.classList.add('linkBoxTopDividerLine'); + + // Div with "new to ethereum" text + link. + const linkBox = document.querySelector( + '.iekbcc0.ju367v7c.ju367v7x.ju367v8f.ju367v6o.ju367v4.ju367va.ju367v2r', + ); + linkBox?.classList.add('linkBox'); +}; diff --git a/client/src/components/ui/Modal/Modal.module.scss b/client/src/components/ui/Modal/Modal.module.scss index 35f384ab20..64de19eab2 100644 --- a/client/src/components/ui/Modal/Modal.module.scss +++ b/client/src/components/ui/Modal/Modal.module.scss @@ -1,4 +1,4 @@ -$desktop-width: 47.2rem; + .root { display: flex; @@ -32,8 +32,8 @@ $desktop-width: 47.2rem; } @media #{$desktop-up} { - width: $desktop-width; - margin: 0 0 0 calc($desktop-width / -2); + width: $modalDesktopWidth; + margin: 0 0 0 calc($modalDesktopWidth / -2); .header { font-size: $font-size-20; @@ -46,11 +46,11 @@ $desktop-width: 47.2rem; .header { position: relative; font-weight: $font-weight-bold; - font-size: $font-size-20; + font-size: $modalHeaderFontSize; color: $color-octant-dark; width: 100%; overflow: hidden; - line-height: 8.8rem; + line-height: $modalHeaderHeight; } } @@ -96,11 +96,11 @@ $desktop-width: 47.2rem; @media #{$desktop-up} { .root { - width: $desktop-width; + width: $modalDesktopWidth; left: 50%; box-shadow: $box-shadow-1; border-radius: $border-radius-20; - margin-left: calc($desktop-width / -2); + margin-left: calc($modalDesktopWidth / -2); } .buttonClose { @@ -110,7 +110,7 @@ $desktop-width: 47.2rem; } .body { - padding: 0 5.6rem 5.6rem; + padding: $modalPadding; &.hasImage { border-radius: 0 0 $border-radius-20 $border-radius-20; diff --git a/client/src/constants/domElementsIds.ts b/client/src/constants/domElementsIds.ts index 06b3d69383..4f4aa47fd4 100644 --- a/client/src/constants/domElementsIds.ts +++ b/client/src/constants/domElementsIds.ts @@ -1,6 +1,6 @@ export const METRICS_EPOCH_ID = 'MetricsEpoch'; export const METRICS_GENERAL_ID = 'MetricsGeneral'; -export const METRICS_PERSONAL_ID = 'MetricsPersonal'; export const LAYOUT_BODY_ID = 'LayoutBody'; +export const RAINBOW_KIT_PROVIDER = 'RainbowKitProvider'; export const LAYOUT_NAVBAR_ID = 'LayoutNavbar'; export const EPOCH_RESULTS_BAR_ID = 'EpochResultsBar'; diff --git a/client/src/index.tsx b/client/src/index.tsx index 193832aee4..5b9c5309c8 100644 --- a/client/src/index.tsx +++ b/client/src/index.tsx @@ -1,7 +1,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies import 'regenerator-runtime/runtime'; import './wallect-connect-polyfill'; -import { RainbowKitProvider } from '@rainbow-me/rainbowkit'; +import { RainbowKitProvider, lightTheme } from '@rainbow-me/rainbowkit'; import { QueryClientProvider } from '@tanstack/react-query'; import React from 'react'; import ReactDOM from 'react-dom/client'; @@ -14,6 +14,7 @@ import env, { envViteKeys, envsAllowedToBeEmpty } from 'env'; import clientReactQuery from './api/clients/client-react-query'; import { wagmiConfig } from './api/clients/client-wagmi'; import App from './App'; +import { RAINBOW_KIT_PROVIDER } from './constants/domElementsIds'; import '@rainbow-me/rainbowkit/styles.css'; @@ -58,7 +59,17 @@ if (window.location.hash) { ReactDOM.createRoot(root).render( - + diff --git a/client/src/locales/en/translation.json b/client/src/locales/en/translation.json index eaa9266172..ff8b38e9a5 100644 --- a/client/src/locales/en/translation.json +++ b/client/src/locales/en/translation.json @@ -298,7 +298,8 @@ "browserWallet": "Browser wallet", "connecting": "Connecting ...", "walletConnect": "WalletConnect", - "ledgerConnect": "Ledger" + "ledgerConnect": "Ledger", + "walletSelectHeader": "Choose a browser wallet" }, "glmLock": { "lock": "Lock", diff --git a/client/src/styles/utils/_colors.scss b/client/src/styles/utils/_colors.scss index 26ec211d98..10a42dcc8b 100644 --- a/client/src/styles/utils/_colors.scss +++ b/client/src/styles/utils/_colors.scss @@ -46,5 +46,6 @@ $color-octant-orange9: #fff5f4; $color-octant-orange10: #ffeae6; $color-octant-orange11: #fffafa; $color-octant-purple: #685b8a; +$color-octant-purple2: #271558; // Used in some SVGs. $color-octant-purple2: #8777af; $color-octant-purple3-20: rgba(219, 220, 252, 0.2); diff --git a/client/src/styles/utils/_variables.scss b/client/src/styles/utils/_variables.scss index 4c0824fbc6..4427205287 100644 --- a/client/src/styles/utils/_variables.scss +++ b/client/src/styles/utils/_variables.scss @@ -35,6 +35,11 @@ $modalVariantSmallPaddingMobile: 2.4rem; $modalVariantSmallPaddingDesktop: 5.6rem; $projectItemPadding: 2.4rem; $historyHorizontalPadding: 1.6rem; + +$modalDesktopWidth: 47.2rem; +$modalPadding: 0 5.6rem 5.6rem; +$modalHeaderHeight: 8.8rem; +$modalHeaderFontSize: $font-size-20; $projectListItemHorizontalPaddingLargeDesktop: 24.6rem; $projectListItemHorizontalPaddingDesktopUp: 17.8rem; $projectListItemHorizontalPaddingTabletUp: 13.2rem; diff --git a/client/yarn.lock b/client/yarn.lock index 5ce74d321a..cfc2dae942 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -2657,6 +2657,13 @@ dependencies: "@noble/hashes" "1.3.3" +"@noble/curves@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" + integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== + dependencies: + "@noble/hashes" "1.4.0" + "@noble/curves@1.6.0", "@noble/curves@^1.4.0", "@noble/curves@^1.6.0", "@noble/curves@~1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b" @@ -2664,6 +2671,13 @@ dependencies: "@noble/hashes" "1.5.0" +"@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + "@noble/hashes@1.3.2", "@noble/hashes@^1.3.1", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" @@ -2674,6 +2688,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== +"@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.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@^1.5.0", "@noble/hashes@~1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" @@ -2836,10 +2855,10 @@ dependencies: playwright "1.41.1" -"@rainbow-me/rainbowkit@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit/-/rainbowkit-2.1.1.tgz#5d8ae5a015fef1f62fb501e271790dfa753c2c13" - integrity sha512-iOn4m1CTv+ezzYpiA4QU+v6JFB94NY6h5ohpQi3Qt/qZXdHzp3NAKUrESQ10kFx2Xc4px80PKdggeES0UPZw0A== +"@rainbow-me/rainbowkit@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit/-/rainbowkit-2.1.5.tgz#913169f9fb4518cff8fe2856ea2333e754b8bb00" + integrity sha512-Kdef0zu0bUlIOlbyyi3ukmQl7k8s3w0jTcWZxYTicZ/N4L35yX0vEzYgiG4u6OSXlbAQaC7VrkPKugPbSohnLQ== dependencies: "@vanilla-extract/css" "1.14.0" "@vanilla-extract/dynamic" "2.1.0" @@ -2970,6 +2989,11 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f" integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q== +"@scure/base@~1.1.6": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.7.tgz#fe973311a5c6267846aa131bc72e96c5d40d2b30" + integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== + "@scure/base@~1.1.7", "@scure/base@~1.1.8": version "1.1.9" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" @@ -2993,6 +3017,15 @@ "@noble/hashes" "~1.3.2" "@scure/base" "~1.1.4" +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@scure/bip32@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.5.0.tgz#dd4a2e1b8a9da60e012e776d954c4186db6328e6" @@ -3018,6 +3051,14 @@ "@noble/hashes" "~1.3.2" "@scure/base" "~1.1.4" +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@scure/bip39@1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.4.0.tgz#664d4f851564e2e1d4bffa0339f9546ea55960a6" @@ -4607,10 +4648,10 @@ abitype@0.9.8: resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c" integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ== -abitype@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" - integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== +abitype@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" + integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== abitype@1.0.6: version "1.0.6" @@ -7017,9 +7058,9 @@ elliptic@6.5.4: minimalistic-crypto-utils "^1.0.1" elliptic@^6.5.7: - version "6.6.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210" - integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA== + version "6.5.7" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" + integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -15195,19 +15236,20 @@ viem@^2.1.1: webauthn-p256 "0.0.10" ws "8.18.0" -viem@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.12.1.tgz#895b73501582376b955f00e5ecafcf51d9d89ffb" - integrity sha512-71gxcGCXdNXQuBhpqXblVRH1F3hP/wONCptVOCW4r6VrCEXL/9vfNyCdQKtK/0WGyXm04Zs9Jf/AOAxKqf6FmQ== +viem@^2.21.1: + version "2.21.1" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.1.tgz#7d07e4302297d1b44b4c97b8fece3b6ebb73b1ef" + integrity sha512-nlIc2LLS6aqkngULS9UJ2Sg3nHKAgF9bbpDUwjUoAUBijd69mrCWPBXQ8jmbzcx12uZUfd9Nc//CHgSVZiMwyg== dependencies: "@adraffy/ens-normalize" "1.10.0" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@scure/bip32" "1.3.2" - "@scure/bip39" "1.2.1" - abitype "1.0.0" + "@noble/curves" "1.4.0" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + abitype "1.0.5" isows "1.0.4" - ws "8.13.0" + webauthn-p256 "0.0.5" + ws "8.17.1" vite-plugin-compression@^0.5.1: version "0.5.1" @@ -15315,6 +15357,14 @@ webauthn-p256@0.0.10: "@noble/curves" "^1.4.0" "@noble/hashes" "^1.4.0" +webauthn-p256@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.5.tgz#0baebd2ba8a414b21cc09c0d40f9dd0be96a06bd" + integrity sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg== + dependencies: + "@noble/curves" "^1.4.0" + "@noble/hashes" "^1.4.0" + webcrypto-core@^1.7.7: version "1.7.7" resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.7.tgz#06f24b3498463e570fed64d7cab149e5437b162c" @@ -15586,6 +15636,11 @@ ws@8.14.0, ws@^8.11.0, ws@^8.12.0, ws@^8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.0.tgz#6c5792c5316dc9266ba8e780433fc45e6680aecd" integrity sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg== +ws@8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + ws@8.18.0: version "8.18.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"