From 571291cd02bb0ee241e91111212d2f8d665470a8 Mon Sep 17 00:00:00 2001 From: Theophile Sandoz Date: Thu, 22 Feb 2024 14:10:24 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=A1=20Add=20support=20for=20WalletConn?= =?UTF-8?q?ect=20(#4759)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Do not rely on `injectweb3-connect` for the "supportedWallets" list * Remove Polkadot.js from the recommended wallets See https://discord.com/channels/811216481340751934/943152333427191859/1192881817653620786 * Replace `Wallet.signer` by `Wallet.getSigner(address)` * Expose `genesisHash` and `runtimeVersion` on the `ProxyApi` * Install WalletConnect dependencies * Integrate WalletConnect * Fix types in stories and tests * Fix wallet connection * Fix transactions * Fix with the proxy api * Add the WalletConnect logo * Fix legacy tests * Persist session * Remove "getSigner" method * Implement "signRaw" with wallet connect * Handle disconnections * Properly disconnect accounts * Fix wallet connection * Fix interaction tests * Name the accounts * Fix the wallet reject app case * Load wallet connect in parallel to the RPC node * Add some metadata * Fix wallet disconnection * Address change requests --- packages/ui/.env.example | 3 + packages/ui/package.json | 3 + .../ui/src/accounts/model/walletConnect.ts | 188 ++ packages/ui/src/accounts/model/wallets.ts | 27 + .../accounts/providers/accounts/context.tsx | 1 + .../accounts/providers/accounts/provider.tsx | 152 +- .../accounts/providers/accounts/useWallets.ts | 122 ++ packages/ui/src/app/App.stories.tsx | 8 +- .../src/app/assets/images/logos/Pioneer.png | Bin 0 -> 21745 bytes .../app/assets/images/logos/WalletConnect.svg | 15 + .../src/app/components/ExtensionWarning.tsx | 19 - .../BountyCancelModal.stories.tsx | 3 +- .../SubmitJudgementModal.stories.tsx | 3 +- .../Stepper/VerticalStaticStepper.tsx | 6 +- .../OnBoardingModal.stories.tsx | 3 +- .../OnBoardingModal/OnBoardingPlugin.tsx | 78 +- .../components/ConnectWalletItem.tsx | 7 +- .../components/NoAccountStep.tsx | 5 +- .../components/SelectAccountStep.tsx | 6 +- .../common/providers/onboarding/provider.tsx | 14 +- .../RevealVote/PickVoteModal.stories.tsx | 4 +- .../CurrentMember/CurrentMember.tsx | 5 +- .../DisconnectWalletModal.tsx | 7 +- .../ui/src/memberships/model/backendAuth.ts | 2 +- packages/ui/src/mocks/providers/accounts.tsx | 5 + packages/ui/src/mocks/providers/api.tsx | 1 + packages/ui/src/proxyApi/client/ProxyApi.ts | 10 +- packages/ui/src/proxyApi/types.ts | 5 +- packages/ui/src/proxyApi/worker/index.ts | 7 +- packages/ui/test/_mocks/transactions.ts | 1 + .../test/common/hooks/useOnBoarding.test.tsx | 6 +- .../components/CurrentMember.test.tsx | 15 +- packages/ui/test/setup.ts | 1 + yarn.lock | 1554 ++++++++++++++++- 34 files changed, 2060 insertions(+), 226 deletions(-) create mode 100644 packages/ui/src/accounts/model/walletConnect.ts create mode 100644 packages/ui/src/accounts/model/wallets.ts create mode 100644 packages/ui/src/accounts/providers/accounts/useWallets.ts create mode 100644 packages/ui/src/app/assets/images/logos/Pioneer.png create mode 100644 packages/ui/src/app/assets/images/logos/WalletConnect.svg diff --git a/packages/ui/.env.example b/packages/ui/.env.example index 4259dbcd7f..9820d7481e 100644 --- a/packages/ui/.env.example +++ b/packages/ui/.env.example @@ -18,6 +18,9 @@ REACT_APP_CAPTCHA_SITE_KEY=10000000-ffff-ffff-ffff-000000000001 # Member avatar upload REACT_APP_AVATAR_UPLOAD_URL=https://atlas-services.joystream.org/avatars +# WalletConnect project id +REACT_APP_WALLET_CONNECT_PROJECT_ID="2ea3f3ghubh32b8ie2f2" + # Image reporting ## Manual blacklist: diff --git a/packages/ui/package.json b/packages/ui/package.json index 3302d89169..9e4608baca 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -50,6 +50,8 @@ "@types/react-router-dom": "^5.3.1", "@types/react-transition-group": "^4.4.3", "@types/styled-components": "^5.1.15", + "@walletconnect/modal": "^2.6.2", + "@walletconnect/universal-provider": "^2.11.0", "@xstate/react": "^1.6.1", "chart.js": "^4.4.1", "copy-webpack-plugin": "^9.0.1", @@ -120,6 +122,7 @@ "@types/yargs": "^17.0.3", "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^6.11.0", + "@walletconnect/types": "^2.11.0", "babel-jest": "^27.2.5", "babel-loader": "^8.2.2", "babel-plugin-import-graphql": "^2.8.1", diff --git a/packages/ui/src/accounts/model/walletConnect.ts b/packages/ui/src/accounts/model/walletConnect.ts new file mode 100644 index 0000000000..8b3d874181 --- /dev/null +++ b/packages/ui/src/accounts/model/walletConnect.ts @@ -0,0 +1,188 @@ +import { Signer } from '@polkadot/api/types' +import { WalletConnectModal } from '@walletconnect/modal' +import { SessionTypes } from '@walletconnect/types' +import Provider from '@walletconnect/universal-provider' +import { BaseDotsamaWallet, MetadataDef, SubscriptionFn, WalletAccount } from 'injectweb3-connect' +import { Observable } from 'rxjs' + +import PioneerLogo from '@/app/assets/images/logos/Pioneer.png' +import WalletConnectLogo from '@/app/assets/images/logos/WalletConnect.svg' + +export class WalletConnect extends BaseDotsamaWallet { + public static source = 'WalletConnect' + + protected _projectId: string + protected _genesisHash: Promise + protected _chainCAIP: string | undefined + protected _provider: Provider | undefined + protected _accounts: WalletAccount[] | undefined + + protected _disconnection$: Observable + protected _disconnect: () => void + + constructor( + projectId: string, + genesisHash: Promise, + disconnection$: Observable, + disconnect: () => void + ) { + super({ + extensionName: 'WalletConnect', + title: 'WalletConnect', + logo: { src: WalletConnectLogo, alt: 'WalletConnect Logo' }, + }) + + this._projectId = projectId + this._genesisHash = genesisHash + this._disconnection$ = disconnection$ + this._disconnect = disconnect + } + + public enable = async (): Promise => { + this._provider = + this._provider ?? + (await Provider.init({ + projectId: this._projectId, + relayUrl: 'wss://relay.walletconnect.com', + metadata: { + name: 'Pioneer', + description: 'Joystream Governance App', + icons: [PioneerLogo], + url: window.location.origin + window.location.pathname, + }, + })) + + this._chainCAIP = await this._genesisHash.then((hash) => `polkadot:${hash.slice(2, 34)}`) + + this._provider.session = await this._getSession(this._provider, this._chainCAIP as string) + + if (!this._provider.session) { + throw Error('The connection failed or was cancelled.') + } + + this._handleDisconnection(this._provider) + + const { session } = this._provider + this._accounts = Object.values(session.namespaces) + .flatMap((namespace) => namespace.accounts) + .map((account, index): WalletAccount => { + const peerWalletName = session.peer.metadata.name + return { + name: `${peerWalletName} account ${index + 1}`, + address: account.split(':')[2], + source: this.extensionName, + } + }) + } + + protected async _getSession(provider: Provider, chainCAIP: string): Promise { + if (provider.session) return provider.session + + const lastSession = provider.client.session.getAll().at(-1) + if (lastSession) return lastSession + + const requiredNamespaces = { + polkadot: { + methods: ['polkadot_signTransaction', 'polkadot_signMessage'], + chains: [chainCAIP], + events: ['chainChanged", "accountsChanged'], + }, + } + + const { uri, approval } = await provider.client.connect({ requiredNamespaces }) + + const wcModal = new WalletConnectModal({ projectId: this._projectId }) + + if (!uri) return + + // if there is a URI from the client connect step open the modal + wcModal.openModal({ uri }) + + const modalClosedP = new Promise((resolve) => { + const unsubscribe = wcModal.subscribeModal((state) => { + if (state.open) return + + unsubscribe() + resolve(undefined) + }) + }) + + // await session approval from the wallet app or the modal getting closed + return Promise.race([approval(), modalClosedP]).finally(wcModal.closeModal) + } + + protected _handleDisconnection(provider: Provider): void { + const appDisconnectHandler = async () => { + if (!this._provider?.session) return + + await provider.client.disconnect({ + topic: this._provider.session.topic, + reason: { code: -1, message: 'Disconnected by client!' }, + }) + + reset() + } + const disconnectSubscription = this._disconnection$.subscribe(appDisconnectHandler) + + const walletDisconnectHandler = () => { + reset() + this._disconnect() + } + provider.client.once('session_delete', walletDisconnectHandler) + provider.client.once('session_expire', walletDisconnectHandler) + + const reset = () => { + if (!this._provider?.session) return + + disconnectSubscription.unsubscribe() + this._provider?.client.off('session_delete', walletDisconnectHandler) + this._provider?.client.off('session_expire', walletDisconnectHandler) + this._provider.session = undefined + } + } + + public getAccounts = async (): Promise => { + return this._accounts ?? [] + } + + public subscribeAccounts: (callback: SubscriptionFn) => Promise<() => void> = (callback) => { + callback(this._accounts ?? []) + return Promise.resolve(() => undefined) + } + + public updateMetadata: (chainInfo: MetadataDef) => Promise = () => Promise.resolve(true) + + public get signer(): Signer { + return { + signPayload: (transactionPayload) => { + if (!this._provider?.session || !this._chainCAIP) { + throw Error('The WalletConnect was accessed before it was enabled.') + } + + return this._provider.client.request({ + chainId: this._chainCAIP, + topic: this._provider.session.topic, + request: { + method: 'polkadot_signTransaction', + params: { address: transactionPayload.address, transactionPayload }, + }, + }) + }, + + signRaw: (raw) => { + if (!this._provider?.session || !this._chainCAIP) { + throw Error('The WalletConnect was accessed before it was enabled.') + } + + return this._provider.client.request({ + chainId: this._chainCAIP, + topic: this._provider.session.topic, + request: { + method: 'polkadot_signMessage', + params: { address: raw.address, message: raw.data }, + }, + }) + }, + } + } +} diff --git a/packages/ui/src/accounts/model/wallets.ts b/packages/ui/src/accounts/model/wallets.ts new file mode 100644 index 0000000000..e96952b5c9 --- /dev/null +++ b/packages/ui/src/accounts/model/wallets.ts @@ -0,0 +1,27 @@ +import { BaseDotsamaWallet, PolkadotLogo, SubwalletLogo, TalismanLogo, Wallet } from 'injectweb3-connect' + +export const DefaultWalletIcon = PolkadotLogo + +export const RecommendedWallets: Wallet[] = [ + { + extensionName: 'talisman', + title: 'Talisman', + noExtensionMessage: 'You can use any Polkadot compatible wallet but we recommend using Talisman', + installUrl: 'https://talisman.xyz/download', + logo: { src: TalismanLogo, alt: 'Talisman Logo' }, + }, + { + extensionName: 'subwallet-js', + title: 'SubWallet', + noExtensionMessage: 'You can use any Polkadot compatible wallet but we recommend using Talisman', + installUrl: 'https://www.subwallet.app/download.html', + logo: { src: SubwalletLogo, alt: 'Subwallet Logo' }, + }, +].map((data) => new BaseDotsamaWallet(data)) + +export const RecommendedWalletsNames = RecommendedWallets.map((wallet) => wallet.extensionName) + +export const asWallet = (source: string): Wallet => + new BaseDotsamaWallet({ extensionName: source, logo: walletLogos.get(source) }) + +export const walletLogos = new Map([['polkadot-js', { src: DefaultWalletIcon, alt: 'Polkadotjs Logo' }]]) diff --git a/packages/ui/src/accounts/providers/accounts/context.tsx b/packages/ui/src/accounts/providers/accounts/context.tsx index 1c14aa1508..0988f560d1 100644 --- a/packages/ui/src/accounts/providers/accounts/context.tsx +++ b/packages/ui/src/accounts/providers/accounts/context.tsx @@ -6,4 +6,5 @@ export const AccountsContext = createContext({ isLoading: true, hasAccounts: false, allAccounts: [], + allWallets: [], }) diff --git a/packages/ui/src/accounts/providers/accounts/provider.tsx b/packages/ui/src/accounts/providers/accounts/provider.tsx index fed0426262..9544c0343a 100644 --- a/packages/ui/src/accounts/providers/accounts/provider.tsx +++ b/packages/ui/src/accounts/providers/accounts/provider.tsx @@ -1,28 +1,23 @@ import { InjectedAccountWithMeta } from '@polkadot/extension-inject/types' import { Keyring } from '@polkadot/ui-keyring' import { decodeAddress } from '@polkadot/util-crypto' -import { getWalletBySource, Wallet } from 'injectweb3-connect' -import React, { ReactNode, useEffect, useState } from 'react' -import { debounceTime, filter, skip } from 'rxjs/operators' +import { Wallet } from 'injectweb3-connect' +import React, { ReactNode, useEffect } from 'react' +import { debounceTime, filter, map, of } from 'rxjs' import { encodeAddress } from '@/accounts/model/encodeAddress' import { useKeyring } from '@/common/hooks/useKeyring' -import { useLocalStorage } from '@/common/hooks/useLocalStorage' import { useObservable } from '@/common/hooks/useObservable' import { Account } from '../../types' import { AccountsContext } from './context' +import { UseWallets, useWallets } from './useWallets' -type ExtensionError = 'NO_EXTENSION' | 'APP_REJECTED' - -export interface UseAccounts { +export type UseAccounts = UseWallets & { allAccounts: Account[] hasAccounts: boolean isLoading: boolean - error?: ExtensionError - wallet?: Wallet - setWallet?: (wallet: Wallet | undefined) => void } interface Props { @@ -37,9 +32,7 @@ function isKeyringLoaded(keyring: Keyring) { } } -const loadKeysFromExtension = async (keyring: Keyring, wallet: Wallet) => { - await wallet.enable('Pioneer') - +const loadKeysFromWallet = async (keyring: Keyring, wallet: Wallet) => { const injectedAccounts = await wallet.getAccounts() if (!isKeyringLoaded(keyring)) { @@ -63,119 +56,44 @@ const loadKeysFromExtension = async (keyring: Keyring, wallet: Wallet) => { }) } -// Extensions is not always ready on application load, hence the check -const onExtensionLoaded = - (onSuccess: (foundWallets: string[]) => void, onFail: () => void, recentWallet?: string) => () => { - const interval = 20 - const timeout = 1000 - let timeElapsed = 0 - - const intervalId = setInterval(() => { - const extensionsKeys = Object.keys((window as any)?.injectedWeb3 ?? {}) - if (extensionsKeys.length) { - if (!recentWallet) { - clearInterval(intervalId) - onSuccess(extensionsKeys) - } else if (extensionsKeys.includes(recentWallet)) { - // some wallets load slower which will cause error when trying to preload them hence the check - clearInterval(intervalId) - onSuccess(extensionsKeys) - } else if (timeElapsed >= timeout) { - // if wallet in storage was disabled we don't want to wait for it too long - clearInterval(intervalId) - onSuccess(extensionsKeys) - } - timeElapsed += interval - } else { - timeElapsed += interval - if (timeElapsed >= timeout) { - clearInterval(intervalId) - onFail() - } - } - }, interval) - - return () => clearInterval(intervalId) - } - export const AccountsContextProvider = (props: Props) => { const keyring = useKeyring() - const [isExtensionLoaded, setIsExtensionLoaded] = useState(false) - const [selectedWallet, setSelectedWallet] = useState() - const [extensionError, setExtensionError] = useState() - const [recentWallet, setRecentWallet] = useLocalStorage('recentWallet') - - useEffect( - onExtensionLoaded( - (foundWallets) => { - setIsExtensionLoaded(true) - if (recentWallet && foundWallets.includes(recentWallet)) { - const possibleWallet = getWalletBySource(recentWallet) - setSelectedWallet(possibleWallet) - } - }, - () => setExtensionError('NO_EXTENSION'), - recentWallet - ), - [] - ) + + const { allWallets, wallet, setWallet, walletState } = useWallets() useEffect(() => { - if (!isExtensionLoaded || !selectedWallet) { - return - } - - setExtensionError(undefined) - loadKeysFromExtension(keyring, selectedWallet) - .then(() => { - setRecentWallet(selectedWallet.extensionName) - }) - .catch((error: Error) => { - setSelectedWallet(undefined) - - if (error?.message.includes('not allowed to interact') || error?.message.includes('Rejected')) { - setExtensionError('APP_REJECTED') - } - }) - }, [isExtensionLoaded, selectedWallet]) - - const accounts = useObservable( - () => - keyring.accounts.subject.asObservable().pipe( - debounceTime(20), - filter((accounts) => !!accounts), - skip(1) - ), - [keyring] - ) - const allAccounts: Account[] = [] - - if (accounts && selectedWallet) { - allAccounts.push( - ...Object.values(accounts).map((account) => { - const publicKey = decodeAddress(account.json.address) - return { - address: encodeAddress(publicKey), - name: account.json.meta.name, - source: account.json.meta.source as string, - } - }) + if (wallet) loadKeysFromWallet(keyring, wallet) + }, [keyring, wallet]) + + const allAccounts: Account[] | undefined = useObservable(() => { + if (!wallet) return of(undefined) + + return keyring.accounts.subject.asObservable().pipe( + debounceTime(200), + filter((accounts) => !!accounts), + map((accounts) => + Object.values(accounts).map((account) => { + const publicKey = decodeAddress(account.json.address) + return { + address: encodeAddress(publicKey), + name: account.json.meta.name, + source: account.json.meta.source as string, + } + }) + ) ) - } + }, [keyring, wallet]) - const hasAccounts = allAccounts.length !== 0 + const hasAccounts = !!allAccounts?.length const value: UseAccounts = { - allAccounts, + allAccounts: allAccounts ?? [], hasAccounts, - isLoading: !isExtensionLoaded || !accounts, - setWallet: setSelectedWallet, - wallet: selectedWallet, - error: extensionError, - } - - if (extensionError || !selectedWallet?.extension) { - value.isLoading = false + isLoading: walletState === 'READY' && !allAccounts, + wallet, + setWallet, + allWallets, + walletState, } return {props.children} diff --git a/packages/ui/src/accounts/providers/accounts/useWallets.ts b/packages/ui/src/accounts/providers/accounts/useWallets.ts new file mode 100644 index 0000000000..b03edec394 --- /dev/null +++ b/packages/ui/src/accounts/providers/accounts/useWallets.ts @@ -0,0 +1,122 @@ +import { InjectedWindow, Wallet } from 'injectweb3-connect' +import { groupBy } from 'lodash' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { Subject, firstValueFrom } from 'rxjs' + +import { WalletConnect } from '@/accounts/model/walletConnect' +import { RecommendedWallets, RecommendedWalletsNames, asWallet } from '@/accounts/model/wallets' +import { useApi } from '@/api/hooks/useApi' +import { useLocalStorage } from '@/common/hooks/useLocalStorage' + +type WalletState = undefined | 'ENABLING' | 'READY' | 'APP_REJECTED' + +export type UseWallets = { + allWallets: Wallet[] + wallet?: Wallet + setWallet?: (wallet: Wallet | undefined) => void + walletState?: WalletState +} + +const genesisHash$ = new Subject() +const WalletDisconnection$ = new Subject() + +export const useWallets = (): UseWallets => { + const [installedWalletsNames, setInstalledWalletsNames] = useState([]) + + useEffect(() => { + const interval = 100 + const timeout = 2000 + const start = Date.now() + + const intervalId = setInterval(() => { + const extensionsKeys = Object.keys((window as Window & InjectedWindow)?.injectedWeb3 ?? {}) + if (extensionsKeys.length !== installedWalletsNames.length) { + setInstalledWalletsNames(extensionsKeys) + } + + const timeElapsed = Date.now() - start + if (timeElapsed > timeout) { + clearTimeout(intervalId) + } + }, interval) + + return () => clearInterval(intervalId) + }, []) + + const walletExtensions = useMemo(() => { + const unknown = installedWalletsNames.filter((name) => !RecommendedWalletsNames.includes(name)).map(asWallet) + const { installed = [], recommended = [] } = groupBy(RecommendedWallets, (wallet) => + installedWalletsNames.includes(wallet.extensionName) ? 'installed' : 'recommended' + ) + return { installed, recommended, unknown } + }, [installedWalletsNames]) + + const { api } = useApi() + useEffect(() => { + if (api) genesisHash$.next(api.genesisHash.toHex()) + }, [api?.isConnected]) + + const walletConnect = useMemo(() => { + const wcProjectId: string | undefined = process.env.REACT_APP_WALLET_CONNECT_PROJECT_ID + if (!wcProjectId) return + + const genesisHash = firstValueFrom(genesisHash$) + return new WalletConnect(wcProjectId, genesisHash, WalletDisconnection$, () => setWallet(undefined)) + }, [api?.isConnected]) + + const allWallets = useMemo( + () => [ + ...walletExtensions.installed, + ...walletExtensions.unknown, + ...(walletConnect ? [walletConnect] : []), + ...walletExtensions.recommended, + ], + [walletExtensions, walletConnect] + ) + + const { wallet, setWallet, walletState } = useSelectedWallet(allWallets) + + return { allWallets, wallet, setWallet, walletState } +} + +const useSelectedWallet = (allWallets: Wallet[]) => { + const [wallet, _setWallet] = useState() + const [recentWallet, setRecentWallet] = useLocalStorage('recentWallet') + const [walletState, setWalletState] = useState() + + const setWallet = useCallback(async (wallet: Wallet | undefined): Promise => { + if (!wallet) { + WalletDisconnection$.next() + _setWallet(undefined) + setWalletState(undefined) + setRecentWallet(undefined) + return + } + + setWalletState('ENABLING') + try { + await wallet.enable('Pioneer') + _setWallet(wallet) + setWalletState('READY') + setRecentWallet(wallet.extensionName) + return + } catch (error) { + const message: string = error?.message?.toLowerCase() + if (message.includes('not allowed to interact') || message.includes('rejected')) { + return setWalletState('APP_REJECTED') + } + setWalletState(undefined) + } + }, []) + + const initialRecentWallet = useRef(recentWallet) + const cachedWallet = initialRecentWallet.current + ? allWallets.find((wallet) => wallet.extensionName === initialRecentWallet.current) + : undefined + + useEffect(() => { + if (cachedWallet) setWallet(cachedWallet) + }, [cachedWallet?.extensionName]) + + return { wallet, setWallet, walletState } +} diff --git a/packages/ui/src/app/App.stories.tsx b/packages/ui/src/app/App.stories.tsx index ce62a5d97a..feb02e4d28 100644 --- a/packages/ui/src/app/App.stories.tsx +++ b/packages/ui/src/app/App.stories.tsx @@ -334,11 +334,11 @@ export const ConnectWallet: Story = { const modal = withinModal(canvasElement) expectActiveStepToBe(modal, 'Connect wallet') - expect(modal.getByText('Select Wallet')) - const pluginButton = getButtonByText(modal, 'Install extension') + expect(modal.getByRole('heading', { name: 'Select Wallet' })) + const pluginButton = getButtonByText(modal, 'Select Wallet') expect(pluginButton).toBeDisabled() - await userEvent.click(modal.getByText('Polkadot.js')) - expect(pluginButton).toBeEnabled() + await userEvent.click(modal.getByText('Talisman')) + expect(await getButtonByText(modal, 'Install extension')).toBeEnabled() }, } diff --git a/packages/ui/src/app/assets/images/logos/Pioneer.png b/packages/ui/src/app/assets/images/logos/Pioneer.png new file mode 100644 index 0000000000000000000000000000000000000000..28d0e77f197da4b41c630bba042b9f9c02814d6d GIT binary patch literal 21745 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 Pg + + + + + + + + + + + diff --git a/packages/ui/src/app/components/ExtensionWarning.tsx b/packages/ui/src/app/components/ExtensionWarning.tsx index 6e508b6736..117ab9ca90 100644 --- a/packages/ui/src/app/components/ExtensionWarning.tsx +++ b/packages/ui/src/app/components/ExtensionWarning.tsx @@ -1,6 +1,5 @@ import React, { useEffect, useState } from 'react' -import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' import { SideNotification } from '@/common/components/page/SideNotification' import { useOnBoarding } from '@/common/hooks/useOnBoarding' import { useMyMemberships } from '@/memberships/hooks/useMyMemberships' @@ -13,17 +12,10 @@ const notificationTimeouts: Record = { } export function ExtensionNotification() { - const { error } = useMyAccounts() const { members } = useMyMemberships() const { status } = useOnBoarding() const [showNotification, setShowNotification] = useState(undefined) - useEffect(() => { - if (error === 'NO_EXTENSION') { - setShowNotification('ERROR') - } - }, [error]) - useEffect(() => { if (status === 'finished') { setShowNotification('OLD_USER') @@ -38,17 +30,6 @@ export function ExtensionNotification() { return () => clearTimeout(timeout) }, [showNotification]) - if (showNotification === 'ERROR') { - return ( - setShowNotification(undefined)} - title="Extension unavailable" - message="You need a Polkadot ecosystem extension to use this site." - isError - /> - ) - } - if (showNotification === 'OLD_USER') { return ( } export const VerticalStaticStepper = ({ steps }: VerticalStaticStepperProps) => { + const { allWallets } = useMyAccounts() + return ( {steps.map((item, index) => ( @@ -29,7 +31,7 @@ export const VerticalStaticStepper = ({ steps }: VerticalStaticStepperProps) => {item.subtitle} {item.walletIcon ?? ( - {getAllWallets().map((wallet) => ( + {allWallets.map((wallet) => ( ))} diff --git a/packages/ui/src/common/modals/OnBoardingModal/OnBoardingModal.stories.tsx b/packages/ui/src/common/modals/OnBoardingModal/OnBoardingModal.stories.tsx index 6dee95c84c..31bcfa156b 100644 --- a/packages/ui/src/common/modals/OnBoardingModal/OnBoardingModal.stories.tsx +++ b/packages/ui/src/common/modals/OnBoardingModal/OnBoardingModal.stories.tsx @@ -34,7 +34,8 @@ const useMyAccounts: UseAccounts = { { name: 'Alice Account', address: 'j4W7rVcUCxi2crhhjRq46fNDRbVHTjJrz6bKxZwehEMQxZeSf' }, { name: 'Bob Account', address: '5DWS57CtERHpNehXCPcNoHGKutQYGrwvaEF5zXb26Fz9rcQp' }, ], - error: undefined, + walletState: 'READY', + allWallets: [], } const useMyBalances: AddressToBalanceMap = { diff --git a/packages/ui/src/common/modals/OnBoardingModal/OnBoardingPlugin.tsx b/packages/ui/src/common/modals/OnBoardingModal/OnBoardingPlugin.tsx index baf573bca0..87af7aaf4d 100644 --- a/packages/ui/src/common/modals/OnBoardingModal/OnBoardingPlugin.tsx +++ b/packages/ui/src/common/modals/OnBoardingModal/OnBoardingPlugin.tsx @@ -1,9 +1,10 @@ -import { getAllWallets, Wallet } from 'injectweb3-connect' -import React, { useCallback, useEffect, useState } from 'react' +import { Wallet } from 'injectweb3-connect' +import React, { useState } from 'react' import styled from 'styled-components' import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' import { ButtonPrimary } from '@/common/components/buttons' +import { LinkPrimary } from '@/common/components/buttons/Links' import { LinkSymbol } from '@/common/components/icons/symbols' import { List, ListItem } from '@/common/components/List' import { ScrolledModalBody } from '@/common/components/Modal' @@ -14,30 +15,19 @@ import { OnBoardingTextFooter } from '@/common/modals/OnBoardingModal/OnBoarding export const OnBoardingPlugin = () => { const [selectedWallet, setSelectedWallet] = useState() - const { setWallet, error } = useMyAccounts() - const handleClick = useCallback(() => { - if (!selectedWallet?.installed && selectedWallet?.installUrl) { - window.open(selectedWallet.installUrl, '_blank') - } else if (selectedWallet?.installed) { - setWallet?.(selectedWallet) - } - }, [selectedWallet]) - - useEffect(() => { - if (error === 'APP_REJECTED') { - setSelectedWallet(undefined) - } - }, [error]) + const { allWallets, setWallet, walletState } = useMyAccounts() return ( <> - Select Wallet + + Select Wallet + Select which wallet you want to use to connect with. - {getAllWallets().map((wallet) => ( + {allWallets.map((wallet) => ( { - {error === 'APP_REJECTED' && ( + {walletState === 'APP_REJECTED' && ( Extension is blocking Pioneer from access @@ -60,24 +50,41 @@ export const OnBoardingPlugin = () => { )} + + + ) +} + +type WalletSelectionFooterProps = { + selectedWallet: Wallet | undefined + setWallet?: (wallet: Wallet | undefined) => void +} + +const WalletSelectionFooter = ({ selectedWallet, setWallet }: WalletSelectionFooterProps) => { + const isInstalledWallet = selectedWallet?.installed + const recommendedWalletUrl = !isInstalledWallet && selectedWallet?.installUrl + + if (recommendedWalletUrl) { + return ( - - {selectedWallet?.installed ? ( - 'Select Wallet' - ) : ( - <> - - Install extension - - )} - - + + Install extension + } /> - + ) + } + + return ( + setWallet?.(selectedWallet)} disabled={!selectedWallet}> + Select Wallet + + } + /> ) } @@ -98,7 +105,14 @@ const Wrapper = styled.div` } ` +const StyledLink = styled(LinkPrimary)` + margin-left: auto; + path { + fill: ${Colors.White} !important; + } +` const StyledButton = styled(ButtonPrimary)` + margin-left: auto; path { fill: ${Colors.White} !important; } diff --git a/packages/ui/src/common/modals/OnBoardingModal/components/ConnectWalletItem.tsx b/packages/ui/src/common/modals/OnBoardingModal/components/ConnectWalletItem.tsx index 38a58edb23..e1386f1db5 100644 --- a/packages/ui/src/common/modals/OnBoardingModal/components/ConnectWalletItem.tsx +++ b/packages/ui/src/common/modals/OnBoardingModal/components/ConnectWalletItem.tsx @@ -1,7 +1,8 @@ -import { getWalletBySource, Wallet } from 'injectweb3-connect' +import { Wallet } from 'injectweb3-connect' import React from 'react' import styled from 'styled-components' +import { DefaultWalletIcon } from '@/accounts/model/wallets' import { CheckboxIcon } from '@/common/components/icons' import { RowGapBlock } from '@/common/components/page/PageContent' import { TextBig, TextMedium } from '@/common/components/typography' @@ -14,13 +15,11 @@ interface ConnectWalletItemProps { onClick: () => void } -const defaultIconSrc = getWalletBySource('polkadot-js')?.logo.src - export const ConnectWalletItem = ({ wallet, selected, onClick }: ConnectWalletItemProps) => { return ( - {wallet.logo.alt + {wallet.logo.alt {wallet.title} diff --git a/packages/ui/src/common/modals/OnBoardingModal/components/NoAccountStep.tsx b/packages/ui/src/common/modals/OnBoardingModal/components/NoAccountStep.tsx index b04442f6ef..7d46fd20a9 100644 --- a/packages/ui/src/common/modals/OnBoardingModal/components/NoAccountStep.tsx +++ b/packages/ui/src/common/modals/OnBoardingModal/components/NoAccountStep.tsx @@ -9,10 +9,7 @@ import { HorizontalStaticStepper } from '@/common/components/Stepper/HorizontalS import { TextExtraHuge } from '@/common/components/typography' import { OnBoardingTextFooter } from '@/common/modals/OnBoardingModal' -const steps = [ - 'Open the extension with the icon in your browser bar', - 'Create an account according to the displayed instructions', -] +const steps = ['Connect Pioneer to the selected wallet', 'Create an account according to the displayed instructions'] export const NoAccountStep = () => { const { setWallet } = useMyAccounts() diff --git a/packages/ui/src/common/modals/OnBoardingModal/components/SelectAccountStep.tsx b/packages/ui/src/common/modals/OnBoardingModal/components/SelectAccountStep.tsx index d147c081aa..7f9225e900 100644 --- a/packages/ui/src/common/modals/OnBoardingModal/components/SelectAccountStep.tsx +++ b/packages/ui/src/common/modals/OnBoardingModal/components/SelectAccountStep.tsx @@ -1,10 +1,10 @@ import { BN_ZERO } from '@polkadot/util' -import { getWalletBySource } from 'injectweb3-connect' import React, { useState } from 'react' import styled from 'styled-components' import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' import { useMyBalances } from '@/accounts/hooks/useMyBalances' +import { DefaultWalletIcon } from '@/accounts/model/wallets' import { ButtonPrimary } from '@/common/components/buttons' import { ConnectIcon } from '@/common/components/icons/ConnectIcon' import { JoystreamLogo } from '@/common/components/icons/JoystreamLogo' @@ -19,8 +19,6 @@ interface Props { onAccountSelect?: (account: string) => void } -const defaultIconSrc = getWalletBySource('polkadot-js')?.logo.src - export const SelectAccountStep = ({ onAccountSelect }: Props) => { const [selectedAccountAddress, setSelectedAccountAddress] = useState() const { allAccounts, setWallet, wallet } = useMyAccounts() @@ -35,7 +33,7 @@ export const SelectAccountStep = ({ onAccountSelect }: Props) => { - + diff --git a/packages/ui/src/common/providers/onboarding/provider.tsx b/packages/ui/src/common/providers/onboarding/provider.tsx index a627932dd7..380f24c7f2 100644 --- a/packages/ui/src/common/providers/onboarding/provider.tsx +++ b/packages/ui/src/common/providers/onboarding/provider.tsx @@ -21,12 +21,12 @@ const hasAccount = (allAccounts: Account[], address: string) => { } const useOnBoarding = (): UseOnBoarding => { - const { isLoading: isLoadingAccounts, error: accountsError, hasAccounts, allAccounts, wallet } = useMyAccounts() + const { isLoading: isLoadingAccounts, walletState, hasAccounts, allAccounts } = useMyAccounts() const { total: totalBalance } = useMyTotalBalances() const { isLoading: isLoadingMembers, hasMembers } = useMyMemberships() const [membershipAccount, setMembershipAccount] = useLocalStorage('onboarding-membership-account') - if (totalBalance.gtn(0) && wallet) { + if (totalBalance.gtn(0) || hasMembers) { return { isLoading: false, status: 'finished' } } @@ -34,17 +34,13 @@ const useOnBoarding = (): UseOnBoarding => { return { isLoading: true } } - if (accountsError === 'NO_EXTENSION' || !wallet) { + if (!walletState || walletState === 'APP_REJECTED') { return { isLoading: false, status: 'installPlugin' } } - if (!hasMembers && (!hasAccounts || !membershipAccount || !hasAccount(allAccounts, membershipAccount))) { + if (!hasAccounts || !membershipAccount || !hasAccount(allAccounts, membershipAccount)) { return { isLoading: false, status: 'addAccount', setMembershipAccount } } - if (!hasMembers && membershipAccount && hasAccount(allAccounts, membershipAccount)) { - return { isLoading: false, status: 'createMembership', membershipAccount, setMembershipAccount } - } - - return { isLoading: false, status: 'finished' } + return { isLoading: false, status: 'createMembership', membershipAccount, setMembershipAccount } } diff --git a/packages/ui/src/council/modals/RevealVote/PickVoteModal.stories.tsx b/packages/ui/src/council/modals/RevealVote/PickVoteModal.stories.tsx index fb9590d4d6..77c9e15d9c 100644 --- a/packages/ui/src/council/modals/RevealVote/PickVoteModal.stories.tsx +++ b/packages/ui/src/council/modals/RevealVote/PickVoteModal.stories.tsx @@ -2,6 +2,7 @@ import { Meta, Story } from '@storybook/react' import React from 'react' import { AccountsContext } from '@/accounts/providers/accounts/context' +import { UseAccounts } from '@/accounts/providers/accounts/provider' import { ModalContext } from '@/common/providers/modal/context' import { VotingAttempt } from '@/council/hooks/useCommitment' @@ -23,13 +24,14 @@ interface Props { showModal: () => void } -const useAccounts = { +const useAccounts: UseAccounts = { isLoading: false, allAccounts: [ { name: 'Alice Account', address: 'j4W7rVcUCxi2crhhjRq46fNDRbVHTjJrz6bKxZwehEMQxZeSf' }, { name: 'Bob Account', address: '5DWS57CtERHpNehXCPcNoHGKutQYGrwvaEF5zXb26Fz9rcQp' }, ], hasAccounts: true, + allWallets: [], } const Template: Story = ({ votes, hideModal, showModal }) => { diff --git a/packages/ui/src/memberships/components/CurrentMember/CurrentMember.tsx b/packages/ui/src/memberships/components/CurrentMember/CurrentMember.tsx index 812895bafc..07b6deea12 100644 --- a/packages/ui/src/memberships/components/CurrentMember/CurrentMember.tsx +++ b/packages/ui/src/memberships/components/CurrentMember/CurrentMember.tsx @@ -1,4 +1,3 @@ -import { getAllWallets } from 'injectweb3-connect' import React, { useEffect } from 'react' import { useHistory } from 'react-router' import styled from 'styled-components' @@ -22,7 +21,7 @@ import { SwitchMemberModalCall } from '../../modals/SwitchMemberModal' import { AddMembershipButton } from '../AddMembershipButton' export const CurrentMember = () => { - const { setWallet } = useMyAccounts() + const { allWallets, setWallet } = useMyAccounts() const { status, isLoading } = useOnBoarding() const { members, hasMembers, active } = useMyMemberships() const { showModal, modal } = useModal() @@ -63,7 +62,7 @@ export const CurrentMember = () => { const handleConnectWallet = () => { if (isMobileWallet) { - const wallets = getAllWallets().filter((wallet) => wallet.installed) + const wallets = allWallets.filter((wallet) => wallet.installed) if (wallets.length > 0) { return setWallet?.(wallets.at(-1)) } diff --git a/packages/ui/src/memberships/modals/DisconnectWalletModal/DisconnectWalletModal.tsx b/packages/ui/src/memberships/modals/DisconnectWalletModal/DisconnectWalletModal.tsx index 1c6572a942..cd9af98849 100644 --- a/packages/ui/src/memberships/modals/DisconnectWalletModal/DisconnectWalletModal.tsx +++ b/packages/ui/src/memberships/modals/DisconnectWalletModal/DisconnectWalletModal.tsx @@ -1,8 +1,9 @@ -import { getWalletBySource, Wallet } from 'injectweb3-connect' +import { Wallet } from 'injectweb3-connect' import React from 'react' import styled from 'styled-components' import { useMyAccounts } from '@/accounts/hooks/useMyAccounts' +import { DefaultWalletIcon } from '@/accounts/model/wallets' import { ButtonGhost, ButtonPrimary, CloseButton } from '@/common/components/buttons' import { Modal } from '@/common/components/Modal' import { TextHuge, TextMedium } from '@/common/components/typography' @@ -12,8 +13,6 @@ import { useModal } from '@/common/hooks/useModal' import { useMyMemberships } from '@/memberships/hooks/useMyMemberships' import { SignOutModalCall } from '@/memberships/modals/SignOutModal/types' -const defaultIconSrc = getWalletBySource('polkadot-js')?.logo.src - export const DisconnectWalletModal = () => { const { wallet, setWallet } = useMyAccounts() const { setActive } = useMyMemberships() @@ -32,7 +31,7 @@ export const DisconnectWalletModal = () => { - {wallet?.logo.alt + {wallet?.logo.alt Disconnect Wallet ? diff --git a/packages/ui/src/memberships/model/backendAuth.ts b/packages/ui/src/memberships/model/backendAuth.ts index aafbcae8b9..ebd2068a3c 100644 --- a/packages/ui/src/memberships/model/backendAuth.ts +++ b/packages/ui/src/memberships/model/backendAuth.ts @@ -4,7 +4,7 @@ import { Member } from '../types' export async function getBackendAuthSignature(member: Member, wallet: Wallet) { const timestamp = Date.now() - const result = await wallet?.signer.signRaw({ + const result = await wallet.signer.signRaw({ address: member.controllerAccount, data: `${member.id}:${timestamp}`, }) diff --git a/packages/ui/src/mocks/providers/accounts.tsx b/packages/ui/src/mocks/providers/accounts.tsx index 760061819b..f8578a4295 100644 --- a/packages/ui/src/mocks/providers/accounts.tsx +++ b/packages/ui/src/mocks/providers/accounts.tsx @@ -6,6 +6,7 @@ import React, { FC, useCallback, useEffect, useState } from 'react' import { AccountsContext } from '@/accounts/providers/accounts/context' import { UseAccounts } from '@/accounts/providers/accounts/provider' +import { useWallets } from '@/accounts/providers/accounts/useWallets' import { BalancesContext } from '@/accounts/providers/balances/context' import { Account, AddressToBalanceMap, LockType } from '@/accounts/types' import { whenDefined } from '@/common/utils' @@ -115,6 +116,8 @@ export const MockAccountsProvider: FC = ({ children, accounts [members] ) + const { allWallets } = useWallets() + if (!accounts) return <>{children} // Set contexts @@ -123,6 +126,8 @@ export const MockAccountsProvider: FC = ({ children, accounts hasAccounts: true, isLoading: false, wallet: accounts.hasWallet === false ? undefined : WALLET, + allWallets: allWallets.map((wallet) => ({ ...wallet, installed: false })), + walletState: accounts.hasWallet ? 'READY' : undefined, } const membershipContextValue: MyMemberships = { diff --git a/packages/ui/src/mocks/providers/api.tsx b/packages/ui/src/mocks/providers/api.tsx index 5474273c2b..b433f3e025 100644 --- a/packages/ui/src/mocks/providers/api.tsx +++ b/packages/ui/src/mocks/providers/api.tsx @@ -69,6 +69,7 @@ export const MockApiProvider: FC = ({ children, chain }) => { query: asApi('query', asApiMethod, defaultQuery), rpc: asApi('rpc', asApiMethod, { chain: rpcChain }), tx: asApi('tx', fromTxMock), + genesisHash: createType('Hash', '0x123456789'), } return watchForMissingProps(api, 'api') as Api diff --git a/packages/ui/src/proxyApi/client/ProxyApi.ts b/packages/ui/src/proxyApi/client/ProxyApi.ts index b528418a2c..b76467fcb4 100644 --- a/packages/ui/src/proxyApi/client/ProxyApi.ts +++ b/packages/ui/src/proxyApi/client/ProxyApi.ts @@ -19,6 +19,8 @@ export class ProxyApi extends Events { rpc: ApiRx['rpc'] tx: ApiRx['tx'] consts: ApiRx['consts'] + genesisHash: ApiRx['genesisHash'] + runtimeVersion: ApiRx['runtimeVersion'] _async: AsyncProps static create(providerEndpoint: string) { @@ -42,7 +44,7 @@ export class ProxyApi extends Events { return messages.pipe( firstWhere(({ data }) => data.messageType === 'init'), deserializeMessage(), - map(({ payload }) => new ProxyApi(messages, postMessage, payload.consts)), + map(({ payload }) => new ProxyApi(messages, postMessage, payload)), share() ) } @@ -50,11 +52,13 @@ export class ProxyApi extends Events { constructor( messages: Observable, postMessage: PostMessage, - consts: ProxyApi['consts'] + initPayload: WorkerInitMessage['payload'] ) { super() { - this.consts = consts + this.consts = initPayload.consts + this.genesisHash = initPayload.genesisHash + this.runtimeVersion = initPayload.runtimeVersion this.derive = query('derive', messages, postMessage) this.query = query('query', messages, postMessage) this.rpc = query('rpc', messages, postMessage) diff --git a/packages/ui/src/proxyApi/types.ts b/packages/ui/src/proxyApi/types.ts index af3de4d1ae..9cd77721cc 100644 --- a/packages/ui/src/proxyApi/types.ts +++ b/packages/ui/src/proxyApi/types.ts @@ -29,7 +29,10 @@ export type RawClientMessageEvent = MessageEvent<{ export type RawMessageEvent = RawWorkerMessageEvent | RawClientMessageEvent -export type WorkerInitMessage = { messageType: 'init'; payload: { consts: ProxyApi['consts'] } } +export type WorkerInitMessage = { + messageType: 'init' + payload: Pick +} export type ClientInitMessage = { messageType: 'init'; payload: string } export type WorkerConnectMessage = { messageType: 'isConnected'; payload: boolean } diff --git a/packages/ui/src/proxyApi/worker/index.ts b/packages/ui/src/proxyApi/worker/index.ts index 1c20063f66..3755c8b229 100644 --- a/packages/ui/src/proxyApi/worker/index.ts +++ b/packages/ui/src/proxyApi/worker/index.ts @@ -34,7 +34,12 @@ messages.subscribe(({ data }) => { ApiRx.create({ provider }) .pipe(first()) .subscribe((api) => { - postMessage({ messageType: 'init', payload: { consts: api.consts } }) + const initPayload = { + consts: api.consts, + genesisHash: api.genesisHash, + runtimeVersion: api.runtimeVersion, + } + postMessage({ messageType: 'init', payload: initPayload }) postMessage({ messageType: 'isConnected', payload: true }) api.on('connected', () => self.postMessage({ messageType: 'isConnected', payload: true })) api.on('disconnected', () => self.postMessage({ messageType: 'isConnected', payload: false })) diff --git a/packages/ui/test/_mocks/transactions.ts b/packages/ui/test/_mocks/transactions.ts index 16057d180a..a7fa39d264 100644 --- a/packages/ui/test/_mocks/transactions.ts +++ b/packages/ui/test/_mocks/transactions.ts @@ -266,6 +266,7 @@ export const stubAccounts = (allAccounts: Account[], myAccounts: Partial { describe('Loaded', () => { beforeEach(() => { - stubAccounts([], { error: undefined, wallet }) + stubAccounts([], { walletState: 'READY', wallet }) useMyMemberships.isLoading = false useApi.isConnected = true }) it('Install plugin', async () => { - stubAccounts([], { error: 'NO_EXTENSION', wallet: undefined }) + stubAccounts([], { wallet: undefined }) const { isLoading, status } = await renderUseOnBoarding() @@ -80,7 +80,7 @@ describe('useOnBoarding', () => { }) it('Create membership', async () => { - stubAccounts([alice], { error: undefined, wallet }) + stubAccounts([alice], { walletState: 'READY', wallet }) stubBalances({ available: 0 }) mockUseLocalStorage = [getAccount('alice'), jest.fn()] diff --git a/packages/ui/test/membership/components/CurrentMember.test.tsx b/packages/ui/test/membership/components/CurrentMember.test.tsx index b57e3b3140..745055ae18 100644 --- a/packages/ui/test/membership/components/CurrentMember.test.tsx +++ b/packages/ui/test/membership/components/CurrentMember.test.tsx @@ -5,6 +5,7 @@ import React from 'react' import { GlobalModals } from '@/app/GlobalModals' import { ModalContextProvider } from '@/common/providers/modal/provider' +import { OnBoardingProvider } from '@/common/providers/onboarding/provider' import { CurrentMember } from '@/memberships/components/CurrentMember' import { seedMember, seedMembers } from '@/mocks/data' @@ -88,12 +89,14 @@ describe('UI: CurrentMember component', () => { return render( - - - - - - + + + + + + + + ) diff --git a/packages/ui/test/setup.ts b/packages/ui/test/setup.ts index 29350fa48f..8a534bf102 100644 --- a/packages/ui/test/setup.ts +++ b/packages/ui/test/setup.ts @@ -106,6 +106,7 @@ export const mockedUseMyAccounts = jest.fn(() => ({ allAccounts: [], hasAccounts: false, isLoading: true, + allWallets: [], })) jest.mock('@/accounts/hooks/useMyAccounts', () => ({ diff --git a/yarn.lock b/yarn.lock index c811ba5f87..ef847a8e18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4024,6 +4024,13 @@ __metadata: languageName: node linkType: hard +"@ioredis/commands@npm:^1.1.1": + version: 1.2.0 + resolution: "@ioredis/commands@npm:1.2.0" + checksum: 9b20225ba36ef3e5caf69b3c0720597c3016cc9b1e157f519ea388f621dd9037177f84cfe7e25c4c32dad7dd90c70ff9123cd411f747e053cf292193c9c461e2 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -4944,6 +4951,9 @@ __metadata: "@types/yargs": ^17.0.3 "@typescript-eslint/eslint-plugin": ^6.11.0 "@typescript-eslint/parser": ^6.11.0 + "@walletconnect/modal": ^2.6.2 + "@walletconnect/types": ^2.11.0 + "@walletconnect/universal-provider": ^2.11.0 "@xstate/react": ^1.6.1 babel-jest: ^27.2.5 babel-loader: ^8.2.2 @@ -5148,6 +5158,22 @@ __metadata: languageName: node linkType: hard +"@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": + version: 1.1.2 + resolution: "@lit-labs/ssr-dom-shim@npm:1.1.2" + checksum: 73fd787893851d4ec4aaa5c775405ed2aae4ca0891b2dd3c973b32c2f4bf70ada5481dd0224e52b786d037aa8a00052186ad1623c44551affd66f6409cca8da6 + languageName: node + linkType: hard + +"@lit/reactive-element@npm:^1.3.0, @lit/reactive-element@npm:^1.6.0": + version: 1.6.3 + resolution: "@lit/reactive-element@npm:1.6.3" + dependencies: + "@lit-labs/ssr-dom-shim": ^1.0.0 + checksum: 79b58631c38effeabad090070324431da8a22cf0ff665f5e4de35e4d791f984742b3d340c9c7fce996d1124a8da95febc582471b4c237236c770b1300b56ef6e + languageName: node + linkType: hard + "@manypkg/find-root@npm:2.1.0": version: 2.1.0 resolution: "@manypkg/find-root@npm:2.1.0" @@ -5201,6 +5227,91 @@ __metadata: languageName: node linkType: hard +"@motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/animation@npm:10.17.0" + dependencies: + "@motionone/easing": ^10.17.0 + "@motionone/types": ^10.17.0 + "@motionone/utils": ^10.17.0 + tslib: ^2.3.1 + checksum: 8cab13cde7ccbe29bcaff1cb43ba39acdc51d9be4726628f4d0ba27898c59456887fd9ec56aceaa3d5b82993efbdfa9a7b9e99d4b96bc458f486208394027093 + languageName: node + linkType: hard + +"@motionone/dom@npm:^10.16.2, @motionone/dom@npm:^10.16.4": + version: 10.17.0 + resolution: "@motionone/dom@npm:10.17.0" + dependencies: + "@motionone/animation": ^10.17.0 + "@motionone/generators": ^10.17.0 + "@motionone/types": ^10.17.0 + "@motionone/utils": ^10.17.0 + hey-listen: ^1.0.8 + tslib: ^2.3.1 + checksum: 6415f17032136218dfa88b9b00fbab738e514544129edf6f5c01dbdacefe9be48efd2d06f3d0cb7f2f5d2d2d79c94362effc7d034332406fd4dec6a710e603a2 + languageName: node + linkType: hard + +"@motionone/easing@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/easing@npm:10.17.0" + dependencies: + "@motionone/utils": ^10.17.0 + tslib: ^2.3.1 + checksum: 2870d9e94645cf4ed3a27309a858dccee26615291ec46b56e993ef3ac9f059a659b02a2115ed61d27250fc8800acc9640f0319aeb402de7fa0e15dffbebeb548 + languageName: node + linkType: hard + +"@motionone/generators@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/generators@npm:10.17.0" + dependencies: + "@motionone/types": ^10.17.0 + "@motionone/utils": ^10.17.0 + tslib: ^2.3.1 + checksum: 6d048a0362692db3f450b97c1679a8d0265bff93106412bdcc33b9c48b9362a3e97f672f29a2932d5e393330750fdd55921c1c9b2bf20690922a37a0164e649f + languageName: node + linkType: hard + +"@motionone/svelte@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/svelte@npm:10.16.4" + dependencies: + "@motionone/dom": ^10.16.4 + tslib: ^2.3.1 + checksum: 699e20955ea832bcf32d410ae9f88edf61a5c2cf2b56527119ab1df6fecbf2632b62d541743d0f6d278fd700a15a20b9eb7c8aa5266e7aed5e113b8f8f75b863 + languageName: node + linkType: hard + +"@motionone/types@npm:^10.15.1, @motionone/types@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/types@npm:10.17.0" + checksum: 3996c84e1578b17146c14bd581ab682b7b2a06ca7fd5a7dc378a0f3b10539256d7b803a7df748f0c60d6df6b33950269a27ba2bb1839de779196bd024bee4b87 + languageName: node + linkType: hard + +"@motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.17.0": + version: 10.17.0 + resolution: "@motionone/utils@npm:10.17.0" + dependencies: + "@motionone/types": ^10.17.0 + hey-listen: ^1.0.8 + tslib: ^2.3.1 + checksum: 408e278c9051a221e528bb9ca0a773018b9953ecd53bb88715421afc009f4647417b0d9f163c8195467badd934f39ade24f57e007416988e4291242e749ea43d + languageName: node + linkType: hard + +"@motionone/vue@npm:^10.16.2": + version: 10.16.4 + resolution: "@motionone/vue@npm:10.16.4" + dependencies: + "@motionone/dom": ^10.16.4 + tslib: ^2.3.1 + checksum: 746e38d0ee831829bfac2ce471f3d98a9e37bd8cbdf2706fa3becce69c17f51180a1ee47582d97758d68aafdfc9a187ab47ff216c77254ac994287dabcf266c1 + languageName: node + linkType: hard + "@mrmlnc/readdir-enhanced@npm:^2.2.1": version: 2.2.1 resolution: "@mrmlnc/readdir-enhanced@npm:2.2.1" @@ -5937,6 +6048,151 @@ __metadata: languageName: node linkType: hard +"@parcel/watcher-android-arm64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-android-arm64@npm:2.4.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.4.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.4.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-freebsd-x64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.4.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.4.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.4.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.4.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.4.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.4.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-wasm@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-wasm@npm:2.4.0" + dependencies: + is-glob: ^4.0.3 + micromatch: ^4.0.5 + napi-wasm: ^1.1.0 + checksum: f32af594a20a809981b6830e8abdb59e604b670568f2344c7bc69b7447fbc135fb8a6900ba1feb5a197b3a5633a663bdfd9502e4a684aebd10abfb99f36f678b + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.4.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-ia32@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.4.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher-win32-x64@npm:2.4.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.4.0": + version: 2.4.0 + resolution: "@parcel/watcher@npm:2.4.0" + dependencies: + "@parcel/watcher-android-arm64": 2.4.0 + "@parcel/watcher-darwin-arm64": 2.4.0 + "@parcel/watcher-darwin-x64": 2.4.0 + "@parcel/watcher-freebsd-x64": 2.4.0 + "@parcel/watcher-linux-arm-glibc": 2.4.0 + "@parcel/watcher-linux-arm64-glibc": 2.4.0 + "@parcel/watcher-linux-arm64-musl": 2.4.0 + "@parcel/watcher-linux-x64-glibc": 2.4.0 + "@parcel/watcher-linux-x64-musl": 2.4.0 + "@parcel/watcher-win32-arm64": 2.4.0 + "@parcel/watcher-win32-ia32": 2.4.0 + "@parcel/watcher-win32-x64": 2.4.0 + detect-libc: ^1.0.3 + is-glob: ^4.0.3 + micromatch: ^4.0.5 + node-addon-api: ^7.0.0 + node-gyp: latest + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 9ff89d7e8c0beeee998b28a173870c657b65aa76fafb3c98524f4c28f37103b70e84538de3a380a1126b28e4e84c90df87804398c38fdcaef877f87aa06db961 + languageName: node + linkType: hard + "@peculiar/asn1-schema@npm:^2.3.6": version: 2.3.6 resolution: "@peculiar/asn1-schema@npm:2.3.6" @@ -7271,6 +7527,176 @@ __metadata: languageName: node linkType: hard +"@stablelib/aead@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/aead@npm:1.0.1" + checksum: 1a6f68d138f105d17dd65349751515bd252ab0498c77255b8555478d28415600dde493f909eb718245047a993f838dfae546071e1687566ffb7b8c3e10c918d9 + languageName: node + linkType: hard + +"@stablelib/binary@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/binary@npm:1.0.1" + dependencies: + "@stablelib/int": ^1.0.1 + checksum: dca9b98eb1f56a4002b5b9e7351fbc49f3d8616af87007c01e833bd763ac89214eb5f3b7e18673c91ce59d4a0e4856a2eb661ace33d39f17fb1ad267271fccd8 + languageName: node + linkType: hard + +"@stablelib/bytes@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/bytes@npm:1.0.1" + checksum: 456267e08c3384abcb71d3ad3e97a6f99185ad754bac016f501ebea4e4886f37900589143b57e33bdbbf513a92fc89368c15dd4517e0540d0bdc79ecdf9dd087 + languageName: node + linkType: hard + +"@stablelib/chacha20poly1305@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha20poly1305@npm:1.0.1" + dependencies: + "@stablelib/aead": ^1.0.1 + "@stablelib/binary": ^1.0.1 + "@stablelib/chacha": ^1.0.1 + "@stablelib/constant-time": ^1.0.1 + "@stablelib/poly1305": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 81f1a32330838d31e4dc3144d76eba7244b56d9ea38c1f604f2c34d93ed8e67e9a6167d2cfd72254c13cc46dfc1f5ce5157b37939a575295d69d9144abb4e4fb + languageName: node + linkType: hard + +"@stablelib/chacha@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha@npm:1.0.1" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: f061f36c4ca4bf177dd7cac11e7c65ced164f141b6065885141ae5a55f32e16ba0209aefcdcc966aef013f1da616ce901a3a80653b4b6f833cf7e3397ae2d6bd + languageName: node + linkType: hard + +"@stablelib/constant-time@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/constant-time@npm:1.0.1" + checksum: dba4f4bf508de2ff15f7f0cbd875e70391aa3ba3698290fe1ed2feb151c243ba08a90fc6fb390ec2230e30fcc622318c591a7c0e35dcb8150afb50c797eac3d7 + languageName: node + linkType: hard + +"@stablelib/ed25519@npm:^1.0.2": + version: 1.0.3 + resolution: "@stablelib/ed25519@npm:1.0.3" + dependencies: + "@stablelib/random": ^1.0.2 + "@stablelib/sha512": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: e18279de078edac67396ba07dbb862dce0fe89efa8141c21a5b04108a29914bd51636019522323ca5097ec596a90b3028ed64e88ee009b0ac7de7c1ab6499ccb + languageName: node + linkType: hard + +"@stablelib/hash@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hash@npm:1.0.1" + checksum: 3ff1f12d1a4082aaf4b6cdf40c2010aabe5c4209d3b40b97b5bbb0d9abc0ee94abdc545e57de0614afaea807ca0212ac870e247ec8f66cdce91ec39ce82948cf + languageName: node + linkType: hard + +"@stablelib/hkdf@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/hkdf@npm:1.0.1" + dependencies: + "@stablelib/hash": ^1.0.1 + "@stablelib/hmac": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 9d45e303715a1835c8612b78e6c1b9d2b7463699b484241d8681fb5c17e0f2bbde5ce211c882134b64616a402e09177baeba80426995ff227b3654a155ab225d + languageName: node + linkType: hard + +"@stablelib/hmac@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hmac@npm:1.0.1" + dependencies: + "@stablelib/constant-time": ^1.0.1 + "@stablelib/hash": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: e3b93f7144a5846a6e30213278f7570de6d3f9d09131b95ce76d5c5c8bf37bf5d1830f2ee8d847555707271dbfd6e2461221719fd4d8b27ff06b9dd689c0ec21 + languageName: node + linkType: hard + +"@stablelib/int@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/int@npm:1.0.1" + checksum: 65bfbf50a382eea70c68e05366bf379cfceff8fbc076f1c267ef2f2411d7aed64fd140c415cb6c29f19a3910d3b8b7805d4b32ad5721a5007a8e744a808c7ae3 + languageName: node + linkType: hard + +"@stablelib/keyagreement@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/keyagreement@npm:1.0.1" + dependencies: + "@stablelib/bytes": ^1.0.1 + checksum: 3c8ec904dd50f72f3162f5447a0fa8f1d9ca6e24cd272d3dbe84971267f3b47f9bd5dc4e4eeedf3fbac2fe01f2d9277053e57c8e60db8c5544bfb35c62d290dd + languageName: node + linkType: hard + +"@stablelib/poly1305@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/poly1305@npm:1.0.1" + dependencies: + "@stablelib/constant-time": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 70b845bb0481c66b7ba3f3865d01e4c67a4dffc9616fc6de1d23efc5e828ec09de25f8e3be4e1f15a23b8e87e3036ee3d949c2fd4785047e6f7028bbec0ead18 + languageName: node + linkType: hard + +"@stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": + version: 1.0.2 + resolution: "@stablelib/random@npm:1.0.2" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: f5ace0a588dc4c21f01cb85837892d4c872e994ae77a58a8eb7dd61aa0b26fb1e9b46b0445e71af57d963ef7d9f5965c64258fc0d04df7b2947bc48f2d3560c5 + languageName: node + linkType: hard + +"@stablelib/sha256@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha256@npm:1.0.1" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/hash": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 38669871e1bda72eb537629ebceac1c72da8890273a9fbe088f81f6d14c1ec04e78be8c5b455380a06c67f8e62b2508e11e9063fcc257dbaa1b5c27ac756ba77 + languageName: node + linkType: hard + +"@stablelib/sha512@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha512@npm:1.0.1" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/hash": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: b7c82f7608a35948a2147a534c0c9afc80deab3fd5f72a2e27b2454e7c0c6944d39381be3abcb1b7fac5b824ba030ae3e98209d517a579c143d8ed63930b042f + languageName: node + linkType: hard + +"@stablelib/wipe@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/wipe@npm:1.0.1" + checksum: 287802eb146810a46ba72af70b82022caf83a8aeebde23605f5ee0decf64fe2b97a60c856e43b6617b5801287c30cfa863cfb0469e7fcde6f02d143cf0c6cbf4 + languageName: node + linkType: hard + +"@stablelib/x25519@npm:^1.0.3": + version: 1.0.3 + resolution: "@stablelib/x25519@npm:1.0.3" + dependencies: + "@stablelib/keyagreement": ^1.0.1 + "@stablelib/random": ^1.0.2 + "@stablelib/wipe": ^1.0.1 + checksum: f8537066b542b6770c1b5b2ae5ad0688d1b986e4bf818067c152c123a5471531987bbf024224f75f387f481ccc5b628e391e49e92102b8b1a3e2d449d6105402 + languageName: node + linkType: hard + "@storybook/addon-actions@npm:7.0.18": version: 7.0.18 resolution: "@storybook/addon-actions@npm:7.0.18" @@ -9896,6 +10322,13 @@ __metadata: languageName: node linkType: hard +"@types/trusted-types@npm:^2.0.2": + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 8e4202766a65877efcf5d5a41b7dd458480b36195e580a3b1085ad21e948bc417d55d6f8af1fd2a7ad008015d4117d5fdfe432731157da3c68678487174e4ba3 + languageName: node + linkType: hard + "@types/unist@npm:*, @types/unist@npm:^2.0.0": version: 2.0.6 resolution: "@types/unist@npm:2.0.6" @@ -10276,6 +10709,305 @@ __metadata: languageName: node linkType: hard +"@walletconnect/core@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/core@npm:2.11.0" + dependencies: + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-provider": 1.0.13 + "@walletconnect/jsonrpc-types": 1.0.3 + "@walletconnect/jsonrpc-utils": 1.0.8 + "@walletconnect/jsonrpc-ws-connection": 1.0.14 + "@walletconnect/keyvaluestorage": ^1.1.1 + "@walletconnect/logger": ^2.0.1 + "@walletconnect/relay-api": ^1.0.9 + "@walletconnect/relay-auth": ^1.0.4 + "@walletconnect/safe-json": ^1.0.2 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.11.0 + "@walletconnect/utils": 2.11.0 + events: ^3.3.0 + isomorphic-unfetch: 3.1.0 + lodash.isequal: 4.5.0 + uint8arrays: ^3.1.0 + checksum: 419eff78df347eb5d5c51c2dbf60e3246b5dda00afdd77279795a89627285839cb769e1115e751026756d37e26e6bd708452170ded08be074d64256afd8a8663 + languageName: node + linkType: hard + +"@walletconnect/environment@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/environment@npm:1.0.1" + dependencies: + tslib: 1.14.1 + checksum: a18731d857bdca73910147e59992cef3c6e292c37ab3d3013307bd706f06cb216aa804f0f48b25a78df6493ad8127e633629f4b50acb4f69d3765d6ac0524f68 + languageName: node + linkType: hard + +"@walletconnect/events@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/events@npm:1.0.1" + dependencies: + keyvaluestorage-interface: ^1.0.0 + tslib: 1.14.1 + checksum: d28aa4dcc981bdaf38f0aeed979731ca793cead7e7a4ee730a9146d99d89db09a86c8e3192ed860638283276961c0723ba00cf3b8776f0692b36ec7df6c01be4 + languageName: node + linkType: hard + +"@walletconnect/heartbeat@npm:1.2.1": + version: 1.2.1 + resolution: "@walletconnect/heartbeat@npm:1.2.1" + dependencies: + "@walletconnect/events": ^1.0.1 + "@walletconnect/time": ^1.0.2 + tslib: 1.14.1 + checksum: df4d492a2d336283f834bc205c09b795f85cd507a61b14745dc2124e510a250fefbd83d51216f93df2e0aa0cf8120134db2679de8019eddd63877e9928997952 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-http-connection@npm:^1.0.7": + version: 1.0.7 + resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.7" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.6 + "@walletconnect/safe-json": ^1.0.1 + cross-fetch: ^3.1.4 + tslib: 1.14.1 + checksum: c4efcd46d4b344727ca6879badca2c2f855499ac76c8dace5d118f4423167adce34e41a99f3dcab0febb945ce51c6ef0ac8556567d5e38d8dad864b131eb5b00 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-provider@npm:1.0.13": + version: 1.0.13 + resolution: "@walletconnect/jsonrpc-provider@npm:1.0.13" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.8 + "@walletconnect/safe-json": ^1.0.2 + tslib: 1.14.1 + checksum: 497dfdd9f988432f171bc98336f3583c679059f0a166f95d6e51c8e1937c17abd9a5fd3aadfcebf6964bae14edd1e05fb0453e370d6e3bbc7ff4919fcad7c478 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:1.0.3, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" + dependencies: + keyvaluestorage-interface: ^1.0.0 + tslib: 1.14.1 + checksum: 26e6f1d8f4207328d3df465c36d0d67844772863dc8e9e78e6cfec417cfc359300eab049d99ea558982b3f0948f4ca26b75253bdf635ffd82ffe30a5276b790c + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.7, @walletconnect/jsonrpc-utils@npm:^1.0.8": + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" + dependencies: + "@walletconnect/environment": ^1.0.1 + "@walletconnect/jsonrpc-types": ^1.0.3 + tslib: 1.14.1 + checksum: f43a85dfce8150c3e3d1f009e8d8241ab8e10b026ea435f0918edf4db6b3a17586ba9d9c54a93cc61e4d3c685611e5bd5954fc377a581af503acd38e6d84c2ef + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-ws-connection@npm:1.0.14": + version: 1.0.14 + resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.14" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.6 + "@walletconnect/safe-json": ^1.0.2 + events: ^3.3.0 + ws: ^7.5.1 + checksum: a401e60b19390098183ef1b2a7b3e15c4dd3c64f9ac87fd2bbc0ae1f7fb31539ba542374ca021193efc4a2ae59fa3b04e588aed98cdf5c364f50524403d50f9f + languageName: node + linkType: hard + +"@walletconnect/keyvaluestorage@npm:^1.1.1": + version: 1.1.1 + resolution: "@walletconnect/keyvaluestorage@npm:1.1.1" + dependencies: + "@walletconnect/safe-json": ^1.0.1 + idb-keyval: ^6.2.1 + unstorage: ^1.9.0 + peerDependencies: + "@react-native-async-storage/async-storage": 1.x + peerDependenciesMeta: + "@react-native-async-storage/async-storage": + optional: true + checksum: 7f85cb83963153417745367742070ccb78e03bd62adb549de57a7d5fae7bcfbd9a8f42b2f445ca76a3817ffacacc69d85bbf67757c3616ee7b3525f2f8a0faea + languageName: node + linkType: hard + +"@walletconnect/logger@npm:^2.0.1": + version: 2.0.1 + resolution: "@walletconnect/logger@npm:2.0.1" + dependencies: + pino: 7.11.0 + tslib: 1.14.1 + checksum: b686679d176d5d22a3441d93e71be2652e6c447682a6d6f014baf7c2d9dcd23b93e2f434d4410e33cc532d068333f6b3c1d899aeb0d6f60cc296ed17f57b0c2c + languageName: node + linkType: hard + +"@walletconnect/modal-core@npm:2.6.2": + version: 2.6.2 + resolution: "@walletconnect/modal-core@npm:2.6.2" + dependencies: + valtio: 1.11.2 + checksum: 94daceba50c323b06ecbeac2968d9f0972f327359c6118887c6526cd64006249b12f64322d71bc6c4a2b928436ecc89cf3d3af706511fcdc264c1f4b34a2dd5d + languageName: node + linkType: hard + +"@walletconnect/modal-ui@npm:2.6.2": + version: 2.6.2 + resolution: "@walletconnect/modal-ui@npm:2.6.2" + dependencies: + "@walletconnect/modal-core": 2.6.2 + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + checksum: cd1ec0205eb491e529670599d3dd26f6782d7c5a99d5594bf6949a8c760c1c5f4eb6ed72b8662450774fe4e2dd47678f2c05145c8f2494bd7153446ddf4bd7ed + languageName: node + linkType: hard + +"@walletconnect/modal@npm:^2.6.2": + version: 2.6.2 + resolution: "@walletconnect/modal@npm:2.6.2" + dependencies: + "@walletconnect/modal-core": 2.6.2 + "@walletconnect/modal-ui": 2.6.2 + checksum: 68b354d49960b96d22de0e47a3801df27c01a3e96ec5fbde3ca6df1344ca2b20668b0c4d58fe1803f5670ac7b7b4c6f5b7b405e354f5f9eaff5cca147c13de9c + languageName: node + linkType: hard + +"@walletconnect/relay-api@npm:^1.0.9": + version: 1.0.9 + resolution: "@walletconnect/relay-api@npm:1.0.9" + dependencies: + "@walletconnect/jsonrpc-types": ^1.0.2 + tslib: 1.14.1 + checksum: 5870579b6552f1ce7351878f1acb8386b0c11288c64d39133c7cee5040feeb7ccf9114228d97a59749d60366ad107b097d656407d534567c24f5d3878ea6e246 + languageName: node + linkType: hard + +"@walletconnect/relay-auth@npm:^1.0.4": + version: 1.0.4 + resolution: "@walletconnect/relay-auth@npm:1.0.4" + dependencies: + "@stablelib/ed25519": ^1.0.2 + "@stablelib/random": ^1.0.1 + "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/time": ^1.0.2 + tslib: 1.14.1 + uint8arrays: ^3.0.0 + checksum: 35b3229d7b57e74fdb8fe6827d8dd8291dc60bacda880a57b2acb47a34d38f12be46c971c9eff361eb4073e896648b550de7a7a3852ef3752f9619c08dfba891 + languageName: node + linkType: hard + +"@walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/safe-json@npm:1.0.2" + dependencies: + tslib: 1.14.1 + checksum: fee03fcc70adb5635ab9419ea6ec6555aa2467bef650ad3b9526451c3a5cf247836db0f3ae3bb435d2e585d99e50c2ebe7dc9c429cfa3df900cf3fe4bd06d37f + languageName: node + linkType: hard + +"@walletconnect/sign-client@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/sign-client@npm:2.11.0" + dependencies: + "@walletconnect/core": 2.11.0 + "@walletconnect/events": ^1.0.1 + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-utils": 1.0.8 + "@walletconnect/logger": ^2.0.1 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.11.0 + "@walletconnect/utils": 2.11.0 + events: ^3.3.0 + checksum: 89230cf4ca95f9feb06104cc8097340e345b2b21257d45acf16729342ddcf5248bbf05097343b21e4dbebfa4fbacb6fe067099ee6127169a6b464563985d4716 + languageName: node + linkType: hard + +"@walletconnect/time@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/time@npm:1.0.2" + dependencies: + tslib: 1.14.1 + checksum: e3fc0113ca9e7ecedfc65f9e1517196682d5ffcda60750f51073b8d704719a17fea75da8b242c804bfa5b994707723043892a2db3cc86988b190b7b8711fe3c0 + languageName: node + linkType: hard + +"@walletconnect/types@npm:2.11.0, @walletconnect/types@npm:^2.11.0": + version: 2.11.0 + resolution: "@walletconnect/types@npm:2.11.0" + dependencies: + "@walletconnect/events": ^1.0.1 + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-types": 1.0.3 + "@walletconnect/keyvaluestorage": ^1.1.1 + "@walletconnect/logger": ^2.0.1 + events: ^3.3.0 + checksum: 32d0d7972b90683467e47eabf92005c7c5d1ae76400eb221576ac0d32501b9f0a414d5921f0c881efe86f07485db807e3e9d370c6b9cc264771822916dc4cca5 + languageName: node + linkType: hard + +"@walletconnect/universal-provider@npm:^2.11.0": + version: 2.11.0 + resolution: "@walletconnect/universal-provider@npm:2.11.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": ^1.0.7 + "@walletconnect/jsonrpc-provider": 1.0.13 + "@walletconnect/jsonrpc-types": ^1.0.2 + "@walletconnect/jsonrpc-utils": ^1.0.7 + "@walletconnect/logger": ^2.0.1 + "@walletconnect/sign-client": 2.11.0 + "@walletconnect/types": 2.11.0 + "@walletconnect/utils": 2.11.0 + events: ^3.3.0 + checksum: 7f4f187cd9148dc2e262e4afecadf0d0e136ae4183a60779562fef142411b927a3305c90793ef98dc3ecc61e4e2d4cfc8ac5491b1b42054021cfc4383f7ab81e + languageName: node + linkType: hard + +"@walletconnect/utils@npm:2.11.0": + version: 2.11.0 + resolution: "@walletconnect/utils@npm:2.11.0" + dependencies: + "@stablelib/chacha20poly1305": 1.0.1 + "@stablelib/hkdf": 1.0.1 + "@stablelib/random": ^1.0.2 + "@stablelib/sha256": 1.0.1 + "@stablelib/x25519": ^1.0.3 + "@walletconnect/relay-api": ^1.0.9 + "@walletconnect/safe-json": ^1.0.2 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.11.0 + "@walletconnect/window-getters": ^1.0.1 + "@walletconnect/window-metadata": ^1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: ^3.1.0 + checksum: 9d8259ea6a2850e620eb366b26fc3f17cf7bf75ae9c50fdfa3252b9dd152d1c10444009dfad1aa5a0a7d1ed844e5efd76581540e973315ec289fba7b51ebf7d7 + languageName: node + linkType: hard + +"@walletconnect/window-getters@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-getters@npm:1.0.1" + dependencies: + tslib: 1.14.1 + checksum: fae312c4e1be5574d97f071de58e6aa0d0296869761499caf9d4a9a5fd2643458af32233a2120521b00873a599ff88457d405bd82ced5fb5bd6dc3191c07a3e5 + languageName: node + linkType: hard + +"@walletconnect/window-metadata@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-metadata@npm:1.0.1" + dependencies: + "@walletconnect/window-getters": ^1.0.1 + tslib: 1.14.1 + checksum: e82aea7195c6fe95c00e87bb38051c5549838c2e8302da94f1afa48206f79f0b620166c9820f847494505d282d1568e2086a1561b0493d2d0a1fa115f9106aef + languageName: node + linkType: hard + "@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": version: 1.11.6 resolution: "@webassemblyjs/ast@npm:1.11.6" @@ -10706,6 +11438,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.11.3": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 76d8e7d559512566b43ab4aadc374f11f563f0a9e21626dd59cb2888444e9445923ae9f3699972767f18af61df89cd89f5eaaf772d1327b055b45cb829b4a88c + languageName: node + linkType: hard + "acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.5.0": version: 8.6.0 resolution: "acorn@npm:8.6.0" @@ -11028,6 +11769,16 @@ __metadata: languageName: node linkType: hard +"anymatch@npm:^3.1.3": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + "apollo-datasource@npm:^3.3.2": version: 3.3.2 resolution: "apollo-datasource@npm:3.3.2" @@ -11567,6 +12318,13 @@ __metadata: languageName: node linkType: hard +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36 + languageName: node + linkType: hard + "attr-accept@npm:^2.2.1": version: 2.2.2 resolution: "attr-accept@npm:2.2.2" @@ -13182,6 +13940,15 @@ __metadata: languageName: node linkType: hard +"citty@npm:^0.1.5": + version: 0.1.5 + resolution: "citty@npm:0.1.5" + dependencies: + consola: ^3.2.3 + checksum: 9a2379fd01345500f1eb2bcc33f5e60be8379551091b43a3ba4e3a39c63a92e41453dea542ab9f2528fe9e19177ff1453c01a845a74529292af34fdafd23a5f6 + languageName: node + linkType: hard + "cjs-module-lexer@npm:^1.0.0": version: 1.2.2 resolution: "cjs-module-lexer@npm:1.2.2" @@ -13358,6 +14125,17 @@ __metadata: languageName: node linkType: hard +"clipboardy@npm:^4.0.0": + version: 4.0.0 + resolution: "clipboardy@npm:4.0.0" + dependencies: + execa: ^8.0.1 + is-wsl: ^3.1.0 + is64bit: ^2.0.0 + checksum: ac7fa4438451d4a509fd7163505c08be92087c1a0ab8f54f8063eb04a69191ded1b59333344e2fd60bad9688e2a3dd69e50a813bf05ebf8369fa8bf65a0f47a2 + languageName: node + linkType: hard + "cliui@npm:^5.0.0": version: 5.0.0 resolution: "cliui@npm:5.0.0" @@ -13429,6 +14207,13 @@ __metadata: languageName: node linkType: hard +"cluster-key-slot@npm:^1.1.0": + version: 1.1.2 + resolution: "cluster-key-slot@npm:1.1.2" + checksum: be0ad2d262502adc998597e83f9ded1b80f827f0452127c5a37b22dfca36bab8edf393f7b25bb626006fb9fb2436106939ede6d2d6ecf4229b96a47f27edd681 + languageName: node + linkType: hard + "cmd-shim@npm:^6.0.0": version: 6.0.2 resolution: "cmd-shim@npm:6.0.2" @@ -13751,6 +14536,13 @@ __metadata: languageName: node linkType: hard +"consola@npm:^3.2.3": + version: 3.2.3 + resolution: "consola@npm:3.2.3" + checksum: 32ec70e177dd2385c42e38078958cc7397be91db21af90c6f9faa0b16168b49b1c61d689338604bbb2d64370b9347a35f42a9197663a913d3a405bb0ce728499 + languageName: node + linkType: hard + "console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" @@ -13874,6 +14666,13 @@ __metadata: languageName: node linkType: hard +"cookie-es@npm:^1.0.0": + version: 1.0.0 + resolution: "cookie-es@npm:1.0.0" + checksum: e8721cf4d38f3e44049c9118874b323f4f674b1c5cef84a2b888f5bf86ad720ad17b51b43150cad7535a375c24e2921da603801ad28aa6125c3d36c031b41468 + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -14129,6 +14928,15 @@ __metadata: languageName: node linkType: hard +"cross-fetch@npm:^3.1.4": + version: 3.1.8 + resolution: "cross-fetch@npm:3.1.8" + dependencies: + node-fetch: ^2.6.12 + checksum: 78f993fa099eaaa041122ab037fe9503ecbbcb9daef234d1d2e0b9230a983f64d645d088c464e21a247b825a08dc444a6e7064adfa93536d3a9454b4745b3632 + languageName: node + linkType: hard + "cross-fetch@npm:^3.1.5": version: 3.1.6 resolution: "cross-fetch@npm:3.1.6" @@ -14176,6 +14984,13 @@ __metadata: languageName: node linkType: hard +"crossws@npm:^0.1.0": + version: 0.1.1 + resolution: "crossws@npm:0.1.1" + checksum: 4cd8eadb497d852998b770d54a10779ba9e0c38c823d141c35040c7a7afc7a6fcd274ce82a8614e992e3f71cb5e41c71a01ee0923ab6e1bec215842404555d7d + languageName: node + linkType: hard + "crypto-browserify@npm:^3.12.0": version: 3.12.0 resolution: "crypto-browserify@npm:3.12.0" @@ -14773,6 +15588,13 @@ __metadata: languageName: node linkType: hard +"decode-uri-component@npm:^0.2.2": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 95476a7d28f267292ce745eac3524a9079058bbb35767b76e3ee87d42e34cd0275d2eb19d9d08c3e167f97556e8a2872747f5e65cbebcac8b0c98d83e285f139 + languageName: node + linkType: hard + "decompress-response@npm:^3.3.0": version: 3.3.0 resolution: "decompress-response@npm:3.3.0" @@ -14973,6 +15795,13 @@ __metadata: languageName: node linkType: hard +"defu@npm:^6.1.3, defu@npm:^6.1.4": + version: 6.1.4 + resolution: "defu@npm:6.1.4" + checksum: 40e3af6338f195ac1564f53d1887fa2d0429ac7e8c081204bc4d29191180059d3952b5f4e08fe5df8d59eb873aa26e9c88b56d4fac699673d4a372c93620b229 + languageName: node + linkType: hard + "del@npm:^4.1.1": version: 4.1.1 resolution: "del@npm:4.1.1" @@ -15034,6 +15863,13 @@ __metadata: languageName: node linkType: hard +"denque@npm:^2.1.0": + version: 2.1.0 + resolution: "denque@npm:2.1.0" + checksum: 1d4ae1d05e59ac3a3481e7b478293f4b4c813819342273f3d5b826c7ffa9753c520919ba264f377e09108d24ec6cf0ec0ac729a5686cbb8f32d797126c5dae74 + languageName: node + linkType: hard + "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -15086,6 +15922,13 @@ __metadata: languageName: node linkType: hard +"destr@npm:^2.0.1, destr@npm:^2.0.2": + version: 2.0.2 + resolution: "destr@npm:2.0.2" + checksum: cb63dd477d1c323f95650ce7784f1497466d68150ac0fddd6c99652be45c9dcb997d53fd5eb6c6fda6c0b2a5e5b4fc7fa3c3e18dace3d810ba4cf45d8b55bdd6 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -15100,6 +15943,13 @@ __metadata: languageName: node linkType: hard +"detect-browser@npm:5.3.0": + version: 5.3.0 + resolution: "detect-browser@npm:5.3.0" + checksum: dd6e08d55da1d9e0f22510ac79872078ae03d9dfa13c5e66c96baedc1c86567345a88f96949161f6be8f3e0fafa93bf179bdb1cd311b14f5f163112fcc70ab49 + languageName: node + linkType: hard + "detect-indent@npm:^6.0.0, detect-indent@npm:^6.1.0": version: 6.1.0 resolution: "detect-indent@npm:6.1.0" @@ -15107,6 +15957,15 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: daaaed925ffa7889bd91d56e9624e6c8033911bb60f3a50a74a87500680652969dbaab9526d1e200a4c94acf80fc862a22131841145a0a8482d60a99c24f4a3e + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -15239,6 +16098,13 @@ __metadata: languageName: node linkType: hard +"dijkstrajs@npm:^1.0.1": + version: 1.0.3 + resolution: "dijkstrajs@npm:1.0.3" + checksum: 82ff2c6633f235dd5e6bed04ec62cdfb1f327b4d7534557bd52f18991313f864ee50654543072fff4384a92b643ada4d5452f006b7098dbdfad6c8744a8c9e08 + languageName: node + linkType: hard + "dindist@npm:^1.0.2": version: 1.0.2 resolution: "dindist@npm:1.0.2" @@ -15580,6 +16446,18 @@ __metadata: languageName: node linkType: hard +"duplexify@npm:^4.1.2": + version: 4.1.2 + resolution: "duplexify@npm:4.1.2" + dependencies: + end-of-stream: ^1.4.1 + inherits: ^2.0.3 + readable-stream: ^3.1.1 + stream-shift: ^1.0.0 + checksum: 964376c61c0e92f6ed0694b3ba97c84f199413dc40ab8dfdaef80b7a7f4982fcabf796214e28ed614a5bc1ec45488a29b81e7d46fa3f5ddf65bcb118c20145ad + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -15722,6 +16600,13 @@ __metadata: languageName: node linkType: hard +"encode-utf8@npm:^1.0.3": + version: 1.0.3 + resolution: "encode-utf8@npm:1.0.3" + checksum: 550224bf2a104b1d355458c8a82e9b4ea07f9fc78387bc3a49c151b940ad26473de8dc9e121eefc4e84561cb0b46de1e4cd2bc766f72ee145e9ea9541482817f + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -16692,7 +17577,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^8.0.0": +"execa@npm:^8.0.0, execa@npm:^8.0.1": version: 8.0.1 resolution: "execa@npm:8.0.1" dependencies: @@ -17105,6 +17990,13 @@ __metadata: languageName: node linkType: hard +"fast-redact@npm:^3.0.0": + version: 3.3.0 + resolution: "fast-redact@npm:3.3.0" + checksum: 3f7becc70a5a2662a9cbfdc52a4291594f62ae998806ee00315af307f32d9559dbf512146259a22739ee34401950ef47598c1f4777d33b0ed5027203d67f549c + languageName: node + linkType: hard + "fast-url-parser@npm:^1.1.3": version: 1.1.3 resolution: "fast-url-parser@npm:1.1.3" @@ -17301,6 +18193,13 @@ __metadata: languageName: node linkType: hard +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: cf2104a7c45ff48e7f505b78a3991c8f7f30f28bd8106ef582721f321f1c6277f7751aacd5d83026cb079d9d5091082f588d14a72e7c5d720ece79118fa61e10 + languageName: node + linkType: hard + "finalhandler@npm:1.2.0": version: 1.2.0 resolution: "finalhandler@npm:1.2.0" @@ -17981,6 +18880,13 @@ __metadata: languageName: node linkType: hard +"get-port-please@npm:^3.1.2": + version: 3.1.2 + resolution: "get-port-please@npm:3.1.2" + checksum: 8e65b56459ead2f31c446d76bb8eb639c33e04e72b07a4dd5d8acc39738f12962591e90b2befecf10492844d0d11c2122c281f5204ee48692d4a8ba0ec68733a + languageName: node + linkType: hard + "get-port@npm:^5.1.1": version: 5.1.1 resolution: "get-port@npm:5.1.1" @@ -18573,6 +19479,23 @@ __metadata: languageName: node linkType: hard +"h3@npm:^1.10.1, h3@npm:^1.8.2": + version: 1.10.1 + resolution: "h3@npm:1.10.1" + dependencies: + cookie-es: ^1.0.0 + defu: ^6.1.4 + destr: ^2.0.2 + iron-webcrypto: ^1.0.0 + ohash: ^1.1.3 + radix3: ^1.1.0 + ufo: ^1.3.2 + uncrypto: ^0.1.3 + unenv: ^1.9.0 + checksum: f2849e08610adc6d65259142336cfee0ad42d6e1342d87f396a6b53a8bb8e9919dac5263e8403d5a1d0b8774150b96f9bf2b3c6c836017ca80152559c0195b80 + languageName: node + linkType: hard + "handle-thing@npm:^2.0.0": version: 2.0.1 resolution: "handle-thing@npm:2.0.1" @@ -19243,6 +20166,13 @@ __metadata: languageName: node linkType: hard +"http-shutdown@npm:^1.2.2": + version: 1.2.2 + resolution: "http-shutdown@npm:1.2.2" + checksum: 5dccd94f4fe4f51f9cbd7ec4586121160cd6470728e581662ea8032724440d891c4c92b8210b871ac468adadb3c99c40098ad0f752a781a550abae49dfa26206 + languageName: node + linkType: hard + "https-proxy-agent@npm:^4.0.0": version: 4.0.0 resolution: "https-proxy-agent@npm:4.0.0" @@ -19387,6 +20317,13 @@ __metadata: languageName: node linkType: hard +"idb-keyval@npm:^6.2.1": + version: 6.2.1 + resolution: "idb-keyval@npm:6.2.1" + checksum: 7c0836f832096086e99258167740181132a71dd2694c8b8454a4f5ec69114ba6d70983115153306f0b6de1c8d3bad04f67eed3dff8f50c96815b9985d6d78470 + languageName: node + linkType: hard + "ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" @@ -19734,6 +20671,23 @@ __metadata: languageName: node linkType: hard +"ioredis@npm:^5.3.2": + version: 5.3.2 + resolution: "ioredis@npm:5.3.2" + dependencies: + "@ioredis/commands": ^1.1.1 + cluster-key-slot: ^1.1.0 + debug: ^4.3.4 + denque: ^2.1.0 + lodash.defaults: ^4.2.0 + lodash.isarguments: ^3.1.0 + redis-errors: ^1.2.0 + redis-parser: ^3.0.0 + standard-as-callback: ^2.1.0 + checksum: 9a23559133e862a768778301efb68ae8c2af3c33562174b54a4c2d6574b976e85c75a4c34857991af733e35c48faf4c356e7daa8fb0a3543d85ff1768c8754bc + languageName: node + linkType: hard + "ip-regex@npm:^4.0.0, ip-regex@npm:^4.1.0, ip-regex@npm:^4.3.0": version: 4.3.0 resolution: "ip-regex@npm:4.3.0" @@ -19769,6 +20723,13 @@ __metadata: languageName: node linkType: hard +"iron-webcrypto@npm:^1.0.0": + version: 1.0.0 + resolution: "iron-webcrypto@npm:1.0.0" + checksum: bbd96cbbfec7d072296bc7464763b96555bdadb12aca50f1f1c7e4fcdc6acb102bc3488333e924f94404dd50eda24f84b67ad28323b9138ec7255a023e8dc19e + languageName: node + linkType: hard + "is-absolute-url@npm:^2.0.0": version: 2.1.0 resolution: "is-absolute-url@npm:2.1.0" @@ -20033,6 +20994,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + "is-extendable@npm:^0.1.0, is-extendable@npm:^0.1.1": version: 0.1.1 resolution: "is-extendable@npm:0.1.1" @@ -20134,6 +21104,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: ^3.0.0 + bin: + is-inside-container: cli.js + checksum: c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -20544,6 +21525,24 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: ^1.0.0 + checksum: f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 + languageName: node + linkType: hard + +"is64bit@npm:^2.0.0": + version: 2.0.0 + resolution: "is64bit@npm:2.0.0" + dependencies: + system-architecture: ^0.1.0 + checksum: 253079e64b6f9bb90295a63b73a046bea67364cdc104bc5abeffcf4cbc52b3e66b0e921cb14f686deb71b5cab628f9f490845c1194c6e94f84068d177c7f15cd + languageName: node + linkType: hard + "isarray@npm:0.0.1": version: 0.0.1 resolution: "isarray@npm:0.0.1" @@ -20612,7 +21611,7 @@ __metadata: languageName: node linkType: hard -"isomorphic-unfetch@npm:^3.1.0": +"isomorphic-unfetch@npm:3.1.0, isomorphic-unfetch@npm:^3.1.0": version: 3.1.0 resolution: "isomorphic-unfetch@npm:3.1.0" dependencies: @@ -22312,6 +23311,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^1.21.0": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" + bin: + jiti: bin/jiti.js + checksum: a7bd5d63921c170eaec91eecd686388181c7828e1fa0657ab374b9372bfc1f383cf4b039e6b272383d5cb25607509880af814a39abdff967322459cca41f2961 + languageName: node + linkType: hard + "jju@npm:^1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -22654,6 +23662,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:^3.2.0": + version: 3.2.1 + resolution: "jsonc-parser@npm:3.2.1" + checksum: 656d9027b91de98d8ab91b3aa0d0a4cab7dc798a6830845ca664f3e76c82d46b973675bbe9b500fae1de37fd3e81aceacbaa2a57884bf2f8f29192150d2d1ef7 + languageName: node + linkType: hard + "jsonfile@npm:^4.0.0": version: 4.0.0 resolution: "jsonfile@npm:4.0.0" @@ -22790,6 +23805,13 @@ __metadata: languageName: node linkType: hard +"keyvaluestorage-interface@npm:^1.0.0": + version: 1.0.0 + resolution: "keyvaluestorage-interface@npm:1.0.0" + checksum: e20530e71b738dc094ad170a91a98d4b9bdc772dd9044b23cdaaa102aafa8997b1ac867550a1e66ba1d64fcaa949214df31aed18413b4bac31e5fe1f2c76c9de + languageName: node + linkType: hard + "kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": version: 3.2.2 resolution: "kind-of@npm:3.2.2" @@ -23091,6 +24113,35 @@ __metadata: languageName: node linkType: hard +"listhen@npm:^1.5.5": + version: 1.6.0 + resolution: "listhen@npm:1.6.0" + dependencies: + "@parcel/watcher": ^2.4.0 + "@parcel/watcher-wasm": 2.4.0 + citty: ^0.1.5 + clipboardy: ^4.0.0 + consola: ^3.2.3 + crossws: ^0.1.0 + defu: ^6.1.4 + get-port-please: ^3.1.2 + h3: ^1.10.1 + http-shutdown: ^1.2.2 + jiti: ^1.21.0 + mlly: ^1.5.0 + node-forge: ^1.3.1 + pathe: ^1.1.2 + std-env: ^3.7.0 + ufo: ^1.3.2 + untun: ^0.1.3 + uqr: ^0.1.2 + bin: + listen: bin/listhen.mjs + listhen: bin/listhen.mjs + checksum: b5e1725838847ff6c08e65c62ec2977debe4becc35b0d75b7d2a064da9ec14ad098726859e626c7295e2cdc1309084e604679b02aa26df93997326675e56bff6 + languageName: node + linkType: hard + "listr-silent-renderer@npm:^1.1.1": version: 1.1.1 resolution: "listr-silent-renderer@npm:1.1.1" @@ -23166,6 +24217,37 @@ __metadata: languageName: node linkType: hard +"lit-element@npm:^3.3.0": + version: 3.3.3 + resolution: "lit-element@npm:3.3.3" + dependencies: + "@lit-labs/ssr-dom-shim": ^1.1.0 + "@lit/reactive-element": ^1.3.0 + lit-html: ^2.8.0 + checksum: 29a596fa556e231cce7246ca3e5687ad238f299b0cb374a0934d5e6fe9adf1436e031d4fbd21b280aabfc0e21a66e6c4b52da558a908df2566d09d960f3ca93d + languageName: node + linkType: hard + +"lit-html@npm:^2.8.0": + version: 2.8.0 + resolution: "lit-html@npm:2.8.0" + dependencies: + "@types/trusted-types": ^2.0.2 + checksum: 2d70df07248bcb2f502a3afb1e91d260735024fa669669ffb1417575aa39c3092779725ac1b90f5f39e4ce78c63f431f51176bc67f532389f0285a6991573255 + languageName: node + linkType: hard + +"lit@npm:2.8.0": + version: 2.8.0 + resolution: "lit@npm:2.8.0" + dependencies: + "@lit/reactive-element": ^1.6.0 + lit-element: ^3.3.0 + lit-html: ^2.8.0 + checksum: 2480e733f7d022d3ecba91abc58a20968f0ca8f5fa30b3341ecf4bcf4845e674ad27b721a5ae53529cafc6ca603c015b80d0979ceb7a711e268ef20bb6bc7527 + languageName: node + linkType: hard + "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -23321,6 +24403,13 @@ __metadata: languageName: node linkType: hard +"lodash.defaults@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.defaults@npm:4.2.0" + checksum: 84923258235592c8886e29de5491946ff8c2ae5c82a7ac5cddd2e3cb697e6fbdfbbb6efcca015795c86eec2bb953a5a2ee4016e3735a3f02720428a40efbb8f1 + languageName: node + linkType: hard + "lodash.escaperegexp@npm:^4.1.2": version: 4.1.2 resolution: "lodash.escaperegexp@npm:4.1.2" @@ -23384,6 +24473,13 @@ __metadata: languageName: node linkType: hard +"lodash.isarguments@npm:^3.1.0": + version: 3.1.0 + resolution: "lodash.isarguments@npm:3.1.0" + checksum: ae1526f3eb5c61c77944b101b1f655f846ecbedcb9e6b073526eba6890dc0f13f09f72e11ffbf6540b602caee319af9ac363d6cdd6be41f4ee453436f04f13b5 + languageName: node + linkType: hard + "lodash.isboolean@npm:^3.0.3": version: 3.0.3 resolution: "lodash.isboolean@npm:3.0.3" @@ -23398,7 +24494,7 @@ __metadata: languageName: node linkType: hard -"lodash.isequal@npm:^4.5.0": +"lodash.isequal@npm:4.5.0, lodash.isequal@npm:^4.5.0": version: 4.5.0 resolution: "lodash.isequal@npm:4.5.0" checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644 @@ -23667,6 +24763,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.2": + version: 10.2.0 + resolution: "lru-cache@npm:10.2.0" + checksum: eee7ddda4a7475deac51ac81d7dd78709095c6fa46e8350dc2d22462559a1faa3b81ed931d5464b13d48cbd7e08b46100b6f768c76833912bc444b99c37e25db + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -25046,6 +26149,18 @@ __metadata: languageName: node linkType: hard +"mlly@npm:^1.2.0, mlly@npm:^1.5.0": + version: 1.5.0 + resolution: "mlly@npm:1.5.0" + dependencies: + acorn: ^8.11.3 + pathe: ^1.1.2 + pkg-types: ^1.0.3 + ufo: ^1.3.2 + checksum: 82fda663265628ee83a31e99950553371f42f6995838795d44320c78497bf17ab04d1f26c49998944178e4e2416f6f0a580bbca3e272114ee597ae9f3c128b47 + languageName: node + linkType: hard + "mock-local-storage@npm:^1.1.17": version: 1.1.17 resolution: "mock-local-storage@npm:1.1.17" @@ -25077,6 +26192,20 @@ __metadata: languageName: node linkType: hard +"motion@npm:10.16.2": + version: 10.16.2 + resolution: "motion@npm:10.16.2" + dependencies: + "@motionone/animation": ^10.15.1 + "@motionone/dom": ^10.16.2 + "@motionone/svelte": ^10.16.2 + "@motionone/types": ^10.15.1 + "@motionone/utils": ^10.15.1 + "@motionone/vue": ^10.16.2 + checksum: 0b91256808c2374d8b7f4ac5e7ed513f2ca8df2b7d1be4fbc00ec5baece5162ada648aedaa5bc1d60be9ad2e6c9bc1d3bb160333051c20ab79e241b8e02e3c92 + languageName: node + linkType: hard + "mri@npm:^1.1.0, mri@npm:^1.2.0": version: 1.2.0 resolution: "mri@npm:1.2.0" @@ -25207,6 +26336,13 @@ __metadata: languageName: node linkType: hard +"napi-wasm@npm:^1.1.0": + version: 1.1.0 + resolution: "napi-wasm@npm:1.1.0" + checksum: 649a5d03477b89ee75cd8d7be5404daa5c889915640fd4ab042f2d38d265e961f86933e83982388d72c8b0a3952f36f099b96598ea88210205519ec2adc41d8d + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -25343,6 +26479,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^7.0.0": + version: 7.1.0 + resolution: "node-addon-api@npm:7.1.0" + dependencies: + node-gyp: latest + checksum: 26640c8d2ed7e2059e2ed65ee79e2a195306b3f1fc27ad11448943ba91d37767bd717a9a0453cc97e83a1109194dced8336a55f8650000458ef625c0b8b5e3df + languageName: node + linkType: hard + "node-cron@npm:^3.0.2": version: 3.0.2 resolution: "node-cron@npm:3.0.2" @@ -25384,6 +26529,13 @@ __metadata: languageName: node linkType: hard +"node-fetch-native@npm:^1.4.0, node-fetch-native@npm:^1.4.1, node-fetch-native@npm:^1.6.1": + version: 1.6.1 + resolution: "node-fetch-native@npm:1.6.1" + checksum: 1a248ada34561ce1010f09ca81cf5cd9c834b51aec957e82b6811d673e209a44630a835da599f0dd0c3d927f15c5f864d6ed494093c4a42601609f988d5919f2 + languageName: node + linkType: hard + "node-fetch@npm:2.6.1": version: 2.6.1 resolution: "node-fetch@npm:2.6.1" @@ -25414,6 +26566,20 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^2.6.12": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 + languageName: node + linkType: hard + "node-fetch@npm:^2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -25435,6 +26601,13 @@ __metadata: languageName: node linkType: hard +"node-forge@npm:^1.3.1": + version: 1.3.1 + resolution: "node-forge@npm:1.3.1" + checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 + languageName: node + linkType: hard + "node-gyp-build@npm:^4.2.0": version: 4.5.0 resolution: "node-gyp-build@npm:4.5.0" @@ -26195,6 +27368,31 @@ __metadata: languageName: node linkType: hard +"ofetch@npm:^1.3.3": + version: 1.3.3 + resolution: "ofetch@npm:1.3.3" + dependencies: + destr: ^2.0.1 + node-fetch-native: ^1.4.0 + ufo: ^1.3.0 + checksum: 945d757b25ba144f9f45d9de3382de743f0950e68e76726a4c0d2ef01456fa6700a6b102cc343a4e06f71d5ac59a8affdd9a673751c448f4265996f7f22ffa3d + languageName: node + linkType: hard + +"ohash@npm:^1.1.3": + version: 1.1.3 + resolution: "ohash@npm:1.1.3" + checksum: 44c7321cb950ce6e87d46584fd5cc8dd3dd15fcd4ade0ac2995d0497dc6b6b1ae9bd844c59af185d63923da5cfe9b37ae37a9dbd9ac455f3ad0cdfb5a73d5ef6 + languageName: node + linkType: hard + +"on-exit-leak-free@npm:^0.2.0": + version: 0.2.0 + resolution: "on-exit-leak-free@npm:0.2.0" + checksum: d22b0f0538069110626b578db6e68b6ee0e85b1ee9cc5ef9b4de1bba431431d6a8da91a61e09d2ad46f22a96f968e5237833cb9d0b69bc4d294f7ec82f609b05 + languageName: node + linkType: hard + "on-finished@npm:2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -26929,6 +28127,13 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^1.1.1, pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 + languageName: node + linkType: hard + "pbkdf2@npm:^3.0.17, pbkdf2@npm:^3.0.3": version: 3.1.2 resolution: "pbkdf2@npm:3.1.2" @@ -27041,6 +28246,44 @@ __metadata: languageName: node linkType: hard +"pino-abstract-transport@npm:v0.5.0": + version: 0.5.0 + resolution: "pino-abstract-transport@npm:0.5.0" + dependencies: + duplexify: ^4.1.2 + split2: ^4.0.0 + checksum: c503f867de3189f8217ab9cf794e8a631dddd0029a829f0f985f5511308152ebd53e363764fbc5570b3d1c715b341e3923456ce16ad84cd41be2b9a074ada234 + languageName: node + linkType: hard + +"pino-std-serializers@npm:^4.0.0": + version: 4.0.0 + resolution: "pino-std-serializers@npm:4.0.0" + checksum: 89d487729b58c9d3273a0ee851ead068d6d2e2ccc1af8e1c1d28f1b3442423679bec7ec04d9a2aba36f94f335e82be9f4de19dc4fbc161e71c136aaa15b85ad3 + languageName: node + linkType: hard + +"pino@npm:7.11.0": + version: 7.11.0 + resolution: "pino@npm:7.11.0" + dependencies: + atomic-sleep: ^1.0.0 + fast-redact: ^3.0.0 + on-exit-leak-free: ^0.2.0 + pino-abstract-transport: v0.5.0 + pino-std-serializers: ^4.0.0 + process-warning: ^1.0.0 + quick-format-unescaped: ^4.0.3 + real-require: ^0.1.0 + safe-stable-stringify: ^2.1.0 + sonic-boom: ^2.2.1 + thread-stream: ^0.15.1 + bin: + pino: bin.js + checksum: b919e7dbe41de978bb050dcef94fd687c012eb78d344a18f75f04ce180d5810fc162be1f136722d70cd005ed05832c4023a38b9acbc1076ae63c9f5ec5ca515c + languageName: node + linkType: hard + "pioneer@workspace:.": version: 0.0.0-use.local resolution: "pioneer@workspace:." @@ -27104,6 +28347,17 @@ __metadata: languageName: node linkType: hard +"pkg-types@npm:^1.0.3": + version: 1.0.3 + resolution: "pkg-types@npm:1.0.3" + dependencies: + jsonc-parser: ^3.2.0 + mlly: ^1.2.0 + pathe: ^1.1.0 + checksum: 4b305c834b912ddcc8a0fe77530c0b0321fe340396f84cbb87aecdbc126606f47f2178f23b8639e71a4870f9631c7217aef52ffed0ae17ea2dbbe7e43d116a6e + languageName: node + linkType: hard + "playwright-core@npm:1.35.0, playwright-core@npm:>=1.2.0": version: 1.35.0 resolution: "playwright-core@npm:1.35.0" @@ -27131,6 +28385,13 @@ __metadata: languageName: node linkType: hard +"pngjs@npm:^5.0.0": + version: 5.0.0 + resolution: "pngjs@npm:5.0.0" + checksum: 04e912cc45fb9601564e2284efaf0c5d20d131d9b596244f8a6789fc6cdb6b18d2975a6bbf7a001858d7e159d5c5c5dd7b11592e97629b7137f7f5cef05904c8 + languageName: node + linkType: hard + "pnglib@npm:0.0.1": version: 0.0.1 resolution: "pnglib@npm:0.0.1" @@ -27918,6 +29179,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^1.0.0": + version: 1.0.0 + resolution: "process-warning@npm:1.0.0" + checksum: c708a03241deec3cabaeee39c4f9ee8c4d71f1c5ef9b746c8252cdb952a6059068cfcdaf348399775244cbc441b6ae5e26a9c87ed371f88335d84f26d19180f9 + languageName: node + linkType: hard + "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -28099,6 +29367,13 @@ __metadata: languageName: node linkType: hard +"proxy-compare@npm:2.5.1": + version: 2.5.1 + resolution: "proxy-compare@npm:2.5.1" + checksum: c7cc151ac255150bcb24becde6495b3e399416c31991af377ce082255b51f07eaeb5d861bf8bf482703e92f88b90a5892ad57d3153ea29450d03ef921683d9fa + languageName: node + linkType: hard + "proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" @@ -28243,6 +29518,20 @@ __metadata: languageName: node linkType: hard +"qrcode@npm:1.5.3": + version: 1.5.3 + resolution: "qrcode@npm:1.5.3" + dependencies: + dijkstrajs: ^1.0.1 + encode-utf8: ^1.0.3 + pngjs: ^5.0.0 + yargs: ^15.3.1 + bin: + qrcode: bin/qrcode + checksum: 9a8a20a0a9cb1d15de8e7b3ffa214e8b6d2a8b07655f25bd1b1d77f4681488f84d7bae569870c0652872d829d5f8ac4922c27a6bd14c13f0e197bf07b28dead7 + languageName: node + linkType: hard + "qs@npm:6.11.0": version: 6.11.0 resolution: "qs@npm:6.11.0" @@ -28268,6 +29557,18 @@ __metadata: languageName: node linkType: hard +"query-string@npm:7.1.3": + version: 7.1.3 + resolution: "query-string@npm:7.1.3" + dependencies: + decode-uri-component: ^0.2.2 + filter-obj: ^1.1.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: 91af02dcd9cc9227a052841d5c2eecb80a0d6489d05625df506a097ef1c59037cfb5e907f39b84643cbfd535c955abec3e553d0130a7b510120c37d06e0f4346 + languageName: node + linkType: hard + "querystring@npm:0.2.0": version: 0.2.0 resolution: "querystring@npm:0.2.0" @@ -28282,6 +29583,13 @@ __metadata: languageName: node linkType: hard +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd + languageName: node + linkType: hard + "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" @@ -28296,6 +29604,13 @@ __metadata: languageName: node linkType: hard +"radix3@npm:^1.1.0": + version: 1.1.0 + resolution: "radix3@npm:1.1.0" + checksum: e5e6ed8fcf68be4d124bca4f7da7ba0fc7c5b6f9e98bc3f4424459c45d50f1f92506c5f7f8421b5cfee5823c524a4a2cef416053e88845813ce9fc9c7086729a + languageName: node + linkType: hard + "ramda@npm:0.29.0": version: 0.29.0 resolution: "ramda@npm:0.29.0" @@ -28948,6 +30263,13 @@ __metadata: languageName: node linkType: hard +"real-require@npm:^0.1.0": + version: 0.1.0 + resolution: "real-require@npm:0.1.0" + checksum: 96745583ed4f82cd5c6a6af012fd1d3c6fc2f13ae1bcff1a3c4f8094696013a1a07c82c5aa66a403d7d4f84949fc2203bc927c7ad120caad125941ca2d7e5e8e + languageName: node + linkType: hard + "recast@npm:^0.21.0": version: 0.21.5 resolution: "recast@npm:0.21.5" @@ -29010,6 +30332,22 @@ __metadata: languageName: node linkType: hard +"redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": + version: 1.2.0 + resolution: "redis-errors@npm:1.2.0" + checksum: f28ac2692113f6f9c222670735aa58aeae413464fd58ccf3fce3f700cae7262606300840c802c64f2b53f19f65993da24dc918afc277e9e33ac1ff09edb394f4 + languageName: node + linkType: hard + +"redis-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "redis-parser@npm:3.0.0" + dependencies: + redis-errors: ^1.0.0 + checksum: 89290ae530332f2ae37577647fa18208d10308a1a6ba750b9d9a093e7398f5e5253f19855b64c98757f7129cccce958e4af2573fdc33bad41405f87f1943459a + languageName: node + linkType: hard + "regenerate-unicode-properties@npm:^10.1.0": version: 10.1.0 resolution: "regenerate-unicode-properties@npm:10.1.0" @@ -29746,6 +31084,13 @@ __metadata: languageName: node linkType: hard +"safe-stable-stringify@npm:^2.1.0": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -30656,6 +32001,15 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:^2.2.1": + version: 2.8.0 + resolution: "sonic-boom@npm:2.8.0" + dependencies: + atomic-sleep: ^1.0.0 + checksum: c7f9c89f931d7f60f8e0741551a729f0d81e6dc407a99420fc847a9a4c25af048a615b1188ab3c4f1fb3708fe4904973ddab6ebcc8ed5b78b50ab81a99045910 + languageName: node + linkType: hard + "source-list-map@npm:^2.0.0, source-list-map@npm:^2.0.1": version: 2.0.1 resolution: "source-list-map@npm:2.0.1" @@ -30849,6 +32203,13 @@ __metadata: languageName: node linkType: hard +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 + languageName: node + linkType: hard + "split-string@npm:^3.0.1, split-string@npm:^3.0.2": version: 3.1.0 resolution: "split-string@npm:3.1.0" @@ -30949,6 +32310,13 @@ __metadata: languageName: node linkType: hard +"standard-as-callback@npm:^2.1.0": + version: 2.1.0 + resolution: "standard-as-callback@npm:2.1.0" + checksum: 88bec83ee220687c72d94fd86a98d5272c91d37ec64b66d830dbc0d79b62bfa6e47f53b71646011835fc9ce7fae62739545d13124262b53be4fbb3e2ebad551c + languageName: node + linkType: hard + "static-eval@npm:2.0.2": version: 2.0.2 resolution: "static-eval@npm:2.0.2" @@ -30982,6 +32350,13 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.7.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 4f489d13ff2ab838c9acd4ed6b786b51aa52ecacdfeaefe9275fcb220ff2ac80c6e95674723508fd29850a694569563a8caaaea738eb82ca16429b3a0b50e510 + languageName: node + linkType: hard + "stop-iteration-iterator@npm:^1.0.0": version: 1.0.0 resolution: "stop-iteration-iterator@npm:1.0.0" @@ -31051,6 +32426,13 @@ __metadata: languageName: node linkType: hard +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 + languageName: node + linkType: hard + "string-argv@npm:^0.3.1": version: 0.3.1 resolution: "string-argv@npm:0.3.1" @@ -31604,6 +32986,13 @@ __metadata: languageName: node linkType: hard +"system-architecture@npm:^0.1.0": + version: 0.1.0 + resolution: "system-architecture@npm:0.1.0" + checksum: ca0dd793c45c354ab57dd7fc8ce7dc9923a6e07382bd3b22eb5b08f55ddb0217c390d00767549c5155fd4ce7ef23ffdd8cfb33dd4344cbbd37837d085a50f6f0 + languageName: node + linkType: hard + "tailwindcss@npm:3.2.7": version: 3.2.7 resolution: "tailwindcss@npm:3.2.7" @@ -31928,6 +33317,15 @@ __metadata: languageName: node linkType: hard +"thread-stream@npm:^0.15.1": + version: 0.15.2 + resolution: "thread-stream@npm:0.15.2" + dependencies: + real-require: ^0.1.0 + checksum: 0547795a8f357ba1ac0dba29c71f965182e29e21752951a04a7167515ee37524bfba6c410f31e65a01a8d3e5b93400b812889aa09523e38ce4d744c894ffa6c0 + languageName: node + linkType: hard + "throat@npm:^4.0.0, throat@npm:^4.1.0": version: 4.1.0 resolution: "throat@npm:4.1.0" @@ -32457,7 +33855,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.8.1, tslib@npm:^1.9.0": +"tslib@npm:1.14.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd @@ -32791,6 +34189,13 @@ __metadata: languageName: node linkType: hard +"ufo@npm:^1.3.0, ufo@npm:^1.3.1, ufo@npm:^1.3.2": + version: 1.3.2 + resolution: "ufo@npm:1.3.2" + checksum: f1180bb715ff4dd46152fd4dec41c731e84d7b9eaf1432548a0210b2f7e0cd29de125ac88e582c6a079d8ae5bc9ab04ef2bdbafe125086480b10c1006b81bfce + languageName: node + linkType: hard + "uglify-js@npm:^3.1.4": version: 3.17.4 resolution: "uglify-js@npm:3.17.4" @@ -32800,7 +34205,7 @@ __metadata: languageName: node linkType: hard -"uint8arrays@npm:^3.0.0": +"uint8arrays@npm:^3.0.0, uint8arrays@npm:^3.1.0": version: 3.1.1 resolution: "uint8arrays@npm:3.1.1" dependencies: @@ -32840,6 +34245,13 @@ __metadata: languageName: node linkType: hard +"uncrypto@npm:^0.1.3": + version: 0.1.3 + resolution: "uncrypto@npm:0.1.3" + checksum: 07160e08806dd6cea16bb96c3fd54cd70fc801e02fc3c6f86980144d15c9ebbd1c55587f7280a207b3af6cd34901c0d0b77ada5a02c2f7081a033a05acf409e2 + languageName: node + linkType: hard + "undefsafe@npm:^2.0.5": version: 2.0.5 resolution: "undefsafe@npm:2.0.5" @@ -32861,6 +34273,19 @@ __metadata: languageName: node linkType: hard +"unenv@npm:^1.9.0": + version: 1.9.0 + resolution: "unenv@npm:1.9.0" + dependencies: + consola: ^3.2.3 + defu: ^6.1.3 + mime: ^3.0.0 + node-fetch-native: ^1.6.1 + pathe: ^1.1.1 + checksum: 4cfbeedee1436e7f417d655c521e4c6220228f5b96afff90b5253d4504282c6de5acdd982aa51c977ce38d21d7692a33d10fc857166b3488655ff29c3bb754a2 + languageName: node + linkType: hard + "unfetch@npm:^4.2.0": version: 4.2.0 resolution: "unfetch@npm:4.2.0" @@ -33194,6 +34619,63 @@ __metadata: languageName: node linkType: hard +"unstorage@npm:^1.9.0": + version: 1.10.1 + resolution: "unstorage@npm:1.10.1" + dependencies: + anymatch: ^3.1.3 + chokidar: ^3.5.3 + destr: ^2.0.2 + h3: ^1.8.2 + ioredis: ^5.3.2 + listhen: ^1.5.5 + lru-cache: ^10.0.2 + mri: ^1.2.0 + node-fetch-native: ^1.4.1 + ofetch: ^1.3.3 + ufo: ^1.3.1 + peerDependencies: + "@azure/app-configuration": ^1.4.1 + "@azure/cosmos": ^4.0.0 + "@azure/data-tables": ^13.2.2 + "@azure/identity": ^3.3.2 + "@azure/keyvault-secrets": ^4.7.0 + "@azure/storage-blob": ^12.16.0 + "@capacitor/preferences": ^5.0.6 + "@netlify/blobs": ^6.2.0 + "@planetscale/database": ^1.11.0 + "@upstash/redis": ^1.23.4 + "@vercel/kv": ^0.2.3 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@netlify/blobs": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/kv": + optional: true + idb-keyval: + optional: true + checksum: 59dc9f21d25df2bc8d14e3965235cbb85e3e2e8cb332da70ca471ba4519269a06936eba4012916251f3b88e23176df44b64abb826202a3a3c9d0a185bfe5e500 + languageName: node + linkType: hard + "untildify@npm:^4.0.0": version: 4.0.0 resolution: "untildify@npm:4.0.0" @@ -33201,6 +34683,19 @@ __metadata: languageName: node linkType: hard +"untun@npm:^0.1.3": + version: 0.1.3 + resolution: "untun@npm:0.1.3" + dependencies: + citty: ^0.1.5 + consola: ^3.2.3 + pathe: ^1.1.1 + bin: + untun: bin/untun.mjs + checksum: ad886c242dbac250f88ef6f18ad780fa084d07e4d030ab5ceacfe4378aa4bf2d3549b8ed8352bad5776facd9aaee05e3f914c661adc11bace867e2a12fd7bee5 + languageName: node + linkType: hard + "unzipper@npm:^0.10.11": version: 0.10.14 resolution: "unzipper@npm:0.10.14" @@ -33251,6 +34746,13 @@ __metadata: languageName: node linkType: hard +"uqr@npm:^0.1.2": + version: 0.1.2 + resolution: "uqr@npm:0.1.2" + checksum: 717766f03814172f5a9934dae2c4c48f6de065a4fd7da82aa513bd8300b621c1e606efdd174478cab79093e5ba244a99f0c0b1b0b9c0175656ab5e637a006d92 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -33354,6 +34856,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:1.2.0": + version: 1.2.0 + resolution: "use-sync-external-store@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 5c639e0f8da3521d605f59ce5be9e094ca772bd44a4ce7322b055a6f58eeed8dda3c94cabd90c7a41fb6fa852210092008afe48f7038792fd47501f33299116a + languageName: node + linkType: hard + "use@npm:^3.1.0": version: 3.1.1 resolution: "use@npm:3.1.1" @@ -33521,6 +35032,24 @@ __metadata: languageName: node linkType: hard +"valtio@npm:1.11.2": + version: 1.11.2 + resolution: "valtio@npm:1.11.2" + dependencies: + proxy-compare: 2.5.1 + use-sync-external-store: 1.2.0 + peerDependencies: + "@types/react": ">=16.8" + react: ">=16.8" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + checksum: cce2d9212aac9fc4bdeba2d381188cc831cfe8d2d03039024cfcd58ba1801f2a5b14d01c2bb21a2c9f12046d2ede64f1dd887175185f39bee553677a35592c30 + languageName: node + linkType: hard + "value-equal@npm:^1.0.1": version: 1.0.1 resolution: "value-equal@npm:1.0.1" @@ -34369,6 +35898,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7.5.1": + version: 7.5.9 + resolution: "ws@npm:7.5.9" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: c3c100a181b731f40b7f2fddf004aa023f79d64f489706a28bc23ff88e87f6a64b3c6651fbec3a84a53960b75159574d7a7385709847a62ddb7ad6af76f49138 + languageName: node + linkType: hard + "ws@npm:^8.1.0, ws@npm:^8.2.3": version: 8.3.0 resolution: "ws@npm:8.3.0"