From d09aa937dae8cbea9aefc5f596c79061f4522641 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Sun, 18 Aug 2024 21:06:22 -0700 Subject: [PATCH 01/14] onboarding metadata for quick sync --- apps/extension/src/hooks/full-sync-height.ts | 11 +++++++ .../page/onboarding/set-grpc-endpoint.tsx | 14 ++++++++- .../src/routes/page/onboarding/start.tsx | 13 ++++++-- apps/extension/src/storage/local.ts | 2 ++ apps/extension/src/storage/types.ts | 2 ++ apps/extension/src/utils/test-constants.ts | 1 + apps/extension/src/wallet-services.ts | 31 ++++++++++++++----- packages/context/src/index.ts | 17 +++++++--- 8 files changed, 77 insertions(+), 14 deletions(-) diff --git a/apps/extension/src/hooks/full-sync-height.ts b/apps/extension/src/hooks/full-sync-height.ts index cf56f7cf..0097bb1c 100644 --- a/apps/extension/src/hooks/full-sync-height.ts +++ b/apps/extension/src/hooks/full-sync-height.ts @@ -55,3 +55,14 @@ export const useSyncProgress = () => { return { latestBlockHeight, fullSyncHeight, error }; }; + +export const fetchBlockHeight = async (grpcEndpoint: string) => { + const tendermintClient = createPromiseClient( + TendermintProxyService, + createGrpcWebTransport({ baseUrl: grpcEndpoint }), + ); + const blockHeight = (await tendermintClient.getStatus({}).catch(() => undefined))?.syncInfo + ?.latestBlockHeight; + + return blockHeight ? Number(blockHeight) : undefined; +}; diff --git a/apps/extension/src/routes/page/onboarding/set-grpc-endpoint.tsx b/apps/extension/src/routes/page/onboarding/set-grpc-endpoint.tsx index fc7d400f..5d96b7cb 100644 --- a/apps/extension/src/routes/page/onboarding/set-grpc-endpoint.tsx +++ b/apps/extension/src/routes/page/onboarding/set-grpc-endpoint.tsx @@ -3,11 +3,23 @@ import { FadeTransition } from '@repo/ui/components/ui/fade-transition'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; import { GrpcEndpointForm } from '../../../shared/components/grpc-endpoint-form'; +import { localExtStorage } from '../../../storage/local'; +import { fetchBlockHeight } from '../../../hooks/full-sync-height'; export const SetGrpcEndpoint = () => { const navigate = usePageNav(); - const onSuccess = (): void => { + const onSuccess = async (): Promise => { + const grpcEndpoint = await localExtStorage.get('grpcEndpoint'); + + if (grpcEndpoint) { + // Fetch the block height after setting the gRPC endpoint + const walletCreationBlockHeight = await fetchBlockHeight(grpcEndpoint); + + // Store the wallet creation block height in local storage + await localExtStorage.set('walletCreationBlockHeight', walletCreationBlockHeight!); + } + navigate(PagePath.SET_DEFAULT_FRONTEND); }; diff --git a/apps/extension/src/routes/page/onboarding/start.tsx b/apps/extension/src/routes/page/onboarding/start.tsx index 7ef621d0..5a638fa6 100644 --- a/apps/extension/src/routes/page/onboarding/start.tsx +++ b/apps/extension/src/routes/page/onboarding/start.tsx @@ -9,6 +9,7 @@ import { import { FadeTransition } from '@repo/ui/components/ui/fade-transition'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; +import { localExtStorage } from '../../../storage/local'; export const OnboardingStart = () => { const navigate = usePageNav(); @@ -28,14 +29,22 @@ export const OnboardingStart = () => { diff --git a/apps/extension/src/storage/local.ts b/apps/extension/src/storage/local.ts index a0cd0753..59d0fbc7 100644 --- a/apps/extension/src/storage/local.ts +++ b/apps/extension/src/storage/local.ts @@ -11,6 +11,8 @@ export const localDefaults: ExtensionStorageDefaults = { passwordKeyPrint: undefined, frontendUrl: undefined, numeraires: [], + isFreshWallet: false, + walletCreationBlockHeight: 0, }; // Meant to be used for long-term persisted data. It is cleared when the extension is removed. diff --git a/apps/extension/src/storage/types.ts b/apps/extension/src/storage/types.ts index 3935de94..15249ffe 100644 --- a/apps/extension/src/storage/types.ts +++ b/apps/extension/src/storage/types.ts @@ -25,4 +25,6 @@ export interface LocalStorageState { knownSites: OriginRecord[]; params: Stringified | undefined; numeraires: Stringified[]; + isFreshWallet?: boolean; + walletCreationBlockHeight?: number; } diff --git a/apps/extension/src/utils/test-constants.ts b/apps/extension/src/utils/test-constants.ts index 11858f10..1d54d63d 100644 --- a/apps/extension/src/utils/test-constants.ts +++ b/apps/extension/src/utils/test-constants.ts @@ -13,4 +13,5 @@ export const localTestDefaults: LocalStorageState = { passwordKeyPrint: undefined, frontendUrl: EXAMPLE_MINIFRONT_URL, numeraires: [], + walletCreationBlockHeight: 0, }; diff --git a/apps/extension/src/wallet-services.ts b/apps/extension/src/wallet-services.ts index 35184b5d..7d168361 100644 --- a/apps/extension/src/wallet-services.ts +++ b/apps/extension/src/wallet-services.ts @@ -16,13 +16,30 @@ export const startWalletServices = async () => { const grpcEndpoint = await onboardGrpcEndpoint(); const numeraires = await localExtStorage.get('numeraires'); - const services = new Services({ - grpcEndpoint, - chainId: await getChainId(grpcEndpoint), - walletId: WalletId.fromJsonString(wallet.id), - fullViewingKey: FullViewingKey.fromJsonString(wallet.fullViewingKey), - numeraires: numeraires.map(n => AssetId.fromJsonString(n)), - }); + // Retrieve the wallet flag from storage + const isFreshWallet = (await localExtStorage.get('isFreshWallet')) || false; + + let walletCreationBlockHeight; + + // Wait until walletCreationBlockHeight is set + while (!walletCreationBlockHeight) { + walletCreationBlockHeight = await localExtStorage.get('walletCreationBlockHeight'); + if (!walletCreationBlockHeight) { + await new Promise(resolve => setTimeout(resolve, 500)); // Wait 500ms before checking again + } + } + + const services = new Services( + { + grpcEndpoint, + chainId: await getChainId(grpcEndpoint), + walletId: WalletId.fromJsonString(wallet.id), + fullViewingKey: FullViewingKey.fromJsonString(wallet.fullViewingKey), + numeraires: numeraires.map(n => AssetId.fromJsonString(n)), + walletCreationBlockHeight: walletCreationBlockHeight!, + }, + isFreshWallet, + ); const { blockProcessor, indexedDb } = await services.getWalletServices(); void syncLastBlockToStorage({ indexedDb }); diff --git a/packages/context/src/index.ts b/packages/context/src/index.ts index 4d1825b7..c8835b4d 100644 --- a/packages/context/src/index.ts +++ b/packages/context/src/index.ts @@ -15,12 +15,16 @@ export interface ServicesConfig { readonly walletId: WalletId; readonly fullViewingKey: FullViewingKey; readonly numeraires: AssetId[]; + readonly walletCreationBlockHeight: number; } export class Services implements ServicesInterface { private walletServicesPromise: Promise | undefined; - constructor(private config: ServicesConfig) {} + constructor( + private config: ServicesConfig, + private isFreshWallet: boolean, + ) { } // If getWalletServices() is called multiple times concurrently, they'll all // wait for the same promise rather than each starting their own @@ -28,13 +32,18 @@ export class Services implements ServicesInterface { public async getWalletServices(): Promise { if (!this.walletServicesPromise) { this.walletServicesPromise = this.initializeWalletServices().catch((e: unknown) => { - // If promise rejected, reset promise to `undefined` so next caller can - // try again + // If promise rejected, reset promise to `undefined` so next caller can try again. this.walletServicesPromise = undefined; throw e; }); } - void this.walletServicesPromise.then(({ blockProcessor }) => blockProcessor.sync()); + + void this.walletServicesPromise.then(({ blockProcessor }) => + this.isFreshWallet && this.config.walletCreationBlockHeight + ? blockProcessor.sync(this.isFreshWallet, this.config.walletCreationBlockHeight) + : blockProcessor.sync(), + ); + return this.walletServicesPromise; } From 5cf09467aec22ff9352e4984f9b8158f04d60a85 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Wed, 28 Aug 2024 22:15:06 -0700 Subject: [PATCH 02/14] wallet birthday --- .../src/routes/page/onboarding/generate.tsx | 78 ++++++++++++++++++- .../src/routes/page/onboarding/height.tsx | 64 +++++++++++++++ .../src/routes/page/onboarding/import.tsx | 2 +- .../src/routes/page/onboarding/routes.tsx | 5 ++ .../page/onboarding/set-grpc-endpoint.tsx | 15 +--- .../src/routes/page/onboarding/start.tsx | 13 +--- apps/extension/src/routes/page/paths.ts | 1 + apps/extension/src/storage/local.ts | 1 - apps/extension/src/storage/types.ts | 1 - apps/extension/src/wallet-services.ts | 33 +++----- packages/context/src/index.ts | 22 +++--- 11 files changed, 170 insertions(+), 65 deletions(-) create mode 100644 apps/extension/src/routes/page/onboarding/height.tsx diff --git a/apps/extension/src/routes/page/onboarding/generate.tsx b/apps/extension/src/routes/page/onboarding/generate.tsx index 1be81121..42dae8af 100644 --- a/apps/extension/src/routes/page/onboarding/generate.tsx +++ b/apps/extension/src/routes/page/onboarding/generate.tsx @@ -1,6 +1,6 @@ import { ExclamationTriangleIcon, LockClosedIcon } from '@radix-ui/react-icons'; import { SeedPhraseLength } from '@penumbra-zone/crypto-web/mnemonic'; -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { Button } from '@repo/ui/components/ui/button'; import { BackIcon } from '@repo/ui/components/ui/icons/back-icon'; import { Card, CardContent, CardHeader, CardTitle } from '@repo/ui/components/ui/card'; @@ -14,20 +14,74 @@ import { generateSelector } from '../../../state/seed-phrase/generate'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; import { WordLengthToogles } from '../../../shared/containers/word-length-toogles'; +import { ChainRegistryClient } from '@penumbra-labs/registry'; +import { fetchBlockHeight } from '../../../hooks/full-sync-height'; +import { localExtStorage } from '../../../storage/local'; +import { sample } from 'lodash'; + +const fetchBlockHeightWithFallback = async (endpoints: string[]): Promise => { + if (endpoints.length === 0) { + throw new Error('All RPC endpoints failed to fetch the block height.'); + } + + // Randomly select an rpc endpoint from the chain registry + const randomEndpoint = sample(endpoints); + + try { + const walletCreationBlockHeight = await fetchBlockHeight(randomEndpoint!); + if (walletCreationBlockHeight !== undefined) { + return walletCreationBlockHeight; + } else { + // Remove the current endpoint from the list and try again + const remainingEndpoints = endpoints.filter(endpoint => endpoint !== randomEndpoint); + return fetchBlockHeightWithFallback(remainingEndpoints); + } + } catch (error) { + const remainingEndpoints = endpoints.filter(endpoint => endpoint !== randomEndpoint); + return fetchBlockHeightWithFallback(remainingEndpoints); + } +}; export const GenerateSeedPhrase = () => { const navigate = usePageNav(); const { phrase, generateRandomSeedPhrase } = useStore(generateSelector); const [count, { startCountdown }] = useCountdown({ countStart: 3 }); const [reveal, setReveal] = useState(false); + const [blockHeight, setBlockHeight] = useState(null); + + // On render, generate a new seed phrase. + // Fetch data only once on the initial render. + const isFetchedRef = useRef(false); - // On render, generate a new seed phrase useEffect(() => { + const fetchData = async () => { + if (isFetchedRef.current) { + return; + } + + try { + const chainRegistryClient = new ChainRegistryClient(); + const { rpcs } = chainRegistryClient.bundled.globals(); + + const suggestedEndpoints = rpcs.map(i => i!.url); + const blockHeight = await fetchBlockHeightWithFallback(suggestedEndpoints); + localExtStorage.set('walletCreationBlockHeight', blockHeight); + setBlockHeight(blockHeight ?? null); + + isFetchedRef.current = true; + } catch (error) { + console.error('Error fetching data:', error); + } + }; + if (!phrase.length) { generateRandomSeedPhrase(SeedPhraseLength.TWELVE_WORDS); } startCountdown(); - }, [generateRandomSeedPhrase, phrase.length, startCountdown]); + + // Fetch RPCs and block height asynchronously + fetchData(); + }, [phrase.length, generateRandomSeedPhrase, startCountdown]); return ( @@ -60,6 +114,23 @@ export const GenerateSeedPhrase = () => { isSuccessCopyText /> + + {reveal && ( +
+

Important!

+

+ Block Height:{' '} + + {blockHeight !== null ? blockHeight : 'Loading...'} + +

+

+ Please save the wallet creation height along with your recovery passphrase. It will + help you restore your wallet more quickly! +

+
+ )} +

@@ -80,6 +151,7 @@ export const GenerateSeedPhrase = () => {

+ {reveal ? ( + + + +
+ ); +}; diff --git a/apps/extension/src/routes/page/onboarding/import.tsx b/apps/extension/src/routes/page/onboarding/import.tsx index 6e72de95..29d7ebf5 100644 --- a/apps/extension/src/routes/page/onboarding/import.tsx +++ b/apps/extension/src/routes/page/onboarding/import.tsx @@ -22,7 +22,7 @@ export const ImportSeedPhrase = () => { const handleSubmit = (event: MouseEvent | FormEvent) => { event.preventDefault(); - navigate(PagePath.SET_PASSWORD); + navigate(PagePath.IMPORT_WALLET_CREATION_HEIGHT); }; return ( diff --git a/apps/extension/src/routes/page/onboarding/routes.tsx b/apps/extension/src/routes/page/onboarding/routes.tsx index 05d1726b..f4bf9b2c 100644 --- a/apps/extension/src/routes/page/onboarding/routes.tsx +++ b/apps/extension/src/routes/page/onboarding/routes.tsx @@ -9,6 +9,7 @@ import { pageIndexLoader } from '..'; import { SetGrpcEndpoint } from './set-grpc-endpoint'; import { SetDefaultFrontendPage } from './default-frontend'; import { SetNumerairesPage } from './set-numeraire'; +import { ImportWalletCreationHeight } from './height'; export const onboardingRoutes = [ { @@ -27,6 +28,10 @@ export const onboardingRoutes = [ path: PagePath.IMPORT_SEED_PHRASE, element: , }, + { + path: PagePath.IMPORT_WALLET_CREATION_HEIGHT, + element: , + }, { path: PagePath.SET_PASSWORD, element: , diff --git a/apps/extension/src/routes/page/onboarding/set-grpc-endpoint.tsx b/apps/extension/src/routes/page/onboarding/set-grpc-endpoint.tsx index 5d96b7cb..61f6ba36 100644 --- a/apps/extension/src/routes/page/onboarding/set-grpc-endpoint.tsx +++ b/apps/extension/src/routes/page/onboarding/set-grpc-endpoint.tsx @@ -3,23 +3,11 @@ import { FadeTransition } from '@repo/ui/components/ui/fade-transition'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; import { GrpcEndpointForm } from '../../../shared/components/grpc-endpoint-form'; -import { localExtStorage } from '../../../storage/local'; -import { fetchBlockHeight } from '../../../hooks/full-sync-height'; export const SetGrpcEndpoint = () => { const navigate = usePageNav(); - const onSuccess = async (): Promise => { - const grpcEndpoint = await localExtStorage.get('grpcEndpoint'); - - if (grpcEndpoint) { - // Fetch the block height after setting the gRPC endpoint - const walletCreationBlockHeight = await fetchBlockHeight(grpcEndpoint); - - // Store the wallet creation block height in local storage - await localExtStorage.set('walletCreationBlockHeight', walletCreationBlockHeight!); - } - + const onSuccess = (): void => { navigate(PagePath.SET_DEFAULT_FRONTEND); }; @@ -28,7 +16,6 @@ export const SetGrpcEndpoint = () => { Select your preferred RPC endpoint - The requests you make may reveal your intentions about transactions you wish to make, so select an RPC node that you trust. If you're unsure which one to choose, leave this diff --git a/apps/extension/src/routes/page/onboarding/start.tsx b/apps/extension/src/routes/page/onboarding/start.tsx index 5a638fa6..7ef621d0 100644 --- a/apps/extension/src/routes/page/onboarding/start.tsx +++ b/apps/extension/src/routes/page/onboarding/start.tsx @@ -9,7 +9,6 @@ import { import { FadeTransition } from '@repo/ui/components/ui/fade-transition'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; -import { localExtStorage } from '../../../storage/local'; export const OnboardingStart = () => { const navigate = usePageNav(); @@ -29,22 +28,14 @@ export const OnboardingStart = () => { diff --git a/apps/extension/src/routes/page/paths.ts b/apps/extension/src/routes/page/paths.ts index a501389c..d6bfe892 100644 --- a/apps/extension/src/routes/page/paths.ts +++ b/apps/extension/src/routes/page/paths.ts @@ -4,6 +4,7 @@ export enum PagePath { GENERATE_SEED_PHRASE = '/welcome/generate', CONFIRM_BACKUP = '/welcome/confirm-backup', IMPORT_SEED_PHRASE = '/welcome/import', + IMPORT_WALLET_CREATION_HEIGHT = '/welcome/set-wallet-creation-height', ONBOARDING_SUCCESS = '/welcome/success', SET_PASSWORD = '/welcome/set-password', SET_GRPC_ENDPOINT = '/welcome/set-grpc-endpoint', diff --git a/apps/extension/src/storage/local.ts b/apps/extension/src/storage/local.ts index 59d0fbc7..ec9ddd88 100644 --- a/apps/extension/src/storage/local.ts +++ b/apps/extension/src/storage/local.ts @@ -11,7 +11,6 @@ export const localDefaults: ExtensionStorageDefaults = { passwordKeyPrint: undefined, frontendUrl: undefined, numeraires: [], - isFreshWallet: false, walletCreationBlockHeight: 0, }; diff --git a/apps/extension/src/storage/types.ts b/apps/extension/src/storage/types.ts index 15249ffe..5f577862 100644 --- a/apps/extension/src/storage/types.ts +++ b/apps/extension/src/storage/types.ts @@ -25,6 +25,5 @@ export interface LocalStorageState { knownSites: OriginRecord[]; params: Stringified | undefined; numeraires: Stringified[]; - isFreshWallet?: boolean; walletCreationBlockHeight?: number; } diff --git a/apps/extension/src/wallet-services.ts b/apps/extension/src/wallet-services.ts index 7d168361..a6b30b99 100644 --- a/apps/extension/src/wallet-services.ts +++ b/apps/extension/src/wallet-services.ts @@ -16,30 +16,17 @@ export const startWalletServices = async () => { const grpcEndpoint = await onboardGrpcEndpoint(); const numeraires = await localExtStorage.get('numeraires'); - // Retrieve the wallet flag from storage - const isFreshWallet = (await localExtStorage.get('isFreshWallet')) || false; + // Retrieve the wallet creation height flag from storage + let walletCreationBlockHeight = await localExtStorage.get('walletCreationBlockHeight'); - let walletCreationBlockHeight; - - // Wait until walletCreationBlockHeight is set - while (!walletCreationBlockHeight) { - walletCreationBlockHeight = await localExtStorage.get('walletCreationBlockHeight'); - if (!walletCreationBlockHeight) { - await new Promise(resolve => setTimeout(resolve, 500)); // Wait 500ms before checking again - } - } - - const services = new Services( - { - grpcEndpoint, - chainId: await getChainId(grpcEndpoint), - walletId: WalletId.fromJsonString(wallet.id), - fullViewingKey: FullViewingKey.fromJsonString(wallet.fullViewingKey), - numeraires: numeraires.map(n => AssetId.fromJsonString(n)), - walletCreationBlockHeight: walletCreationBlockHeight!, - }, - isFreshWallet, - ); + const services = new Services({ + grpcEndpoint, + chainId: await getChainId(grpcEndpoint), + walletId: WalletId.fromJsonString(wallet.id), + fullViewingKey: FullViewingKey.fromJsonString(wallet.fullViewingKey), + numeraires: numeraires.map(n => AssetId.fromJsonString(n)), + walletCreationBlockHeight: walletCreationBlockHeight!, + }); const { blockProcessor, indexedDb } = await services.getWalletServices(); void syncLastBlockToStorage({ indexedDb }); diff --git a/packages/context/src/index.ts b/packages/context/src/index.ts index c8835b4d..b5dd4f47 100644 --- a/packages/context/src/index.ts +++ b/packages/context/src/index.ts @@ -21,10 +21,7 @@ export interface ServicesConfig { export class Services implements ServicesInterface { private walletServicesPromise: Promise | undefined; - constructor( - private config: ServicesConfig, - private isFreshWallet: boolean, - ) { } + constructor(private config: ServicesConfig) {} // If getWalletServices() is called multiple times concurrently, they'll all // wait for the same promise rather than each starting their own @@ -38,12 +35,7 @@ export class Services implements ServicesInterface { }); } - void this.walletServicesPromise.then(({ blockProcessor }) => - this.isFreshWallet && this.config.walletCreationBlockHeight - ? blockProcessor.sync(this.isFreshWallet, this.config.walletCreationBlockHeight) - : blockProcessor.sync(), - ); - + void this.walletServicesPromise.then(({ blockProcessor }) => blockProcessor.sync()); return this.walletServicesPromise; } @@ -92,7 +84,14 @@ export class Services implements ServicesInterface { } private async initializeWalletServices(): Promise { - const { chainId, grpcEndpoint, walletId, fullViewingKey, numeraires } = this.config; + const { + chainId, + grpcEndpoint, + walletId, + fullViewingKey, + numeraires, + walletCreationBlockHeight, + } = this.config; const querier = new RootQuerier({ grpcEndpoint }); const registryClient = new ChainRegistryClient(); const indexedDb = await IndexedDb.initialize({ @@ -127,6 +126,7 @@ export class Services implements ServicesInterface { indexedDb, stakingAssetId: registryClient.bundled.globals().stakingAssetId, numeraires: numeraires, + walletCreationBlockHeight: walletCreationBlockHeight, }); return { viewServer, blockProcessor, indexedDb, querier }; From ff05ea543b2a531d2dc206d510de15df5be19fc1 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Wed, 28 Aug 2024 22:33:18 -0700 Subject: [PATCH 03/14] linting --- .../src/routes/page/onboarding/generate.tsx | 14 +++++------ .../src/routes/page/onboarding/height.tsx | 25 +++++++++++++------ apps/extension/src/wallet-services.ts | 2 +- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/apps/extension/src/routes/page/onboarding/generate.tsx b/apps/extension/src/routes/page/onboarding/generate.tsx index 42dae8af..87f745b2 100644 --- a/apps/extension/src/routes/page/onboarding/generate.tsx +++ b/apps/extension/src/routes/page/onboarding/generate.tsx @@ -63,10 +63,10 @@ export const GenerateSeedPhrase = () => { const chainRegistryClient = new ChainRegistryClient(); const { rpcs } = chainRegistryClient.bundled.globals(); - const suggestedEndpoints = rpcs.map(i => i!.url); + const suggestedEndpoints = rpcs.map(i => i.url); const blockHeight = await fetchBlockHeightWithFallback(suggestedEndpoints); - localExtStorage.set('walletCreationBlockHeight', blockHeight); - setBlockHeight(blockHeight ?? null); + await localExtStorage.set('walletCreationBlockHeight', blockHeight); + setBlockHeight(blockHeight); isFetchedRef.current = true; } catch (error) { @@ -80,7 +80,7 @@ export const GenerateSeedPhrase = () => { startCountdown(); // Fetch RPCs and block height asynchronously - fetchData(); + void fetchData(); }, [phrase.length, generateRandomSeedPhrase, startCountdown]); return ( @@ -116,13 +116,11 @@ export const GenerateSeedPhrase = () => { {reveal && ( -
+

Important!

Block Height:{' '} - - {blockHeight !== null ? blockHeight : 'Loading...'} - + {blockHeight ?? 'Loading...'}

Please save the wallet creation height along with your recovery passphrase. It will diff --git a/apps/extension/src/routes/page/onboarding/height.tsx b/apps/extension/src/routes/page/onboarding/height.tsx index edceb95d..ecf9afb5 100644 --- a/apps/extension/src/routes/page/onboarding/height.tsx +++ b/apps/extension/src/routes/page/onboarding/height.tsx @@ -23,29 +23,38 @@ export const ImportWalletCreationHeight = () => { if (blockHeight) { // Save the block height to local extension storage - localExtStorage.set('walletCreationBlockHeight', Number(blockHeight)); + await localExtStorage.set('walletCreationBlockHeight', Number(blockHeight)); } - // Proceed to the next step in the onboarding process navigate(PagePath.SET_PASSWORD); }; + const handleClick = (event: MouseEvent | FormEvent) => { + handleSubmit(event).catch((error: unknown) => { + if (error instanceof Error) { + console.error('Error during submission:', error.message); + } else { + console.error('Unexpected error:', error); + } + }); + }; + return ( navigate(-1)} /> - + Enter Block Height When the Wallet Was Created (Optional) - This step is optional. Providing your wallet's block creation height can help speed up - the synchronization process, but it's not required. If you don't have this information, - you can safely skip this step. + This step is optional. Providing your wallet's block creation height can help speed + up the synchronization process, but it's not required. If you don't have this + information, you can safely skip this step. -

+ { onChange={e => setBlockHeight(e.target.value)} className='text-[15px] font-normal leading-[22px]' /> -
diff --git a/apps/extension/src/wallet-services.ts b/apps/extension/src/wallet-services.ts index a6b30b99..1f1024d7 100644 --- a/apps/extension/src/wallet-services.ts +++ b/apps/extension/src/wallet-services.ts @@ -17,7 +17,7 @@ export const startWalletServices = async () => { const numeraires = await localExtStorage.get('numeraires'); // Retrieve the wallet creation height flag from storage - let walletCreationBlockHeight = await localExtStorage.get('walletCreationBlockHeight'); + const walletCreationBlockHeight = await localExtStorage.get('walletCreationBlockHeight'); const services = new Services({ grpcEndpoint, From 1f4bea7deea787d769a2725f2ff1ddad98b2a352 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Sat, 31 Aug 2024 22:13:20 -0700 Subject: [PATCH 04/14] refactor to use zustand store for in-memory state management --- apps/extension/src/hooks/full-sync-height.ts | 23 +---- .../src/routes/page/onboarding/generate.tsx | 82 ++++++------------ .../src/routes/page/onboarding/height.tsx | 8 +- apps/extension/src/state/block-height.ts | 84 +++++++++++++++++++ apps/extension/src/state/index.ts | 10 +++ 5 files changed, 124 insertions(+), 83 deletions(-) create mode 100644 apps/extension/src/state/block-height.ts diff --git a/apps/extension/src/hooks/full-sync-height.ts b/apps/extension/src/hooks/full-sync-height.ts index 0097bb1c..7c609d70 100644 --- a/apps/extension/src/hooks/full-sync-height.ts +++ b/apps/extension/src/hooks/full-sync-height.ts @@ -3,9 +3,7 @@ import { PopupLoaderData } from '../routes/popup/home'; import { useStore } from '../state'; import { networkSelector } from '../state/network'; import { useLoaderData } from 'react-router-dom'; -import { TendermintProxyService } from '@penumbra-zone/protobuf'; -import { createGrpcWebTransport } from '@connectrpc/connect-web'; -import { createPromiseClient } from '@connectrpc/connect'; +import { fetchBlockHeight } from '../state/block-height'; const tryGetMax = (a?: number, b?: number): number | undefined => { // Height can be 0n which is falsy, so should compare to undefined state @@ -38,13 +36,7 @@ export const useSyncProgress = () => { if (!grpcEndpoint) { return; } - const tendermintClient = createPromiseClient( - TendermintProxyService, - createGrpcWebTransport({ baseUrl: grpcEndpoint }), - ); - const blockHeight = (await tendermintClient.getStatus({}).catch(() => undefined))?.syncInfo - ?.latestBlockHeight; - return Number(blockHeight); + return await fetchBlockHeight(grpcEndpoint); }, enabled: Boolean(grpcEndpoint), }); @@ -55,14 +47,3 @@ export const useSyncProgress = () => { return { latestBlockHeight, fullSyncHeight, error }; }; - -export const fetchBlockHeight = async (grpcEndpoint: string) => { - const tendermintClient = createPromiseClient( - TendermintProxyService, - createGrpcWebTransport({ baseUrl: grpcEndpoint }), - ); - const blockHeight = (await tendermintClient.getStatus({}).catch(() => undefined))?.syncInfo - ?.latestBlockHeight; - - return blockHeight ? Number(blockHeight) : undefined; -}; diff --git a/apps/extension/src/routes/page/onboarding/generate.tsx b/apps/extension/src/routes/page/onboarding/generate.tsx index 87f745b2..df230fbe 100644 --- a/apps/extension/src/routes/page/onboarding/generate.tsx +++ b/apps/extension/src/routes/page/onboarding/generate.tsx @@ -14,74 +14,37 @@ import { generateSelector } from '../../../state/seed-phrase/generate'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; import { WordLengthToogles } from '../../../shared/containers/word-length-toogles'; -import { ChainRegistryClient } from '@penumbra-labs/registry'; -import { fetchBlockHeight } from '../../../hooks/full-sync-height'; -import { localExtStorage } from '../../../storage/local'; -import { sample } from 'lodash'; - -const fetchBlockHeightWithFallback = async (endpoints: string[]): Promise => { - if (endpoints.length === 0) { - throw new Error('All RPC endpoints failed to fetch the block height.'); - } - - // Randomly select an rpc endpoint from the chain registry - const randomEndpoint = sample(endpoints); - - try { - const walletCreationBlockHeight = await fetchBlockHeight(randomEndpoint!); - if (walletCreationBlockHeight !== undefined) { - return walletCreationBlockHeight; - } else { - // Remove the current endpoint from the list and try again - const remainingEndpoints = endpoints.filter(endpoint => endpoint !== randomEndpoint); - return fetchBlockHeightWithFallback(remainingEndpoints); - } - } catch (error) { - const remainingEndpoints = endpoints.filter(endpoint => endpoint !== randomEndpoint); - return fetchBlockHeightWithFallback(remainingEndpoints); - } -}; +import { generateBlockHeightSelector } from '../../../state/block-height'; export const GenerateSeedPhrase = () => { const navigate = usePageNav(); const { phrase, generateRandomSeedPhrase } = useStore(generateSelector); const [count, { startCountdown }] = useCountdown({ countStart: 3 }); const [reveal, setReveal] = useState(false); - const [blockHeight, setBlockHeight] = useState(null); + const blockHeight = useStore(generateBlockHeightSelector); + const initializeBlockHeight = useStore( + state => state.walletCreationBlockHeight.initializeBlockHeight, + ); - // On render, generate a new seed phrase. - // Fetch data only once on the initial render. - const isFetchedRef = useRef(false); + // Track if the block height has been initialized to avoid multiple fetch attempts + const isInitialized = useRef(false); + // On render, generate a new seed phrase and initialize the wallet creation block height useEffect(() => { - const fetchData = async () => { - if (isFetchedRef.current) { - return; + const initialize = async () => { + if (!phrase.length) { + generateRandomSeedPhrase(SeedPhraseLength.TWELVE_WORDS); } + startCountdown(); - try { - const chainRegistryClient = new ChainRegistryClient(); - const { rpcs } = chainRegistryClient.bundled.globals(); - - const suggestedEndpoints = rpcs.map(i => i.url); - const blockHeight = await fetchBlockHeightWithFallback(suggestedEndpoints); - await localExtStorage.set('walletCreationBlockHeight', blockHeight); - setBlockHeight(blockHeight); - - isFetchedRef.current = true; - } catch (error) { - console.error('Error fetching data:', error); + if (!isInitialized.current && blockHeight === 0) { + await initializeBlockHeight(); + isInitialized.current = true; } }; - if (!phrase.length) { - generateRandomSeedPhrase(SeedPhraseLength.TWELVE_WORDS); - } - startCountdown(); - - // Fetch RPCs and block height asynchronously - void fetchData(); - }, [phrase.length, generateRandomSeedPhrase, startCountdown]); + void initialize(); + }, [generateRandomSeedPhrase, phrase.length, startCountdown, blockHeight, initializeBlockHeight]); return ( @@ -117,14 +80,17 @@ export const GenerateSeedPhrase = () => { {reveal && (
-

Important!

+

Wallet Birthday

Block Height:{' '} - {blockHeight ?? 'Loading...'} + + {isInitialized.current ? Number(blockHeight) : 'Loading...'} +

- Please save the wallet creation height along with your recovery passphrase. It will - help you restore your wallet more quickly! + Please save the wallet creation height along with your recovery passphrase. + It`'`s not required, but will help you restore your wallet quicker on a fresh + Prax install next time.

)} diff --git a/apps/extension/src/routes/page/onboarding/height.tsx b/apps/extension/src/routes/page/onboarding/height.tsx index ecf9afb5..c2bee690 100644 --- a/apps/extension/src/routes/page/onboarding/height.tsx +++ b/apps/extension/src/routes/page/onboarding/height.tsx @@ -45,12 +45,12 @@ export const ImportWalletCreationHeight = () => { - Enter Block Height When the Wallet Was Created (Optional) + Enter block height when the wallet was created (optional) - This step is optional. Providing your wallet's block creation height can help speed - up the synchronization process, but it's not required. If you don't have this - information, you can safely skip this step. + Providing your wallet's block creation height can help speed up the synchronization + process, but it's not required. If you don't have this information, you can + safely skip this step. diff --git a/apps/extension/src/state/block-height.ts b/apps/extension/src/state/block-height.ts new file mode 100644 index 00000000..0be0e481 --- /dev/null +++ b/apps/extension/src/state/block-height.ts @@ -0,0 +1,84 @@ +import { ExtensionStorage } from '../storage/base'; +import { LocalStorageState } from '../storage/types'; +import { AllSlices, SliceCreator } from '.'; +import { ChainRegistryClient } from '@penumbra-labs/registry'; +import { TendermintProxyService } from '@penumbra-zone/protobuf'; +import { createGrpcWebTransport } from '@connectrpc/connect-web'; +import { createPromiseClient } from '@connectrpc/connect'; +import { sample } from 'lodash'; + +export interface walletCreationBlockHeightSlice { + blockHeight: number; + initializeBlockHeight: () => Promise; +} + +// Utility function to fetch the block height by randomly querying one of the RPC endpoints +// from the chain registry, using a recursive callback to try another endpoint if the current +// one fails. Additionally, this implements a timeout mechanism at the request level to avoid +// hanging from stalled requests. +const fetchBlockHeightWithFallback = async (endpoints: string[]): Promise => { + if (endpoints.length === 0) { + throw new Error('All RPC endpoints failed to fetch the block height.'); + } + + // Randomly select an RPC endpoint from the chain registry + const randomGrpcEndpoint = sample(endpoints); + if (!randomGrpcEndpoint) { + throw new Error('No RPC endpoints found.'); + } + + try { + const walletCreationBlockHeight = await fetchBlockHeight(randomGrpcEndpoint); + if (walletCreationBlockHeight !== undefined) { + return walletCreationBlockHeight; + } else { + // Remove the current endpoint from the list and retry with remaining endpoints + const remainingEndpoints = endpoints.filter(endpoint => endpoint !== randomGrpcEndpoint); + return fetchBlockHeightWithFallback(remainingEndpoints); + } + } catch (error) { + const remainingEndpoints = endpoints.filter(endpoint => endpoint !== randomGrpcEndpoint); + return fetchBlockHeightWithFallback(remainingEndpoints); + } +}; + +// Fetch the block height from a specific RPC endpoint with a timeout to prevent hanging requests. +export const fetchBlockHeight = async (grpcEndpoint: string): Promise => { + const tendermintClient = createPromiseClient( + TendermintProxyService, + createGrpcWebTransport({ baseUrl: grpcEndpoint }), + ); + + // TODO: Add timeout handling for async gRPC request + + const blockHeight = (await tendermintClient.getStatus({}).catch(() => undefined))?.syncInfo + ?.latestBlockHeight; + + return Number(blockHeight); +}; + +// Zustand slice that initializes and stores the block height in both Zustand state and local storage. +export const createWalletCreationBlockHeightSlice = + (local: ExtensionStorage): SliceCreator => + set => ({ + blockHeight: 0, + initializeBlockHeight: async () => { + try { + const chainRegistryClient = new ChainRegistryClient(); + const { rpcs } = chainRegistryClient.bundled.globals(); + const suggestedEndpoints = rpcs.map(i => i.url); + + const blockHeight = await fetchBlockHeightWithFallback(suggestedEndpoints); + await local.set('walletCreationBlockHeight', blockHeight); + set(state => { + state.walletCreationBlockHeight.blockHeight = blockHeight; + }); + } catch (error) { + console.error('Error fetching block height:', error); + } + }, + }); + +// Selector to retrieve the block height from the Zustand store +export const generateBlockHeightSelector = (state: AllSlices) => + state.walletCreationBlockHeight.blockHeight; diff --git a/apps/extension/src/state/index.ts b/apps/extension/src/state/index.ts index 201d7033..72bc9a76 100644 --- a/apps/extension/src/state/index.ts +++ b/apps/extension/src/state/index.ts @@ -14,6 +14,10 @@ import { createOriginApprovalSlice, OriginApprovalSlice } from './origin-approva import { ConnectedSitesSlice, createConnectedSitesSlice } from './connected-sites'; import { createDefaultFrontendSlice, DefaultFrontendSlice } from './default-frontend'; import { createNumerairesSlice, NumerairesSlice } from './numeraires'; +import { + walletCreationBlockHeightSlice, + createWalletCreationBlockHeightSlice, +} from './block-height'; export interface AllSlices { wallets: WalletsSlice; @@ -25,6 +29,7 @@ export interface AllSlices { originApproval: OriginApprovalSlice; connectedSites: ConnectedSitesSlice; defaultFrontend: DefaultFrontendSlice; + walletCreationBlockHeight: walletCreationBlockHeightSlice; } export type SliceCreator = StateCreator< @@ -48,6 +53,11 @@ export const initializeStore = ( txApproval: createTxApprovalSlice()(setState, getState, store), originApproval: createOriginApprovalSlice()(setState, getState, store), defaultFrontend: createDefaultFrontendSlice(local)(setState, getState, store), + walletCreationBlockHeight: createWalletCreationBlockHeightSlice(local)( + setState, + getState, + store, + ), })); }; From 0672988ffbb7c2248d88bdc163f4682903622119 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Sun, 1 Sep 2024 11:05:24 -0700 Subject: [PATCH 05/14] proper error propogation to caller in order to display in ui --- .../src/routes/page/onboarding/generate.tsx | 37 ++++++++++++------- apps/extension/src/state/block-height.ts | 36 +++++++----------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/apps/extension/src/routes/page/onboarding/generate.tsx b/apps/extension/src/routes/page/onboarding/generate.tsx index df230fbe..76fe7d21 100644 --- a/apps/extension/src/routes/page/onboarding/generate.tsx +++ b/apps/extension/src/routes/page/onboarding/generate.tsx @@ -21,6 +21,7 @@ export const GenerateSeedPhrase = () => { const { phrase, generateRandomSeedPhrase } = useStore(generateSelector); const [count, { startCountdown }] = useCountdown({ countStart: 3 }); const [reveal, setReveal] = useState(false); + const [error, setError] = useState(null); const blockHeight = useStore(generateBlockHeightSelector); const initializeBlockHeight = useStore( state => state.walletCreationBlockHeight.initializeBlockHeight, @@ -29,21 +30,23 @@ export const GenerateSeedPhrase = () => { // Track if the block height has been initialized to avoid multiple fetch attempts const isInitialized = useRef(false); - // On render, generate a new seed phrase and initialize the wallet creation block height + // On render, asynchronously generate a new seed phrase and initialize the wallet creation block height useEffect(() => { - const initialize = async () => { - if (!phrase.length) { - generateRandomSeedPhrase(SeedPhraseLength.TWELVE_WORDS); - } - startCountdown(); + void (async () => { + try { + if (!phrase.length) { + generateRandomSeedPhrase(SeedPhraseLength.TWELVE_WORDS); + } + startCountdown(); - if (!isInitialized.current && blockHeight === 0) { - await initializeBlockHeight(); - isInitialized.current = true; + if (!isInitialized.current && blockHeight === 0) { + await initializeBlockHeight(); + isInitialized.current = true; + } + } catch (error) { + setError('Failed to fetch block height. Please try again later'); } - }; - - void initialize(); + })(); }, [generateRandomSeedPhrase, phrase.length, startCountdown, blockHeight, initializeBlockHeight]); return ( @@ -84,12 +87,18 @@ export const GenerateSeedPhrase = () => {

Block Height:{' '} - {isInitialized.current ? Number(blockHeight) : 'Loading...'} + {error ? ( + {error} + ) : isInitialized.current ? ( + Number(blockHeight) + ) : ( + 'Loading...' + )}

Please save the wallet creation height along with your recovery passphrase. - It`'`s not required, but will help you restore your wallet quicker on a fresh + It's not required, but will help you restore your wallet quicker on a fresh Prax install next time.

diff --git a/apps/extension/src/state/block-height.ts b/apps/extension/src/state/block-height.ts index 0be0e481..3cba9cf5 100644 --- a/apps/extension/src/state/block-height.ts +++ b/apps/extension/src/state/block-height.ts @@ -27,16 +27,12 @@ const fetchBlockHeightWithFallback = async (endpoints: string[]): Promise endpoint !== randomGrpcEndpoint); - return fetchBlockHeightWithFallback(remainingEndpoints); - } - } catch (error) { + const walletCreationBlockHeight = await fetchBlockHeight(randomGrpcEndpoint); + + if (walletCreationBlockHeight !== undefined) { + return walletCreationBlockHeight; + } else { + // Remove the current endpoint from the list and retry with remaining endpoints const remainingEndpoints = endpoints.filter(endpoint => endpoint !== randomGrpcEndpoint); return fetchBlockHeightWithFallback(remainingEndpoints); } @@ -63,19 +59,15 @@ export const createWalletCreationBlockHeightSlice = set => ({ blockHeight: 0, initializeBlockHeight: async () => { - try { - const chainRegistryClient = new ChainRegistryClient(); - const { rpcs } = chainRegistryClient.bundled.globals(); - const suggestedEndpoints = rpcs.map(i => i.url); + const chainRegistryClient = new ChainRegistryClient(); + const { rpcs } = chainRegistryClient.bundled.globals(); + const suggestedEndpoints = rpcs.map(i => i.url); - const blockHeight = await fetchBlockHeightWithFallback(suggestedEndpoints); - await local.set('walletCreationBlockHeight', blockHeight); - set(state => { - state.walletCreationBlockHeight.blockHeight = blockHeight; - }); - } catch (error) { - console.error('Error fetching block height:', error); - } + const blockHeight = await fetchBlockHeightWithFallback(suggestedEndpoints); + await local.set('walletCreationBlockHeight', blockHeight); + set(state => { + state.walletCreationBlockHeight.blockHeight = blockHeight; + }); }, }); From adcbf929ad0bd818815920b54da83e1f21cb346d Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Sun, 1 Sep 2024 19:46:30 -0700 Subject: [PATCH 06/14] address more gabe's comments --- apps/extension/src/hooks/onboarding.ts | 10 ++++- .../src/routes/page/onboarding/generate.tsx | 15 +++---- .../src/routes/page/onboarding/height.tsx | 34 +++++--------- apps/extension/src/state/block-height.ts | 44 ++++++++++++++----- apps/extension/src/state/index.ts | 16 +++++-- 5 files changed, 73 insertions(+), 46 deletions(-) diff --git a/apps/extension/src/hooks/onboarding.ts b/apps/extension/src/hooks/onboarding.ts index 1308d7e0..f6408770 100644 --- a/apps/extension/src/hooks/onboarding.ts +++ b/apps/extension/src/hooks/onboarding.ts @@ -1,4 +1,5 @@ import { useStore } from '../state'; +// import { existingWalletBlockHeightSelector } from '../state/block-height'; import { passwordSelector } from '../state/password'; import { generateSelector } from '../state/seed-phrase/generate'; import { importSelector } from '../state/seed-phrase/import'; @@ -16,7 +17,14 @@ export const useOnboardingSave = () => { // Determine which routes it came through to get here const seedPhrase = generatedPhrase.length ? generatedPhrase : importedPhrase; await setPassword(plaintextPassword); - await addWallet({ label: 'Wallet #1', seedPhrase }); }; }; + +export const useOnboardingSaveOptional = () => { + const { setBlockHeight } = useStore(state => state.existingWalletCreationBlockHeight); + + return async (walletBlockHeight: number) => { + await setBlockHeight(walletBlockHeight); + }; +}; diff --git a/apps/extension/src/routes/page/onboarding/generate.tsx b/apps/extension/src/routes/page/onboarding/generate.tsx index 76fe7d21..835e1f3f 100644 --- a/apps/extension/src/routes/page/onboarding/generate.tsx +++ b/apps/extension/src/routes/page/onboarding/generate.tsx @@ -14,7 +14,7 @@ import { generateSelector } from '../../../state/seed-phrase/generate'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; import { WordLengthToogles } from '../../../shared/containers/word-length-toogles'; -import { generateBlockHeightSelector } from '../../../state/block-height'; +import { freshWalletBlockHeightSelector } from '../../../state/block-height'; export const GenerateSeedPhrase = () => { const navigate = usePageNav(); @@ -22,10 +22,8 @@ export const GenerateSeedPhrase = () => { const [count, { startCountdown }] = useCountdown({ countStart: 3 }); const [reveal, setReveal] = useState(false); const [error, setError] = useState(null); - const blockHeight = useStore(generateBlockHeightSelector); - const initializeBlockHeight = useStore( - state => state.walletCreationBlockHeight.initializeBlockHeight, - ); + const blockHeight = useStore(freshWalletBlockHeightSelector); + const setBlockHeight = useStore(state => state.freshWalletCreationBlockHeight.setBlockHeight); // Track if the block height has been initialized to avoid multiple fetch attempts const isInitialized = useRef(false); @@ -40,14 +38,14 @@ export const GenerateSeedPhrase = () => { startCountdown(); if (!isInitialized.current && blockHeight === 0) { - await initializeBlockHeight(); + await setBlockHeight(); isInitialized.current = true; } } catch (error) { setError('Failed to fetch block height. Please try again later'); } })(); - }, [generateRandomSeedPhrase, phrase.length, startCountdown, blockHeight, initializeBlockHeight]); + }, [generateRandomSeedPhrase, phrase.length, startCountdown, blockHeight, setBlockHeight]); return ( @@ -83,9 +81,8 @@ export const GenerateSeedPhrase = () => { {reveal && (
-

Wallet Birthday

+

Wallet Birthday Height

- Block Height:{' '} {error ? ( {error} diff --git a/apps/extension/src/routes/page/onboarding/height.tsx b/apps/extension/src/routes/page/onboarding/height.tsx index c2bee690..49fbbbe5 100644 --- a/apps/extension/src/routes/page/onboarding/height.tsx +++ b/apps/extension/src/routes/page/onboarding/height.tsx @@ -10,33 +10,22 @@ import { import { FadeTransition } from '@repo/ui/components/ui/fade-transition'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; -import { FormEvent, MouseEvent, useState } from 'react'; +import { FormEvent, useState } from 'react'; import { Input } from '@repo/ui/components/ui/input'; -import { localExtStorage } from '../../../storage/local'; +import { useOnboardingSaveOptional } from '../../../hooks/onboarding'; export const ImportWalletCreationHeight = () => { const navigate = usePageNav(); const [blockHeight, setBlockHeight] = useState(''); + const onboardingSave = useOnboardingSaveOptional(); - const handleSubmit = async (event: MouseEvent | FormEvent) => { + const handleSubmit = (event: FormEvent) => { event.preventDefault(); - if (blockHeight) { - // Save the block height to local extension storage - await localExtStorage.set('walletCreationBlockHeight', Number(blockHeight)); - } - - navigate(PagePath.SET_PASSWORD); - }; - - const handleClick = (event: MouseEvent | FormEvent) => { - handleSubmit(event).catch((error: unknown) => { - if (error instanceof Error) { - console.error('Error during submission:', error.message); - } else { - console.error('Unexpected error:', error); - } - }); + void (async () => { + await onboardingSave(Number(blockHeight)); + navigate(PagePath.SET_PASSWORD); + })(); }; return ( @@ -45,7 +34,8 @@ export const ImportWalletCreationHeight = () => { - Enter block height when the wallet was created (optional) + Enter the block height at the time your wallet was created. This is your wallet's + birthday height (Optional) Providing your wallet's block creation height can help speed up the synchronization @@ -54,7 +44,7 @@ export const ImportWalletCreationHeight = () => { -

+ { onChange={e => setBlockHeight(e.target.value)} className='text-[15px] font-normal leading-[22px]' /> -
diff --git a/apps/extension/src/state/block-height.ts b/apps/extension/src/state/block-height.ts index 3cba9cf5..6f5b71bf 100644 --- a/apps/extension/src/state/block-height.ts +++ b/apps/extension/src/state/block-height.ts @@ -7,9 +7,14 @@ import { createGrpcWebTransport } from '@connectrpc/connect-web'; import { createPromiseClient } from '@connectrpc/connect'; import { sample } from 'lodash'; -export interface walletCreationBlockHeightSlice { +export interface freshWalletCreationBlockHeightSlice { blockHeight: number; - initializeBlockHeight: () => Promise; + setBlockHeight: () => Promise; +} + +export interface existingWalletCreationBlockHeightSlice { + blockHeight: number; + setBlockHeight: (height: number) => Promise; } // Utility function to fetch the block height by randomly querying one of the RPC endpoints @@ -53,12 +58,12 @@ export const fetchBlockHeight = async (grpcEndpoint: string): Promise): SliceCreator => +// Fresh wallets: zustand slice that initializes and stores the block height in both Zustand state and local storage. +export const createFreshWalletCreationBlockHeightSlice = + (local: ExtensionStorage): SliceCreator => set => ({ blockHeight: 0, - initializeBlockHeight: async () => { + setBlockHeight: async () => { const chainRegistryClient = new ChainRegistryClient(); const { rpcs } = chainRegistryClient.bundled.globals(); const suggestedEndpoints = rpcs.map(i => i.url); @@ -66,11 +71,30 @@ export const createWalletCreationBlockHeightSlice = const blockHeight = await fetchBlockHeightWithFallback(suggestedEndpoints); await local.set('walletCreationBlockHeight', blockHeight); set(state => { - state.walletCreationBlockHeight.blockHeight = blockHeight; + state.freshWalletCreationBlockHeight.blockHeight = blockHeight; + }); + }, + }); + +// Existing wallets: zustand slice that initializes and stores the block height in both Zustand state and local storage. +export const createExistingWalletCreationBlockHeightSlice = + ( + local: ExtensionStorage, + ): SliceCreator => + set => ({ + blockHeight: 0, + setBlockHeight: async (blockHeight: number) => { + await local.set('walletCreationBlockHeight', blockHeight); + set(state => { + state.existingWalletCreationBlockHeight.blockHeight = blockHeight; }); }, }); -// Selector to retrieve the block height from the Zustand store -export const generateBlockHeightSelector = (state: AllSlices) => - state.walletCreationBlockHeight.blockHeight; +// Selector to retrieve the block height from the Zustand store for fresh wallets +export const freshWalletBlockHeightSelector = (state: AllSlices) => + state.freshWalletCreationBlockHeight.blockHeight; + +// Selector to retrieve the block height from the Zustand store for existing wallets +export const existingWalletBlockHeightSelector = (state: AllSlices) => + state.existingWalletCreationBlockHeight.blockHeight; diff --git a/apps/extension/src/state/index.ts b/apps/extension/src/state/index.ts index 72bc9a76..48090c36 100644 --- a/apps/extension/src/state/index.ts +++ b/apps/extension/src/state/index.ts @@ -15,8 +15,10 @@ import { ConnectedSitesSlice, createConnectedSitesSlice } from './connected-site import { createDefaultFrontendSlice, DefaultFrontendSlice } from './default-frontend'; import { createNumerairesSlice, NumerairesSlice } from './numeraires'; import { - walletCreationBlockHeightSlice, - createWalletCreationBlockHeightSlice, + freshWalletCreationBlockHeightSlice, + createFreshWalletCreationBlockHeightSlice, + existingWalletCreationBlockHeightSlice, + createExistingWalletCreationBlockHeightSlice, } from './block-height'; export interface AllSlices { @@ -29,7 +31,8 @@ export interface AllSlices { originApproval: OriginApprovalSlice; connectedSites: ConnectedSitesSlice; defaultFrontend: DefaultFrontendSlice; - walletCreationBlockHeight: walletCreationBlockHeightSlice; + freshWalletCreationBlockHeight: freshWalletCreationBlockHeightSlice; + existingWalletCreationBlockHeight: existingWalletCreationBlockHeightSlice; } export type SliceCreator = StateCreator< @@ -53,7 +56,12 @@ export const initializeStore = ( txApproval: createTxApprovalSlice()(setState, getState, store), originApproval: createOriginApprovalSlice()(setState, getState, store), defaultFrontend: createDefaultFrontendSlice(local)(setState, getState, store), - walletCreationBlockHeight: createWalletCreationBlockHeightSlice(local)( + freshWalletCreationBlockHeight: createFreshWalletCreationBlockHeightSlice(local)( + setState, + getState, + store, + ), + existingWalletCreationBlockHeight: createExistingWalletCreationBlockHeightSlice(local)( setState, getState, store, From ff35bcf52050780e724b130d1604e833c94f1158 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Sun, 1 Sep 2024 20:43:18 -0700 Subject: [PATCH 07/14] change type to support undefined --- apps/extension/src/wallet-services.ts | 2 +- packages/context/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/extension/src/wallet-services.ts b/apps/extension/src/wallet-services.ts index 1f1024d7..3a65fdf5 100644 --- a/apps/extension/src/wallet-services.ts +++ b/apps/extension/src/wallet-services.ts @@ -25,7 +25,7 @@ export const startWalletServices = async () => { walletId: WalletId.fromJsonString(wallet.id), fullViewingKey: FullViewingKey.fromJsonString(wallet.fullViewingKey), numeraires: numeraires.map(n => AssetId.fromJsonString(n)), - walletCreationBlockHeight: walletCreationBlockHeight!, + walletCreationBlockHeight: walletCreationBlockHeight, }); const { blockProcessor, indexedDb } = await services.getWalletServices(); diff --git a/packages/context/src/index.ts b/packages/context/src/index.ts index b5dd4f47..c32d644b 100644 --- a/packages/context/src/index.ts +++ b/packages/context/src/index.ts @@ -15,7 +15,7 @@ export interface ServicesConfig { readonly walletId: WalletId; readonly fullViewingKey: FullViewingKey; readonly numeraires: AssetId[]; - readonly walletCreationBlockHeight: number; + readonly walletCreationBlockHeight: number | undefined; } export class Services implements ServicesInterface { From 5197ee6491cf051b3e01e9a5ab4d55bd025d604f Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Sun, 1 Sep 2024 20:44:03 -0700 Subject: [PATCH 08/14] ui formatting for wallet birthday --- .../src/routes/page/onboarding/generate.tsx | 12 ++++---- .../src/routes/page/onboarding/height.tsx | 28 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apps/extension/src/routes/page/onboarding/generate.tsx b/apps/extension/src/routes/page/onboarding/generate.tsx index 835e1f3f..024f6365 100644 --- a/apps/extension/src/routes/page/onboarding/generate.tsx +++ b/apps/extension/src/routes/page/onboarding/generate.tsx @@ -81,22 +81,22 @@ export const GenerateSeedPhrase = () => { {reveal && (
-

Wallet Birthday Height

-

+

Wallet Birthday

+

{error ? ( {error} ) : isInitialized.current ? ( - Number(blockHeight) + Number(blockHeight).toLocaleString() ) : ( 'Loading...' )}

- Please save the wallet creation height along with your recovery passphrase. - It's not required, but will help you restore your wallet quicker on a fresh - Prax install next time. + This is the block height at the time your wallet was created. Please save the block + height along with your recovery passphrase. It's not required, but will help + you restore your wallet quicker on a fresh Prax install next time.

)} diff --git a/apps/extension/src/routes/page/onboarding/height.tsx b/apps/extension/src/routes/page/onboarding/height.tsx index 49fbbbe5..7aa5790a 100644 --- a/apps/extension/src/routes/page/onboarding/height.tsx +++ b/apps/extension/src/routes/page/onboarding/height.tsx @@ -31,28 +31,28 @@ export const ImportWalletCreationHeight = () => { return ( navigate(-1)} /> - - - - Enter the block height at the time your wallet was created. This is your wallet's - birthday height (Optional) + + + + Enter your wallet's birthday (Optional) - - Providing your wallet's block creation height can help speed up the synchronization - process, but it's not required. If you don't have this information, you can - safely skip this step. + + This is the block height at the time your wallet was created. Providing your + wallet's block creation height can help speed up the synchronization process, but + it's not required. If you don't have this information, you can safely skip + this step. - -
+ + setBlockHeight(e.target.value)} - className='text-[15px] font-normal leading-[22px]' + className='rounded-md border border-gray-700 p-3 text-[16px] font-normal leading-[24px]' /> - From 89a5502412fe95a6f38bfbace05d2ad3de3efa84 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Mon, 2 Sep 2024 00:22:38 -0700 Subject: [PATCH 09/14] add changeset --- .changeset/cuddly-worms-heal.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/cuddly-worms-heal.md diff --git a/.changeset/cuddly-worms-heal.md b/.changeset/cuddly-worms-heal.md new file mode 100644 index 00000000..f4e8fbb1 --- /dev/null +++ b/.changeset/cuddly-worms-heal.md @@ -0,0 +1,6 @@ +--- +'@repo/context': major +'chrome-extension': major +--- + +fresh and existing wallets skip trial decryption From e8301043a08918ce49f962b398c1c05fcf447d5e Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Tue, 3 Sep 2024 15:21:36 +0200 Subject: [PATCH 10/14] [pairing] draft updates --- apps/extension/package.json | 16 +- apps/extension/src/hooks/onboarding.ts | 2 +- .../src/routes/page/onboarding/height.tsx | 2 +- .../routes/page/onboarding/set-password.tsx | 4 +- .../page/restore-password/set-password.tsx | 4 +- packages/context/package.json | 14 +- packages/ui/package.json | 6 +- pnpm-lock.yaml | 785 +++++++++--------- 8 files changed, 419 insertions(+), 414 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 36c44d66..6ca65db9 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -19,19 +19,19 @@ "@connectrpc/connect-web": "^1.4.0", "@penumbra-labs/registry": "11.1.0", "@penumbra-zone/bech32m": "^7.0.0", - "@penumbra-zone/client": "^18.0.1", - "@penumbra-zone/crypto-web": "^22.0.0", + "@penumbra-zone/client": "^18.1.0", + "@penumbra-zone/crypto-web": "^23.0.0", "@penumbra-zone/getters": "^16.0.0", "@penumbra-zone/keys": "^4.2.1", - "@penumbra-zone/perspective": "^28.0.0", + "@penumbra-zone/perspective": "^29.0.0", "@penumbra-zone/protobuf": "^6.0.0", - "@penumbra-zone/query": "^29.0.0", - "@penumbra-zone/services": "^32.0.0", - "@penumbra-zone/storage": "^28.0.0", + "@penumbra-zone/query": "^30.0.0", + "@penumbra-zone/services": "^33.0.0", + "@penumbra-zone/storage": "^29.0.0", "@penumbra-zone/transport-chrome": "^8.0.1", "@penumbra-zone/transport-dom": "^7.5.0", - "@penumbra-zone/types": "^21.0.0", - "@penumbra-zone/wasm": "^26.2.0", + "@penumbra-zone/types": "^22.0.0", + "@penumbra-zone/wasm": "^27.0.0", "@radix-ui/react-icons": "^1.3.0", "@repo/context": "workspace:*", "@repo/ui": "workspace:*", diff --git a/apps/extension/src/hooks/onboarding.ts b/apps/extension/src/hooks/onboarding.ts index f6408770..29906e2d 100644 --- a/apps/extension/src/hooks/onboarding.ts +++ b/apps/extension/src/hooks/onboarding.ts @@ -7,7 +7,7 @@ import { walletsSelector } from '../state/wallets'; // Saves hashed password, uses that hash to encrypt the seed phrase // and then saves that to session + local storage -export const useOnboardingSave = () => { +export const useAddWallet = () => { const { setPassword } = useStore(passwordSelector); const { phrase: generatedPhrase } = useStore(generateSelector); const { phrase: importedPhrase } = useStore(importSelector); diff --git a/apps/extension/src/routes/page/onboarding/height.tsx b/apps/extension/src/routes/page/onboarding/height.tsx index 7aa5790a..838a6e01 100644 --- a/apps/extension/src/routes/page/onboarding/height.tsx +++ b/apps/extension/src/routes/page/onboarding/height.tsx @@ -46,7 +46,7 @@ export const ImportWalletCreationHeight = () => {
setBlockHeight(e.target.value)} diff --git a/apps/extension/src/routes/page/onboarding/set-password.tsx b/apps/extension/src/routes/page/onboarding/set-password.tsx index 8676070a..f9a3e616 100644 --- a/apps/extension/src/routes/page/onboarding/set-password.tsx +++ b/apps/extension/src/routes/page/onboarding/set-password.tsx @@ -9,14 +9,14 @@ import { CardTitle, } from '@repo/ui/components/ui/card'; import { FadeTransition } from '@repo/ui/components/ui/fade-transition'; -import { useOnboardingSave } from '../../../hooks/onboarding'; +import { useAddWallet } from '../../../hooks/onboarding'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; import { PasswordInput } from '../../../shared/components/password-input'; export const SetPassword = () => { const navigate = usePageNav(); - const onboardingSave = useOnboardingSave(); + const onboardingSave = useAddWallet(); const [password, setPassword] = useState(''); const [confirmation, setConfirmation] = useState(''); diff --git a/apps/extension/src/routes/page/restore-password/set-password.tsx b/apps/extension/src/routes/page/restore-password/set-password.tsx index 6c47762a..f18291fc 100644 --- a/apps/extension/src/routes/page/restore-password/set-password.tsx +++ b/apps/extension/src/routes/page/restore-password/set-password.tsx @@ -9,14 +9,14 @@ import { CardTitle, } from '@repo/ui/components/ui/card'; import { FadeTransition } from '@repo/ui/components/ui/fade-transition'; -import { useOnboardingSave } from '../../../hooks/onboarding'; +import { useAddWallet } from '../../../hooks/onboarding'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; import { PasswordInput } from '../../../shared/components/password-input'; export const SetPassword = () => { const navigate = usePageNav(); - const finalOnboardingSave = useOnboardingSave(); + const finalOnboardingSave = useAddWallet(); const [password, setPassword] = useState(''); const [confirmation, setConfirmation] = useState(''); diff --git a/packages/context/package.json b/packages/context/package.json index 7c5449e3..5c41ae67 100644 --- a/packages/context/package.json +++ b/packages/context/package.json @@ -19,18 +19,18 @@ "@bufbuild/protobuf": "^1.10.0", "@penumbra-labs/registry": "11.1.0", "@penumbra-zone/bech32m": "^7.0.0", - "@penumbra-zone/crypto-web": "^22.0.0", + "@penumbra-zone/crypto-web": "^23.0.0", "@penumbra-zone/getters": "^16.0.0", "@penumbra-zone/keys": "^4.2.1", - "@penumbra-zone/perspective": "^28.0.0", + "@penumbra-zone/perspective": "^29.0.0", "@penumbra-zone/protobuf": "^6.0.0", - "@penumbra-zone/query": "^29.0.0", - "@penumbra-zone/services": "^32.0.0", - "@penumbra-zone/storage": "^28.0.0", + "@penumbra-zone/query": "^30.0.0", + "@penumbra-zone/services": "^33.0.0", + "@penumbra-zone/storage": "^29.0.0", "@penumbra-zone/transport-chrome": "^8.0.1", "@penumbra-zone/transport-dom": "^7.5.0", - "@penumbra-zone/types": "^21.0.0", - "@penumbra-zone/wasm": "^26.2.0", + "@penumbra-zone/types": "^22.0.0", + "@penumbra-zone/wasm": "^27.0.0", "exponential-backoff": "^3.1.1" } } diff --git a/packages/ui/package.json b/packages/ui/package.json index 053be7d8..9de0d4ee 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -32,10 +32,10 @@ "@penumbra-labs/registry": "11.1.0", "@penumbra-zone/bech32m": "^7.0.0", "@penumbra-zone/getters": "^16.0.0", - "@penumbra-zone/perspective": "^28.0.0", + "@penumbra-zone/perspective": "^29.0.0", "@penumbra-zone/protobuf": "^6.0.0", - "@penumbra-zone/types": "^21.0.0", - "@penumbra-zone/wasm": "^26.2.0", + "@penumbra-zone/types": "^22.0.0", + "@penumbra-zone/wasm": "^27.0.0", "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "1.0.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e58537a..fa1e5cb1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,10 +46,10 @@ importers: version: link:packages/tsconfig '@storybook/react-vite': specifier: 8.1.1 - version: 8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.1)(typescript@5.5.4)(vite@5.4.2(@types/node@20.14.13)(terser@5.31.6)) + version: 8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.2)(typescript@5.5.4)(vite@5.4.2(@types/node@20.14.13)(terser@5.31.6)) '@turbo/gen': specifier: ^1.13.4 - version: 1.13.4(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4) + version: 1.13.4(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4) '@types/node': specifier: ^20.14.5 version: 20.14.13 @@ -70,7 +70,7 @@ importers: version: 12.4.0(typescript@5.5.4) tailwindcss: specifier: ^3.4.4 - version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)) + version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)) turbo: specifier: ^2.0.12 version: 2.0.12 @@ -99,11 +99,11 @@ importers: specifier: ^7.0.0 version: 7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/client': - specifier: ^18.0.1 - version: 18.0.1(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.5.0) + specifier: ^18.1.0 + version: 18.1.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.5.0) '@penumbra-zone/crypto-web': - specifier: ^22.0.0 - version: 22.0.0(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + specifier: ^23.0.0 + version: 23.0.0(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) '@penumbra-zone/getters': specifier: ^16.0.0 version: 16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) @@ -111,20 +111,20 @@ importers: specifier: ^4.2.1 version: 4.2.1 '@penumbra-zone/perspective': - specifier: ^28.0.0 - version: 28.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/wasm@26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))) + specifier: ^29.0.0 + version: 29.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/wasm@27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))) '@penumbra-zone/protobuf': specifier: ^6.0.0 version: 6.0.0(@bufbuild/protobuf@1.10.0) '@penumbra-zone/query': - specifier: ^29.0.0 - version: 29.0.0(lgdfff65jhftsrxe7yms2hodri) + specifier: ^30.0.0 + version: 30.0.0(banmk3erwunubgvg457fwz7rvq) '@penumbra-zone/services': - specifier: ^32.0.0 - version: 32.0.0(puvtpkyxdz7u2mryloo5z5pz6q) + specifier: ^33.0.0 + version: 33.0.0(m7lhnv2o565qvcwz2e4vqrdxsi) '@penumbra-zone/storage': - specifier: ^28.0.0 - version: 28.0.0(3wbpnsgziu7e3ofmprbzkzltsi) + specifier: ^29.0.0 + version: 29.0.0(uz3f7wsbv65r4y3vsa3krgv4bu) '@penumbra-zone/transport-chrome': specifier: ^8.0.1 version: 8.0.1(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.5.0) @@ -132,11 +132,11 @@ importers: specifier: ^7.5.0 version: 7.5.0 '@penumbra-zone/types': - specifier: ^21.0.0 - version: 21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) + specifier: ^22.0.0 + version: 22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/wasm': - specifier: ^26.2.0 - version: 26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + specifier: ^27.0.0 + version: 27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) '@radix-ui/react-icons': specifier: ^1.3.0 version: 1.3.0(react@18.3.1) @@ -200,7 +200,7 @@ importers: version: 18.3.0 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(@swc/core@1.7.21)(webpack-cli@5.1.4(webpack@5.93.0)) + version: 5.28.5(@swc/core@1.7.23)(webpack-cli@5.1.4(webpack@5.93.0)) autoprefixer: specifier: ^10.4.19 version: 10.4.19(postcss@8.4.40) @@ -209,40 +209,40 @@ importers: version: 6.0.3 copy-webpack-plugin: specifier: ^12.0.2 - version: 12.0.2(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) + version: 12.0.2(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) css-loader: specifier: ^7.1.1 - version: 7.1.2(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) + version: 7.1.2(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) dotenv: specifier: ^16.4.5 version: 16.4.5 html-webpack-plugin: specifier: ^5.6.0 - version: 5.6.0(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) + version: 5.6.0(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) postcss: specifier: ^8.4.38 version: 8.4.40 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.4.40)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) + version: 8.1.1(postcss@8.4.40)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) + version: 4.0.0(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) tailwindcss: specifier: ^3.4.4 - version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@22.5.1)(typescript@5.5.4)) + version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) ts-loader: specifier: ^9.5.1 - version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) + version: 9.5.1(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.7.21)(@types/node@22.5.1)(typescript@5.5.4) + version: 10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4) web-ext: specifier: ^8.2.0 version: 8.2.0(body-parser@1.20.2)(express@4.19.2) webpack: specifier: ^5.91.0 - version: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + version: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 version: 5.1.4(webpack@5.93.0) @@ -251,7 +251,7 @@ importers: version: 5.10.0 webpack-watch-external-files-plugin: specifier: ^3.1.0 - version: 3.1.0(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) + version: 3.1.0(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) apps/prax-marketing-site: dependencies: @@ -266,7 +266,7 @@ importers: version: 6.25.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwindcss: specifier: ^3.4.4 - version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@22.5.1)(typescript@5.5.4)) + version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) devDependencies: '@types/react': specifier: ^18.3.2 @@ -276,7 +276,7 @@ importers: version: 18.3.0 '@vitejs/plugin-react-swc': specifier: ^3.7.0 - version: 3.7.0(vite@5.3.5(@types/node@22.5.1)(terser@5.31.6)) + version: 3.7.0(vite@5.3.5(@types/node@22.5.2)(terser@5.31.6)) autoprefixer: specifier: ^10.4.19 version: 10.4.19(postcss@8.4.40) @@ -288,7 +288,7 @@ importers: version: 8.4.40 vite: specifier: ^5.3.1 - version: 5.3.5(@types/node@22.5.1)(terser@5.31.6) + version: 5.3.5(@types/node@22.5.2)(terser@5.31.6) packages/context: dependencies: @@ -302,8 +302,8 @@ importers: specifier: ^7.0.0 version: 7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/crypto-web': - specifier: ^22.0.0 - version: 22.0.0(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + specifier: ^23.0.0 + version: 23.0.0(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) '@penumbra-zone/getters': specifier: ^16.0.0 version: 16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) @@ -311,20 +311,20 @@ importers: specifier: ^4.2.1 version: 4.2.1 '@penumbra-zone/perspective': - specifier: ^28.0.0 - version: 28.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/wasm@26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))) + specifier: ^29.0.0 + version: 29.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/wasm@27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))) '@penumbra-zone/protobuf': specifier: ^6.0.0 version: 6.0.0(@bufbuild/protobuf@1.10.0) '@penumbra-zone/query': - specifier: ^29.0.0 - version: 29.0.0(lgdfff65jhftsrxe7yms2hodri) + specifier: ^30.0.0 + version: 30.0.0(banmk3erwunubgvg457fwz7rvq) '@penumbra-zone/services': - specifier: ^32.0.0 - version: 32.0.0(puvtpkyxdz7u2mryloo5z5pz6q) + specifier: ^33.0.0 + version: 33.0.0(m7lhnv2o565qvcwz2e4vqrdxsi) '@penumbra-zone/storage': - specifier: ^28.0.0 - version: 28.0.0(3wbpnsgziu7e3ofmprbzkzltsi) + specifier: ^29.0.0 + version: 29.0.0(uz3f7wsbv65r4y3vsa3krgv4bu) '@penumbra-zone/transport-chrome': specifier: ^8.0.1 version: 8.0.1(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.5.0) @@ -332,11 +332,11 @@ importers: specifier: ^7.5.0 version: 7.5.0 '@penumbra-zone/types': - specifier: ^21.0.0 - version: 21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) + specifier: ^22.0.0 + version: 22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/wasm': - specifier: ^26.2.0 - version: 26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + specifier: ^27.0.0 + version: 27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) exponential-backoff: specifier: ^3.1.1 version: 3.1.1 @@ -375,7 +375,7 @@ importers: version: 0.8.0(eslint@9.8.0)(typescript@5.5.4) eslint-plugin-tailwindcss: specifier: ^3.15.2 - version: 3.17.4(tailwindcss@3.4.10(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4))) + version: 3.17.4(tailwindcss@3.4.10(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4))) eslint-plugin-turbo: specifier: ^2.0.12 version: 2.0.12(eslint@9.8.0) @@ -390,10 +390,10 @@ importers: dependencies: tailwindcss: specifier: ^3.4.4 - version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)) + version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4))) + version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4))) packages/tsconfig: {} @@ -415,17 +415,17 @@ importers: specifier: ^16.0.0 version: 16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/perspective': - specifier: ^28.0.0 - version: 28.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/wasm@26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))) + specifier: ^29.0.0 + version: 29.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/wasm@27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))) '@penumbra-zone/protobuf': specifier: ^6.0.0 version: 6.0.0(@bufbuild/protobuf@1.10.0) '@penumbra-zone/types': - specifier: ^21.0.0 - version: 21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) + specifier: ^22.0.0 + version: 22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/wasm': - specifier: ^26.2.0 - version: 26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + specifier: ^27.0.0 + version: 27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) '@radix-ui/react-avatar': specifier: ^1.0.4 version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -476,7 +476,7 @@ importers: version: 6.4.8 '@textea/json-viewer': specifier: ^3.4.1 - version: 3.4.1(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.4.1(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.2(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) bignumber.js: specifier: ^9.1.2 version: 9.1.2 @@ -534,13 +534,13 @@ importers: version: 8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9))) '@storybook/addon-interactions': specifier: ^8.1.1 - version: 8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@22.5.1)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6)) + version: 8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@22.5.2)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6)) '@storybook/addon-links': specifier: ^8.1.1 version: 8.2.6(react@18.3.1)(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9))) '@storybook/addon-postcss': specifier: ^2.0.0 - version: 2.0.0(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5)) + version: 2.0.0(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5)) '@storybook/blocks': specifier: ^8.1.1 version: 8.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9))) @@ -552,7 +552,7 @@ importers: version: 8.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)))(typescript@5.5.4) '@storybook/react-vite': specifier: 8.1.1 - version: 8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.1)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6)) + version: 8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.2)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(terser@5.31.6)) '@testing-library/dom': specifier: ^10.1.0 version: 10.4.0 @@ -585,7 +585,7 @@ importers: version: 8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)) tailwindcss: specifier: ^3.4.4 - version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@22.5.1)(typescript@5.5.4)) + version: 3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) packages: @@ -1926,16 +1926,16 @@ packages: '@types/react': '>=16' react: '>=16' - '@mui/core-downloads-tracker@6.0.0': - resolution: {integrity: sha512-x5qg4ndVmSY5jzp1AgSQSh/iI3H3oN30JwSQAKCIopH6iHGyqEzLx5/gZVbpWzlzt5xoeX8eubqPzEiUo8ClYg==} + '@mui/core-downloads-tracker@6.0.2': + resolution: {integrity: sha512-Cg68oOlAfbJgMgvbCwcX3Y3HdygCl6X1nREYTdEWcEKUQhNarrC45Cc35mP+zA7p3ZXE/7FLiaTCCgwuSoef/Q==} - '@mui/material@6.0.0': - resolution: {integrity: sha512-pU8L/bvoK3bBYM0MUCr8EHgdFbYwB3LIZ1yr1FWI2dZBA/751oy2qr7UgMnZznGCq+C9pTp1EOugF9FhW0G6xg==} + '@mui/material@6.0.2': + resolution: {integrity: sha512-KrnkJFSyhsAh8V30DNUbWyRyxMi4ZHjFg1ikQGx+mUAIffFTYIEx9Q+Kxd3vCT0FUFGOmbsuh6F6yRhpybsjkg==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@mui/material-pigment-css': ^6.0.0 + '@mui/material-pigment-css': ^6.0.2 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1949,8 +1949,8 @@ packages: '@types/react': optional: true - '@mui/private-theming@6.0.0': - resolution: {integrity: sha512-GaURgp4wl/E4X/v2wF7joYYR8Skzf+LBtBHi/Vb6FlwrMGiZGW9gatPPpK89aB64NZ25UPwPsXupWPoOdbmSMg==} + '@mui/private-theming@6.0.2': + resolution: {integrity: sha512-emddFcRhA0hPGVIwIbW5g0V8vtCgw2g/H/A7jTdGe7dpCWEPpp6jPIXRRKcEUWgmg91R6rBNfV+LFHxBxmZXOQ==} engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1959,8 +1959,8 @@ packages: '@types/react': optional: true - '@mui/styled-engine@6.0.0': - resolution: {integrity: sha512-V/i+XixLUzulE1tSwlf9iJXipuD1J9XBV1Z1Yezfc0p42wAvoB9dIJImfUNMjvAsjdgw1CoRoebROQlLLy8HsQ==} + '@mui/styled-engine@6.0.2': + resolution: {integrity: sha512-qd3Vlhted0SYVGotnCfVNcxff7vW2WN0fclbAexff60NeNS1qs/H/CImHEHUBiUGeNWMPRochbN6VF1arQ7/jA==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -1972,8 +1972,8 @@ packages: '@emotion/styled': optional: true - '@mui/system@6.0.0': - resolution: {integrity: sha512-Y1Luj5aApIN+FnrdZTwd/UvL3QC53nHHweaWco27vO9WLC/s/bLYFR6sO9hdib2wIGLr3WCQJGUafeGpz5OWzw==} + '@mui/system@6.0.2': + resolution: {integrity: sha512-AZv1/C4PuHgWFTA8YraIzl3FTVLdRz0RIMRwEADWZBdIhnuTHS/4+r8qE9+3CcpTHg1WsEu8btaO3AhQahSM9A==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -1996,8 +1996,8 @@ packages: '@types/react': optional: true - '@mui/utils@6.0.0': - resolution: {integrity: sha512-6MlZc3Kv/KctTkq6EQyi5p1UKtJpBxcmTyqxM3HucbdhAZuUMRTYYipLVQRqvDqiUisqQcev3QDFKx1b7DMCwg==} + '@mui/utils@6.0.2': + resolution: {integrity: sha512-TeFrYsxcmeoDSlkoPhX+LjIuuqC5Pyj+xz2kRceKCkUpwMNTEeVOfowXDPe+mboZwmpJ5ZxP4eiAgQMdeEasjg==} engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -2006,9 +2006,9 @@ packages: '@types/react': optional: true - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2046,18 +2046,18 @@ packages: peerDependencies: '@penumbra-zone/protobuf': 6.0.0 - '@penumbra-zone/client@18.0.1': - resolution: {integrity: sha512-As/UhrW/sRKUsV4mJMAhUzBIcIdoBmQ058hiniSG9NQ2Ja9/1Uug4fg1HPiMmy3Gw9uPD7E4j+yeSJIiHRJFPw==} + '@penumbra-zone/client@18.1.0': + resolution: {integrity: sha512-khXFquqIpDmXUCwQpP6RfYQnkNI4ekDqz+SP/XCo+7W1xHKJiApXnHDKBA/VsOZ1Q/qGak/R1xfq6z9aV58xSA==} peerDependencies: '@bufbuild/protobuf': ^1.10.0 '@connectrpc/connect': ^1.4.0 '@penumbra-zone/protobuf': 6.0.0 '@penumbra-zone/transport-dom': 7.5.0 - '@penumbra-zone/crypto-web@22.0.0': - resolution: {integrity: sha512-4gbgzsfqO6tN4/LkefIAaLsGoVebD5DQHEybdxAxXBLniuizewr/8ceSpDZVY8sFpbU2l7dfNfQt4mTE2F8jew==} + '@penumbra-zone/crypto-web@23.0.0': + resolution: {integrity: sha512-JLDIOHJE4B7gPOAIPbCT2DxF5srUq4AW95hllvMADsO2iwovh54OFXSuFbLZfvaJrLs84boVT10R/27QlTdG0A==} peerDependencies: - '@penumbra-zone/types': 21.0.0 + '@penumbra-zone/types': 22.0.0 '@penumbra-zone/getters@16.0.0': resolution: {integrity: sha512-c4saUCIooXKDIdl3UmXAtIspxkt/K1vZNyXRLwUyB0B0EfXj7qILlDbz2csOewU8SSKFIuzaBscIeJykOEHKXg==} @@ -2070,55 +2070,55 @@ packages: resolution: {integrity: sha512-1K+/8bh53Kse4u/I1afUQuRrTnZhLLA6JWIV+mFiXX8An2J2CGIVDjp1mSJkUSzFjFDUzUX052kvYHCtZYK3QA==} hasBin: true - '@penumbra-zone/perspective@28.0.0': - resolution: {integrity: sha512-HfRR/8ap+/asSGwIFHHkScj9gnFmFQh6puGVhAeALCXa2lv/nMe9NIM1LFf1M+621NO5B5TWugXOKSl4yBcpzA==} + '@penumbra-zone/perspective@29.0.0': + resolution: {integrity: sha512-9nzixSJqbaPQvwYGhANr+kCgpqwakcsz+Amp/l2CJwjW9m/dGa79O6wA8Qp3ZKgHhXy+b51+PU/Tsdaosv3Rug==} peerDependencies: '@bufbuild/protobuf': ^1.10.0 '@penumbra-zone/bech32m': 7.0.0 '@penumbra-zone/getters': 16.0.0 '@penumbra-zone/protobuf': 6.0.0 - '@penumbra-zone/wasm': 26.2.0 + '@penumbra-zone/wasm': 27.0.0 '@penumbra-zone/protobuf@6.0.0': resolution: {integrity: sha512-x+g2plwEnYwzB692oAIzA9yzqcbsJt1f1lYmPNJpWOqNA9wC3OPDOfzQa7rgP4v6+KNd5IbRfRNyGPd/6zxYNg==} peerDependencies: '@bufbuild/protobuf': ^1.10.0 - '@penumbra-zone/query@29.0.0': - resolution: {integrity: sha512-qgBeV/JR0IvrJROarbQQrXMxSjZRyPINfWR8G8+WzJdMskTazJgSbATso3DAkQHg7PwqAXdCPLchTqUwnS0vgA==} + '@penumbra-zone/query@30.0.0': + resolution: {integrity: sha512-rr+xAlOk49ORWWsTsVnynIXkk/HGz9O4myOOIdWqH1YpEcHu6AHjwPJl5mq/B5uptopyPgwS7uW4qIt8CCCJtA==} peerDependencies: '@penumbra-zone/bech32m': 7.0.0 - '@penumbra-zone/crypto-web': 22.0.0 + '@penumbra-zone/crypto-web': 23.0.0 '@penumbra-zone/getters': 16.0.0 '@penumbra-zone/protobuf': 6.0.0 - '@penumbra-zone/types': 21.0.0 - '@penumbra-zone/wasm': 26.2.0 + '@penumbra-zone/types': 22.0.0 + '@penumbra-zone/wasm': 27.0.0 - '@penumbra-zone/services@32.0.0': - resolution: {integrity: sha512-dONqQcAAqexFXthiKHSendu1MDa4ZjtLZVakL5OmjXFs4vXpPpYNG3CCecEun/EzAs4jeGeaeWER9JtqPhH0Xg==} + '@penumbra-zone/services@33.0.0': + resolution: {integrity: sha512-HFIh0rw/mqLSgPFtyYPVreizg/wO+eIsoNQYSdb2RSiKRlCkBEogpTXytrzTw10XHSLXbsZrJR7ReTeJBGp5ZA==} peerDependencies: '@bufbuild/protobuf': ^1.10.0 '@connectrpc/connect': ^1.4.0 '@penumbra-zone/bech32m': 7.0.0 - '@penumbra-zone/crypto-web': 22.0.0 + '@penumbra-zone/crypto-web': 23.0.0 '@penumbra-zone/getters': 16.0.0 '@penumbra-zone/protobuf': 6.0.0 - '@penumbra-zone/query': 29.0.0 - '@penumbra-zone/storage': 28.0.0 + '@penumbra-zone/query': 30.0.0 + '@penumbra-zone/storage': 29.0.0 '@penumbra-zone/transport-dom': 7.5.0 - '@penumbra-zone/types': 21.0.0 - '@penumbra-zone/wasm': 26.2.0 + '@penumbra-zone/types': 22.0.0 + '@penumbra-zone/wasm': 27.0.0 - '@penumbra-zone/storage@28.0.0': - resolution: {integrity: sha512-zausWRlhmVpE5mxPBFj61zG1bzlHHcT0LYzXwOnbeYhkZfbIOCYo7oPvNY6KqPdrqYrOQZPcIeQSEdUrelLuxA==} + '@penumbra-zone/storage@29.0.0': + resolution: {integrity: sha512-m11GuRFMl7b8BV/L64tkjIbecTaOmEAIrTHfmpZKyQXdyw7povVbIegBw/PXAqxH9Gf0BAwLL+lBvRA9/JHcKA==} peerDependencies: '@bufbuild/protobuf': ^1.10.0 '@penumbra-labs/registry': 11.1.0 '@penumbra-zone/bech32m': 7.0.0 '@penumbra-zone/getters': 16.0.0 '@penumbra-zone/protobuf': 6.0.0 - '@penumbra-zone/types': 21.0.0 - '@penumbra-zone/wasm': 26.2.0 + '@penumbra-zone/types': 22.0.0 + '@penumbra-zone/wasm': 27.0.0 '@penumbra-zone/transport-chrome@8.0.1': resolution: {integrity: sha512-Bk5/6N60hkeDwtx/ebP5u5DgZWNdRh6FQHgOXNP93FJjg4oobNOkjdoH0Gdqevj+sawGnyXFCyC6WeHB6D2LTA==} @@ -2130,21 +2130,21 @@ packages: '@penumbra-zone/transport-dom@7.5.0': resolution: {integrity: sha512-8xFIEDeXODl18AITfiIrJJoE8Y6y/+apO+BhrqCmXP+yqGo8LBzcW3iWDQkOc6Go2c1MGJT97B25r079Km1kuA==} - '@penumbra-zone/types@21.0.0': - resolution: {integrity: sha512-ViEebo+S+NgMolu8la8/uxbh+pScVgzGJ82lqCt/bdimD+UGgIrw/b6tPamKXTAjS9eW2YEqT6UT+67alFEPpw==} + '@penumbra-zone/types@22.0.0': + resolution: {integrity: sha512-cl0OTcGXJehkL1B18HTVMXY+aqZ6pIfD12DhP9kAi8xkOiIbjNwu48NHzs2BXospnTMaiW8aqdpBRy6nCJCF0A==} peerDependencies: '@bufbuild/protobuf': ^1.10.0 '@penumbra-zone/bech32m': 7.0.0 '@penumbra-zone/getters': 16.0.0 '@penumbra-zone/protobuf': 6.0.0 - '@penumbra-zone/wasm@26.2.0': - resolution: {integrity: sha512-WimfNxVe9NXJMJnvoEyxSbOixW8x8YIcrIiXmaMBPPrkC3p8Bq3UzJqgg8FBtDEycU8oVOehs9MN3lLVMbgagQ==} + '@penumbra-zone/wasm@27.0.0': + resolution: {integrity: sha512-+ttIMQeOUbFSx4IC7LnHGixwGoV3F4gvNo7sHqR60T2DL3rWpBiSsTm9BFBfSmKLnOdAgkfr+2/uGFJvibaVnw==} peerDependencies: '@bufbuild/protobuf': ^1.10.0 '@penumbra-zone/bech32m': 7.0.0 '@penumbra-zone/protobuf': 6.0.0 - '@penumbra-zone/types': 21.0.0 + '@penumbra-zone/types': 22.0.0 '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2883,8 +2883,8 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.21.1': - resolution: {integrity: sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==} + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} cpu: [arm] os: [android] @@ -2893,8 +2893,8 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.21.1': - resolution: {integrity: sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==} + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} cpu: [arm64] os: [android] @@ -2903,8 +2903,8 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.21.1': - resolution: {integrity: sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==} + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} cpu: [arm64] os: [darwin] @@ -2913,8 +2913,8 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.21.1': - resolution: {integrity: sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==} + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} cpu: [x64] os: [darwin] @@ -2923,8 +2923,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.21.1': - resolution: {integrity: sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} cpu: [arm] os: [linux] @@ -2933,8 +2933,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.21.1': - resolution: {integrity: sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==} + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} cpu: [arm] os: [linux] @@ -2943,8 +2943,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.21.1': - resolution: {integrity: sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==} + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} cpu: [arm64] os: [linux] @@ -2953,8 +2953,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.21.1': - resolution: {integrity: sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==} + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} cpu: [arm64] os: [linux] @@ -2963,8 +2963,8 @@ packages: cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': - resolution: {integrity: sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} cpu: [ppc64] os: [linux] @@ -2973,8 +2973,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.21.1': - resolution: {integrity: sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==} + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} cpu: [riscv64] os: [linux] @@ -2983,8 +2983,8 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.21.1': - resolution: {integrity: sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==} + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} cpu: [s390x] os: [linux] @@ -2993,8 +2993,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.21.1': - resolution: {integrity: sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==} + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} cpu: [x64] os: [linux] @@ -3003,8 +3003,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.21.1': - resolution: {integrity: sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==} + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} cpu: [x64] os: [linux] @@ -3013,8 +3013,8 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.21.1': - resolution: {integrity: sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==} + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} cpu: [arm64] os: [win32] @@ -3023,8 +3023,8 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.21.1': - resolution: {integrity: sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==} + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} cpu: [ia32] os: [win32] @@ -3033,8 +3033,8 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.21.1': - resolution: {integrity: sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} cpu: [x64] os: [win32] @@ -3286,8 +3286,8 @@ packages: '@storybook/types@8.1.1': resolution: {integrity: sha512-QSQ63aKr2IXrGjX2/Fg1oiGWk+2Nuf+TplaHRC2NKBMgvyn+M0BHUgMTDHQVrFaH4bpl2PkE0r0tzOKP4JI43A==} - '@swc/core-darwin-arm64@1.7.21': - resolution: {integrity: sha512-hh5uOZ7jWF66z2TRMhhXtWMQkssuPCSIZPy9VHf5KvZ46cX+5UeECDthchYklEVZQyy4Qr6oxfh4qff/5spoMA==} + '@swc/core-darwin-arm64@1.7.23': + resolution: {integrity: sha512-yyOHPfti6yKlQulfVWMt7BVKst+SyEZYCWuQSGMn1KgmNCH/bYufRWfQXIhkGSj44ZkEepJmsJ8tDyIb4k5WyA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -3298,8 +3298,8 @@ packages: cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.7.21': - resolution: {integrity: sha512-lTsPquqSierQ6jWiWM7NnYXXZGk9zx3NGkPLHjPbcH5BmyiauX0CC/YJYJx7YmS2InRLyALlGmidHkaF4JY28A==} + '@swc/core-darwin-x64@1.7.23': + resolution: {integrity: sha512-GzqHwQ0Y1VyjdI/bBKFX2GKm5HD3PIB6OhuAQtWZMTtEr2yIrlT0YK2T+XKh7oIg31JwxGBeQdBk3KTI7DARmQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -3310,8 +3310,8 @@ packages: cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.7.21': - resolution: {integrity: sha512-AgSd0fnSzAqCvWpzzZCq75z62JVGUkkXEOpfdi99jj/tryPy38KdXJtkVWJmufPXlRHokGTBitalk33WDJwsbA==} + '@swc/core-linux-arm-gnueabihf@1.7.23': + resolution: {integrity: sha512-qwX4gB41OS6/OZkHcpTqLFGsdmvoZyffnJIlgB/kZKwH3lfeJWzv6vx57zXtNpM/t7GoQEe0VZUVdmNjxSxBZw==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -3322,8 +3322,8 @@ packages: cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.7.21': - resolution: {integrity: sha512-l+jw6RQ4Y43/8dIst0c73uQE+W3kCWrCFqMqC/xIuE/iqHOnvYK6YbA1ffOct2dImkHzNiKuoehGqtQAc6cNaQ==} + '@swc/core-linux-arm64-gnu@1.7.23': + resolution: {integrity: sha512-TsrbUZdMaUwzI7+g/8rHPLWbntMKYSu5Bn5IBSqVKPeyqaXxNnlIUnWXgXcUcRAc+T+Y8ADfr7EiFz9iz5DuSA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -3334,8 +3334,8 @@ packages: cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.7.21': - resolution: {integrity: sha512-29KKZXrTo/c9F1JFL9WsNvCa6UCdIVhHP5EfuYhlKbn5/YmSsNFkuHdUtZFEd5U4+jiShXDmgGCtLW2d08LIwg==} + '@swc/core-linux-arm64-musl@1.7.23': + resolution: {integrity: sha512-JEdtwdthazKq4PBz53KSubwwK8MvqODAihGSAzc8u3Unq4ojcvaS8b0CwLBeD+kTQ78HpxOXTt3DsFIxpgaCAA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -3346,8 +3346,8 @@ packages: cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.7.21': - resolution: {integrity: sha512-HsP3JwddvQj5HvnjmOr+Bd5plEm6ccpfP5wUlm3hywzvdVkj+yR29bmD7UwpV/1zCQ60Ry35a7mXhKI6HQxFgw==} + '@swc/core-linux-x64-gnu@1.7.23': + resolution: {integrity: sha512-V51gFPWaVAHbI1yg9ahsoya3aB4uawye3SZ5uQWgcP7wdCdiv60dw4F5nuPJf5Z1oXD3U/BslXuamv8Oh9vXqQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -3358,8 +3358,8 @@ packages: cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.7.21': - resolution: {integrity: sha512-hYKLVeUTHqvFK628DFJEwxoX6p42T3HaQ4QjNtf3oKhiJWFh9iTRUrN/oCB5YI3R9WMkFkKh+99gZ/Dd0T5lsg==} + '@swc/core-linux-x64-musl@1.7.23': + resolution: {integrity: sha512-BBqQi4+UdeRqag3yM4IJjaHG4yc1o3l9ksENHToE0o/u2DT0FY5+K/DiYGZLC1JHbSFzNqRCYsa7DIzRtZ0A1A==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -3370,8 +3370,8 @@ packages: cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.7.21': - resolution: {integrity: sha512-qyWAKW10aMBe6iUqeZ7NAJIswjfggVTUpDINpQGUJhz+pR71YZDidXgZXpaDB84YyDB2JAlRqd1YrLkl7CMiIw==} + '@swc/core-win32-arm64-msvc@1.7.23': + resolution: {integrity: sha512-JPk6pvCKncL6bXG7p+NLZf8PWx4FakVvKNdwGeMrYunb+yk1IZf7qf9LJk8+GDGF5QviDXPs8opZrTrfsW80fA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -3382,8 +3382,8 @@ packages: cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.7.21': - resolution: {integrity: sha512-cy61wS3wgH5mEwBiQ5w6/FnQrchBDAdPsSh0dKSzNmI+4K8hDxS8uzdBycWqJXO0cc+mA77SIlwZC3hP3Kum2g==} + '@swc/core-win32-ia32-msvc@1.7.23': + resolution: {integrity: sha512-2Whxi8d+bLQBzJcQ5qYPHlk02YYVGsMVav0fWk+FnX2z1QRREIu1L1xvrpi7gBpjXp6BIU40ya8GiKeekNT2bg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -3394,8 +3394,8 @@ packages: cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.7.21': - resolution: {integrity: sha512-/rexGItJURNJOdae+a48M+loT74nsEU+PyRRVAkZMKNRtLoYFAr0cpDlS5FodIgGunp/nqM0bst4H2w6Y05IKA==} + '@swc/core-win32-x64-msvc@1.7.23': + resolution: {integrity: sha512-82fARk4/yJ40kwWKY/gdKDisPdtgJE9jgpl/vkNG3alyJxrCzuNM7+CtiKoYbXLeqM8GQTS3wlvCaJu9oQ8dag==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -3406,8 +3406,8 @@ packages: cpu: [x64] os: [win32] - '@swc/core@1.7.21': - resolution: {integrity: sha512-7/cN0SZ+y2V6e0hsDD8koGR0QVh7Jl3r756bwaHLLSN+kReoUb/yVcLsA8iTn90JLME3DkQK4CPjxDCQiyMXNg==} + '@swc/core@1.7.23': + resolution: {integrity: sha512-VDNkpDvDlreGh2E3tlDj8B3piiuLhhQA/7rIVZpiLUvG1YpucAa6N7iDXA7Gc/+Hah8spaCg/qvEaBkCmcIYCQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -3670,8 +3670,8 @@ packages: '@types/node@20.14.13': resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} - '@types/node@22.5.1': - resolution: {integrity: sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==} + '@types/node@22.5.2': + resolution: {integrity: sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==} '@types/npmlog@4.1.6': resolution: {integrity: sha512-0l3z16vnlJGl2Mi/rgJFrdwfLZ4jfNYgE6ZShEpjqhHuGTqdEzNles03NpYHwUMVYZa+Tj46UxKIEpE78lQ3DQ==} @@ -3697,8 +3697,8 @@ packages: '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} - '@types/react@18.3.4': - resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==} + '@types/react@18.3.5': + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} '@types/request@2.48.12': resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} @@ -4485,8 +4485,8 @@ packages: caniuse-lite@1.0.30001643: resolution: {integrity: sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==} - caniuse-lite@1.0.30001653: - resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} + caniuse-lite@1.0.30001655: + resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==} cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} @@ -7664,6 +7664,9 @@ packages: picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -7839,8 +7842,8 @@ packages: resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.41: - resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + postcss@8.4.44: + resolution: {integrity: sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -8366,8 +8369,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.21.1: - resolution: {integrity: sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==} + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -11437,13 +11440,13 @@ snapshots: optionalDependencies: typescript: 5.5.4 - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(terser@5.31.6))': dependencies: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.5.4) - vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6) + vite: 5.4.2(@types/node@22.5.2)(terser@5.31.6) optionalDependencies: typescript: 5.5.4 @@ -11502,15 +11505,15 @@ snapshots: '@types/react': 18.3.3 react: 18.3.1 - '@mui/core-downloads-tracker@6.0.0': {} + '@mui/core-downloads-tracker@6.0.2': {} - '@mui/material@6.0.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@6.0.2(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/core-downloads-tracker': 6.0.0 - '@mui/system': 6.0.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/core-downloads-tracker': 6.0.2 + '@mui/system': 6.0.2(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/types': 7.2.16(@types/react@18.3.3) - '@mui/utils': 6.0.0(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.2(@types/react@18.3.3)(react@18.3.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.11 clsx: 2.1.1 @@ -11525,16 +11528,16 @@ snapshots: '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/private-theming@6.0.0(@types/react@18.3.3)(react@18.3.1)': + '@mui/private-theming@6.0.2(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/utils': 6.0.0(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.2(@types/react@18.3.3)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: '@types/react': 18.3.3 - '@mui/styled-engine@6.0.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@6.0.2(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 '@emotion/cache': 11.13.1 @@ -11545,13 +11548,13 @@ snapshots: '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/system@6.0.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@mui/system@6.0.2(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/private-theming': 6.0.0(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine': 6.0.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) + '@mui/private-theming': 6.0.2(@types/react@18.3.3)(react@18.3.1) + '@mui/styled-engine': 6.0.2(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.16(@types/react@18.3.3) - '@mui/utils': 6.0.0(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.2(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -11565,7 +11568,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@mui/utils@6.0.0(@types/react@18.3.3)(react@18.3.1)': + '@mui/utils@6.0.2(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 '@mui/types': 7.2.16(@types/react@18.3.3) @@ -11577,7 +11580,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@noble/hashes@1.4.0': {} + '@noble/hashes@1.5.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -11618,16 +11621,16 @@ snapshots: '@penumbra-zone/protobuf': 6.0.0(@bufbuild/protobuf@1.10.0) bech32: 2.0.0 - '@penumbra-zone/client@18.0.1(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.5.0)': + '@penumbra-zone/client@18.1.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.5.0)': dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) '@penumbra-zone/protobuf': 6.0.0(@bufbuild/protobuf@1.10.0) '@penumbra-zone/transport-dom': 7.5.0 - '@penumbra-zone/crypto-web@22.0.0(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))': + '@penumbra-zone/crypto-web@23.0.0(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))': dependencies: - '@penumbra-zone/types': 21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) + '@penumbra-zone/types': 22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) bip39: 3.1.0 crypto-js: 4.2.0 @@ -11639,54 +11642,54 @@ snapshots: '@penumbra-zone/keys@4.2.1': {} - '@penumbra-zone/perspective@28.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/wasm@26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))))': + '@penumbra-zone/perspective@29.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/wasm@27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))))': dependencies: '@bufbuild/protobuf': 1.10.0 '@penumbra-zone/bech32m': 7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/getters': 16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/protobuf': 6.0.0(@bufbuild/protobuf@1.10.0) - '@penumbra-zone/wasm': 26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + '@penumbra-zone/wasm': 27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) '@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)': dependencies: '@bufbuild/protobuf': 1.10.0 - '@penumbra-zone/query@29.0.0(lgdfff65jhftsrxe7yms2hodri)': + '@penumbra-zone/query@30.0.0(banmk3erwunubgvg457fwz7rvq)': dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) '@connectrpc/connect-web': 1.4.0(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/bech32m': 7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) - '@penumbra-zone/crypto-web': 22.0.0(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + '@penumbra-zone/crypto-web': 23.0.0(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) '@penumbra-zone/getters': 16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/protobuf': 6.0.0(@bufbuild/protobuf@1.10.0) - '@penumbra-zone/types': 21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) - '@penumbra-zone/wasm': 26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + '@penumbra-zone/types': 22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) + '@penumbra-zone/wasm': 27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) exponential-backoff: 3.1.1 - '@penumbra-zone/services@32.0.0(puvtpkyxdz7u2mryloo5z5pz6q)': + '@penumbra-zone/services@33.0.0(m7lhnv2o565qvcwz2e4vqrdxsi)': dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) '@penumbra-zone/bech32m': 7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) - '@penumbra-zone/crypto-web': 22.0.0(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + '@penumbra-zone/crypto-web': 23.0.0(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) '@penumbra-zone/getters': 16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/protobuf': 6.0.0(@bufbuild/protobuf@1.10.0) - '@penumbra-zone/query': 29.0.0(lgdfff65jhftsrxe7yms2hodri) - '@penumbra-zone/storage': 28.0.0(3wbpnsgziu7e3ofmprbzkzltsi) + '@penumbra-zone/query': 30.0.0(banmk3erwunubgvg457fwz7rvq) + '@penumbra-zone/storage': 29.0.0(uz3f7wsbv65r4y3vsa3krgv4bu) '@penumbra-zone/transport-dom': 7.5.0 - '@penumbra-zone/types': 21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) - '@penumbra-zone/wasm': 26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + '@penumbra-zone/types': 22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) + '@penumbra-zone/wasm': 27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) - '@penumbra-zone/storage@28.0.0(3wbpnsgziu7e3ofmprbzkzltsi)': + '@penumbra-zone/storage@29.0.0(uz3f7wsbv65r4y3vsa3krgv4bu)': dependencies: '@bufbuild/protobuf': 1.10.0 '@penumbra-labs/registry': 11.1.0 '@penumbra-zone/bech32m': 7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/getters': 16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/protobuf': 6.0.0(@bufbuild/protobuf@1.10.0) - '@penumbra-zone/types': 21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) - '@penumbra-zone/wasm': 26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) + '@penumbra-zone/types': 22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) + '@penumbra-zone/wasm': 27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))) idb: 8.0.0 '@penumbra-zone/transport-chrome@8.0.1(@bufbuild/protobuf@1.10.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/transport-dom@7.5.0)': @@ -11700,7 +11703,7 @@ snapshots: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.10.0) - '@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))': + '@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))': dependencies: '@bufbuild/protobuf': 1.10.0 '@penumbra-zone/bech32m': 7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) @@ -11710,12 +11713,12 @@ snapshots: idb: 8.0.0 zod: 3.23.8 - '@penumbra-zone/wasm@26.2.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))': + '@penumbra-zone/wasm@27.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0))(@penumbra-zone/types@22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))': dependencies: '@bufbuild/protobuf': 1.10.0 '@penumbra-zone/bech32m': 7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) '@penumbra-zone/protobuf': 6.0.0(@bufbuild/protobuf@1.10.0) - '@penumbra-zone/types': 21.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) + '@penumbra-zone/types': 22.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/getters@16.0.0(@bufbuild/protobuf@1.10.0)(@penumbra-zone/bech32m@7.0.0(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)))(@penumbra-zone/protobuf@6.0.0(@bufbuild/protobuf@1.10.0)) optionalDependencies: '@penumbra-zone/keys': 4.2.1 @@ -12458,108 +12461,108 @@ snapshots: '@remix-run/router@1.18.0': {} - '@rollup/pluginutils@5.1.0(rollup@4.21.1)': + '@rollup/pluginutils@5.1.0(rollup@4.21.2)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.21.1 + rollup: 4.21.2 '@rollup/rollup-android-arm-eabi@4.19.1': optional: true - '@rollup/rollup-android-arm-eabi@4.21.1': + '@rollup/rollup-android-arm-eabi@4.21.2': optional: true '@rollup/rollup-android-arm64@4.19.1': optional: true - '@rollup/rollup-android-arm64@4.21.1': + '@rollup/rollup-android-arm64@4.21.2': optional: true '@rollup/rollup-darwin-arm64@4.19.1': optional: true - '@rollup/rollup-darwin-arm64@4.21.1': + '@rollup/rollup-darwin-arm64@4.21.2': optional: true '@rollup/rollup-darwin-x64@4.19.1': optional: true - '@rollup/rollup-darwin-x64@4.21.1': + '@rollup/rollup-darwin-x64@4.21.2': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.19.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.21.1': + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': optional: true '@rollup/rollup-linux-arm-musleabihf@4.19.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.21.1': + '@rollup/rollup-linux-arm-musleabihf@4.21.2': optional: true '@rollup/rollup-linux-arm64-gnu@4.19.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.21.1': + '@rollup/rollup-linux-arm64-gnu@4.21.2': optional: true '@rollup/rollup-linux-arm64-musl@4.19.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.21.1': + '@rollup/rollup-linux-arm64-musl@4.21.2': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.19.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': optional: true '@rollup/rollup-linux-riscv64-gnu@4.19.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.21.1': + '@rollup/rollup-linux-riscv64-gnu@4.21.2': optional: true '@rollup/rollup-linux-s390x-gnu@4.19.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.21.1': + '@rollup/rollup-linux-s390x-gnu@4.21.2': optional: true '@rollup/rollup-linux-x64-gnu@4.19.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.21.1': + '@rollup/rollup-linux-x64-gnu@4.21.2': optional: true '@rollup/rollup-linux-x64-musl@4.19.1': optional: true - '@rollup/rollup-linux-x64-musl@4.21.1': + '@rollup/rollup-linux-x64-musl@4.21.2': optional: true '@rollup/rollup-win32-arm64-msvc@4.19.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.21.1': + '@rollup/rollup-win32-arm64-msvc@4.21.2': optional: true '@rollup/rollup-win32-ia32-msvc@4.19.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.21.1': + '@rollup/rollup-win32-ia32-msvc@4.21.2': optional: true '@rollup/rollup-win32-x64-msvc@4.19.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.21.1': + '@rollup/rollup-win32-x64-msvc@4.21.2': optional: true '@sinclair/typebox@0.27.8': {} @@ -12631,11 +12634,11 @@ snapshots: '@storybook/global': 5.0.0 storybook: 8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)) - '@storybook/addon-interactions@8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@22.5.1)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6))': + '@storybook/addon-interactions@8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@22.5.2)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6))': dependencies: '@storybook/global': 5.0.0 '@storybook/instrumenter': 8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9))) - '@storybook/test': 8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@22.5.1)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6)) + '@storybook/test': 8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@22.5.2)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6)) polished: 4.3.1 storybook: 8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)) ts-dedent: 2.2.0 @@ -12667,13 +12670,13 @@ snapshots: storybook: 8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)) ts-dedent: 2.2.0 - '@storybook/addon-postcss@2.0.0(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5))': + '@storybook/addon-postcss@2.0.0(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5))': dependencies: '@storybook/node-logger': 6.5.16 - css-loader: 3.6.0(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5)) + css-loader: 3.6.0(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5)) postcss: 7.0.39 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5)) - style-loader: 1.3.0(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5)) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5)) + style-loader: 1.3.0(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5)) transitivePeerDependencies: - webpack @@ -12734,7 +12737,7 @@ snapshots: - prettier - supports-color - '@storybook/builder-vite@8.1.1(encoding@0.1.13)(prettier@3.3.3)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))': + '@storybook/builder-vite@8.1.1(encoding@0.1.13)(prettier@3.3.3)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(terser@5.31.6))': dependencies: '@storybook/channels': 8.1.1 '@storybook/client-logger': 8.1.1 @@ -12753,7 +12756,7 @@ snapshots: fs-extra: 11.2.0 magic-string: 0.30.11 ts-dedent: 2.2.0 - vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6) + vite: 5.4.2(@types/node@22.5.2)(terser@5.31.6) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -12968,10 +12971,10 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)) - '@storybook/react-vite@8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.1)(typescript@5.5.4)(vite@5.4.2(@types/node@20.14.13)(terser@5.31.6))': + '@storybook/react-vite@8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.2)(typescript@5.5.4)(vite@5.4.2(@types/node@20.14.13)(terser@5.31.6))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.5.4)(vite@5.4.2(@types/node@20.14.13)(terser@5.31.6)) - '@rollup/pluginutils': 5.1.0(rollup@4.21.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) '@storybook/builder-vite': 8.1.1(encoding@0.1.13)(prettier@3.3.3)(typescript@5.5.4)(vite@5.4.2(@types/node@20.14.13)(terser@5.31.6)) '@storybook/node-logger': 8.1.1 '@storybook/react': 8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) @@ -12993,11 +12996,11 @@ snapshots: - typescript - vite-plugin-glimmerx - '@storybook/react-vite@8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.1)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))': + '@storybook/react-vite@8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.2)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(terser@5.31.6))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6)) - '@rollup/pluginutils': 5.1.0(rollup@4.21.1) - '@storybook/builder-vite': 8.1.1(encoding@0.1.13)(prettier@3.3.3)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(terser@5.31.6)) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + '@storybook/builder-vite': 8.1.1(encoding@0.1.13)(prettier@3.3.3)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(terser@5.31.6)) '@storybook/node-logger': 8.1.1 '@storybook/react': 8.1.1(encoding@0.1.13)(prettier@3.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@storybook/types': 8.1.1 @@ -13008,7 +13011,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) resolve: 1.22.8 tsconfig-paths: 4.2.0 - vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6) + vite: 5.4.2(@types/node@22.5.2)(terser@5.31.6) transitivePeerDependencies: - '@preact/preset-vite' - encoding @@ -13079,12 +13082,12 @@ snapshots: optionalDependencies: typescript: 5.5.4 - '@storybook/test@8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@22.5.1)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6))': + '@storybook/test@8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9)))(vitest@2.0.5(@types/node@22.5.2)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6))': dependencies: '@storybook/csf': 0.1.11 '@storybook/instrumenter': 8.2.6(storybook@8.2.6(@babel/preset-env@7.25.0(@babel/core@7.24.9))) '@testing-library/dom': 10.1.0 - '@testing-library/jest-dom': 6.4.5(vitest@2.0.5(@types/node@22.5.1)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6)) + '@testing-library/jest-dom': 6.4.5(vitest@2.0.5(@types/node@22.5.2)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6)) '@testing-library/user-event': 14.5.2(@testing-library/dom@10.1.0) '@vitest/expect': 1.6.0 '@vitest/spy': 1.6.0 @@ -13107,81 +13110,81 @@ snapshots: '@types/express': 4.17.21 file-system-cache: 2.3.0 - '@swc/core-darwin-arm64@1.7.21': + '@swc/core-darwin-arm64@1.7.23': optional: true '@swc/core-darwin-arm64@1.7.3': optional: true - '@swc/core-darwin-x64@1.7.21': + '@swc/core-darwin-x64@1.7.23': optional: true '@swc/core-darwin-x64@1.7.3': optional: true - '@swc/core-linux-arm-gnueabihf@1.7.21': + '@swc/core-linux-arm-gnueabihf@1.7.23': optional: true '@swc/core-linux-arm-gnueabihf@1.7.3': optional: true - '@swc/core-linux-arm64-gnu@1.7.21': + '@swc/core-linux-arm64-gnu@1.7.23': optional: true '@swc/core-linux-arm64-gnu@1.7.3': optional: true - '@swc/core-linux-arm64-musl@1.7.21': + '@swc/core-linux-arm64-musl@1.7.23': optional: true '@swc/core-linux-arm64-musl@1.7.3': optional: true - '@swc/core-linux-x64-gnu@1.7.21': + '@swc/core-linux-x64-gnu@1.7.23': optional: true '@swc/core-linux-x64-gnu@1.7.3': optional: true - '@swc/core-linux-x64-musl@1.7.21': + '@swc/core-linux-x64-musl@1.7.23': optional: true '@swc/core-linux-x64-musl@1.7.3': optional: true - '@swc/core-win32-arm64-msvc@1.7.21': + '@swc/core-win32-arm64-msvc@1.7.23': optional: true '@swc/core-win32-arm64-msvc@1.7.3': optional: true - '@swc/core-win32-ia32-msvc@1.7.21': + '@swc/core-win32-ia32-msvc@1.7.23': optional: true '@swc/core-win32-ia32-msvc@1.7.3': optional: true - '@swc/core-win32-x64-msvc@1.7.21': + '@swc/core-win32-x64-msvc@1.7.23': optional: true '@swc/core-win32-x64-msvc@1.7.3': optional: true - '@swc/core@1.7.21': + '@swc/core@1.7.23': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.12 optionalDependencies: - '@swc/core-darwin-arm64': 1.7.21 - '@swc/core-darwin-x64': 1.7.21 - '@swc/core-linux-arm-gnueabihf': 1.7.21 - '@swc/core-linux-arm64-gnu': 1.7.21 - '@swc/core-linux-arm64-musl': 1.7.21 - '@swc/core-linux-x64-gnu': 1.7.21 - '@swc/core-linux-x64-musl': 1.7.21 - '@swc/core-win32-arm64-msvc': 1.7.21 - '@swc/core-win32-ia32-msvc': 1.7.21 - '@swc/core-win32-x64-msvc': 1.7.21 + '@swc/core-darwin-arm64': 1.7.23 + '@swc/core-darwin-x64': 1.7.23 + '@swc/core-linux-arm-gnueabihf': 1.7.23 + '@swc/core-linux-arm64-gnu': 1.7.23 + '@swc/core-linux-arm64-musl': 1.7.23 + '@swc/core-linux-x64-gnu': 1.7.23 + '@swc/core-linux-x64-musl': 1.7.23 + '@swc/core-win32-arm64-msvc': 1.7.23 + '@swc/core-win32-ia32-msvc': 1.7.23 + '@swc/core-win32-x64-msvc': 1.7.23 optional: true '@swc/core@1.7.3': @@ -13242,7 +13245,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(vitest@2.0.5(@types/node@22.5.1)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6))': + '@testing-library/jest-dom@6.4.5(vitest@2.0.5(@types/node@22.5.2)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6))': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.25.0 @@ -13253,7 +13256,7 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 optionalDependencies: - vitest: 2.0.5(@types/node@22.5.1)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6) + vitest: 2.0.5(@types/node@22.5.2)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6) '@testing-library/jest-dom@6.4.8': dependencies: @@ -13280,11 +13283,11 @@ snapshots: dependencies: '@testing-library/dom': 10.1.0 - '@textea/json-viewer@3.4.1(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@textea/json-viewer@3.4.1(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.2(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/material': 6.0.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.0.2(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 copy-to-clipboard: 3.3.3 react: 18.3.1 @@ -13306,7 +13309,7 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@1.13.4(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)': + '@turbo/gen@1.13.4(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)': dependencies: '@turbo/workspaces': 1.13.4 chalk: 2.4.2 @@ -13316,7 +13319,7 @@ snapshots: minimatch: 9.0.5 node-plop: 0.26.3 proxy-agent: 6.4.0 - ts-node: 10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4) + ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -13488,7 +13491,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.5.1': + '@types/node@22.5.2': dependencies: undici-types: 6.19.8 @@ -13510,14 +13513,14 @@ snapshots: '@types/react-transition-group@4.4.11': dependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 '@types/react@18.3.3': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 - '@types/react@18.3.4': + '@types/react@18.3.5': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -13560,11 +13563,11 @@ snapshots: '@types/uuid@9.0.8': {} - '@types/webpack@5.28.5(@swc/core@1.7.21)(webpack-cli@5.1.4(webpack@5.93.0))': + '@types/webpack@5.28.5(@swc/core@1.7.23)(webpack-cli@5.1.4(webpack@5.93.0))': dependencies: '@types/node': 20.14.13 tapable: 2.2.1 - webpack: 5.92.1(@swc/core@1.7.21)(webpack-cli@5.1.4(webpack@5.93.0)) + webpack: 5.92.1(@swc/core@1.7.23)(webpack-cli@5.1.4(webpack@5.93.0)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -13699,10 +13702,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.0(vite@5.3.5(@types/node@22.5.1)(terser@5.31.6))': + '@vitejs/plugin-react-swc@3.7.0(vite@5.3.5(@types/node@22.5.2)(terser@5.31.6))': dependencies: '@swc/core': 1.7.3 - vite: 5.3.5(@types/node@22.5.1)(terser@5.31.6) + vite: 5.3.5(@types/node@22.5.2)(terser@5.31.6) transitivePeerDependencies: - '@swc/helpers' @@ -13859,19 +13862,19 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4))': dependencies: - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.93.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4))': dependencies: - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.93.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4))': dependencies: - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.93.0) '@xtuc/ieee754@1.2.0': {} @@ -14316,7 +14319,7 @@ snapshots: bip39@3.1.0: dependencies: - '@noble/hashes': 1.4.0 + '@noble/hashes': 1.5.0 bl@4.1.0: dependencies: @@ -14395,7 +14398,7 @@ snapshots: browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001653 + caniuse-lite: 1.0.30001655 electron-to-chromium: 1.5.13 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -14499,7 +14502,7 @@ snapshots: caniuse-lite@1.0.30001643: {} - caniuse-lite@1.0.30001653: {} + caniuse-lite@1.0.30001655: {} cardinal@2.1.1: dependencies: @@ -14855,7 +14858,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@12.0.2(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)): + copy-webpack-plugin@12.0.2(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -14863,7 +14866,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) core-js-compat@3.37.1: dependencies: @@ -14940,7 +14943,7 @@ snapshots: css-color-keywords@1.0.0: {} - css-loader@3.6.0(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5)): + css-loader@3.6.0(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5)): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -14955,9 +14958,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.94.0(@swc/core@1.7.21)(esbuild@0.21.5) + webpack: 5.94.0(@swc/core@1.7.23)(esbuild@0.21.5) - css-loader@7.1.2(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)): + css-loader@7.1.2(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)): dependencies: icss-utils: 5.1.0(postcss@8.4.40) postcss: 8.4.40 @@ -14968,7 +14971,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) css-select@4.3.0: dependencies: @@ -15621,11 +15624,11 @@ snapshots: - supports-color - typescript - eslint-plugin-tailwindcss@3.17.4(tailwindcss@3.4.10(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4))): + eslint-plugin-tailwindcss@3.17.4(tailwindcss@3.4.10(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4))): dependencies: fast-glob: 3.3.2 postcss: 8.4.40 - tailwindcss: 3.4.10(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)) + tailwindcss: 3.4.10(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)) eslint-plugin-turbo@2.0.12(eslint@9.8.0): dependencies: @@ -16630,7 +16633,7 @@ snapshots: html-tags@3.3.1: {} - html-webpack-plugin@5.6.0(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)): + html-webpack-plugin@5.6.0(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -16638,7 +16641,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) htmlparser2@6.1.0: dependencies: @@ -18239,6 +18242,8 @@ snapshots: picocolors@1.0.1: {} + picocolors@1.1.0: {} + picomatch@2.3.1: {} pify@2.3.0: {} @@ -18315,9 +18320,9 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.8 - postcss-import@15.1.0(postcss@8.4.41): + postcss-import@15.1.0(postcss@8.4.44): dependencies: - postcss: 8.4.41 + postcss: 8.4.44 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 @@ -18327,36 +18332,36 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.40 - postcss-js@4.0.1(postcss@8.4.41): + postcss-js@4.0.1(postcss@8.4.44): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.41 + postcss: 8.4.44 - postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 yaml: 2.5.0 optionalDependencies: postcss: 8.4.40 - ts-node: 10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4) + ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4) - postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@22.5.1)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 yaml: 2.5.0 optionalDependencies: postcss: 8.4.40 - ts-node: 10.9.2(@swc/core@1.7.21)(@types/node@22.5.1)(typescript@5.5.4) + ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4) - postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)): + postcss-load-config@4.0.2(postcss@8.4.44)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 yaml: 2.5.0 optionalDependencies: - postcss: 8.4.41 - ts-node: 10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4) + postcss: 8.4.44 + ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4) - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5)): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5)): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 @@ -18364,16 +18369,16 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.6.3 - webpack: 5.94.0(@swc/core@1.7.21)(esbuild@0.21.5) + webpack: 5.94.0(@swc/core@1.7.23)(esbuild@0.21.5) - postcss-loader@8.1.1(postcss@8.4.40)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)): + postcss-loader@8.1.1(postcss@8.4.40)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)): dependencies: cosmiconfig: 9.0.0(typescript@5.5.4) jiti: 1.21.6 postcss: 8.4.40 semver: 7.6.3 optionalDependencies: - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript @@ -18424,9 +18429,9 @@ snapshots: postcss: 8.4.40 postcss-selector-parser: 6.1.1 - postcss-nested@6.2.0(postcss@8.4.41): + postcss-nested@6.2.0(postcss@8.4.44): dependencies: - postcss: 8.4.41 + postcss: 8.4.44 postcss-selector-parser: 6.1.1 postcss-selector-parser@6.1.1: @@ -18458,10 +18463,10 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 - postcss@8.4.41: + postcss@8.4.44: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 + picocolors: 1.1.0 source-map-js: 1.2.0 postgres-array@2.0.0: {} @@ -19064,26 +19069,26 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.19.1 fsevents: 2.3.3 - rollup@4.21.1: + rollup@4.21.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.1 - '@rollup/rollup-android-arm64': 4.21.1 - '@rollup/rollup-darwin-arm64': 4.21.1 - '@rollup/rollup-darwin-x64': 4.21.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.1 - '@rollup/rollup-linux-arm-musleabihf': 4.21.1 - '@rollup/rollup-linux-arm64-gnu': 4.21.1 - '@rollup/rollup-linux-arm64-musl': 4.21.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.1 - '@rollup/rollup-linux-riscv64-gnu': 4.21.1 - '@rollup/rollup-linux-s390x-gnu': 4.21.1 - '@rollup/rollup-linux-x64-gnu': 4.21.1 - '@rollup/rollup-linux-x64-musl': 4.21.1 - '@rollup/rollup-win32-arm64-msvc': 4.21.1 - '@rollup/rollup-win32-ia32-msvc': 4.21.1 - '@rollup/rollup-win32-x64-msvc': 4.21.1 + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 fsevents: 2.3.3 router@1.3.8: @@ -19556,15 +19561,15 @@ snapshots: stubs@3.0.0: {} - style-loader@1.3.0(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5)): + style-loader@1.3.0(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5)): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.94.0(@swc/core@1.7.21)(esbuild@0.21.5) + webpack: 5.94.0(@swc/core@1.7.23)(esbuild@0.21.5) - style-loader@4.0.0(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)): + style-loader@4.0.0(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)): dependencies: - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) styled-components@6.1.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -19675,11 +19680,11 @@ snapshots: tailwind-merge@2.4.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4))): dependencies: - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)) - tailwindcss@3.4.10(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)): + tailwindcss@3.4.10(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -19694,19 +19699,19 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.1 - postcss: 8.4.41 - postcss-import: 15.1.0(postcss@8.4.41) - postcss-js: 4.0.1(postcss@8.4.41) - postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)) - postcss-nested: 6.2.0(postcss@8.4.41) + picocolors: 1.1.0 + postcss: 8.4.44 + postcss-import: 15.1.0(postcss@8.4.44) + postcss-js: 4.0.1(postcss@8.4.44) + postcss-load-config: 4.0.2(postcss@8.4.44)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)) + postcss-nested: 6.2.0(postcss@8.4.44) postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: - ts-node - tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)): + tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -19725,7 +19730,7 @@ snapshots: postcss: 8.4.40 postcss-import: 15.1.0(postcss@8.4.40) postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4)) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4)) postcss-nested: 6.2.0(postcss@8.4.40) postcss-selector-parser: 6.1.1 resolve: 1.22.8 @@ -19733,7 +19738,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@22.5.1)(typescript@5.5.4)): + tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -19752,7 +19757,7 @@ snapshots: postcss: 8.4.40 postcss-import: 15.1.0(postcss@8.4.40) postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@swc/core@1.7.21)(@types/node@22.5.1)(typescript@5.5.4)) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) postcss-nested: 6.2.0(postcss@8.4.40) postcss-selector-parser: 6.1.1 resolve: 1.22.8 @@ -19824,39 +19829,39 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.7.21)(esbuild@0.21.5)(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.23)(esbuild@0.21.5)(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.3 - webpack: 5.94.0(@swc/core@1.7.21)(esbuild@0.21.5) + webpack: 5.94.0(@swc/core@1.7.23)(esbuild@0.21.5) optionalDependencies: - '@swc/core': 1.7.21 + '@swc/core': 1.7.23 esbuild: 0.21.5 - terser-webpack-plugin@5.3.10(@swc/core@1.7.21)(webpack@5.92.1(@swc/core@1.7.21)(webpack-cli@5.1.4(webpack@5.93.0))): + terser-webpack-plugin@5.3.10(@swc/core@1.7.23)(webpack@5.92.1(@swc/core@1.7.23)(webpack-cli@5.1.4(webpack@5.93.0))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.3 - webpack: 5.92.1(@swc/core@1.7.21)(webpack-cli@5.1.4(webpack@5.93.0)) + webpack: 5.92.1(@swc/core@1.7.23)(webpack-cli@5.1.4(webpack@5.93.0)) optionalDependencies: - '@swc/core': 1.7.21 + '@swc/core': 1.7.23 - terser-webpack-plugin@5.3.10(@swc/core@1.7.21)(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.23)(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.3 - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) optionalDependencies: - '@swc/core': 1.7.21 + '@swc/core': 1.7.23 terser@5.31.3: dependencies: @@ -19978,7 +19983,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)): + ts-loader@9.5.1(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -19986,9 +19991,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.5.4 - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) - ts-node@10.9.2(@swc/core@1.7.21)(@types/node@20.14.13)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.7.23)(@types/node@20.14.13)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -20006,16 +20011,16 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.7.21 + '@swc/core': 1.7.23 - ts-node@10.9.2(@swc/core@1.7.21)(@types/node@22.5.1)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.5.1 + '@types/node': 22.5.2 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -20026,7 +20031,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.7.21 + '@swc/core': 1.7.23 ts-toolbelt@9.6.0: {} @@ -20422,13 +20427,13 @@ snapshots: - terser optional: true - vite-node@2.0.5(@types/node@22.5.1)(terser@5.31.6): + vite-node@2.0.5(@types/node@22.5.2)(terser@5.31.6): dependencies: cac: 6.7.14 debug: 4.3.6 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6) + vite: 5.4.2(@types/node@22.5.2)(terser@5.31.6) transitivePeerDependencies: - '@types/node' - less @@ -20451,33 +20456,33 @@ snapshots: fsevents: 2.3.3 terser: 5.31.6 - vite@5.3.5(@types/node@22.5.1)(terser@5.31.6): + vite@5.3.5(@types/node@22.5.2)(terser@5.31.6): dependencies: esbuild: 0.21.5 postcss: 8.4.40 rollup: 4.19.1 optionalDependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 fsevents: 2.3.3 terser: 5.31.6 vite@5.4.2(@types/node@20.14.13)(terser@5.31.6): dependencies: esbuild: 0.21.5 - postcss: 8.4.41 - rollup: 4.21.1 + postcss: 8.4.44 + rollup: 4.21.2 optionalDependencies: '@types/node': 20.14.13 fsevents: 2.3.3 terser: 5.31.6 - vite@5.4.2(@types/node@22.5.1)(terser@5.31.6): + vite@5.4.2(@types/node@22.5.2)(terser@5.31.6): dependencies: esbuild: 0.21.5 - postcss: 8.4.41 - rollup: 4.21.1 + postcss: 8.4.44 + rollup: 4.21.2 optionalDependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 fsevents: 2.3.3 terser: 5.31.6 @@ -20552,7 +20557,7 @@ snapshots: - terser optional: true - vitest@2.0.5(@types/node@22.5.1)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6): + vitest@2.0.5(@types/node@22.5.2)(@vitest/browser@1.6.0(playwright@1.45.3)(vitest@1.6.0))(jsdom@24.1.1)(terser@5.31.6): dependencies: '@ampproject/remapping': 2.3.0 '@vitest/expect': 2.0.5 @@ -20570,11 +20575,11 @@ snapshots: tinybench: 2.9.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6) - vite-node: 2.0.5(@types/node@22.5.1)(terser@5.31.6) + vite: 5.4.2(@types/node@22.5.2)(terser@5.31.6) + vite-node: 2.0.5(@types/node@22.5.2)(terser@5.31.6) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 '@vitest/browser': 1.6.0(playwright@1.45.3)(vitest@1.6.0) jsdom: 24.1.1 transitivePeerDependencies: @@ -20659,9 +20664,9 @@ snapshots: webpack-cli@5.1.4(webpack@5.93.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -20670,7 +20675,7 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) webpack-merge: 5.10.0 webpack-merge@5.10.0: @@ -20683,13 +20688,13 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack-watch-external-files-plugin@3.1.0(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)): + webpack-watch-external-files-plugin@3.1.0(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)): dependencies: glob: 10.4.2 path: 0.12.7 - webpack: 5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4) + webpack: 5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4) - webpack@5.92.1(@swc/core@1.7.21)(webpack-cli@5.1.4(webpack@5.93.0)): + webpack@5.92.1(@swc/core@1.7.23)(webpack-cli@5.1.4(webpack@5.93.0)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -20712,7 +20717,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.21)(webpack@5.92.1(@swc/core@1.7.21)(webpack-cli@5.1.4(webpack@5.93.0))) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.23)(webpack@5.92.1(@swc/core@1.7.23)(webpack-cli@5.1.4(webpack@5.93.0))) watchpack: 2.4.1 webpack-sources: 3.2.3 optionalDependencies: @@ -20722,7 +20727,7 @@ snapshots: - esbuild - uglify-js - webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4): + webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -20745,7 +20750,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.21)(webpack@5.93.0(@swc/core@1.7.21)(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.23)(webpack@5.93.0(@swc/core@1.7.23)(webpack-cli@5.1.4)) watchpack: 2.4.1 webpack-sources: 3.2.3 optionalDependencies: @@ -20755,7 +20760,7 @@ snapshots: - esbuild - uglify-js - webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5): + webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5): dependencies: '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.12.1 @@ -20777,7 +20782,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.21)(esbuild@0.21.5)(webpack@5.94.0(@swc/core@1.7.21)(esbuild@0.21.5)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.23)(esbuild@0.21.5)(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.21.5)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: From 2bfba05086c60b04889ec0086b5863f6c363dc24 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Tue, 3 Sep 2024 07:16:16 -0700 Subject: [PATCH 11/14] combine zustand slices --- apps/extension/src/hooks/onboarding.ts | 2 +- .../src/routes/page/onboarding/generate.tsx | 8 +-- apps/extension/src/state/block-height.ts | 64 +++++++------------ apps/extension/src/state/index.ts | 21 +----- 4 files changed, 31 insertions(+), 64 deletions(-) diff --git a/apps/extension/src/hooks/onboarding.ts b/apps/extension/src/hooks/onboarding.ts index 29906e2d..c9e291d7 100644 --- a/apps/extension/src/hooks/onboarding.ts +++ b/apps/extension/src/hooks/onboarding.ts @@ -22,7 +22,7 @@ export const useAddWallet = () => { }; export const useOnboardingSaveOptional = () => { - const { setBlockHeight } = useStore(state => state.existingWalletCreationBlockHeight); + const { setBlockHeight } = useStore(state => state.walletHeight); return async (walletBlockHeight: number) => { await setBlockHeight(walletBlockHeight); diff --git a/apps/extension/src/routes/page/onboarding/generate.tsx b/apps/extension/src/routes/page/onboarding/generate.tsx index 024f6365..d6a99644 100644 --- a/apps/extension/src/routes/page/onboarding/generate.tsx +++ b/apps/extension/src/routes/page/onboarding/generate.tsx @@ -14,7 +14,7 @@ import { generateSelector } from '../../../state/seed-phrase/generate'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; import { WordLengthToogles } from '../../../shared/containers/word-length-toogles'; -import { freshWalletBlockHeightSelector } from '../../../state/block-height'; +import { walletBlockHeightSelector } from '../../../state/block-height'; export const GenerateSeedPhrase = () => { const navigate = usePageNav(); @@ -22,8 +22,8 @@ export const GenerateSeedPhrase = () => { const [count, { startCountdown }] = useCountdown({ countStart: 3 }); const [reveal, setReveal] = useState(false); const [error, setError] = useState(null); - const blockHeight = useStore(freshWalletBlockHeightSelector); - const setBlockHeight = useStore(state => state.freshWalletCreationBlockHeight.setBlockHeight); + const blockHeight = useStore(walletBlockHeightSelector); + const setBlockHeight = useStore(state => state.walletHeight.setBlockHeight); // Track if the block height has been initialized to avoid multiple fetch attempts const isInitialized = useRef(false); @@ -38,7 +38,7 @@ export const GenerateSeedPhrase = () => { startCountdown(); if (!isInitialized.current && blockHeight === 0) { - await setBlockHeight(); + await setBlockHeight(0, true); isInitialized.current = true; } } catch (error) { diff --git a/apps/extension/src/state/block-height.ts b/apps/extension/src/state/block-height.ts index 6f5b71bf..97ffcfdc 100644 --- a/apps/extension/src/state/block-height.ts +++ b/apps/extension/src/state/block-height.ts @@ -7,14 +7,9 @@ import { createGrpcWebTransport } from '@connectrpc/connect-web'; import { createPromiseClient } from '@connectrpc/connect'; import { sample } from 'lodash'; -export interface freshWalletCreationBlockHeightSlice { +export interface walletHeightSlice { blockHeight: number; - setBlockHeight: () => Promise; -} - -export interface existingWalletCreationBlockHeightSlice { - blockHeight: number; - setBlockHeight: (height: number) => Promise; + setBlockHeight: (blockHeight?: number, isFreshWallet?: boolean) => Promise; } // Utility function to fetch the block height by randomly querying one of the RPC endpoints @@ -58,43 +53,30 @@ export const fetchBlockHeight = async (grpcEndpoint: string): Promise): SliceCreator => +// Zustand slice that initializes and stores the block height in both Zustand state and local storage +export const createWalletCreationBlockHeightSlice = + (local: ExtensionStorage): SliceCreator => set => ({ blockHeight: 0, - setBlockHeight: async () => { - const chainRegistryClient = new ChainRegistryClient(); - const { rpcs } = chainRegistryClient.bundled.globals(); - const suggestedEndpoints = rpcs.map(i => i.url); + setBlockHeight: async (walletHeight?: number, isFreshWallet?: boolean) => { + if (!isFreshWallet) { + await local.set('walletCreationBlockHeight', walletHeight); + set(state => { + state.walletHeight.blockHeight = walletHeight!; + }); + } else { + const chainRegistryClient = new ChainRegistryClient(); + const { rpcs } = chainRegistryClient.bundled.globals(); + const suggestedEndpoints = rpcs.map(i => i.url); - const blockHeight = await fetchBlockHeightWithFallback(suggestedEndpoints); - await local.set('walletCreationBlockHeight', blockHeight); - set(state => { - state.freshWalletCreationBlockHeight.blockHeight = blockHeight; - }); + const blockHeight = await fetchBlockHeightWithFallback(suggestedEndpoints); + await local.set('walletCreationBlockHeight', blockHeight); + set(state => { + state.walletHeight.blockHeight = blockHeight; + }); + } }, }); -// Existing wallets: zustand slice that initializes and stores the block height in both Zustand state and local storage. -export const createExistingWalletCreationBlockHeightSlice = - ( - local: ExtensionStorage, - ): SliceCreator => - set => ({ - blockHeight: 0, - setBlockHeight: async (blockHeight: number) => { - await local.set('walletCreationBlockHeight', blockHeight); - set(state => { - state.existingWalletCreationBlockHeight.blockHeight = blockHeight; - }); - }, - }); - -// Selector to retrieve the block height from the Zustand store for fresh wallets -export const freshWalletBlockHeightSelector = (state: AllSlices) => - state.freshWalletCreationBlockHeight.blockHeight; - -// Selector to retrieve the block height from the Zustand store for existing wallets -export const existingWalletBlockHeightSelector = (state: AllSlices) => - state.existingWalletCreationBlockHeight.blockHeight; +// Selector to retrieve the wallet block height from the Zustand store +export const walletBlockHeightSelector = (state: AllSlices) => state.walletHeight.blockHeight; diff --git a/apps/extension/src/state/index.ts b/apps/extension/src/state/index.ts index 48090c36..0e598d65 100644 --- a/apps/extension/src/state/index.ts +++ b/apps/extension/src/state/index.ts @@ -14,12 +14,7 @@ import { createOriginApprovalSlice, OriginApprovalSlice } from './origin-approva import { ConnectedSitesSlice, createConnectedSitesSlice } from './connected-sites'; import { createDefaultFrontendSlice, DefaultFrontendSlice } from './default-frontend'; import { createNumerairesSlice, NumerairesSlice } from './numeraires'; -import { - freshWalletCreationBlockHeightSlice, - createFreshWalletCreationBlockHeightSlice, - existingWalletCreationBlockHeightSlice, - createExistingWalletCreationBlockHeightSlice, -} from './block-height'; +import { walletHeightSlice, createWalletCreationBlockHeightSlice } from './block-height'; export interface AllSlices { wallets: WalletsSlice; @@ -31,8 +26,7 @@ export interface AllSlices { originApproval: OriginApprovalSlice; connectedSites: ConnectedSitesSlice; defaultFrontend: DefaultFrontendSlice; - freshWalletCreationBlockHeight: freshWalletCreationBlockHeightSlice; - existingWalletCreationBlockHeight: existingWalletCreationBlockHeightSlice; + walletHeight: walletHeightSlice; } export type SliceCreator = StateCreator< @@ -56,16 +50,7 @@ export const initializeStore = ( txApproval: createTxApprovalSlice()(setState, getState, store), originApproval: createOriginApprovalSlice()(setState, getState, store), defaultFrontend: createDefaultFrontendSlice(local)(setState, getState, store), - freshWalletCreationBlockHeight: createFreshWalletCreationBlockHeightSlice(local)( - setState, - getState, - store, - ), - existingWalletCreationBlockHeight: createExistingWalletCreationBlockHeightSlice(local)( - setState, - getState, - store, - ), + walletHeight: createWalletCreationBlockHeightSlice(local)(setState, getState, store), })); }; From c12a736f05655d7955c70191f8cd05944af1b35b Mon Sep 17 00:00:00 2001 From: Gabe Rodriguez Date: Tue, 3 Sep 2024 17:26:10 +0200 Subject: [PATCH 12/14] [pairing] use react-query --- apps/extension/src/hooks/full-sync-height.ts | 16 +--- .../src/hooks/latest-block-height.ts | 74 +++++++++++++++++ apps/extension/src/hooks/onboarding.ts | 9 -- .../src/routes/page/onboarding/generate.tsx | 49 ++++------- .../src/routes/page/onboarding/height.tsx | 9 +- .../routes/page/onboarding/set-password.tsx | 4 +- .../page/restore-password/set-password.tsx | 4 +- apps/extension/src/state/block-height.ts | 82 ------------------- apps/extension/src/state/index.ts | 3 - apps/extension/src/storage/local.ts | 2 +- apps/extension/src/storage/types.ts | 2 +- apps/extension/src/wallet-services.ts | 2 +- 12 files changed, 105 insertions(+), 151 deletions(-) create mode 100644 apps/extension/src/hooks/latest-block-height.ts delete mode 100644 apps/extension/src/state/block-height.ts diff --git a/apps/extension/src/hooks/full-sync-height.ts b/apps/extension/src/hooks/full-sync-height.ts index 7c609d70..65e14808 100644 --- a/apps/extension/src/hooks/full-sync-height.ts +++ b/apps/extension/src/hooks/full-sync-height.ts @@ -1,9 +1,8 @@ -import { useQuery } from '@tanstack/react-query'; import { PopupLoaderData } from '../routes/popup/home'; import { useStore } from '../state'; import { networkSelector } from '../state/network'; import { useLoaderData } from 'react-router-dom'; -import { fetchBlockHeight } from '../state/block-height'; +import { useLatestBlockHeight } from './latest-block-height'; const tryGetMax = (a?: number, b?: number): number | undefined => { // Height can be 0n which is falsy, so should compare to undefined state @@ -28,18 +27,7 @@ const useFullSyncHeight = (): number | undefined => { export const useSyncProgress = () => { const fullSyncHeight = useFullSyncHeight(); - const { grpcEndpoint } = useStore(networkSelector); - - const { data: queriedLatest, error } = useQuery({ - queryKey: ['latestBlockHeight'], - queryFn: async () => { - if (!grpcEndpoint) { - return; - } - return await fetchBlockHeight(grpcEndpoint); - }, - enabled: Boolean(grpcEndpoint), - }); + const { data: queriedLatest, error } = useLatestBlockHeight(); // If we have a queried sync height and it's ahead of our block-height query, // use the sync value instead diff --git a/apps/extension/src/hooks/latest-block-height.ts b/apps/extension/src/hooks/latest-block-height.ts new file mode 100644 index 00000000..6dd35982 --- /dev/null +++ b/apps/extension/src/hooks/latest-block-height.ts @@ -0,0 +1,74 @@ +import { useQuery } from '@tanstack/react-query'; +import { sample } from 'lodash'; +import { createPromiseClient } from '@connectrpc/connect'; +import { createGrpcWebTransport } from '@connectrpc/connect-web'; +import { TendermintProxyService } from '@penumbra-zone/protobuf'; +import { ChainRegistryClient } from '@penumbra-labs/registry'; +import { useStore } from '../state'; +import { networkSelector } from '../state/network'; + +// Utility function to fetch the block height by randomly querying one of the RPC endpoints +// from the chain registry, using a recursive callback to try another endpoint if the current +// one fails. Additionally, this implements a timeout mechanism at the request level to avoid +// hanging from stalled requests. +const fetchBlockHeightWithFallback = async (endpoints: string[]): Promise => { + if (endpoints.length === 0) { + throw new Error('All RPC endpoints failed to fetch the block height.'); + } + + // Randomly select an RPC endpoint from the chain registry + const randomGrpcEndpoint = sample(endpoints); + if (!randomGrpcEndpoint) { + throw new Error('No RPC endpoints found.'); + } + + try { + return await fetchBlockHeight(randomGrpcEndpoint); + } catch (e) { + // Remove the current endpoint from the list and retry with remaining endpoints + const remainingEndpoints = endpoints.filter(endpoint => endpoint !== randomGrpcEndpoint); + return fetchBlockHeightWithFallback(remainingEndpoints); + } +}; + +// Fetch the block height from a specific RPC endpoint with a timeout to prevent hanging requests. +export const fetchBlockHeight = async (grpcEndpoint: string): Promise => { + const tendermintClient = createPromiseClient( + TendermintProxyService, + createGrpcWebTransport({ baseUrl: grpcEndpoint, defaultTimeoutMs: 2000 }), + ); + + const result = await tendermintClient.getStatus({}); + if (!result.syncInfo) { + throw new Error('No syncInfo in getStatus result'); + } + return Number(result.syncInfo.latestBlockHeight); +}; + +export const useLatestBlockHeightWithFallback = () => { + return useQuery({ + queryKey: ['latestBlockHeightWithFallback'], + queryFn: async () => { + const chainRegistryClient = new ChainRegistryClient(); + const { rpcs } = chainRegistryClient.bundled.globals(); + const suggestedEndpoints = rpcs.map(i => i.url); + return await fetchBlockHeightWithFallback(suggestedEndpoints); + }, + retry: false, + }); +}; + +export const useLatestBlockHeight = () => { + const { grpcEndpoint } = useStore(networkSelector); + + return useQuery({ + queryKey: ['latestBlockHeight'], + queryFn: async () => { + if (!grpcEndpoint) { + return; + } + return await fetchBlockHeight(grpcEndpoint); + }, + enabled: Boolean(grpcEndpoint), + }); +}; diff --git a/apps/extension/src/hooks/onboarding.ts b/apps/extension/src/hooks/onboarding.ts index c9e291d7..6f5e3fee 100644 --- a/apps/extension/src/hooks/onboarding.ts +++ b/apps/extension/src/hooks/onboarding.ts @@ -1,5 +1,4 @@ import { useStore } from '../state'; -// import { existingWalletBlockHeightSelector } from '../state/block-height'; import { passwordSelector } from '../state/password'; import { generateSelector } from '../state/seed-phrase/generate'; import { importSelector } from '../state/seed-phrase/import'; @@ -20,11 +19,3 @@ export const useAddWallet = () => { await addWallet({ label: 'Wallet #1', seedPhrase }); }; }; - -export const useOnboardingSaveOptional = () => { - const { setBlockHeight } = useStore(state => state.walletHeight); - - return async (walletBlockHeight: number) => { - await setBlockHeight(walletBlockHeight); - }; -}; diff --git a/apps/extension/src/routes/page/onboarding/generate.tsx b/apps/extension/src/routes/page/onboarding/generate.tsx index d6a99644..bcc5d060 100644 --- a/apps/extension/src/routes/page/onboarding/generate.tsx +++ b/apps/extension/src/routes/page/onboarding/generate.tsx @@ -1,6 +1,6 @@ import { ExclamationTriangleIcon, LockClosedIcon } from '@radix-ui/react-icons'; import { SeedPhraseLength } from '@penumbra-zone/crypto-web/mnemonic'; -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useState } from 'react'; import { Button } from '@repo/ui/components/ui/button'; import { BackIcon } from '@repo/ui/components/ui/icons/back-icon'; import { Card, CardContent, CardHeader, CardTitle } from '@repo/ui/components/ui/card'; @@ -14,38 +14,29 @@ import { generateSelector } from '../../../state/seed-phrase/generate'; import { usePageNav } from '../../../utils/navigate'; import { PagePath } from '../paths'; import { WordLengthToogles } from '../../../shared/containers/word-length-toogles'; -import { walletBlockHeightSelector } from '../../../state/block-height'; +import { useLatestBlockHeightWithFallback } from '../../../hooks/latest-block-height'; +import { localExtStorage } from '../../../storage/local'; export const GenerateSeedPhrase = () => { const navigate = usePageNav(); const { phrase, generateRandomSeedPhrase } = useStore(generateSelector); const [count, { startCountdown }] = useCountdown({ countStart: 3 }); const [reveal, setReveal] = useState(false); - const [error, setError] = useState(null); - const blockHeight = useStore(walletBlockHeightSelector); - const setBlockHeight = useStore(state => state.walletHeight.setBlockHeight); - // Track if the block height has been initialized to avoid multiple fetch attempts - const isInitialized = useRef(false); + const { data: latestBlockHeight, isLoading, error } = useLatestBlockHeightWithFallback(); + + const onSubmit = async () => { + await localExtStorage.set('walletCreationBlockHeight', latestBlockHeight); + navigate(PagePath.CONFIRM_BACKUP); + }; // On render, asynchronously generate a new seed phrase and initialize the wallet creation block height useEffect(() => { - void (async () => { - try { - if (!phrase.length) { - generateRandomSeedPhrase(SeedPhraseLength.TWELVE_WORDS); - } - startCountdown(); - - if (!isInitialized.current && blockHeight === 0) { - await setBlockHeight(0, true); - isInitialized.current = true; - } - } catch (error) { - setError('Failed to fetch block height. Please try again later'); - } - })(); - }, [generateRandomSeedPhrase, phrase.length, startCountdown, blockHeight, setBlockHeight]); + if (!phrase.length) { + generateRandomSeedPhrase(SeedPhraseLength.TWELVE_WORDS); + } + startCountdown(); + }, [generateRandomSeedPhrase, phrase.length, startCountdown]); return ( @@ -84,13 +75,9 @@ export const GenerateSeedPhrase = () => {

Wallet Birthday

- {error ? ( - {error} - ) : isInitialized.current ? ( - Number(blockHeight).toLocaleString() - ) : ( - 'Loading...' - )} + {Boolean(error) && {String(error)}} + {isLoading && 'Loading...'} + {latestBlockHeight && Number(latestBlockHeight).toLocaleString()}

@@ -126,7 +113,7 @@ export const GenerateSeedPhrase = () => {

)} diff --git a/packages/context/src/index.ts b/packages/context/src/index.ts index c32d644b..9cedfb5c 100644 --- a/packages/context/src/index.ts +++ b/packages/context/src/index.ts @@ -125,8 +125,8 @@ export class Services implements ServicesInterface { querier, indexedDb, stakingAssetId: registryClient.bundled.globals().stakingAssetId, - numeraires: numeraires, - walletCreationBlockHeight: walletCreationBlockHeight, + numeraires, + walletCreationBlockHeight, }); return { viewServer, blockProcessor, indexedDb, querier }; diff --git a/packages/ui/components/ui/copy-to-clipboard/copy-to-clipboard.tsx b/packages/ui/components/ui/copy-to-clipboard/copy-to-clipboard.tsx index b0c8524b..ed505c05 100644 --- a/packages/ui/components/ui/copy-to-clipboard/copy-to-clipboard.tsx +++ b/packages/ui/components/ui/copy-to-clipboard/copy-to-clipboard.tsx @@ -21,7 +21,7 @@ const CopyToClipboard = React.forwardRef