From 505ac6acdf28a4b7a92d346083e3adc91cf8ee88 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Wed, 19 Nov 2025 02:09:06 -0500 Subject: [PATCH 01/11] WIP feat(clerk-js): Add Solana wallet authentication support Signed-off-by: Kenton Duprey --- packages/clerk-js/src/core/clerk.ts | 13 + .../clerk-js/src/core/resources/SignIn.ts | 32 +- .../ui/components/SignIn/SignInFactorOne.tsx | 2 + .../components/SignIn/SignInSocialButtons.tsx | 4 + .../src/utils/injectedWeb3Providers.ts | 144 +++++- packages/clerk-js/src/utils/web3.ts | 79 ++- .../hooks/use-third-party-provider.hook.ts | 4 + packages/shared/src/types/clerk.ts | 9 + packages/shared/src/types/signIn.ts | 2 + packages/shared/src/types/signInFuture.ts | 9 + packages/shared/src/types/web3.ts | 489 +++++++++++++++++- packages/shared/src/types/web3Wallet.ts | 1 + packages/shared/src/web3.ts | 5 + 13 files changed, 765 insertions(+), 28 deletions(-) diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 6353d4c09d3..5765fbdecd4 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -34,6 +34,7 @@ import type { AuthenticateWithGoogleOneTapParams, AuthenticateWithMetamaskParams, AuthenticateWithOKXWalletParams, + AuthenticateWithSolanaParams, BillingNamespace, Clerk as ClerkInterface, ClerkAPIError, @@ -116,6 +117,7 @@ import { generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, + generateSignatureWithSolana, getClerkQueryParam, getWeb3Identifier, hasExternalAccountSignUpError, @@ -2255,6 +2257,13 @@ export class Clerk implements ClerkInterface { }); }; + public authenticateWithSolana = async (props: AuthenticateWithSolanaParams = {}): Promise => { + await this.authenticateWithWeb3({ + ...props, + strategy: 'web3_solana_signature', + }); + }; + public authenticateWithWeb3 = async ({ redirectUrl, signUpContinueUrl, @@ -2263,6 +2272,7 @@ export class Clerk implements ClerkInterface { strategy, legalAccepted, secondFactorUrl, + walletName, }: ClerkAuthenticateWithWeb3Params): Promise => { if (!this.client || !this.environment) { return; @@ -2283,6 +2293,9 @@ export class Clerk implements ClerkInterface { case 'coinbase_wallet': generateSignature = generateSignatureWithCoinbaseWallet; break; + case 'solana': + generateSignature = generateSignatureWithSolana; + break; default: generateSignature = generateSignatureWithOKXWallet; break; diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 8888af69a0a..5e88eb210e5 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -69,12 +69,14 @@ import { generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, + generateSignatureWithSolana, getBaseIdentifier, getBrowserLocale, getClerkQueryParam, getCoinbaseWalletIdentifier, getMetamaskIdentifier, getOKXWalletIdentifier, + getSolanaIdentifier, windowNavigate, } from '../../utils'; import { @@ -212,6 +214,7 @@ export class SignIn extends BaseResource implements SignInResource { case 'web3_base_signature': case 'web3_coinbase_wallet_signature': case 'web3_okx_wallet_signature': + case 'web3_solana_signature': config = { web3WalletId: params.web3WalletId } as Web3SignatureConfig; break; case 'reset_password_phone_code': @@ -403,7 +406,7 @@ export class SignIn extends BaseResource implements SignInResource { let signature: string; try { - signature = await generateSignature({ identifier, nonce: message, provider }); + signature = await generateSignature({ identifier, nonce: message, provider, walletName: provider }); } catch (err) { // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing // Passkey in order to authenticate, the initial generate signature request to be rejected. For this @@ -412,7 +415,7 @@ export class SignIn extends BaseResource implements SignInResource { // error code 4001 means the user rejected the request // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors if (provider === 'coinbase_wallet' && err.code === 4001) { - signature = await generateSignature({ identifier, nonce: message, provider }); + signature = await generateSignature({ identifier, nonce: message, provider, walletName: provider }); } else { throw err; } @@ -460,6 +463,15 @@ export class SignIn extends BaseResource implements SignInResource { }); }; + public authenticateWithSolana = async (walletName: string): Promise => { + const identifier = await getSolanaIdentifier(walletName); + return this.authenticateWithWeb3({ + identifier, + generateSignature: generateSignatureWithSolana, + strategy: 'web3_solana_signature', + }); + }; + public authenticateWithPasskey = async (params?: AuthenticateWithPasskeyParams): Promise => { const { flow } = params || {}; @@ -986,6 +998,10 @@ class SignInFuture implements SignInFutureResource { identifier = await getOKXWalletIdentifier(); generateSignature = generateSignatureWithOKXWallet; break; + case 'solana': + identifier = await getSolanaIdentifier(params.provider); + generateSignature = generateSignatureWithSolana; + break; default: throw new Error(`Unsupported Web3 provider: ${provider}`); } @@ -1011,7 +1027,11 @@ class SignInFuture implements SignInFutureResource { let signature: string; try { - signature = await generateSignature({ identifier, nonce: message }); + signature = await generateSignature({ + identifier, + nonce: message, + walletName: params.provider, + }); } catch (err) { // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing // Passkey in order to authenticate, the initial generate signature request to be rejected. For this @@ -1020,7 +1040,11 @@ class SignInFuture implements SignInFutureResource { // error code 4001 means the user rejected the request // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors if (provider === 'coinbase_wallet' && err.code === 4001) { - signature = await generateSignature({ identifier, nonce: message }); + signature = await generateSignature({ + identifier, + nonce: message, + walletName: provider, + }); } else { throw err; } diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx index e318345e719..4e3e81054de 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx @@ -222,6 +222,8 @@ function SignInFactorOneInternal(): JSX.Element { onShowAlternativeMethodsClicked={toggleAllStrategies} /> ); + // case 'web3_solana_signature': + // return ; case 'reset_password_phone_code': return ( handleError(err, [], card.setError)); }} web3Callback={strategy => { + // if (strategy === 'web3_solana_signature') { + // return navigate('factor-one'); + // } + return clerk .authenticateWithWeb3({ customNavigate: navigate, diff --git a/packages/clerk-js/src/utils/injectedWeb3Providers.ts b/packages/clerk-js/src/utils/injectedWeb3Providers.ts index 7b6c6557e8e..5f5f680f722 100644 --- a/packages/clerk-js/src/utils/injectedWeb3Providers.ts +++ b/packages/clerk-js/src/utils/injectedWeb3Providers.ts @@ -1,4 +1,15 @@ -import type { MetamaskWeb3Provider, OKXWalletWeb3Provider } from '@clerk/shared/types'; +import type { + InjectedWeb3ProviderChain, + MetamaskWeb3Provider, + OKXWalletWeb3Provider, + Wallet, + WalletEventsWindow, + Wallets, + WalletsEventNames, + WalletsEventsListeners, + WindowAppReadyEvent, + WindowAppReadyEventAPI, +} from '@clerk/shared/types'; //https://eips.ethereum.org/EIPS/eip-6963 @@ -27,14 +38,20 @@ interface EIP6963ProviderDetail { } type EIP6963AnnounceProviderEvent = CustomEvent; -type InjectedWeb3Provider = MetamaskWeb3Provider | OKXWalletWeb3Provider; +type InjectedWeb3Wallet = MetamaskWeb3Provider | OKXWalletWeb3Provider; class InjectedWeb3Providers { - #providers: EIP6963ProviderDetail[] = []; - #providerIdMap: Record = { + #wallets: Wallets | undefined = undefined; + #registeredWalletsSet = new Set(); + #cachedWalletsArray: readonly Wallet[] | undefined; + #listeners: { [E in WalletsEventNames]?: WalletsEventsListeners[E][] } = {}; + + #ethWalletProviders: EIP6963ProviderDetail[] = []; + #providerIdMap: Record = { metamask: 'MetaMask', okx_wallet: 'OKX Wallet', } as const; + static #instance: InjectedWeb3Providers | null = null; private constructor() { @@ -43,6 +60,22 @@ class InjectedWeb3Providers { } window.addEventListener('eip6963:announceProvider', this.#onAnnouncement as EventListener); window.dispatchEvent(new Event('eip6963:requestProvider')); + + this.#wallets = Object.freeze({ register: this.#register, get: this.#get, on: this.#on }); + + const api = Object.freeze({ register: this.#register }); + try { + (window as WalletEventsWindow).addEventListener('wallet-standard:register-wallet', ({ detail: callback }) => + callback(api), + ); + } catch (error) { + console.error('wallet-standard:register-wallet event listener could not be added\n', error); + } + try { + (window as WalletEventsWindow).dispatchEvent(new AppReadyEvent(api)); + } catch (error) { + console.error('wallet-standard:app-ready event could not be dispatched\n', error); + } } public static getInstance(): InjectedWeb3Providers { @@ -52,24 +85,119 @@ class InjectedWeb3Providers { return InjectedWeb3Providers.#instance; } - get = (provider: InjectedWeb3Provider) => { - const ethProvider = this.#providers.find(p => p.info.name === this.#providerIdMap[provider])?.provider; + // Get a provider by its wallet name and optional chain + get = (walletProvider: string, chain?: InjectedWeb3ProviderChain) => { + const ethProvider = this.#ethWalletProviders.find( + p => p.info.name === this.#providerIdMap[walletProvider as InjectedWeb3Wallet], + )?.provider; if (ethProvider !== undefined) { return ethProvider; } + // Try to find the requested Solana provider among the registered wallets + const wallets = this.#wallets?.get(); + if (wallets) { + // Try to find the requested wallet by matching its name and chain (if provided) + const wallet = wallets.find(w => w.name === walletProvider && (chain ? w.chains?.includes(`${chain}:`) : true)); + if (wallet) { + return wallet; + } + } + // In case we weren't able to find the requested provider, fallback to the // global injected provider instead, if any, to allow the user to continue // the flow rather than blocking it + if (chain === 'solana') { + return (window as any).solana; + } return window.ethereum; }; #onAnnouncement = (event: EIP6963AnnounceProviderEvent) => { - if (this.#providers.some(p => p.info.uuid === event.detail.info.uuid)) { + if (this.#ethWalletProviders.some(p => p.info.uuid === event.detail.info.uuid)) { return; } - this.#providers.push(event.detail); + this.#ethWalletProviders.push(event.detail); }; + + #register = (...wallets: Wallet[]): (() => void) => { + // Filter out wallets that have already been registered. + // This prevents the same wallet from being registered twice, but it also prevents wallets from being + // unregistered by reusing a reference to the wallet to obtain the unregister function for it. + wallets = wallets.filter(wallet => !this.#registeredWalletsSet.has(wallet)); + // If there are no new wallets to register, just return a no-op unregister function. + + if (!wallets.length) { + return () => {}; + } + + wallets.forEach(wallet => this.#addRegisteredWallet(wallet)); + this.#listeners['register']?.forEach(listener => guard(() => listener(...wallets))); + // Return a function that unregisters the registered wallets. + return () => { + wallets.forEach(wallet => this.#removeRegisteredWallet(wallet)); + this.#listeners['unregister']?.forEach(listener => guard(() => listener(...wallets))); + }; + }; + + #addRegisteredWallet = (wallet: Wallet) => { + this.#cachedWalletsArray = undefined; + this.#registeredWalletsSet.add(wallet); + }; + #removeRegisteredWallet = (wallet: Wallet) => { + this.#cachedWalletsArray = undefined; + this.#registeredWalletsSet.delete(wallet); + }; + + #get = (): readonly Wallet[] => { + if (!this.#cachedWalletsArray) { + this.#cachedWalletsArray = [...this.#registeredWalletsSet]; + } + return this.#cachedWalletsArray; + }; + + #on = (event: E, listener: WalletsEventsListeners[E]): (() => void) => { + if (this.#listeners[event]) { + this.#listeners[event].push(listener); + } else { + this.#listeners[event] = [listener]; + } + // Return a function that removes the event listener. + return () => { + this.#listeners[event] = this.#listeners[event]?.filter(existingListener => listener !== existingListener); + }; + }; + + listeners: { [E in WalletsEventNames]?: WalletsEventsListeners } = {}; } export const getInjectedWeb3Providers = () => InjectedWeb3Providers.getInstance(); + +function guard(callback: () => void): void { + try { + callback(); + } catch (error) { + console.error(error); + } +} + +class AppReadyEvent extends Event implements WindowAppReadyEvent { + readonly #detail: WindowAppReadyEventAPI; + + get detail() { + return this.#detail; + } + + get type() { + return 'wallet-standard:app-ready' as const; + } + + constructor(api: WindowAppReadyEventAPI) { + super('wallet-standard:app-ready', { + bubbles: false, + cancelable: false, + composed: false, + }); + this.#detail = api; + } +} diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index fc494876f78..17eed4df56f 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -1,46 +1,83 @@ -import type { Web3Provider } from '@clerk/shared/types'; +import type { InjectedWeb3ProviderChain, Wallet, Web3Provider } from '@clerk/shared/types'; import { clerkUnsupportedEnvironmentWarning } from '@/core/errors'; import { toHex } from './hex'; import { getInjectedWeb3Providers } from './injectedWeb3Providers'; -type GetWeb3IdentifierParams = { - provider: Web3Provider; +// type InjectedWeb3Wallet = MetamaskWeb3Provider | OKXWalletWeb3Provider; +// const web3WalletProviderMap: Record = { +// metamask: 'MetaMask', +// okx_wallet: 'OKX Wallet', +// } as const; + +type GetWeb3IdentifierParams = GetWeb3EthIdentifierParams | GetWeb3SolanaIdentifierParams; + +type GetWeb3EthIdentifierParams = { + provider: Exclude; + chain?: Exclude; +}; + +type GetWeb3SolanaIdentifierParams = { + provider: string; + chain: 'solana'; }; export async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promise { - const { provider } = params; - const ethereum = await getEthereumProvider(provider); + const walletProvider = await getWeb3WalletProvider(params.provider, params?.chain); // TODO - core-3: Improve error handling for the case when the provider is not found - if (!ethereum) { + if (!walletProvider) { // If a plugin for the requested provider is not found, // the flow will fail as it has been the expected behavior so far. return ''; } - const identifiers = await ethereum.request({ method: 'eth_requestAccounts' }); + if (params.chain === 'solana') { + // Solana provider + const address = (walletProvider as Wallet).accounts[0]?.address; + if (address) { + return address; + } + return ''; + } + + const identifiers = walletProvider.accounts; // @ts-ignore -- Provider SDKs may return unknown shape; use first address if present return (identifiers && identifiers[0]) || ''; } type GenerateWeb3SignatureParams = GenerateSignatureParams & { - provider: Web3Provider; + provider: string; + chain?: InjectedWeb3ProviderChain; }; export async function generateWeb3Signature(params: GenerateWeb3SignatureParams): Promise { const { identifier, nonce, provider } = params; - const ethereum = await getEthereumProvider(provider); + + const wallet = await getWeb3WalletProvider(provider, params?.chain); // TODO - core-3: Improve error handling for the case when the provider is not found - if (!ethereum) { + if (!wallet) { // If a plugin for the requested provider is not found, // the flow will fail as it has been the expected behavior so far. return ''; } + if (params.chain === 'solana' && 'features' in wallet && wallet.features) { + if (!(wallet as Wallet).accounts.find(a => a.address === identifier)) { + throw new Error(`The connected wallet does not have the specified identifier.`); + } + if (!wallet.features[`solana:signMessage`]) { + throw new Error(`The connected wallet does not support signing messages on Solana.`); + } + const signedMessages = await wallet.features[`solana:signMessage`].signMessage({ + account: identifier, + message: nonce, + }); + return signedMessages[0].signature; + } - return await ethereum.request({ + return await wallet.request({ method: 'personal_sign', params: [`0x${toHex(nonce)}`, identifier], }); @@ -62,13 +99,21 @@ export async function getBaseIdentifier(): Promise { return await getWeb3Identifier({ provider: 'base' }); } +export async function getSolanaIdentifier(walletName: string): Promise { + return await getWeb3Identifier({ provider: walletName, chain: 'solana' }); +} + type GenerateSignatureParams = { identifier: string; nonce: string; }; +type GenerateSolanaSignatureParams = GenerateSignatureParams & { + walletName: string; +}; + export async function generateSignatureWithMetamask(params: GenerateSignatureParams): Promise { - return await generateWeb3Signature({ ...params, provider: 'metamask' }); + return await generateWeb3Signature({ ...params, provider: 'MetaMask' }); } export async function generateSignatureWithCoinbaseWallet(params: GenerateSignatureParams): Promise { @@ -76,14 +121,18 @@ export async function generateSignatureWithCoinbaseWallet(params: GenerateSignat } export async function generateSignatureWithOKXWallet(params: GenerateSignatureParams): Promise { - return await generateWeb3Signature({ ...params, provider: 'okx_wallet' }); + return await generateWeb3Signature({ ...params, provider: 'OKX Wallet' }); } export async function generateSignatureWithBase(params: GenerateSignatureParams): Promise { return await generateWeb3Signature({ ...params, provider: 'base' }); } -async function getEthereumProvider(provider: Web3Provider) { +export async function generateSignatureWithSolana(params: GenerateSolanaSignatureParams): Promise { + return await generateWeb3Signature({ ...params, chain: 'solana', provider: params.walletName }); +} + +async function getWeb3WalletProvider(provider: string, chain?: InjectedWeb3ProviderChain) { if (provider === 'coinbase_wallet') { if (__BUILD_DISABLE_RHC__) { clerkUnsupportedEnvironmentWarning('Coinbase Wallet'); @@ -120,5 +169,5 @@ async function getEthereumProvider(provider: Web3Provider) { } } - return getInjectedWeb3Providers().get(provider); + return getInjectedWeb3Providers().get(provider, chain); } diff --git a/packages/elements/src/react/hooks/use-third-party-provider.hook.ts b/packages/elements/src/react/hooks/use-third-party-provider.hook.ts index 226243625a6..ed144305b93 100644 --- a/packages/elements/src/react/hooks/use-third-party-provider.hook.ts +++ b/packages/elements/src/react/hooks/use-third-party-provider.hook.ts @@ -97,6 +97,10 @@ export const useThirdPartyProvider = < return ref.send({ type: 'AUTHENTICATE.WEB3', strategy: 'web3_okx_wallet_signature' }); } + if (provider === 'solana') { + return ref.send({ type: 'AUTHENTICATE.WEB3', strategy: 'web3_solana_signature' }); + } + return ref.send({ type: 'AUTHENTICATE.OAUTH', strategy: `oauth_${provider}` }); }, [provider, isProviderEnabled, isSaml, isEnterpriseSSO, ref], diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index b37e7d0a8a8..a6b5e7ed460 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -2250,6 +2250,7 @@ export interface ClerkAuthenticateWithWeb3Params { strategy: Web3Strategy; legalAccepted?: boolean; secondFactorUrl?: string; + walletName?: string; } export type JoinWaitlistParams = { @@ -2293,6 +2294,14 @@ export interface AuthenticateWithBaseParams { legalAccepted?: boolean; } +export interface AuthenticateWithSolanaParams { + customNavigate?: (to: string) => Promise; + redirectUrl?: string; + signUpContinueUrl?: string; + unsafeMetadata?: SignUpUnsafeMetadata; + legalAccepted?: boolean; +} + export interface LoadedClerk extends Clerk { client: ClientResource; } diff --git a/packages/shared/src/types/signIn.ts b/packages/shared/src/types/signIn.ts index e37018e15c3..a8c2c9726b1 100644 --- a/packages/shared/src/types/signIn.ts +++ b/packages/shared/src/types/signIn.ts @@ -76,6 +76,8 @@ export interface SignInResource extends ClerkResource { authenticateWithBase: () => Promise; + // authenticateWithSolana: () => Promise; + authenticateWithPasskey: (params?: AuthenticateWithPasskeyParams) => Promise; createEmailLinkFlow: () => CreateEmailLinkFlowReturn; diff --git a/packages/shared/src/types/signInFuture.ts b/packages/shared/src/types/signInFuture.ts index 66c52a4a8b3..320bcfa7093 100644 --- a/packages/shared/src/types/signInFuture.ts +++ b/packages/shared/src/types/signInFuture.ts @@ -4,6 +4,7 @@ import type { PhoneCodeChannel } from './phoneCodeChannel'; import type { SignInFirstFactor, SignInSecondFactor, SignInStatus, UserData } from './signInCommon'; import type { OAuthStrategy, PasskeyStrategy, Web3Strategy } from './strategies'; import type { VerificationResource } from './verification'; +import type { InjectedWeb3ProviderChain } from './web3'; export interface SignInFutureCreateParams { /** @@ -244,6 +245,14 @@ export interface SignInFutureWeb3Params { * The verification strategy to validate the user's sign-in request. */ strategy: Web3Strategy; + /** + * The Web3 wallet provider to use for the sign-in. + */ + provider: string; + /** + * The blockchain network chain to use for the sign-in. + */ + chain?: InjectedWeb3ProviderChain; } export interface SignInFuturePasskeyParams { diff --git a/packages/shared/src/types/web3.ts b/packages/shared/src/types/web3.ts index 78e82f3fb76..1ee37ba4aea 100644 --- a/packages/shared/src/types/web3.ts +++ b/packages/shared/src/types/web3.ts @@ -10,5 +10,492 @@ export type MetamaskWeb3Provider = 'metamask'; export type CoinbaseWalletWeb3Provider = 'coinbase_wallet'; export type OKXWalletWeb3Provider = 'okx_wallet'; export type BaseWeb3Provider = 'base'; +export type SolanaWeb3Provider = 'solana'; -export type Web3Provider = MetamaskWeb3Provider | BaseWeb3Provider | CoinbaseWalletWeb3Provider | OKXWalletWeb3Provider; +export type Web3Provider = + | MetamaskWeb3Provider + | BaseWeb3Provider + | CoinbaseWalletWeb3Provider + | OKXWalletWeb3Provider + | SolanaWeb3Provider; + +export type EthereumWeb3Provider = + | MetamaskWeb3Provider + | BaseWeb3Provider + | CoinbaseWalletWeb3Provider + | OKXWalletWeb3Provider; + +export type InjectedWeb3ProviderChain = 'solana'; + +// types copied over from @solana/wallet-standard-features and @wallet-standard/base so this library doesn't depend on them + +/** + * A namespaced identifier in the format `${namespace}:${reference}`. + * + * Used by {@link IdentifierArray} and {@link IdentifierRecord}. + * + * @group Identifier + */ +export type IdentifierString = `${string}:${string}`; + +/** + * A read-only array of namespaced identifiers in the format `${namespace}:${reference}`. + * + * Used by {@link Wallet.chains | Wallet::chains}, {@link WalletAccount.chains | WalletAccount::chains}, and + * {@link WalletAccount.features | WalletAccount::features}. + * + * @group Identifier + */ +export type IdentifierArray = readonly IdentifierString[]; + +/** + * A read-only object with keys of namespaced identifiers in the format `${namespace}:${reference}`. + * + * Used by {@link Wallet.features | Wallet::features}. + * + * @group Identifier + */ +export type IdentifierRecord = Readonly>; + +/** + * Version of the Wallet Standard implemented by a {@link Wallet}. + * + * Used by {@link Wallet.version | Wallet::version}. + * + * Note that this is _NOT_ a version of the Wallet, but a version of the Wallet Standard itself that the Wallet + * supports. + * + * This may be used by the app to determine compatibility and feature detect. + * + * @group Wallet + */ +export type WalletVersion = '1.0.0'; + +/** + * A data URI containing a base64-encoded SVG, WebP, PNG, or GIF image. + * + * Used by {@link Wallet.icon | Wallet::icon} and {@link WalletAccount.icon | WalletAccount::icon}. + * + * @group Wallet + */ +export type WalletIcon = `data:image/${'svg+xml' | 'webp' | 'png' | 'gif'};base64,${string}`; + +/** + * Interface of a **Wallet**, also referred to as a **Standard Wallet**. + * + * A Standard Wallet implements and adheres to the Wallet Standard. + * + * @group Wallet + */ +export interface Wallet { + /** + * {@link WalletVersion | Version} of the Wallet Standard implemented by the Wallet. + * + * Must be read-only, static, and canonically defined by the Wallet Standard. + */ + readonly version: WalletVersion; + + /** + * Name of the Wallet. This may be displayed by the app. + * + * Must be read-only, static, descriptive, unique, and canonically defined by the wallet extension or application. + */ + readonly name: string; + + /** + * {@link WalletIcon | Icon} of the Wallet. This may be displayed by the app. + * + * Must be read-only, static, and canonically defined by the wallet extension or application. + */ + readonly icon: WalletIcon; + + /** + * Chains supported by the Wallet. + * + * A **chain** is an {@link IdentifierString} which identifies a blockchain in a canonical, human-readable format. + * [CAIP-2](https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-2.md) chain IDs are compatible with this, + * but are not required to be used. + * + * Each blockchain should define its own **chains** by extension of the Wallet Standard, using its own namespace. + * The `standard` and `experimental` namespaces are reserved by the Wallet Standard. + * + * The {@link "@wallet-standard/features".EventsFeature | `standard:events` feature} should be used to notify the + * app if the value changes. + */ + readonly chains: IdentifierArray; + + /** + * Features supported by the Wallet. + * + * A **feature name** is an {@link IdentifierString} which identifies a **feature** in a canonical, human-readable + * format. + * + * Each blockchain should define its own features by extension of the Wallet Standard. + * + * The `standard` and `experimental` namespaces are reserved by the Wallet Standard. + * + * A **feature** may have any type. It may be a single method or value, or a collection of them. + * + * A **conventional feature** has the following structure: + * + * ```ts + * export type ExperimentalEncryptFeature = { + * // Name of the feature. + * 'experimental:encrypt': { + * // Version of the feature. + * version: '1.0.0'; + * // Properties of the feature. + * ciphers: readonly 'x25519-xsalsa20-poly1305'[]; + * // Methods of the feature. + * encrypt (data: Uint8Array): Promise; + * }; + * }; + * ``` + * + * The {@link "@wallet-standard/features".EventsFeature | `standard:events` feature} should be used to notify the + * app if the value changes. + */ + readonly features: IdentifierRecord; + + /** + * {@link WalletAccount | Accounts} that the app is authorized to use. + * + * This can be set by the Wallet so the app can use authorized accounts on the initial page load. + * + * The {@link "@wallet-standard/features".ConnectFeature | `standard:connect` feature} should be used to obtain + * authorization to the accounts. + * + * The {@link "@wallet-standard/features".EventsFeature | `standard:events` feature} should be used to notify the + * app if the value changes. + */ + readonly accounts: readonly WalletAccount[]; +} + +/** + * Interface of a **WalletAccount**, also referred to as an **Account**. + * + * An account is a _read-only data object_ that is provided from the Wallet to the app, authorizing the app to use it. + * + * The app can use an account to display and query information from a chain. + * + * The app can also act using an account by passing it to {@link Wallet.features | features} of the Wallet. + * + * Wallets may use or extend {@link "@wallet-standard/wallet".ReadonlyWalletAccount} which implements this interface. + * + * @group Wallet + */ +export interface WalletAccount { + /** Address of the account, corresponding with a public key. */ + readonly address: string; + + /** Public key of the account, corresponding with a secret key to use. */ + readonly publicKey: Uint8Array; + + /** + * Chains supported by the account. + * + * This must be a subset of the {@link Wallet.chains | chains} of the Wallet. + */ + readonly chains: IdentifierArray; + + /** + * Feature names supported by the account. + * + * This must be a subset of the names of {@link Wallet.features | features} of the Wallet. + */ + readonly features: IdentifierArray; + + /** Optional user-friendly descriptive label or name for the account. This may be displayed by the app. */ + readonly label?: string; + + /** Optional user-friendly icon for the account. This may be displayed by the app. */ + readonly icon?: WalletIcon; +} + +/** Input for signing in. */ +export interface SolanaSignInInput { + /** + * Optional EIP-4361 Domain. + * If not provided, the wallet must determine the Domain to include in the message. + */ + readonly domain?: string; + + /** + * Optional EIP-4361 Address. + * If not provided, the wallet must determine the Address to include in the message. + */ + readonly address?: string; + + /** + * Optional EIP-4361 Statement. + * If not provided, the wallet must not include Statement in the message. + */ + readonly statement?: string; + + /** + * Optional EIP-4361 URI. + * If not provided, the wallet must not include URI in the message. + */ + readonly uri?: string; + + /** + * Optional EIP-4361 Version. + * If not provided, the wallet must not include Version in the message. + */ + readonly version?: string; + + /** + * Optional EIP-4361 Chain ID. + * If not provided, the wallet must not include Chain ID in the message. + */ + readonly chainId?: string; + + /** + * Optional EIP-4361 Nonce. + * If not provided, the wallet must not include Nonce in the message. + */ + readonly nonce?: string; + + /** + * Optional EIP-4361 Issued At. + * If not provided, the wallet must not include Issued At in the message. + */ + readonly issuedAt?: string; + + /** + * Optional EIP-4361 Expiration Time. + * If not provided, the wallet must not include Expiration Time in the message. + */ + readonly expirationTime?: string; + + /** + * Optional EIP-4361 Not Before. + * If not provided, the wallet must not include Not Before in the message. + */ + readonly notBefore?: string; + + /** + * Optional EIP-4361 Request ID. + * If not provided, the wallet must not include Request ID in the message. + */ + readonly requestId?: string; + + /** + * Optional EIP-4361 Resources. + * If not provided, the wallet must not include Resources in the message. + */ + readonly resources?: readonly string[]; +} + +/** Output of signing in. */ +export interface SolanaSignInOutput { + /** + * Account that was signed in. + * The address of the account may be different from the provided input Address. + */ + readonly account: WalletAccount; + + /** + * Message bytes that were signed. + * The wallet may prefix or otherwise modify the message before signing it. + */ + readonly signedMessage: Uint8Array; + + /** + * Message signature produced. + * If the signature type is provided, the signature must be Ed25519. + */ + readonly signature: Uint8Array; + + /** + * Optional type of the message signature produced. + * If not provided, the signature must be Ed25519. + */ + readonly signatureType?: 'ed25519'; +} + +/** + * API for {@link Wallets.get | getting}, {@link Wallets.on | listening for}, and + * {@link Wallets.register | registering} {@link "@wallet-standard/base".Wallet | Wallets}. + * + * @group App + */ +export interface Wallets { + /** + * Get all Wallets that have been registered. + * + * @returns Registered Wallets. + */ + get(): readonly Wallet[]; + + /** + * Add an event listener and subscribe to events for Wallets that are + * {@link WalletsEventsListeners.register | registered} and + * {@link WalletsEventsListeners.unregister | unregistered}. + * + * @param event - Event type to listen for. {@link WalletsEventsListeners.register | `register`} and + * {@link WalletsEventsListeners.unregister | `unregister`} are the only event types. + * @param listener - Function that will be called when an event of the type is emitted. + * @returns + * `off` function which may be called to remove the event listener and unsubscribe from events. + * + * As with all event listeners, be careful to avoid memory leaks. + */ + on(event: E, listener: WalletsEventsListeners[E]): () => void; + + /** + * Register Wallets. This can be used to programmatically wrap non-standard wallets as Standard Wallets. + * + * Apps generally do not need to, and should not, call this. + * + * @param wallets - Wallets to register. + * @returns + * `unregister` function which may be called to programmatically unregister the registered Wallets. + * + * Apps generally do not need to, and should not, call this. + */ + register(...wallets: Wallet[]): () => void; +} + +/** + * Types of event listeners of the {@link Wallets} API. + * + * @group App + */ +export interface WalletsEventsListeners { + /** + * Emitted when Wallets are registered. + * + * @param wallets - Wallets that were registered. + */ + register(...wallets: Wallet[]): void; + + /** + * Emitted when Wallets are unregistered. + * + * @param wallets - Wallets that were unregistered. + */ + unregister(...wallets: Wallet[]): void; +} + +/** + * Names of {@link WalletsEventsListeners} that can be listened for. + * + * @group App + */ +export type WalletsEventNames = keyof WalletsEventsListeners; + +/** + * @deprecated Use {@link WalletsEventsListeners} instead. + * + * @group Deprecated + */ +export type WalletsEvents = WalletsEventsListeners; + +/** + * Global `window` type for dispatching and listening for {@link WindowAppReadyEvent} and {@link WindowRegisterWalletEvent}. + * + * ```ts + * import { WalletEventsWindow } from '@wallet-standard/base'; + * + * declare const window: WalletEventsWindow; + * // OR + * (window as WalletEventsWindow) + * ``` + * + * @group Window + */ +export interface WalletEventsWindow extends Omit { + /** Add a listener for {@link WindowAppReadyEvent}. */ + addEventListener(type: WindowAppReadyEventType, listener: (event: WindowAppReadyEvent) => void): void; + /** Add a listener for {@link WindowRegisterWalletEvent}. */ + addEventListener(type: WindowRegisterWalletEventType, listener: (event: WindowRegisterWalletEvent) => void): void; + /** Dispatch a {@link WindowAppReadyEvent}. */ + dispatchEvent(event: WindowAppReadyEvent): void; + /** Dispatch a {@link WindowRegisterWalletEvent}. */ + dispatchEvent(event: WindowRegisterWalletEvent): void; +} + +/** + * Type of {@link WindowAppReadyEvent}. + * + * @group App Ready Event + */ +export type WindowAppReadyEventType = 'wallet-standard:app-ready'; + +/** + * Interface that will be provided to {@link Wallet | Wallets} by the app when the app calls the + * {@link WindowRegisterWalletEventCallback} provided by Wallets. + * + * Wallets must call the {@link WindowAppReadyEventAPI.register | register} method to register themselves. + * + * @group App Ready Event + */ +export interface WindowAppReadyEventAPI { + /** + * Register a {@link Wallet} with the app. + * + * @returns + * `unregister` function to programmatically unregister the Wallet. + * + * Wallets generally do not need to, and should not, call this. + */ + register(wallet: Wallet): () => void; +} + +/** + * Event that will be dispatched by the app on the `window` when the app is ready to register {@link Wallet | Wallets}. + * + * Wallets must listen for this event, and {@link WindowAppReadyEventAPI.register register} themselves when the event is + * dispatched. + * + * @group App Ready Event + */ +export type WindowAppReadyEvent = UnstoppableCustomEvent; + +/** + * Type of {@link WindowRegisterWalletEvent}. + * + * @group Register Wallet Event + */ +export type WindowRegisterWalletEventType = 'wallet-standard:register-wallet'; + +/** + * Callback function provided by {@link Wallet | Wallets} to be called by the app when the app is ready to register + * Wallets. + * + * @group Register Wallet Event + */ +export type WindowRegisterWalletEventCallback = (api: WindowAppReadyEventAPI) => void; + +/** + * Event that will be dispatched on the `window` by each {@link Wallet | Wallet} when the Wallet is ready to be + * registered by the app. + * + * The app must listen for this event, and register Wallets when the event is dispatched. + * + * @group Register Wallet Event + */ +export type WindowRegisterWalletEvent = UnstoppableCustomEvent< + WindowRegisterWalletEventType, + WindowRegisterWalletEventCallback +>; + +/** + * @internal + * + * A custom event that cannot have its default behavior prevented or its propagation stopped. + * + * This is an internal type, extended by {@link WindowAppReadyEvent} and {@link WindowRegisterWalletEvent}. + * + * [`window.CustomEvent`](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent) is not used because + * Node.js doesn't have it, but this interface is compatible with it. + * + * @group Internal + */ +export interface UnstoppableCustomEvent extends Event { + /** Type of the event. */ + readonly type: T; + /** Data attached to the event. */ + readonly detail: D; +} diff --git a/packages/shared/src/types/web3Wallet.ts b/packages/shared/src/types/web3Wallet.ts index 62dec1eb68d..f8074da7572 100644 --- a/packages/shared/src/types/web3Wallet.ts +++ b/packages/shared/src/types/web3Wallet.ts @@ -37,4 +37,5 @@ export interface GenerateSignatureParams { identifier: string; nonce: string; provider?: Web3Provider; + walletName: string; } diff --git a/packages/shared/src/web3.ts b/packages/shared/src/web3.ts index 25392eece24..d630edf5f88 100644 --- a/packages/shared/src/web3.ts +++ b/packages/shared/src/web3.ts @@ -21,4 +21,9 @@ export const WEB3_PROVIDERS: Web3ProviderData[] = [ strategy: 'web3_okx_wallet_signature', name: 'OKX Wallet', }, + { + provider: 'solana', + strategy: 'web3_solana_signature', + name: 'Solana', + }, ]; From a5f9016995f167379fb7717e4dfb6a912cb08d89 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Fri, 21 Nov 2025 15:40:37 -0500 Subject: [PATCH 02/11] feat(clerk-js): Add Solana wallet authentication support Core Changes - Add `AuthenticateWithSolanaParams` type for Solana-specific authentication - Extend `authenticateWithWeb3` to support Solana wallets with `walletName` parameter - Add `authenticateWithSolana` method to `SignInResource` for dedicated Solana auth - Require `walletName` for Solana provider to enable multi-wallet selection - Split Ethereum and Solana provider detection into separate modules Updated types - Add `web3_solana_signature` to `Web3Strategy` union type - Add `walletName` field to `Web3SignatureFactor` type - Update `AuthenticateWithWeb3Params` to include optional `walletName` - Removed unused Wallet Standard types in `web3.ts` (moved to library imports) Dependencies - Add `@solana/wallet-standard@^1.1.4` for Solana wallet types - Add `@wallet-standard/core@^1.1.1` for wallet registry - Add `@wallet-standard/react@^1.0.1` for React integration Signed-off-by: Kenton Duprey --- packages/clerk-js/package.json | 3 + packages/clerk-js/src/core/clerk.ts | 2 +- .../clerk-js/src/core/resources/SignIn.ts | 26 +- .../src/utils/injectedWeb3EthProviders.ts | 75 ++ .../src/utils/injectedWeb3Providers.ts | 203 --- .../src/utils/injectedWeb3SolanaProviders.ts | 54 + packages/clerk-js/src/utils/web3.ts | 64 +- packages/shared/src/types/clerk.ts | 1 + packages/shared/src/types/factors.ts | 1 + packages/shared/src/types/signIn.ts | 3 +- packages/shared/src/types/signInFuture.ts | 8 +- packages/shared/src/types/web3.ts | 475 ------- packages/shared/src/types/web3Wallet.ts | 10 +- pnpm-lock.yaml | 1111 ++++++++++++----- 14 files changed, 1027 insertions(+), 1009 deletions(-) create mode 100644 packages/clerk-js/src/utils/injectedWeb3EthProviders.ts delete mode 100644 packages/clerk-js/src/utils/injectedWeb3Providers.ts create mode 100644 packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index cd8ad69e3cb..266533b3861 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -69,9 +69,12 @@ "@floating-ui/react": "0.27.12", "@floating-ui/react-dom": "^2.1.3", "@formkit/auto-animate": "^0.8.2", + "@solana/wallet-standard": "^1.1.4", "@stripe/stripe-js": "5.6.0", "@swc/helpers": "^0.5.17", "@tanstack/query-core": "5.87.4", + "@wallet-standard/core": "^1.1.1", + "@wallet-standard/react": "^1.0.1", "@zxcvbn-ts/core": "3.0.4", "@zxcvbn-ts/language-common": "3.0.4", "alien-signals": "2.0.6", diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 5765fbdecd4..2f1f817993a 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -2281,7 +2281,7 @@ export class Clerk implements ClerkInterface { const { displayConfig } = this.environment; const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; - const identifier = await getWeb3Identifier({ provider }); + const identifier = await getWeb3Identifier({ provider, walletName }); let generateSignature: (params: GenerateSignatureParams) => Promise; switch (provider) { case 'metamask': diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 5e88eb210e5..a20b6bd5735 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -7,6 +7,7 @@ import type { AuthenticateWithPasskeyParams, AuthenticateWithPopupParams, AuthenticateWithRedirectParams, + AuthenticateWithSolanaParams, AuthenticateWithWeb3Params, ClientTrustState, CreateEmailLinkFlowReturn, @@ -382,13 +383,17 @@ export class SignIn extends BaseResource implements SignInResource { }; public authenticateWithWeb3 = async (params: AuthenticateWithWeb3Params): Promise => { - const { identifier, generateSignature, strategy = 'web3_metamask_signature' } = params || {}; + const { identifier, generateSignature, strategy = 'web3_metamask_signature', walletName } = params || {}; const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; if (!(typeof generateSignature === 'function')) { clerkMissingOptionError('generateSignature'); } + if (provider === 'solana' && !walletName) { + clerkMissingOptionError('walletName'); + } + await this.create({ identifier }); const web3FirstFactor = this.supportedFirstFactors?.find(f => f.strategy === strategy) as Web3SignatureFactor; @@ -406,7 +411,7 @@ export class SignIn extends BaseResource implements SignInResource { let signature: string; try { - signature = await generateSignature({ identifier, nonce: message, provider, walletName: provider }); + signature = await generateSignature({ identifier, nonce: message, provider, walletName }); } catch (err) { // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing // Passkey in order to authenticate, the initial generate signature request to be rejected. For this @@ -415,7 +420,7 @@ export class SignIn extends BaseResource implements SignInResource { // error code 4001 means the user rejected the request // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors if (provider === 'coinbase_wallet' && err.code === 4001) { - signature = await generateSignature({ identifier, nonce: message, provider, walletName: provider }); + signature = await generateSignature({ identifier, nonce: message, provider, walletName }); } else { throw err; } @@ -463,8 +468,8 @@ export class SignIn extends BaseResource implements SignInResource { }); }; - public authenticateWithSolana = async (walletName: string): Promise => { - const identifier = await getSolanaIdentifier(walletName); + public authenticateWithSolana = async ({ walletName }: AuthenticateWithSolanaParams): Promise => { + const identifier = await getSolanaIdentifier({ walletName }); return this.authenticateWithWeb3({ identifier, generateSignature: generateSignatureWithSolana, @@ -999,7 +1004,12 @@ class SignInFuture implements SignInFutureResource { generateSignature = generateSignatureWithOKXWallet; break; case 'solana': - identifier = await getSolanaIdentifier(params.provider); + if (!params.walletName) { + throw new ClerkRuntimeError('walletName is required for solana web3 authentication', { + code: 'missing_wallet_name', + }); + } + identifier = await getSolanaIdentifier({ walletName: params.walletName }); generateSignature = generateSignatureWithSolana; break; default: @@ -1030,7 +1040,7 @@ class SignInFuture implements SignInFutureResource { signature = await generateSignature({ identifier, nonce: message, - walletName: params.provider, + walletName: params.walletName, }); } catch (err) { // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing @@ -1043,7 +1053,7 @@ class SignInFuture implements SignInFutureResource { signature = await generateSignature({ identifier, nonce: message, - walletName: provider, + walletName: params.walletName, }); } else { throw err; diff --git a/packages/clerk-js/src/utils/injectedWeb3EthProviders.ts b/packages/clerk-js/src/utils/injectedWeb3EthProviders.ts new file mode 100644 index 00000000000..bd8ad799874 --- /dev/null +++ b/packages/clerk-js/src/utils/injectedWeb3EthProviders.ts @@ -0,0 +1,75 @@ +import type { MetamaskWeb3Provider, OKXWalletWeb3Provider } from '@clerk/shared/types'; + +//https://eips.ethereum.org/EIPS/eip-6963 + +interface EIP6963ProviderInfo { + walletId: string; + uuid: string; + name: string; + icon: string; +} + +interface EIP1193Provider { + isStatus?: boolean; + host?: string; + path?: string; + sendAsync?: ( + request: { method: string; params?: [] }, + callback: (error: Error | null, response: unknown) => void, + ) => void; // For sending asynchronous requests + send?: (request: { method: string; params?: [] }, callback: (error: Error | null, response: unknown) => void) => void; // For sending synchronous requests + request: (request: { method: string; params?: string[] }) => Promise; // Standard method for sending requests per EIP-1193 +} + +interface EIP6963ProviderDetail { + info: EIP6963ProviderInfo; + provider: EIP1193Provider; +} + +type EIP6963AnnounceProviderEvent = CustomEvent; +type InjectedWeb3EthProvider = MetamaskWeb3Provider | OKXWalletWeb3Provider; + +class InjectedWeb3EthProviders { + #providers: EIP6963ProviderDetail[] = []; + #providerIdMap: Record = { + metamask: 'MetaMask', + okx_wallet: 'OKX Wallet', + } as const; + static #instance: InjectedWeb3EthProviders | null = null; + + private constructor() { + if (typeof window === 'undefined') { + return; + } + window.addEventListener('eip6963:announceProvider', this.#onAnnouncement as EventListener); + window.dispatchEvent(new Event('eip6963:requestProvider')); + } + + public static getInstance(): InjectedWeb3EthProviders { + if (!InjectedWeb3EthProviders.#instance) { + InjectedWeb3EthProviders.#instance = new InjectedWeb3EthProviders(); + } + return InjectedWeb3EthProviders.#instance; + } + + get = (provider: InjectedWeb3EthProvider) => { + const ethProvider = this.#providers.find(p => p.info.name === this.#providerIdMap[provider])?.provider; + if (ethProvider !== undefined) { + return ethProvider; + } + + // In case we weren't able to find the requested provider, fallback to the + // global injected provider instead, if any, to allow the user to continue + // the flow rather than blocking it + return window.ethereum; + }; + + #onAnnouncement = (event: EIP6963AnnounceProviderEvent) => { + if (this.#providers.some(p => p.info.uuid === event.detail.info.uuid)) { + return; + } + this.#providers.push(event.detail); + }; +} + +export const getInjectedWeb3EthProviders = () => InjectedWeb3EthProviders.getInstance(); diff --git a/packages/clerk-js/src/utils/injectedWeb3Providers.ts b/packages/clerk-js/src/utils/injectedWeb3Providers.ts deleted file mode 100644 index 5f5f680f722..00000000000 --- a/packages/clerk-js/src/utils/injectedWeb3Providers.ts +++ /dev/null @@ -1,203 +0,0 @@ -import type { - InjectedWeb3ProviderChain, - MetamaskWeb3Provider, - OKXWalletWeb3Provider, - Wallet, - WalletEventsWindow, - Wallets, - WalletsEventNames, - WalletsEventsListeners, - WindowAppReadyEvent, - WindowAppReadyEventAPI, -} from '@clerk/shared/types'; - -//https://eips.ethereum.org/EIPS/eip-6963 - -interface EIP6963ProviderInfo { - walletId: string; - uuid: string; - name: string; - icon: string; -} - -interface EIP1193Provider { - isStatus?: boolean; - host?: string; - path?: string; - sendAsync?: ( - request: { method: string; params?: [] }, - callback: (error: Error | null, response: unknown) => void, - ) => void; // For sending asynchronous requests - send?: (request: { method: string; params?: [] }, callback: (error: Error | null, response: unknown) => void) => void; // For sending synchronous requests - request: (request: { method: string; params?: string[] }) => Promise; // Standard method for sending requests per EIP-1193 -} - -interface EIP6963ProviderDetail { - info: EIP6963ProviderInfo; - provider: EIP1193Provider; -} - -type EIP6963AnnounceProviderEvent = CustomEvent; -type InjectedWeb3Wallet = MetamaskWeb3Provider | OKXWalletWeb3Provider; - -class InjectedWeb3Providers { - #wallets: Wallets | undefined = undefined; - #registeredWalletsSet = new Set(); - #cachedWalletsArray: readonly Wallet[] | undefined; - #listeners: { [E in WalletsEventNames]?: WalletsEventsListeners[E][] } = {}; - - #ethWalletProviders: EIP6963ProviderDetail[] = []; - #providerIdMap: Record = { - metamask: 'MetaMask', - okx_wallet: 'OKX Wallet', - } as const; - - static #instance: InjectedWeb3Providers | null = null; - - private constructor() { - if (typeof window === 'undefined') { - return; - } - window.addEventListener('eip6963:announceProvider', this.#onAnnouncement as EventListener); - window.dispatchEvent(new Event('eip6963:requestProvider')); - - this.#wallets = Object.freeze({ register: this.#register, get: this.#get, on: this.#on }); - - const api = Object.freeze({ register: this.#register }); - try { - (window as WalletEventsWindow).addEventListener('wallet-standard:register-wallet', ({ detail: callback }) => - callback(api), - ); - } catch (error) { - console.error('wallet-standard:register-wallet event listener could not be added\n', error); - } - try { - (window as WalletEventsWindow).dispatchEvent(new AppReadyEvent(api)); - } catch (error) { - console.error('wallet-standard:app-ready event could not be dispatched\n', error); - } - } - - public static getInstance(): InjectedWeb3Providers { - if (!InjectedWeb3Providers.#instance) { - InjectedWeb3Providers.#instance = new InjectedWeb3Providers(); - } - return InjectedWeb3Providers.#instance; - } - - // Get a provider by its wallet name and optional chain - get = (walletProvider: string, chain?: InjectedWeb3ProviderChain) => { - const ethProvider = this.#ethWalletProviders.find( - p => p.info.name === this.#providerIdMap[walletProvider as InjectedWeb3Wallet], - )?.provider; - if (ethProvider !== undefined) { - return ethProvider; - } - - // Try to find the requested Solana provider among the registered wallets - const wallets = this.#wallets?.get(); - if (wallets) { - // Try to find the requested wallet by matching its name and chain (if provided) - const wallet = wallets.find(w => w.name === walletProvider && (chain ? w.chains?.includes(`${chain}:`) : true)); - if (wallet) { - return wallet; - } - } - - // In case we weren't able to find the requested provider, fallback to the - // global injected provider instead, if any, to allow the user to continue - // the flow rather than blocking it - if (chain === 'solana') { - return (window as any).solana; - } - return window.ethereum; - }; - - #onAnnouncement = (event: EIP6963AnnounceProviderEvent) => { - if (this.#ethWalletProviders.some(p => p.info.uuid === event.detail.info.uuid)) { - return; - } - this.#ethWalletProviders.push(event.detail); - }; - - #register = (...wallets: Wallet[]): (() => void) => { - // Filter out wallets that have already been registered. - // This prevents the same wallet from being registered twice, but it also prevents wallets from being - // unregistered by reusing a reference to the wallet to obtain the unregister function for it. - wallets = wallets.filter(wallet => !this.#registeredWalletsSet.has(wallet)); - // If there are no new wallets to register, just return a no-op unregister function. - - if (!wallets.length) { - return () => {}; - } - - wallets.forEach(wallet => this.#addRegisteredWallet(wallet)); - this.#listeners['register']?.forEach(listener => guard(() => listener(...wallets))); - // Return a function that unregisters the registered wallets. - return () => { - wallets.forEach(wallet => this.#removeRegisteredWallet(wallet)); - this.#listeners['unregister']?.forEach(listener => guard(() => listener(...wallets))); - }; - }; - - #addRegisteredWallet = (wallet: Wallet) => { - this.#cachedWalletsArray = undefined; - this.#registeredWalletsSet.add(wallet); - }; - #removeRegisteredWallet = (wallet: Wallet) => { - this.#cachedWalletsArray = undefined; - this.#registeredWalletsSet.delete(wallet); - }; - - #get = (): readonly Wallet[] => { - if (!this.#cachedWalletsArray) { - this.#cachedWalletsArray = [...this.#registeredWalletsSet]; - } - return this.#cachedWalletsArray; - }; - - #on = (event: E, listener: WalletsEventsListeners[E]): (() => void) => { - if (this.#listeners[event]) { - this.#listeners[event].push(listener); - } else { - this.#listeners[event] = [listener]; - } - // Return a function that removes the event listener. - return () => { - this.#listeners[event] = this.#listeners[event]?.filter(existingListener => listener !== existingListener); - }; - }; - - listeners: { [E in WalletsEventNames]?: WalletsEventsListeners } = {}; -} - -export const getInjectedWeb3Providers = () => InjectedWeb3Providers.getInstance(); - -function guard(callback: () => void): void { - try { - callback(); - } catch (error) { - console.error(error); - } -} - -class AppReadyEvent extends Event implements WindowAppReadyEvent { - readonly #detail: WindowAppReadyEventAPI; - - get detail() { - return this.#detail; - } - - get type() { - return 'wallet-standard:app-ready' as const; - } - - constructor(api: WindowAppReadyEventAPI) { - super('wallet-standard:app-ready', { - bubbles: false, - cancelable: false, - composed: false, - }); - this.#detail = api; - } -} diff --git a/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts new file mode 100644 index 00000000000..f1451c6628b --- /dev/null +++ b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts @@ -0,0 +1,54 @@ +import type { Wallet } from '@wallet-standard/core'; + +//https://eips.ethereum.org/EIPS/eip-6963 + +class InjectedWeb3SolanaProviders { + #wallets: readonly Wallet[] | undefined = undefined; + + static #instance: InjectedWeb3SolanaProviders | null = null; + + private constructor() { + if (typeof window === 'undefined') { + return; + } + this.#initialize(); + } + + async #initialize() { + const wallets = await import('@wallet-standard/core').then(mod => mod.getWallets()); + this.#wallets = wallets.get(); + + wallets.on('register', () => { + this.#wallets = wallets.get(); + }); + wallets.on('unregister', () => { + this.#wallets = wallets.get(); + }); + } + + public static getInstance(): InjectedWeb3SolanaProviders { + if (!InjectedWeb3SolanaProviders.#instance) { + InjectedWeb3SolanaProviders.#instance = new InjectedWeb3SolanaProviders(); + } + return InjectedWeb3SolanaProviders.#instance; + } + + // Get a provider by its wallet name and optional chain + get = (walletName: string) => { + // Try to find the requested Solana provider among the registered wallets + if (this.#wallets) { + // Try to find the requested wallet by matching its name and chain (if provided) + const wallet = this.#wallets.find(w => w.name === walletName && w.chains?.includes(`solana:`)); + if (wallet) { + return wallet; + } + } + + // In case we weren't able to find the requested provider, fallback to the + // global injected provider instead, if any, to allow the user to continue + // the flow rather than blocking it + return (window as any).solana; + }; +} + +export const getInjectedWeb3SolanaProviders = () => InjectedWeb3SolanaProviders.getInstance(); diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index 17eed4df56f..6ac2cedb9ed 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -1,9 +1,11 @@ -import type { InjectedWeb3ProviderChain, Wallet, Web3Provider } from '@clerk/shared/types'; +import type { Web3Provider } from '@clerk/shared/types'; +import type { Wallet } from '@wallet-standard/core'; import { clerkUnsupportedEnvironmentWarning } from '@/core/errors'; +import { getInjectedWeb3SolanaProviders } from '@/utils/injectedWeb3SolanaProviders'; import { toHex } from './hex'; -import { getInjectedWeb3Providers } from './injectedWeb3Providers'; +import { getInjectedWeb3EthProviders } from './injectedWeb3EthProviders'; // type InjectedWeb3Wallet = MetamaskWeb3Provider | OKXWalletWeb3Provider; // const web3WalletProviderMap: Record = { @@ -11,20 +13,14 @@ import { getInjectedWeb3Providers } from './injectedWeb3Providers'; // okx_wallet: 'OKX Wallet', // } as const; -type GetWeb3IdentifierParams = GetWeb3EthIdentifierParams | GetWeb3SolanaIdentifierParams; - -type GetWeb3EthIdentifierParams = { - provider: Exclude; - chain?: Exclude; -}; - -type GetWeb3SolanaIdentifierParams = { - provider: string; - chain: 'solana'; +type GetWeb3IdentifierParams = { + provider: Web3Provider; + walletName?: string; }; export async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promise { - const walletProvider = await getWeb3WalletProvider(params.provider, params?.chain); + const { provider, walletName } = params; + const walletProvider = await getWeb3WalletProvider(provider, walletName); // TODO - core-3: Improve error handling for the case when the provider is not found if (!walletProvider) { @@ -33,29 +29,26 @@ export async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promis return ''; } - if (params.chain === 'solana') { + if (params.provider === 'solana') { // Solana provider - const address = (walletProvider as Wallet).accounts[0]?.address; - if (address) { - return address; - } - return ''; + const identifiers = (walletProvider as Wallet).accounts; + return (identifiers && identifiers[0].address) || ''; } - const identifiers = walletProvider.accounts; + const identifiers = await walletProvider.request({ method: 'eth_requestAccounts' }); // @ts-ignore -- Provider SDKs may return unknown shape; use first address if present return (identifiers && identifiers[0]) || ''; } type GenerateWeb3SignatureParams = GenerateSignatureParams & { - provider: string; - chain?: InjectedWeb3ProviderChain; + provider: Web3Provider; + walletName?: string; }; export async function generateWeb3Signature(params: GenerateWeb3SignatureParams): Promise { const { identifier, nonce, provider } = params; - const wallet = await getWeb3WalletProvider(provider, params?.chain); + const wallet = await getWeb3WalletProvider(provider, params?.walletName); // TODO - core-3: Improve error handling for the case when the provider is not found if (!wallet) { @@ -63,7 +56,7 @@ export async function generateWeb3Signature(params: GenerateWeb3SignatureParams) // the flow will fail as it has been the expected behavior so far. return ''; } - if (params.chain === 'solana' && 'features' in wallet && wallet.features) { + if (provider === 'solana' && 'features' in wallet && wallet.features) { if (!(wallet as Wallet).accounts.find(a => a.address === identifier)) { throw new Error(`The connected wallet does not have the specified identifier.`); } @@ -99,8 +92,8 @@ export async function getBaseIdentifier(): Promise { return await getWeb3Identifier({ provider: 'base' }); } -export async function getSolanaIdentifier(walletName: string): Promise { - return await getWeb3Identifier({ provider: walletName, chain: 'solana' }); +export async function getSolanaIdentifier({ walletName }: { walletName?: string }): Promise { + return await getWeb3Identifier({ provider: 'solana', walletName }); } type GenerateSignatureParams = { @@ -109,11 +102,11 @@ type GenerateSignatureParams = { }; type GenerateSolanaSignatureParams = GenerateSignatureParams & { - walletName: string; + walletName?: string; }; export async function generateSignatureWithMetamask(params: GenerateSignatureParams): Promise { - return await generateWeb3Signature({ ...params, provider: 'MetaMask' }); + return await generateWeb3Signature({ ...params, provider: 'metamask' }); } export async function generateSignatureWithCoinbaseWallet(params: GenerateSignatureParams): Promise { @@ -121,7 +114,7 @@ export async function generateSignatureWithCoinbaseWallet(params: GenerateSignat } export async function generateSignatureWithOKXWallet(params: GenerateSignatureParams): Promise { - return await generateWeb3Signature({ ...params, provider: 'OKX Wallet' }); + return await generateWeb3Signature({ ...params, provider: 'okx_wallet' }); } export async function generateSignatureWithBase(params: GenerateSignatureParams): Promise { @@ -129,10 +122,10 @@ export async function generateSignatureWithBase(params: GenerateSignatureParams) } export async function generateSignatureWithSolana(params: GenerateSolanaSignatureParams): Promise { - return await generateWeb3Signature({ ...params, chain: 'solana', provider: params.walletName }); + return await generateWeb3Signature({ ...params, provider: 'solana', walletName: params.walletName }); } -async function getWeb3WalletProvider(provider: string, chain?: InjectedWeb3ProviderChain) { +async function getWeb3WalletProvider(provider: Web3Provider, walletName?: string) { if (provider === 'coinbase_wallet') { if (__BUILD_DISABLE_RHC__) { clerkUnsupportedEnvironmentWarning('Coinbase Wallet'); @@ -169,5 +162,12 @@ async function getWeb3WalletProvider(provider: string, chain?: InjectedWeb3Provi } } - return getInjectedWeb3Providers().get(provider, chain); + if (provider === 'solana') { + if (!walletName) { + return null; + } + return getInjectedWeb3SolanaProviders().get(walletName); + } + + return getInjectedWeb3EthProviders().get(provider); } diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index a6b5e7ed460..9f2c7c73506 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -2300,6 +2300,7 @@ export interface AuthenticateWithSolanaParams { signUpContinueUrl?: string; unsafeMetadata?: SignUpUnsafeMetadata; legalAccepted?: boolean; + walletName?: string; } export interface LoadedClerk extends Clerk { diff --git a/packages/shared/src/types/factors.ts b/packages/shared/src/types/factors.ts index 9dff219ff14..f244a16f34b 100644 --- a/packages/shared/src/types/factors.ts +++ b/packages/shared/src/types/factors.ts @@ -43,6 +43,7 @@ export type Web3SignatureFactor = { strategy: Web3Strategy; web3WalletId: string; primary?: boolean; + walletName?: string; }; export type PasswordFactor = { diff --git a/packages/shared/src/types/signIn.ts b/packages/shared/src/types/signIn.ts index a8c2c9726b1..de6d26743b5 100644 --- a/packages/shared/src/types/signIn.ts +++ b/packages/shared/src/types/signIn.ts @@ -1,3 +1,4 @@ +import type { AuthenticateWithSolanaParams } from './clerk'; import type { ClerkResourceJSON, ClientTrustState, @@ -76,7 +77,7 @@ export interface SignInResource extends ClerkResource { authenticateWithBase: () => Promise; - // authenticateWithSolana: () => Promise; + authenticateWithSolana: (params: AuthenticateWithSolanaParams) => Promise; authenticateWithPasskey: (params?: AuthenticateWithPasskeyParams) => Promise; diff --git a/packages/shared/src/types/signInFuture.ts b/packages/shared/src/types/signInFuture.ts index 320bcfa7093..554b77dc54d 100644 --- a/packages/shared/src/types/signInFuture.ts +++ b/packages/shared/src/types/signInFuture.ts @@ -4,7 +4,7 @@ import type { PhoneCodeChannel } from './phoneCodeChannel'; import type { SignInFirstFactor, SignInSecondFactor, SignInStatus, UserData } from './signInCommon'; import type { OAuthStrategy, PasskeyStrategy, Web3Strategy } from './strategies'; import type { VerificationResource } from './verification'; -import type { InjectedWeb3ProviderChain } from './web3'; +import type { Web3Provider } from './web3'; export interface SignInFutureCreateParams { /** @@ -248,11 +248,11 @@ export interface SignInFutureWeb3Params { /** * The Web3 wallet provider to use for the sign-in. */ - provider: string; + provider: Web3Provider; /** - * The blockchain network chain to use for the sign-in. + * The name of the wallet to use for Solana sign-ins. Required when `provider` is set to `'solana'`. */ - chain?: InjectedWeb3ProviderChain; + walletName?: string; } export interface SignInFuturePasskeyParams { diff --git a/packages/shared/src/types/web3.ts b/packages/shared/src/types/web3.ts index 1ee37ba4aea..182e2536766 100644 --- a/packages/shared/src/types/web3.ts +++ b/packages/shared/src/types/web3.ts @@ -24,478 +24,3 @@ export type EthereumWeb3Provider = | BaseWeb3Provider | CoinbaseWalletWeb3Provider | OKXWalletWeb3Provider; - -export type InjectedWeb3ProviderChain = 'solana'; - -// types copied over from @solana/wallet-standard-features and @wallet-standard/base so this library doesn't depend on them - -/** - * A namespaced identifier in the format `${namespace}:${reference}`. - * - * Used by {@link IdentifierArray} and {@link IdentifierRecord}. - * - * @group Identifier - */ -export type IdentifierString = `${string}:${string}`; - -/** - * A read-only array of namespaced identifiers in the format `${namespace}:${reference}`. - * - * Used by {@link Wallet.chains | Wallet::chains}, {@link WalletAccount.chains | WalletAccount::chains}, and - * {@link WalletAccount.features | WalletAccount::features}. - * - * @group Identifier - */ -export type IdentifierArray = readonly IdentifierString[]; - -/** - * A read-only object with keys of namespaced identifiers in the format `${namespace}:${reference}`. - * - * Used by {@link Wallet.features | Wallet::features}. - * - * @group Identifier - */ -export type IdentifierRecord = Readonly>; - -/** - * Version of the Wallet Standard implemented by a {@link Wallet}. - * - * Used by {@link Wallet.version | Wallet::version}. - * - * Note that this is _NOT_ a version of the Wallet, but a version of the Wallet Standard itself that the Wallet - * supports. - * - * This may be used by the app to determine compatibility and feature detect. - * - * @group Wallet - */ -export type WalletVersion = '1.0.0'; - -/** - * A data URI containing a base64-encoded SVG, WebP, PNG, or GIF image. - * - * Used by {@link Wallet.icon | Wallet::icon} and {@link WalletAccount.icon | WalletAccount::icon}. - * - * @group Wallet - */ -export type WalletIcon = `data:image/${'svg+xml' | 'webp' | 'png' | 'gif'};base64,${string}`; - -/** - * Interface of a **Wallet**, also referred to as a **Standard Wallet**. - * - * A Standard Wallet implements and adheres to the Wallet Standard. - * - * @group Wallet - */ -export interface Wallet { - /** - * {@link WalletVersion | Version} of the Wallet Standard implemented by the Wallet. - * - * Must be read-only, static, and canonically defined by the Wallet Standard. - */ - readonly version: WalletVersion; - - /** - * Name of the Wallet. This may be displayed by the app. - * - * Must be read-only, static, descriptive, unique, and canonically defined by the wallet extension or application. - */ - readonly name: string; - - /** - * {@link WalletIcon | Icon} of the Wallet. This may be displayed by the app. - * - * Must be read-only, static, and canonically defined by the wallet extension or application. - */ - readonly icon: WalletIcon; - - /** - * Chains supported by the Wallet. - * - * A **chain** is an {@link IdentifierString} which identifies a blockchain in a canonical, human-readable format. - * [CAIP-2](https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-2.md) chain IDs are compatible with this, - * but are not required to be used. - * - * Each blockchain should define its own **chains** by extension of the Wallet Standard, using its own namespace. - * The `standard` and `experimental` namespaces are reserved by the Wallet Standard. - * - * The {@link "@wallet-standard/features".EventsFeature | `standard:events` feature} should be used to notify the - * app if the value changes. - */ - readonly chains: IdentifierArray; - - /** - * Features supported by the Wallet. - * - * A **feature name** is an {@link IdentifierString} which identifies a **feature** in a canonical, human-readable - * format. - * - * Each blockchain should define its own features by extension of the Wallet Standard. - * - * The `standard` and `experimental` namespaces are reserved by the Wallet Standard. - * - * A **feature** may have any type. It may be a single method or value, or a collection of them. - * - * A **conventional feature** has the following structure: - * - * ```ts - * export type ExperimentalEncryptFeature = { - * // Name of the feature. - * 'experimental:encrypt': { - * // Version of the feature. - * version: '1.0.0'; - * // Properties of the feature. - * ciphers: readonly 'x25519-xsalsa20-poly1305'[]; - * // Methods of the feature. - * encrypt (data: Uint8Array): Promise; - * }; - * }; - * ``` - * - * The {@link "@wallet-standard/features".EventsFeature | `standard:events` feature} should be used to notify the - * app if the value changes. - */ - readonly features: IdentifierRecord; - - /** - * {@link WalletAccount | Accounts} that the app is authorized to use. - * - * This can be set by the Wallet so the app can use authorized accounts on the initial page load. - * - * The {@link "@wallet-standard/features".ConnectFeature | `standard:connect` feature} should be used to obtain - * authorization to the accounts. - * - * The {@link "@wallet-standard/features".EventsFeature | `standard:events` feature} should be used to notify the - * app if the value changes. - */ - readonly accounts: readonly WalletAccount[]; -} - -/** - * Interface of a **WalletAccount**, also referred to as an **Account**. - * - * An account is a _read-only data object_ that is provided from the Wallet to the app, authorizing the app to use it. - * - * The app can use an account to display and query information from a chain. - * - * The app can also act using an account by passing it to {@link Wallet.features | features} of the Wallet. - * - * Wallets may use or extend {@link "@wallet-standard/wallet".ReadonlyWalletAccount} which implements this interface. - * - * @group Wallet - */ -export interface WalletAccount { - /** Address of the account, corresponding with a public key. */ - readonly address: string; - - /** Public key of the account, corresponding with a secret key to use. */ - readonly publicKey: Uint8Array; - - /** - * Chains supported by the account. - * - * This must be a subset of the {@link Wallet.chains | chains} of the Wallet. - */ - readonly chains: IdentifierArray; - - /** - * Feature names supported by the account. - * - * This must be a subset of the names of {@link Wallet.features | features} of the Wallet. - */ - readonly features: IdentifierArray; - - /** Optional user-friendly descriptive label or name for the account. This may be displayed by the app. */ - readonly label?: string; - - /** Optional user-friendly icon for the account. This may be displayed by the app. */ - readonly icon?: WalletIcon; -} - -/** Input for signing in. */ -export interface SolanaSignInInput { - /** - * Optional EIP-4361 Domain. - * If not provided, the wallet must determine the Domain to include in the message. - */ - readonly domain?: string; - - /** - * Optional EIP-4361 Address. - * If not provided, the wallet must determine the Address to include in the message. - */ - readonly address?: string; - - /** - * Optional EIP-4361 Statement. - * If not provided, the wallet must not include Statement in the message. - */ - readonly statement?: string; - - /** - * Optional EIP-4361 URI. - * If not provided, the wallet must not include URI in the message. - */ - readonly uri?: string; - - /** - * Optional EIP-4361 Version. - * If not provided, the wallet must not include Version in the message. - */ - readonly version?: string; - - /** - * Optional EIP-4361 Chain ID. - * If not provided, the wallet must not include Chain ID in the message. - */ - readonly chainId?: string; - - /** - * Optional EIP-4361 Nonce. - * If not provided, the wallet must not include Nonce in the message. - */ - readonly nonce?: string; - - /** - * Optional EIP-4361 Issued At. - * If not provided, the wallet must not include Issued At in the message. - */ - readonly issuedAt?: string; - - /** - * Optional EIP-4361 Expiration Time. - * If not provided, the wallet must not include Expiration Time in the message. - */ - readonly expirationTime?: string; - - /** - * Optional EIP-4361 Not Before. - * If not provided, the wallet must not include Not Before in the message. - */ - readonly notBefore?: string; - - /** - * Optional EIP-4361 Request ID. - * If not provided, the wallet must not include Request ID in the message. - */ - readonly requestId?: string; - - /** - * Optional EIP-4361 Resources. - * If not provided, the wallet must not include Resources in the message. - */ - readonly resources?: readonly string[]; -} - -/** Output of signing in. */ -export interface SolanaSignInOutput { - /** - * Account that was signed in. - * The address of the account may be different from the provided input Address. - */ - readonly account: WalletAccount; - - /** - * Message bytes that were signed. - * The wallet may prefix or otherwise modify the message before signing it. - */ - readonly signedMessage: Uint8Array; - - /** - * Message signature produced. - * If the signature type is provided, the signature must be Ed25519. - */ - readonly signature: Uint8Array; - - /** - * Optional type of the message signature produced. - * If not provided, the signature must be Ed25519. - */ - readonly signatureType?: 'ed25519'; -} - -/** - * API for {@link Wallets.get | getting}, {@link Wallets.on | listening for}, and - * {@link Wallets.register | registering} {@link "@wallet-standard/base".Wallet | Wallets}. - * - * @group App - */ -export interface Wallets { - /** - * Get all Wallets that have been registered. - * - * @returns Registered Wallets. - */ - get(): readonly Wallet[]; - - /** - * Add an event listener and subscribe to events for Wallets that are - * {@link WalletsEventsListeners.register | registered} and - * {@link WalletsEventsListeners.unregister | unregistered}. - * - * @param event - Event type to listen for. {@link WalletsEventsListeners.register | `register`} and - * {@link WalletsEventsListeners.unregister | `unregister`} are the only event types. - * @param listener - Function that will be called when an event of the type is emitted. - * @returns - * `off` function which may be called to remove the event listener and unsubscribe from events. - * - * As with all event listeners, be careful to avoid memory leaks. - */ - on(event: E, listener: WalletsEventsListeners[E]): () => void; - - /** - * Register Wallets. This can be used to programmatically wrap non-standard wallets as Standard Wallets. - * - * Apps generally do not need to, and should not, call this. - * - * @param wallets - Wallets to register. - * @returns - * `unregister` function which may be called to programmatically unregister the registered Wallets. - * - * Apps generally do not need to, and should not, call this. - */ - register(...wallets: Wallet[]): () => void; -} - -/** - * Types of event listeners of the {@link Wallets} API. - * - * @group App - */ -export interface WalletsEventsListeners { - /** - * Emitted when Wallets are registered. - * - * @param wallets - Wallets that were registered. - */ - register(...wallets: Wallet[]): void; - - /** - * Emitted when Wallets are unregistered. - * - * @param wallets - Wallets that were unregistered. - */ - unregister(...wallets: Wallet[]): void; -} - -/** - * Names of {@link WalletsEventsListeners} that can be listened for. - * - * @group App - */ -export type WalletsEventNames = keyof WalletsEventsListeners; - -/** - * @deprecated Use {@link WalletsEventsListeners} instead. - * - * @group Deprecated - */ -export type WalletsEvents = WalletsEventsListeners; - -/** - * Global `window` type for dispatching and listening for {@link WindowAppReadyEvent} and {@link WindowRegisterWalletEvent}. - * - * ```ts - * import { WalletEventsWindow } from '@wallet-standard/base'; - * - * declare const window: WalletEventsWindow; - * // OR - * (window as WalletEventsWindow) - * ``` - * - * @group Window - */ -export interface WalletEventsWindow extends Omit { - /** Add a listener for {@link WindowAppReadyEvent}. */ - addEventListener(type: WindowAppReadyEventType, listener: (event: WindowAppReadyEvent) => void): void; - /** Add a listener for {@link WindowRegisterWalletEvent}. */ - addEventListener(type: WindowRegisterWalletEventType, listener: (event: WindowRegisterWalletEvent) => void): void; - /** Dispatch a {@link WindowAppReadyEvent}. */ - dispatchEvent(event: WindowAppReadyEvent): void; - /** Dispatch a {@link WindowRegisterWalletEvent}. */ - dispatchEvent(event: WindowRegisterWalletEvent): void; -} - -/** - * Type of {@link WindowAppReadyEvent}. - * - * @group App Ready Event - */ -export type WindowAppReadyEventType = 'wallet-standard:app-ready'; - -/** - * Interface that will be provided to {@link Wallet | Wallets} by the app when the app calls the - * {@link WindowRegisterWalletEventCallback} provided by Wallets. - * - * Wallets must call the {@link WindowAppReadyEventAPI.register | register} method to register themselves. - * - * @group App Ready Event - */ -export interface WindowAppReadyEventAPI { - /** - * Register a {@link Wallet} with the app. - * - * @returns - * `unregister` function to programmatically unregister the Wallet. - * - * Wallets generally do not need to, and should not, call this. - */ - register(wallet: Wallet): () => void; -} - -/** - * Event that will be dispatched by the app on the `window` when the app is ready to register {@link Wallet | Wallets}. - * - * Wallets must listen for this event, and {@link WindowAppReadyEventAPI.register register} themselves when the event is - * dispatched. - * - * @group App Ready Event - */ -export type WindowAppReadyEvent = UnstoppableCustomEvent; - -/** - * Type of {@link WindowRegisterWalletEvent}. - * - * @group Register Wallet Event - */ -export type WindowRegisterWalletEventType = 'wallet-standard:register-wallet'; - -/** - * Callback function provided by {@link Wallet | Wallets} to be called by the app when the app is ready to register - * Wallets. - * - * @group Register Wallet Event - */ -export type WindowRegisterWalletEventCallback = (api: WindowAppReadyEventAPI) => void; - -/** - * Event that will be dispatched on the `window` by each {@link Wallet | Wallet} when the Wallet is ready to be - * registered by the app. - * - * The app must listen for this event, and register Wallets when the event is dispatched. - * - * @group Register Wallet Event - */ -export type WindowRegisterWalletEvent = UnstoppableCustomEvent< - WindowRegisterWalletEventType, - WindowRegisterWalletEventCallback ->; - -/** - * @internal - * - * A custom event that cannot have its default behavior prevented or its propagation stopped. - * - * This is an internal type, extended by {@link WindowAppReadyEvent} and {@link WindowRegisterWalletEvent}. - * - * [`window.CustomEvent`](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent) is not used because - * Node.js doesn't have it, but this interface is compatible with it. - * - * @group Internal - */ -export interface UnstoppableCustomEvent extends Event { - /** Type of the event. */ - readonly type: T; - /** Data attached to the event. */ - readonly detail: D; -} diff --git a/packages/shared/src/types/web3Wallet.ts b/packages/shared/src/types/web3Wallet.ts index f8074da7572..e85d55401f2 100644 --- a/packages/shared/src/types/web3Wallet.ts +++ b/packages/shared/src/types/web3Wallet.ts @@ -25,17 +25,25 @@ export interface Web3WalletResource extends ClerkResource { __internal_toSnapshot: () => Web3WalletJSONSnapshot; } -export type GenerateSignature = (opts: GenerateSignatureParams) => Promise; +export type GenerateSignature = (opts: GenerateSignatureParams | GenerateSolanaSignatureParams) => Promise; export interface AuthenticateWithWeb3Params { identifier: string; generateSignature: GenerateSignature; strategy?: Web3Strategy; + walletName?: string; } export interface GenerateSignatureParams { identifier: string; nonce: string; provider?: Web3Provider; + walletName?: string; +} + +export interface GenerateSolanaSignatureParams { + identifier: string; + nonce: string; + provider: Extract; walletName: string; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4e64573239..245105c2ac6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,7 +93,7 @@ importers: version: 10.1.0 '@testing-library/jest-dom': specifier: ^6.4.6 - version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) + version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) '@testing-library/react': specifier: ^16.0.0 version: 16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -120,7 +120,7 @@ importers: version: 4.5.2(vite@7.1.5(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) chalk: specifier: 4.1.2 version: 4.1.2 @@ -219,7 +219,7 @@ importers: version: 0.8.0(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3))) jest-environment-jsdom: specifier: ^29.3.1 - version: 29.7.0 + version: 29.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) json5: specifier: 2.2.3 version: 2.2.3 @@ -264,7 +264,7 @@ importers: version: 1.2.2 ts-jest: specifier: 29.2.5 - version: 29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.25.10)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3) tsdown: specifier: catalog:repo version: 0.15.7(publint@0.3.12)(typescript@5.8.3) @@ -297,7 +297,7 @@ importers: version: 6.1.6(typanion@3.14.0) vitest: specifier: 3.2.4 - version: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + version: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) yalc: specifier: 1.0.0-pre.53 version: 1.0.0-pre.53 @@ -390,7 +390,7 @@ importers: version: 9.0.2 vitest-environment-miniflare: specifier: 2.14.4 - version: 2.14.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) + version: 2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) packages/chrome-extension: dependencies: @@ -427,7 +427,7 @@ importers: dependencies: '@base-org/account': specifier: 2.0.1 - version: 2.0.1(@types/react@18.3.26)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(zod@3.25.76) + version: 2.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) '@clerk/localizations': specifier: workspace:^ version: link:../localizations @@ -452,6 +452,9 @@ importers: '@formkit/auto-animate': specifier: ^0.8.2 version: 0.8.2 + '@solana/wallet-standard': + specifier: ^1.1.4 + version: 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) '@stripe/stripe-js': specifier: 5.6.0 version: 5.6.0 @@ -461,6 +464,12 @@ importers: '@tanstack/query-core': specifier: 5.87.4 version: 5.87.4 + '@wallet-standard/core': + specifier: ^1.1.1 + version: 1.1.1 + '@wallet-standard/react': + specifier: ^1.0.1 + version: 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@zxcvbn-ts/core': specifier: 3.0.4 version: 3.0.4 @@ -506,10 +515,10 @@ importers: version: link:../testing '@rsdoctor/rspack-plugin': specifier: ^0.4.13 - version: 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + version: 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) '@rspack/cli': specifier: ^1.4.11 - version: 1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + version: 1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) '@rspack/core': specifier: ^1.4.11 version: 1.4.11(@swc/helpers@0.5.17) @@ -533,7 +542,7 @@ importers: version: 0.4.1 jsdom: specifier: 26.1.0 - version: 26.1.0 + version: 26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) minimatch: specifier: ^10.0.3 version: 10.0.3 @@ -603,7 +612,7 @@ importers: devDependencies: '@statelyai/inspect': specifier: ^0.4.0 - version: 0.4.0(ws@8.18.3)(xstate@5.20.2) + version: 0.4.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(xstate@5.20.2) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -636,7 +645,7 @@ importers: version: 18.3.1(react@18.3.1) react-native-url-polyfill: specifier: 2.0.0 - version: 2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + version: 2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) tslib: specifier: catalog:repo version: 2.8.1 @@ -649,25 +658,25 @@ importers: version: 1.0.2 expo-apple-authentication: specifier: ^7.2.4 - version: 7.2.4(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + version: 7.2.4(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) expo-auth-session: specifier: ^5.4.0 - version: 5.4.0(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 5.4.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-crypto: specifier: ^15.0.7 - version: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-local-authentication: specifier: ^13.8.0 - version: 13.8.0(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 13.8.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-secure-store: specifier: ^12.8.1 - version: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) expo-web-browser: specifier: ^12.8.2 - version: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + version: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) react-native: specifier: ^0.81.4 - version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) packages/expo-passkeys: dependencies: @@ -679,11 +688,11 @@ importers: version: 18.3.1 react-native: specifier: '*' - version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + version: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) devDependencies: expo: specifier: ~52.0.47 - version: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + version: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) packages/express: dependencies: @@ -801,7 +810,7 @@ importers: devDependencies: nuxt: specifier: ^4.1.2 - version: 4.1.2(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.31.0(jiti@2.6.1))(idb-keyval@6.2.1)(ioredis@5.7.0)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.43)(rollup@4.52.4)(terser@5.44.0)(tsx@4.19.2)(typescript@5.8.3)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1) + version: 4.1.2(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.21)(bufferutil@4.0.9)(db0@0.3.2)(eslint@9.31.0(jiti@2.6.1))(idb-keyval@6.2.1)(ioredis@5.7.0)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.43)(rollup@4.52.4)(terser@5.44.0)(tsx@4.19.2)(typescript@5.8.3)(utf-8-validate@5.0.10)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1) typescript: specifier: catalog:repo version: 5.8.3 @@ -983,7 +992,7 @@ importers: version: 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start': specifier: 1.132.0 - version: 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + version: 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) esbuild-plugin-file-path-extensions: specifier: ^2.1.4 version: 2.1.4 @@ -1033,10 +1042,10 @@ importers: dependencies: '@inkjs/ui': specifier: ^2.0.0 - version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)) + version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) '@jescalan/ink-markdown': specifier: ^2.0.0 - version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))(react@18.3.1) + version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) ejs: specifier: 3.1.10 version: 3.1.10 @@ -1054,16 +1063,16 @@ importers: version: 0.1.2 ink: specifier: ^5.0.1 - version: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + version: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) ink-big-text: specifier: ^2.0.0 - version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))(react@18.3.1) + version: 2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) ink-gradient: specifier: ^3.0.0 - version: 3.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)) + version: 3.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) ink-link: specifier: ^4.1.0 - version: 4.1.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)) + version: 4.1.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) jscodeshift: specifier: ^17.0.0 version: 17.3.0(@babel/preset-env@7.26.0(@babel/core@7.28.4)) @@ -4730,6 +4739,76 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.3.0': + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@2.3.0': + resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@2.3.0': + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/wallet-adapter-base@0.9.27': + resolution: {integrity: sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-standard-chains@1.1.1': + resolution: {integrity: sha512-Us3TgL4eMVoVWhuC4UrePlYnpWN+lwteCBlhZDUhFZBJ5UMGh94mYPXno3Ho7+iHPYRtuCi/ePvPcYBqCGuBOw==} + engines: {node: '>=16'} + + '@solana/wallet-standard-core@1.1.2': + resolution: {integrity: sha512-FaSmnVsIHkHhYlH8XX0Y4TYS+ebM+scW7ZeDkdXo3GiKge61Z34MfBPinZSUMV08hCtzxxqH2ydeU9+q/KDrLA==} + engines: {node: '>=16'} + + '@solana/wallet-standard-features@1.3.0': + resolution: {integrity: sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg==} + engines: {node: '>=16'} + + '@solana/wallet-standard-util@1.1.2': + resolution: {integrity: sha512-rUXFNP4OY81Ddq7qOjQV4Kmkozx4wjYAxljvyrqPx8Ycz0FYChG/hQVWqvgpK3sPsEaO/7ABG1NOACsyAKWNOA==} + engines: {node: '>=16'} + + '@solana/wallet-standard-wallet-adapter-base@1.1.4': + resolution: {integrity: sha512-Q2Rie9YaidyFA4UxcUIxUsvynW+/gE2noj/Wmk+IOwDwlVrJUAXCvFaCNsPDSyKoiYEKxkSnlG13OA1v08G4iw==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + bs58: ^6.0.0 + + '@solana/wallet-standard-wallet-adapter-react@1.1.4': + resolution: {integrity: sha512-xa4KVmPgB7bTiWo4U7lg0N6dVUtt2I2WhEnKlIv0jdihNvtyhOjCKMjucWet6KAVhir6I/mSWrJk1U9SvVvhCg==} + engines: {node: '>=16'} + peerDependencies: + '@solana/wallet-adapter-base': '*' + react: 18.3.1 + + '@solana/wallet-standard-wallet-adapter@1.1.4': + resolution: {integrity: sha512-YSBrxwov4irg2hx9gcmM4VTew3ofNnkqsXQ42JwcS6ykF1P1ecVY8JCbrv75Nwe6UodnqeoZRbN7n/p3awtjNQ==} + engines: {node: '>=16'} + + '@solana/wallet-standard@1.1.4': + resolution: {integrity: sha512-NF+MI5tOxyvfTU4A+O5idh/gJFmjm52bMwsPpFGRSL79GECSN0XLmpVOO/jqTKJgac2uIeYDpQw/eMaQuWuUXw==} + engines: {node: '>=16'} + + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + '@speed-highlight/core@1.2.7': resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} @@ -5368,12 +5447,18 @@ packages: '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + '@types/webextension-polyfill@0.12.3': resolution: {integrity: sha512-F58aDVSeN/MjUGazXo/cPsmR76EvqQhQ1v4x23hFjUX0cfAJYE+JBWwiOGW36/VJGGxoH74sVlRIF3z7SJCKyg==} '@types/webpack-env@1.18.8': resolution: {integrity: sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==} + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} @@ -5839,6 +5924,66 @@ packages: '@vue/test-utils@2.4.6': resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + '@wallet-standard/app@1.1.0': + resolution: {integrity: sha512-3CijvrO9utx598kjr45hTbbeeykQrQfKmSnxeWOgU25TOEpvcipD/bYDQWIqUv1Oc6KK4YStokSMu/FBNecGUQ==} + engines: {node: '>=16'} + + '@wallet-standard/base@1.1.0': + resolution: {integrity: sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==} + engines: {node: '>=16'} + + '@wallet-standard/core@1.1.1': + resolution: {integrity: sha512-5Xmjc6+Oe0hcPfVc5n8F77NVLwx1JVAoCVgQpLyv/43/bhtIif+Gx3WUrDlaSDoM8i2kA2xd6YoFbHCxs+e0zA==} + engines: {node: '>=16'} + + '@wallet-standard/errors@0.1.1': + resolution: {integrity: sha512-V8Ju1Wvol8i/VDyQOHhjhxmMVwmKiwyxUZBnHhtiPZJTWY0U/Shb2iEWyGngYEbAkp2sGTmEeNX1tVyGR7PqNw==} + engines: {node: '>=16'} + hasBin: true + + '@wallet-standard/experimental-features@0.2.0': + resolution: {integrity: sha512-B6fBLgouurN3IAoqhh8/1Mm33IAWIErQXVyvMcyBJM+elOD6zkNDUjew5QMG19qCbJ+ZiZUZmdOUC5PxxWw69w==} + engines: {node: '>=16'} + + '@wallet-standard/features@1.1.0': + resolution: {integrity: sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==} + engines: {node: '>=16'} + + '@wallet-standard/react-core@1.0.1': + resolution: {integrity: sha512-g+vZaLlAGlYMwZEoKsmjjI5qz1D8P3FF1aqiI3WLooWOVk55Nszbpk01QCbIFdIMF0UDhxia2FU667TCv509iw==} + engines: {node: '>=16'} + peerDependencies: + react: 18.3.1 + react-dom: 18.3.1 + + '@wallet-standard/react@1.0.1': + resolution: {integrity: sha512-StpPv234R94MmJCCUZurQvQSsX6Xe1eOd2lNgwVonvSVdPqCNVS/haVpdrBMx0wX1Ut24X77qyBLP7SGxK5OUg==} + engines: {node: '>=16'} + + '@wallet-standard/ui-compare@1.0.1': + resolution: {integrity: sha512-Qr6AjgxTgTNgjUm/HQend08jFCUJ2ugbONpbC1hSl4Ndul+theJV3CwVZ2ffKun584bHoR8OAibJ+QA4ecogEA==} + engines: {node: '>=16'} + + '@wallet-standard/ui-core@1.0.0': + resolution: {integrity: sha512-pnpBfxJois0fIAI0IBJ6hopOguw81JniB6DzOs5J7C16W7/M2kC0OKHQFKrz6cgSGMq8X0bPA8nZTXFTSNbURg==} + engines: {node: '>=16'} + + '@wallet-standard/ui-features@1.0.1': + resolution: {integrity: sha512-0/lZFx599bGcDEvisAWtbFMuRM/IuqP/o0vbhAeQdLWsWsaqFTUIKZtMt8JJq+fFBMQGc6tuRH6ehrgm+Y0biQ==} + engines: {node: '>=16'} + + '@wallet-standard/ui-registry@1.0.1': + resolution: {integrity: sha512-+SeXEwSoyqEWv9B6JLxRioRlgN5ksSFObZMf+XKm2U+vwmc/mfm43I8zw5wvGBpubzmywbe2eejd5k/snyx+uA==} + engines: {node: '>=16'} + + '@wallet-standard/ui@1.0.1': + resolution: {integrity: sha512-3b1iSfHOB3YpuBM645ZAgA0LMGZv+3Eh4y9lM3kS+NnvK4NxwnEdn1mLbFxevRhyulNjFZ50m2Cq5mpEOYs2mw==} + engines: {node: '>=16'} + + '@wallet-standard/wallet@1.1.0': + resolution: {integrity: sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==} + engines: {node: '>=16'} + '@web3-storage/multipart-parser@1.0.0': resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} @@ -6015,6 +6160,10 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -6471,6 +6620,12 @@ packages: base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -6532,6 +6687,9 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -6546,6 +6704,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + boxen@8.0.1: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} @@ -6592,6 +6753,12 @@ packages: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -6623,6 +6790,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + builtins@5.1.0: resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} @@ -7016,6 +7187,10 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@14.0.1: resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} engines: {node: '>=20'} @@ -7628,6 +7803,10 @@ packages: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -8002,6 +8181,12 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + esbuild-plugin-file-path-extensions@2.1.4: resolution: {integrity: sha512-lNjylaAsJMprYg28zjUyBivP3y0ms9b7RJZ5tdhDUFLa3sCbqZw4wDnbFUSmnyZYWhCYDPxxp7KkXM2TXGw3PQ==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} @@ -8538,6 +8723,10 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -8576,6 +8765,9 @@ packages: fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + fast-uri@2.4.0: resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} @@ -9330,6 +9522,9 @@ packages: resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} engines: {node: '>=18.18.0'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + husky@8.0.3: resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} @@ -9841,6 +10036,11 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + isomorphic-ws@5.0.0: resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: @@ -9898,6 +10098,11 @@ packages: engines: {node: '>=10'} hasBin: true + jayson@4.2.0: + resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} + engines: {node: '>=8'} + hasBin: true + jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -12903,6 +13108,9 @@ packages: resolution: {integrity: sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==} engines: {node: '>= 18'} + rpc-websockets@9.3.1: + resolution: {integrity: sha512-bY6a+i/lEtBJ/mUxwsCTgevoV1P0foXTVA7UoThzaIWbM+3NDqorf8NBWs5DmqKTFeA1IoNzgvkWjFCPgnzUiQ==} + rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -13399,6 +13607,12 @@ packages: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -13596,6 +13810,10 @@ packages: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} + superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + supertest@6.3.4: resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} engines: {node: '>=6.4.0'} @@ -13740,6 +13958,9 @@ packages: text-decoder@1.1.0: resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -14509,6 +14730,10 @@ packages: peerDependencies: react: 18.3.1 + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -16407,7 +16632,7 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@base-org/account@2.0.1(@types/react@18.3.26)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(zod@3.25.76)': + '@base-org/account@2.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/hashes': 1.4.0 clsx: 1.2.1 @@ -16415,7 +16640,7 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.8.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.33.3(typescript@5.8.3)(zod@3.25.76) + viem: 2.33.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) zustand: 5.0.3(@types/react@18.3.26)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' @@ -17087,7 +17312,7 @@ snapshots: dependencies: uuid: 8.3.2 - '@expo/cli@0.22.26(graphql@16.11.0)': + '@expo/cli@0.22.26(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@5.0.10)': dependencies: '@0no-co/graphql.web': 1.1.2(graphql@16.11.0) '@babel/runtime': 7.27.6 @@ -17107,7 +17332,7 @@ snapshots: '@expo/spawn-async': 1.7.2 '@expo/ws-tunnel': 1.0.6 '@expo/xcpretty': 4.3.2 - '@react-native/dev-middleware': 0.76.9 + '@react-native/dev-middleware': 0.76.9(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@urql/core': 5.1.1(graphql@16.11.0) '@urql/exchange-retry': 1.3.1(@urql/core@5.1.1(graphql@16.11.0)) accepts: 1.3.8 @@ -17160,7 +17385,7 @@ snapshots: undici: 6.21.2 unique-string: 2.0.0 wrap-ansi: 7.0.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -17168,7 +17393,7 @@ snapshots: - supports-color - utf-8-validate - '@expo/cli@54.0.11(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))': + '@expo/cli@54.0.11(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@0no-co/graphql.web': 1.1.2(graphql@16.11.0) '@expo/code-signing-certificates': 0.0.5 @@ -17178,18 +17403,18 @@ snapshots: '@expo/env': 2.0.7 '@expo/image-utils': 0.8.7 '@expo/json-file': 10.0.7 - '@expo/mcp-tunnel': 0.0.8 - '@expo/metro': 54.0.0 - '@expo/metro-config': 54.0.6(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + '@expo/mcp-tunnel': 0.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@expo/metro': 54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@expo/metro-config': 54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@expo/osascript': 2.3.7 '@expo/package-manager': 1.9.8 '@expo/plist': 0.4.7 - '@expo/prebuild-config': 54.0.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + '@expo/prebuild-config': 54.0.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) '@expo/schema-utils': 0.1.7 '@expo/spawn-async': 1.7.2 '@expo/ws-tunnel': 1.0.6 '@expo/xcpretty': 4.3.2 - '@react-native/dev-middleware': 0.81.4 + '@react-native/dev-middleware': 0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@urql/core': 5.1.1(graphql@16.11.0) '@urql/exchange-retry': 1.3.1(@urql/core@5.1.1(graphql@16.11.0)) accepts: 1.3.8 @@ -17203,7 +17428,7 @@ snapshots: connect: 3.7.0 debug: 4.4.3(supports-color@8.1.1) env-editor: 0.4.2 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) expo-server: 1.0.1 freeport-async: 2.0.0 getenv: 2.0.0 @@ -17234,9 +17459,9 @@ snapshots: terminal-link: 2.1.1 undici: 6.21.2 wrap-ansi: 7.0.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bufferutil @@ -17384,12 +17609,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devtools@0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)': + '@expo/devtools@0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: chalk: 4.1.2 optionalDependencies: react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) '@expo/env@0.4.2': dependencies: @@ -17497,9 +17722,9 @@ snapshots: json5: 2.2.3 write-file-atomic: 2.4.3 - '@expo/mcp-tunnel@0.0.8': + '@expo/mcp-tunnel@0.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) zod: 3.25.76 zod-to-json-schema: 3.24.6(zod@3.25.76) transitivePeerDependencies: @@ -17529,7 +17754,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/metro-config@54.0.6(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))': + '@expo/metro-config@54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -17537,7 +17762,7 @@ snapshots: '@expo/config': 12.0.10 '@expo/env': 2.0.7 '@expo/json-file': 10.0.7 - '@expo/metro': 54.0.0 + '@expo/metro': 54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@expo/spawn-async': 1.7.2 browserslist: 4.26.0 chalk: 4.1.2 @@ -17553,26 +17778,26 @@ snapshots: postcss: 8.4.49 resolve-from: 5.0.0 optionalDependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@expo/metro@54.0.0': + '@expo/metro@54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - metro: 0.83.1 + metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-babel-transformer: 0.83.1 metro-cache: 0.83.1 metro-cache-key: 0.83.1 - metro-config: 0.83.1 + metro-config: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-core: 0.83.1 metro-file-map: 0.83.1 metro-resolver: 0.83.1 metro-runtime: 0.83.1 metro-source-map: 0.83.1 metro-transform-plugins: 0.83.1 - metro-transform-worker: 0.83.1 + metro-transform-worker: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -17610,7 +17835,7 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - '@expo/prebuild-config@54.0.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))': + '@expo/prebuild-config@54.0.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))': dependencies: '@expo/config': 12.0.10 '@expo/config-plugins': 54.0.2 @@ -17619,7 +17844,7 @@ snapshots: '@expo/json-file': 10.0.7 '@react-native/normalize-colors': 0.81.4 debug: 4.4.3(supports-color@8.1.1) - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) resolve-from: 5.0.0 semver: 7.7.3 xml2js: 0.6.0 @@ -17666,11 +17891,11 @@ snapshots: dependencies: prop-types: 15.8.1 - '@expo/vector-icons@15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)': + '@expo/vector-icons@15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: - expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) '@expo/ws-tunnel@1.0.6': {} @@ -17860,13 +18085,13 @@ snapshots: '@img/sharp-win32-x64@0.34.4': optional: true - '@inkjs/ui@2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))': + '@inkjs/ui@2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))': dependencies: chalk: 5.6.2 cli-spinners: 3.2.0 deepmerge: 4.3.1 figures: 6.1.0 - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) '@inquirer/confirm@5.1.13(@types/node@22.18.12)': dependencies: @@ -17954,9 +18179,9 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jescalan/ink-markdown@2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))(react@18.3.1)': + '@jescalan/ink-markdown@2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) marked: 11.2.0 marked-terminal: https://codeload.github.com/jescalan/marked-terminal/tar.gz/44f5ab42076e16937f56d645d3d7264675558ea1(marked@11.2.0) react: 18.3.1 @@ -18299,7 +18524,7 @@ snapshots: dependencies: '@miniflare/shared': 2.14.4 - '@miniflare/shared-test-environment@2.14.4': + '@miniflare/shared-test-environment@2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@cloudflare/workers-types': 4.20241022.0 '@miniflare/cache': 2.14.4 @@ -18313,7 +18538,7 @@ snapshots: '@miniflare/shared': 2.14.4 '@miniflare/sites': 2.14.4 '@miniflare/storage-memory': 2.14.4 - '@miniflare/web-sockets': 2.14.4 + '@miniflare/web-sockets': 2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -18344,12 +18569,12 @@ snapshots: dependencies: '@miniflare/shared': 2.14.4 - '@miniflare/web-sockets@2.14.4': + '@miniflare/web-sockets@2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@miniflare/core': 2.14.4 '@miniflare/shared': 2.14.4 undici: 5.28.4 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -18559,7 +18784,7 @@ snapshots: prompts: 2.4.2 semver: 7.7.3 - '@nuxt/devtools@2.6.3(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3))': + '@nuxt/devtools@2.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3))': dependencies: '@nuxt/devtools-kit': 2.6.3(magicast@0.3.5)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) '@nuxt/devtools-wizard': 2.6.3 @@ -18593,7 +18818,7 @@ snapshots: vite-plugin-inspect: 11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) vite-plugin-vue-tracer: 1.0.0(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3)) which: 5.0.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -19263,7 +19488,7 @@ snapshots: '@react-native-community/cli-plugin-metro@12.3.7': optional: true - '@react-native-community/cli-server-api@12.3.7': + '@react-native-community/cli-server-api@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@react-native-community/cli-debugger-ui': 12.3.7 '@react-native-community/cli-tools': 12.3.7 @@ -19273,7 +19498,7 @@ snapshots: nocache: 3.0.4 pretty-format: 26.6.2 serve-static: 1.16.2 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -19302,7 +19527,7 @@ snapshots: joi: 17.13.3 optional: true - '@react-native-community/cli@12.3.7': + '@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@react-native-community/cli-clean': 12.3.7 '@react-native-community/cli-config': 12.3.7 @@ -19310,7 +19535,7 @@ snapshots: '@react-native-community/cli-doctor': 12.3.7 '@react-native-community/cli-hermes': 12.3.7 '@react-native-community/cli-plugin-metro': 12.3.7 - '@react-native-community/cli-server-api': 12.3.7 + '@react-native-community/cli-server-api': 12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@react-native-community/cli-tools': 12.3.7 '@react-native-community/cli-types': 12.3.7 chalk: 4.1.2 @@ -19471,17 +19696,17 @@ snapshots: nullthrows: 1.1.1 yargs: 17.7.2 - '@react-native/community-cli-plugin@0.81.4(@react-native-community/cli@12.3.7)': + '@react-native/community-cli-plugin@0.81.4(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@react-native/dev-middleware': 0.81.4 + '@react-native/dev-middleware': 0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 - metro: 0.83.1 - metro-config: 0.83.1 + metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-config: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-core: 0.83.1 semver: 7.7.3 optionalDependencies: - '@react-native-community/cli': 12.3.7 + '@react-native-community/cli': 12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -19491,7 +19716,7 @@ snapshots: '@react-native/debugger-frontend@0.81.4': {} - '@react-native/dev-middleware@0.76.9': + '@react-native/dev-middleware@0.76.9(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.76.9 @@ -19504,13 +19729,13 @@ snapshots: open: 7.4.2 selfsigned: 2.4.1 serve-static: 1.16.2 - ws: 6.2.3 + ws: 6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native/dev-middleware@0.81.4': + '@react-native/dev-middleware@0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.81.4 @@ -19522,7 +19747,7 @@ snapshots: nullthrows: 1.1.1 open: 7.4.2 serve-static: 1.16.2 - ws: 6.2.3 + ws: 6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -19538,12 +19763,12 @@ snapshots: '@react-native/normalize-colors@0.81.4': {} - '@react-native/virtualized-lists@0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)': + '@react-native/virtualized-lists@0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) optionalDependencies: '@types/react': 18.3.26 @@ -19756,12 +19981,12 @@ snapshots: '@rsdoctor/client@0.4.13': {} - '@rsdoctor/core@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/core@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: - '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) axios: 1.7.9 enhanced-resolve: 5.12.0 filesize: 10.1.6 @@ -19770,7 +19995,7 @@ snapshots: path-browserify: 1.0.1 semver: 7.7.3 source-map: 0.7.6 - webpack-bundle-analyzer: 4.10.2 + webpack-bundle-analyzer: 4.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -19779,12 +20004,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/graph@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) lodash.unionby: 4.8.0 - socket.io: 4.8.1 + socket.io: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) source-map: 0.7.6 transitivePeerDependencies: - '@rspack/core' @@ -19793,13 +20018,13 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/rspack-plugin@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: - '@rsdoctor/core': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/core': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) '@rspack/core': 1.4.11(@swc/helpers@0.5.17) lodash: 4.17.21 transitivePeerDependencies: @@ -19809,12 +20034,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/sdk@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: '@rsdoctor/client': 0.4.13 - '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) '@types/fs-extra': 11.0.4 body-parser: 1.20.3 cors: 2.8.5 @@ -19824,7 +20049,7 @@ snapshots: lodash: 4.17.21 open: 8.4.2 serve-static: 1.16.2 - socket.io: 4.8.1 + socket.io: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) source-map: 0.7.6 tapable: 2.2.1 transitivePeerDependencies: @@ -19834,20 +20059,20 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/types@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 '@types/tapable': 2.2.7 source-map: 0.7.6 - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) optionalDependencies: '@rspack/core': 1.4.11(@swc/helpers@0.5.17) - '@rsdoctor/utils@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rsdoctor/utils@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: '@babel/code-frame': 7.25.7 - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) '@types/estree': 1.0.5 acorn: 8.15.0 acorn-import-assertions: 1.9.0(acorn@8.15.0) @@ -19913,16 +20138,16 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.4.11 '@rspack/binding-win32-x64-msvc': 1.4.11 - '@rspack/cli@1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rspack/cli@1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: '@discoveryjs/json-ext': 0.5.7 '@rspack/core': 1.4.11(@swc/helpers@0.5.17) - '@rspack/dev-server': 1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rspack/dev-server': 1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) colorette: 2.0.20 exit-hook: 4.0.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack-bundle-analyzer: 4.10.2 + webpack-bundle-analyzer: 4.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - '@types/express' @@ -19941,14 +20166,14 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.17 - '@rspack/dev-server@1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@rspack/dev-server@1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: '@rspack/core': 1.4.11(@swc/helpers@0.5.17) chokidar: 3.6.0 http-proxy-middleware: 2.0.9(@types/express@4.17.23) p-retry: 6.2.0 - webpack-dev-server: 5.2.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - ws: 8.18.3 + webpack-dev-server: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@types/express' - bufferutil @@ -20052,16 +20277,133 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.3.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/codecs-numbers@2.3.0(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.8.3) + '@solana/errors': 2.3.0(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/errors@2.3.0(typescript@5.8.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.1 + typescript: 5.8.3 + + '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/wallet-standard-features': 1.3.0 + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + eventemitter3: 5.0.1 + + '@solana/wallet-standard-chains@1.1.1': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@solana/wallet-standard-core@1.1.2': + dependencies: + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + '@solana/wallet-standard-util': 1.1.2 + + '@solana/wallet-standard-features@1.3.0': + dependencies: + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + + '@solana/wallet-standard-util@1.1.2': + dependencies: + '@noble/curves': 1.9.7 + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + + '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + '@solana/wallet-standard-util': 1.1.2 + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + '@wallet-standard/wallet': 1.1.0 + bs58: 6.0.0 + + '@solana/wallet-standard-wallet-adapter-react@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0) + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + react: 18.3.1 + transitivePeerDependencies: + - '@solana/web3.js' + - bs58 + + '@solana/wallet-standard-wallet-adapter@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0) + '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + + '@solana/wallet-standard@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-standard-core': 1.1.2 + '@solana/wallet-standard-wallet-adapter': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + + '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.27.6 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.3.0(typescript@5.8.3) + agentkeepalive: 4.6.0 + bn.js: 5.2.2 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.3.1 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + '@speed-highlight/core@1.2.7': {} '@stablelib/base64@1.0.1': {} '@standard-schema/spec@1.0.0': {} - '@statelyai/inspect@0.4.0(ws@8.18.3)(xstate@5.20.2)': + '@statelyai/inspect@0.4.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(xstate@5.20.2)': dependencies: fast-safe-stringify: 2.1.1 - isomorphic-ws: 5.0.0(ws@8.18.3) + isomorphic-ws: 5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) partysocket: 0.0.25 safe-stable-stringify: 2.4.3 superjson: 1.13.3 @@ -20283,14 +20625,14 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@tanstack/react-start@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: '@tanstack/react-router': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start-client': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start-server': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-utils': 1.132.0 '@tanstack/start-client-core': 1.132.0 - '@tanstack/start-plugin-core': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@tanstack/start-plugin-core': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) pathe: 2.0.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -20332,7 +20674,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@tanstack/router-plugin@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -20351,7 +20693,7 @@ snapshots: optionalDependencies: '@tanstack/react-router': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) transitivePeerDependencies: - supports-color @@ -20393,14 +20735,14 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': + '@tanstack/start-plugin-core@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.4 '@babel/types': 7.28.4 '@tanstack/router-core': 1.132.0 '@tanstack/router-generator': 1.132.0 - '@tanstack/router-plugin': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@tanstack/router-plugin': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) '@tanstack/router-utils': 1.132.0 '@tanstack/server-functions-plugin': 1.132.0(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) '@tanstack/start-server-core': 1.132.0 @@ -20467,7 +20809,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': + '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.27.6 @@ -20481,7 +20823,7 @@ snapshots: '@jest/globals': 29.7.0 '@types/jest': 29.5.12 jest: 29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)) - vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) '@testing-library/react@16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -20815,10 +21157,16 @@ snapshots: '@types/uuid@10.0.0': {} + '@types/uuid@8.3.4': {} + '@types/webextension-polyfill@0.12.3': {} '@types/webpack-env@1.18.8': {} + '@types/ws@7.4.7': + dependencies: + '@types/node': 22.18.12 + '@types/ws@8.5.12': dependencies: '@types/node': 22.18.12 @@ -21203,7 +21551,7 @@ snapshots: vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) vue: 3.5.21(typescript@5.8.3) - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -21218,7 +21566,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -21504,6 +21852,85 @@ snapshots: js-beautify: 1.15.1 vue-component-type-helpers: 2.1.10 + '@wallet-standard/app@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/base@1.1.0': {} + + '@wallet-standard/core@1.1.1': + dependencies: + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/errors': 0.1.1 + '@wallet-standard/features': 1.1.0 + '@wallet-standard/wallet': 1.1.0 + + '@wallet-standard/errors@0.1.1': + dependencies: + chalk: 5.6.2 + commander: 13.1.0 + + '@wallet-standard/experimental-features@0.2.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/features@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/react-core@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/errors': 0.1.1 + '@wallet-standard/experimental-features': 0.2.0 + '@wallet-standard/features': 1.1.0 + '@wallet-standard/ui': 1.0.1 + '@wallet-standard/ui-registry': 1.0.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@wallet-standard/react@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@wallet-standard/react-core': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react + - react-dom + + '@wallet-standard/ui-compare@1.0.1': + dependencies: + '@wallet-standard/base': 1.1.0 + '@wallet-standard/ui-core': 1.0.0 + '@wallet-standard/ui-registry': 1.0.1 + + '@wallet-standard/ui-core@1.0.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/ui-features@1.0.1': + dependencies: + '@wallet-standard/base': 1.1.0 + '@wallet-standard/errors': 0.1.1 + '@wallet-standard/ui-core': 1.0.0 + '@wallet-standard/ui-registry': 1.0.1 + + '@wallet-standard/ui-registry@1.0.1': + dependencies: + '@wallet-standard/base': 1.1.0 + '@wallet-standard/errors': 0.1.1 + '@wallet-standard/ui-core': 1.0.0 + + '@wallet-standard/ui@1.0.1': + dependencies: + '@wallet-standard/ui-compare': 1.0.1 + '@wallet-standard/ui-core': 1.0.0 + '@wallet-standard/ui-features': 1.0.1 + + '@wallet-standard/wallet@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + '@web3-storage/multipart-parser@1.0.0': {} '@webassemblyjs/ast@1.14.1': @@ -21702,6 +22129,10 @@ snapshots: agent-base@7.1.3: {} + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -22286,7 +22717,7 @@ snapshots: - '@babel/preset-env' - supports-color - babel-preset-expo@54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-refresh@0.14.2): + babel-preset-expo@54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-refresh@0.14.2): dependencies: '@babel/helper-module-imports': 7.27.1 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.28.4) @@ -22313,7 +22744,7 @@ snapshots: resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.27.6 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@babel/core' - supports-color @@ -22333,6 +22764,12 @@ snapshots: base-64@1.0.0: {} + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + base-x@5.0.1: {} + base64-js@1.5.1: {} base64id@2.0.0: {} @@ -22387,6 +22824,8 @@ snapshots: bluebird@3.7.2: {} + bn.js@5.2.2: {} + body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -22425,6 +22864,12 @@ snapshots: boolbase@1.0.0: {} + borsh@0.7.0: + dependencies: + bn.js: 5.2.2 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + boxen@8.0.1: dependencies: ansi-align: 3.0.1 @@ -22489,6 +22934,14 @@ snapshots: dependencies: fast-json-stable-stringify: 2.1.0 + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -22520,6 +22973,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bufferutil@4.0.9: + dependencies: + node-gyp-build: 4.8.4 + optional: true + builtins@5.1.0: dependencies: semver: 7.7.3 @@ -22935,6 +23393,8 @@ snapshots: commander@12.1.0: {} + commander@13.1.0: {} + commander@14.0.1: {} commander@2.20.3: {} @@ -23597,6 +24057,8 @@ snapshots: rimraf: 3.0.2 slash: 3.0.0 + delay@5.0.0: {} + delayed-stream@1.0.0: {} denque@2.1.0: {} @@ -23807,7 +24269,7 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.3: + engine.io@6.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@types/cors': 2.8.17 '@types/node': 22.18.12 @@ -23817,7 +24279,7 @@ snapshots: cors: 2.8.5 debug: 4.3.7 engine.io-parser: 5.2.3 - ws: 8.17.1 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -23993,6 +24455,12 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + esbuild-plugin-file-path-extensions@2.1.4: {} esbuild@0.23.1: @@ -24464,129 +24932,129 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expo-apple-authentication@7.2.4(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-apple-authentication@7.2.4(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-application@5.8.3(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-application@5.8.3(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-asset@11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo-asset@11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: '@expo/image-utils': 0.6.5 - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) invariant: 2.2.4 md5-file: 3.2.3 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-asset@12.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo-asset@12.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: '@expo/image-utils': 0.8.7 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-auth-session@5.4.0(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-auth-session@5.4.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo-application: 5.8.3(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - expo-crypto: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - expo-linking: 6.2.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - expo-web-browser: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + expo-application: 5.8.3(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-crypto: 12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-linking: 6.2.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) + expo-web-browser: 12.8.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) invariant: 2.2.4 transitivePeerDependencies: - expo - supports-color - expo-constants@15.4.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-constants@15.4.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@expo/config': 8.5.6 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-constants@17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-constants@17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@expo/config': 10.0.11 '@expo/env': 0.4.2 - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-constants@18.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-constants@18.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@expo/config': 12.0.10 '@expo/env': 2.0.7 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - expo-crypto@12.8.1(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-crypto@12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: base64-js: 1.5.1 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-crypto@15.0.7(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-crypto@15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: base64-js: 1.5.1 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) - expo-file-system@18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-file-system@18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) web-streams-polyfill: 3.3.3 - expo-file-system@19.0.17(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + expo-file-system@19.0.17(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-font@13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1): + expo-font@13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) fontfaceobserver: 2.3.0 react: 18.3.1 - expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) fontfaceobserver: 2.3.0 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-keep-awake@14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1): + expo-keep-awake@14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) react: 18.3.1 - expo-keep-awake@15.0.7(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1): + expo-keep-awake@15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) react: 18.3.1 - expo-linking@6.2.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-linking@6.2.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) + expo-constants: 15.4.5(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)) invariant: 2.2.4 transitivePeerDependencies: - expo - supports-color - expo-local-authentication@13.8.0(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-local-authentication@13.8.0(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) invariant: 2.2.4 expo-modules-autolinking@2.0.8: @@ -24613,44 +25081,44 @@ snapshots: dependencies: invariant: 2.2.4 - expo-modules-core@3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo-modules-core@3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: invariant: 2.2.4 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) - expo-secure-store@12.8.1(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-secure-store@12.8.1(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) expo-server@1.0.1: {} - expo-web-browser@12.8.2(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)): + expo-web-browser@12.8.2(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: compare-urls: 2.0.0 - expo: 54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo: 54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) url: 0.11.3 - expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@babel/runtime': 7.27.6 - '@expo/cli': 0.22.26(graphql@16.11.0) + '@expo/cli': 0.22.26(bufferutil@4.0.9)(graphql@16.11.0)(utf-8-validate@5.0.10) '@expo/config': 10.0.11 '@expo/config-plugins': 9.0.17 '@expo/fingerprint': 0.11.11 '@expo/metro-config': 0.19.12 '@expo/vector-icons': 14.0.4 babel-preset-expo: 12.0.11(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4)) - expo-asset: 11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) - expo-file-system: 18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) - expo-font: 13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1) - expo-keep-awake: 14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1) + expo-asset: 11.0.5(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-constants: 17.0.8(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-file-system: 18.0.12(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-font: 13.0.4(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-keep-awake: 14.0.3(expo@52.0.47(@babel/core@7.28.4)(@babel/preset-env@7.26.0(@babel/core@7.28.4))(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) expo-modules-autolinking: 2.0.8 expo-modules-core: 2.2.3 fbemitter: 3.0.0 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) web-streams-polyfill: 3.3.3 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -24664,29 +25132,29 @@ snapshots: - supports-color - utf-8-validate - expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1): + expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@babel/runtime': 7.27.6 - '@expo/cli': 54.0.11(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) + '@expo/cli': 54.0.11(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@expo/config': 12.0.10 '@expo/config-plugins': 54.0.2 - '@expo/devtools': 0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + '@expo/devtools': 0.1.7(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) '@expo/fingerprint': 0.15.1 - '@expo/metro': 54.0.0 - '@expo/metro-config': 54.0.6(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)) - '@expo/vector-icons': 15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + '@expo/metro': 54.0.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@expo/metro-config': 54.0.6(bufferutil@4.0.9)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@expo/vector-icons': 15.0.2(expo-font@14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) '@ungap/structured-clone': 1.3.0 - babel-preset-expo: 54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-refresh@0.14.2) - expo-asset: 12.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) - expo-file-system: 19.0.17(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)) - expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - expo-keep-awake: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1))(react@18.3.1) + babel-preset-expo: 54.0.4(@babel/core@7.28.4)(@babel/runtime@7.27.6)(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-refresh@0.14.2) + expo-asset: 12.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-constants: 18.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-file-system: 19.0.17(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + expo-font: 14.0.9(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + expo-keep-awake: 15.0.7(expo@54.0.13(@babel/core@7.28.4)(bufferutil@4.0.9)(graphql@16.11.0)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) expo-modules-autolinking: 3.0.15 - expo-modules-core: 3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + expo-modules-core: 3.0.21(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) pretty-format: 29.7.0 react: 18.3.1 - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) react-refresh: 0.14.2 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -24807,6 +25275,8 @@ snapshots: extsprintf@1.3.0: {} + eyes@0.1.8: {} + fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} @@ -24847,6 +25317,8 @@ snapshots: fast-sha256@1.3.0: {} + fast-stable-stringify@1.0.0: {} + fast-uri@2.4.0: {} fast-uri@3.0.3: {} @@ -25765,6 +26237,10 @@ snapshots: human-signals@8.0.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + husky@8.0.3: {} hyperdyperid@1.2.0: {} @@ -25847,28 +26323,28 @@ snapshots: ini@4.1.1: {} - ink-big-text@2.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1))(react@18.3.1): + ink-big-text@2.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: cfonts: 3.3.0 - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) prop-types: 15.8.1 react: 18.3.1 - ink-gradient@3.0.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)): + ink-gradient@3.0.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: '@types/gradient-string': 1.1.6 gradient-string: 2.0.2 - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) prop-types: 15.8.1 strip-ansi: 7.1.2 - ink-link@4.1.0(ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1)): + ink-link@4.1.0(ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - ink: 5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) prop-types: 15.8.1 terminal-link: 3.0.0 - ink@5.0.1(@types/react@18.3.26)(react-devtools-core@4.28.5)(react@18.3.1): + ink@5.0.1(@types/react@18.3.26)(bufferutil@4.0.9)(react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 ansi-escapes: 7.0.0 @@ -25893,11 +26369,11 @@ snapshots: type-fest: 4.41.0 widest-line: 5.0.0 wrap-ansi: 9.0.2 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) yoga-wasm-web: 0.3.3 optionalDependencies: '@types/react': 18.3.26 - react-devtools-core: 4.28.5 + react-devtools-core: 4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -26221,13 +26697,17 @@ snapshots: isobject@3.0.1: {} - isomorphic-ws@5.0.0(ws@8.18.3): + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + isomorphic-ws@5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.7(ws@8.18.2): + isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.2 + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) isstream@0.1.2: {} @@ -26306,6 +26786,24 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 @@ -26412,7 +26910,7 @@ snapshots: jest-util: 29.7.0 pretty-format: 29.7.0 - jest-environment-jsdom@29.7.0: + jest-environment-jsdom@29.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -26421,7 +26919,7 @@ snapshots: '@types/node': 22.18.12 jest-mock: 29.7.0 jest-util: 29.7.0 - jsdom: 20.0.3 + jsdom: 20.0.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -26741,7 +27239,7 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} - jsdom@20.0.3: + jsdom@20.0.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: abab: 2.0.6 acorn: 8.15.0 @@ -26767,14 +27265,14 @@ snapshots: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - jsdom@26.1.0: + jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: cssstyle: 4.6.0 data-urls: 5.0.0 @@ -26794,14 +27292,14 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - jsdom@27.0.0(postcss@8.5.6): + jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10): dependencies: '@asamuzakjp/dom-selector': 6.6.2 cssstyle: 5.3.1(postcss@8.5.6) @@ -26821,7 +27319,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -27601,13 +28099,13 @@ snapshots: transitivePeerDependencies: - supports-color - metro-config@0.83.1: + metro-config@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: connect: 3.7.0 cosmiconfig: 5.2.1 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.83.1 + metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-cache: 0.83.1 metro-core: 0.83.1 metro-runtime: 0.83.1 @@ -27687,14 +28185,14 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.83.1: + metro-transform-worker@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 '@babel/types': 7.28.4 flow-enums-runtime: 0.0.6 - metro: 0.83.1 + metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-babel-transformer: 0.83.1 metro-cache: 0.83.1 metro-cache-key: 0.83.1 @@ -27707,7 +28205,7 @@ snapshots: - supports-color - utf-8-validate - metro@0.83.1: + metro@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -27733,7 +28231,7 @@ snapshots: metro-babel-transformer: 0.83.1 metro-cache: 0.83.1 metro-cache-key: 0.83.1 - metro-config: 0.83.1 + metro-config: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-core: 0.83.1 metro-file-map: 0.83.1 metro-resolver: 0.83.1 @@ -27741,13 +28239,13 @@ snapshots: metro-source-map: 0.83.1 metro-symbolicate: 0.83.1 metro-transform-plugins: 0.83.1 - metro-transform-worker: 0.83.1 + metro-transform-worker: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) mime-types: 2.1.35 nullthrows: 1.1.1 serialize-error: 2.1.0 source-map: 0.5.7 throat: 5.0.0 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -28476,11 +28974,11 @@ snapshots: nullthrows@1.1.1: {} - nuxt@4.1.2(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.31.0(jiti@2.6.1))(idb-keyval@6.2.1)(ioredis@5.7.0)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.43)(rollup@4.52.4)(terser@5.44.0)(tsx@4.19.2)(typescript@5.8.3)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1): + nuxt@4.1.2(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.21)(bufferutil@4.0.9)(db0@0.3.2)(eslint@9.31.0(jiti@2.6.1))(idb-keyval@6.2.1)(ioredis@5.7.0)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.43)(rollup@4.52.4)(terser@5.44.0)(tsx@4.19.2)(typescript@5.8.3)(utf-8-validate@5.0.10)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1): dependencies: '@nuxt/cli': 3.28.0(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.6.3(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3)) + '@nuxt/devtools': 2.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.21(typescript@5.8.3)) '@nuxt/kit': 4.1.2(magicast@0.3.5) '@nuxt/schema': 4.1.2 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) @@ -29619,19 +30117,19 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-devtools-core@4.28.5: + react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.3 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate optional: true - react-devtools-core@6.1.5: + react-devtools-core@6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.3 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -29648,21 +30146,21 @@ snapshots: react-is@18.3.1: {} - react-native-url-polyfill@2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1)): + react-native-url-polyfill@2.0.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)): dependencies: - react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1) + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) whatwg-url-without-unicode: 8.0.0-3 - react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1): + react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.81.4 '@react-native/codegen': 0.81.4(@babel/core@7.28.4) - '@react-native/community-cli-plugin': 0.81.4(@react-native-community/cli@12.3.7) + '@react-native/community-cli-plugin': 0.81.4(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@react-native/gradle-plugin': 0.81.4 '@react-native/js-polyfills': 0.81.4 '@react-native/normalize-colors': 0.81.4 - '@react-native/virtualized-lists': 0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7)(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + '@react-native/virtualized-lists': 0.81.4(@types/react@18.3.26)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -29681,14 +30179,14 @@ snapshots: pretty-format: 29.7.0 promise: 8.3.0 react: 18.3.1 - react-devtools-core: 6.1.5 + react-devtools-core: 6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) react-refresh: 0.14.2 regenerator-runtime: 0.13.11 scheduler: 0.26.0 semver: 7.7.3 stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.20 - ws: 6.2.3 + ws: 6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 optionalDependencies: '@types/react': 18.3.26 @@ -30202,6 +30700,19 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 8.2.0 + rpc-websockets@9.3.1: + dependencies: + '@swc/helpers': 0.5.17 + '@types/uuid': 8.3.4 + '@types/ws': 8.5.12 + buffer: 6.0.3 + eventemitter3: 5.0.1 + uuid: 8.3.2 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + rrweb-cssom@0.8.0: {} rslog@1.2.3: {} @@ -30607,10 +31118,10 @@ snapshots: map-obj: 5.0.2 type-fest: 4.41.0 - socket.io-adapter@2.5.5: + socket.io-adapter@2.5.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: debug: 4.3.7 - ws: 8.17.1 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -30623,14 +31134,14 @@ snapshots: transitivePeerDependencies: - supports-color - socket.io@4.8.1: + socket.io@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 debug: 4.3.7 - engine.io: 6.6.3 - socket.io-adapter: 2.5.5 + engine.io: 6.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + socket.io-adapter: 2.5.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil @@ -30806,6 +31317,12 @@ snapshots: stream-buffers@2.2.0: {} + stream-chain@2.2.5: {} + + stream-json@1.9.1: + dependencies: + stream-chain: 2.2.5 + stream-shift@1.0.3: {} streamsearch@1.1.0: {} @@ -31034,6 +31551,8 @@ snapshots: dependencies: copy-anything: 3.0.5 + superstruct@2.0.2: {} + supertest@6.3.4: dependencies: methods: 1.1.2 @@ -31161,16 +31680,17 @@ snapshots: ansi-escapes: 5.0.0 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))): + terser-webpack-plugin@5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.0 - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) optionalDependencies: '@swc/core': 1.11.29(@swc/helpers@0.5.17) + esbuild: 0.25.10 terser@5.44.0: dependencies: @@ -31195,6 +31715,8 @@ snapshots: dependencies: b4a: 1.6.6 + text-encoding-utf-8@1.0.2: {} + text-extensions@2.4.0: {} thenify-all@1.6.0: @@ -31342,7 +31864,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.25.10)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -31360,6 +31882,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.28.4) + esbuild: 0.25.10 ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3): dependencies: @@ -31965,6 +32488,11 @@ snapshots: dependencies: react: 18.3.1 + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + optional: true + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -32087,16 +32615,16 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - viem@2.33.3(typescript@5.8.3)(zod@3.25.76): + viem@2.33.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) - isows: 1.0.7(ws@8.18.2) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.8.6(typescript@5.8.3)(zod@3.25.76) - ws: 8.18.2 + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32260,19 +32788,19 @@ snapshots: optionalDependencies: vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) - vitest-environment-miniflare@2.14.4(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)): + vitest-environment-miniflare@2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)): dependencies: '@miniflare/queues': 2.14.4 '@miniflare/runner-vm': 2.14.4 '@miniflare/shared': 2.14.4 - '@miniflare/shared-test-environment': 2.14.4 + '@miniflare/shared-test-environment': 2.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) undici: 5.28.4 - vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) + vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) transitivePeerDependencies: - bufferutil - utf-8-validate - vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1): + vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@22.18.12)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -32301,7 +32829,7 @@ snapshots: '@edge-runtime/vm': 5.0.0 '@types/debug': 4.1.12 '@types/node': 22.18.12 - jsdom: 27.0.0(postcss@8.5.6) + jsdom: 27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti - less @@ -32316,7 +32844,7 @@ snapshots: - tsx - yaml - vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1): + vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.7.2)(jiti@2.6.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(msw@2.11.6(@types/node@24.7.2)(typescript@5.8.3))(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -32345,7 +32873,7 @@ snapshots: '@edge-runtime/vm': 5.0.0 '@types/debug': 4.1.12 '@types/node': 24.7.2 - jsdom: 27.0.0(postcss@8.5.6) + jsdom: 27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti - less @@ -32440,7 +32968,7 @@ snapshots: webidl-conversions@8.0.0: optional: true - webpack-bundle-analyzer@4.10.2: + webpack-bundle-analyzer@4.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@discoveryjs/json-ext': 0.5.7 acorn: 8.15.0 @@ -32453,12 +32981,12 @@ snapshots: opener: 1.5.2 picocolors: 1.1.1 sirv: 2.0.4 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - webpack-dev-middleware@7.4.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))): + webpack-dev-middleware@7.4.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)): dependencies: colorette: 2.0.20 memfs: 4.14.0 @@ -32467,9 +32995,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) - webpack-dev-server@5.2.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))): + webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -32497,10 +33025,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) - ws: 8.18.3 + webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) transitivePeerDependencies: - bufferutil - debug @@ -32517,7 +33045,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)): + webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10): dependencies: '@types/estree': 1.0.8 '@webassemblyjs/ast': 1.14.1 @@ -32539,7 +33067,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -32730,17 +33258,32 @@ snapshots: signal-exit: 4.1.0 optional: true - ws@6.2.3: + ws@6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@7.5.10: {} + ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.17.1: {} + ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.18.2: {} + ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.18.3: {} + ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 wsl-utils@0.1.0: dependencies: From 0e178ea7f078f37d4a2ee5804b897c0288865c7e Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 24 Nov 2025 03:16:50 -0500 Subject: [PATCH 03/11] feat(clerk-js,shared,react): add Solana wallet sign-in & sign-up with selectable wallet support - Adds `web3_solana_signature` strategy for Sign In and Sign Up, introduces a Solana wallet selection route (`choose-wallet`), and integrates Solana wallet-standard APIs for identifier and signature generation. - Add `@solana/wallet-standard`, `@solana/wallet-adapter-react`, `@solana/wallet-adapter-base`, `bs58` libs - Implement `injectedWeb3SolanaProviders.ts` singleton with feature/type guards within `solana:signMessage`, connect flow - Update `web3.ts` to fetch Solana identifier via `StandardConnect` and sign messages via `SolanaSignMessage`. - Add `authenticateWithSolana` to `SignIn`, `SignUp`, and expose through `IsomorphicClerk` & `Clerk` interface. - Extend `SignInResource`, `SignUpResource`, introduce `SignUpAuthenticateWithSolanaParams`, thread optional `walletName`. - Support `web3_solana_signature` in sign-in and sign-up start machines. - Add `SignInFactorOneSolanaWalletsCard` component and `choose-wallet` route; extend `FlowMetadata` with `choose-wallet`. - Add `getSolanaIdentifier`, `generateSignatureWithSolana`, propagate `walletName` into web3 auth flow - if named wallet not found, attempt `window.solana` before failing gracefully. Signed-off-by: Kenton Duprey --- packages/clerk-js/package.json | 3 + packages/clerk-js/src/core/clerk.ts | 2 + .../clerk-js/src/core/resources/SignIn.ts | 5 +- .../clerk-js/src/core/resources/SignUp.ts | 22 +- .../ui/components/SignIn/SignInFactorOne.tsx | 2 - .../SignInFactorOneSolanaWalletsCard.tsx | 72 +++++ .../components/SignIn/SignInSocialButtons.tsx | 6 +- .../src/ui/components/SignIn/index.tsx | 4 + .../components/SignUp/SignUpSocialButtons.tsx | 5 + .../SignUp/SignUpStartSolanaWalletsCard.tsx | 77 +++++ .../src/ui/components/SignUp/index.tsx | 4 + .../src/ui/elements/Web3WalletButtons.tsx | 123 ++++++++ .../src/ui/elements/contexts/index.tsx | 3 +- .../src/utils/injectedWeb3SolanaProviders.ts | 37 ++- packages/clerk-js/src/utils/web3.ts | 55 ++-- .../machines/sign-in/start.machine.ts | 3 + .../machines/sign-up/start.machine.ts | 3 + packages/react/src/isomorphicClerk.ts | 10 + packages/shared/src/types/clerk.ts | 5 + packages/shared/src/types/signIn.ts | 2 +- packages/shared/src/types/signUp.ts | 2 + packages/shared/src/types/signUpCommon.ts | 4 + pnpm-lock.yaml | 293 +++++++++++++++++- 23 files changed, 685 insertions(+), 57 deletions(-) create mode 100644 packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx create mode 100644 packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx create mode 100644 packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 266533b3861..4848621b514 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -69,6 +69,7 @@ "@floating-ui/react": "0.27.12", "@floating-ui/react-dom": "^2.1.3", "@formkit/auto-animate": "^0.8.2", + "@solana/wallet-adapter-react": "^0.15.39", "@solana/wallet-standard": "^1.1.4", "@stripe/stripe-js": "5.6.0", "@swc/helpers": "^0.5.17", @@ -79,6 +80,7 @@ "@zxcvbn-ts/language-common": "3.0.4", "alien-signals": "2.0.6", "browser-tabs-lock": "1.3.0", + "bs58": "^6.0.0", "copy-to-clipboard": "3.3.3", "core-js": "3.41.0", "crypto-js": "^4.2.0", @@ -93,6 +95,7 @@ "@rspack/cli": "^1.4.11", "@rspack/core": "^1.4.11", "@rspack/plugin-react-refresh": "^1.5.0", + "@solana/wallet-adapter-base": "^0.9.27", "@svgr/webpack": "^6.5.1", "@types/cloudflare-turnstile": "^0.2.2", "@types/node": "^22.18.12", diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 2f1f817993a..e25fbc02e3d 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -2325,6 +2325,7 @@ export class Clerk implements ClerkInterface { identifier, generateSignature, strategy, + walletName, }); } catch (err) { if (isError(err, ERROR_CODES.FORM_IDENTIFIER_NOT_FOUND)) { @@ -2334,6 +2335,7 @@ export class Clerk implements ClerkInterface { unsafeMetadata, strategy, legalAccepted, + walletName, }); if ( diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index a20b6bd5735..d11fd24984e 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -468,12 +468,13 @@ export class SignIn extends BaseResource implements SignInResource { }); }; - public authenticateWithSolana = async ({ walletName }: AuthenticateWithSolanaParams): Promise => { - const identifier = await getSolanaIdentifier({ walletName }); + public authenticateWithSolana = async (params?: AuthenticateWithSolanaParams): Promise => { + const identifier = await getSolanaIdentifier({ walletName: params?.walletName }); return this.authenticateWithWeb3({ identifier, generateSignature: generateSignatureWithSolana, strategy: 'web3_solana_signature', + walletName: params?.walletName, }); }; diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index bb520ccdcea..792816ec373 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -47,12 +47,14 @@ import { generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, + generateSignatureWithSolana, getBaseIdentifier, getBrowserLocale, getClerkQueryParam, getCoinbaseWalletIdentifier, getMetamaskIdentifier, getOKXWalletIdentifier, + getSolanaIdentifier, windowNavigate, } from '../../utils'; import { @@ -278,6 +280,7 @@ export class SignUp extends BaseResource implements SignUpResource { unsafeMetadata, strategy = 'web3_metamask_signature', legalAccepted, + walletName, } = params || {}; const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; @@ -297,7 +300,7 @@ export class SignUp extends BaseResource implements SignUpResource { let signature: string; try { - signature = await generateSignature({ identifier, nonce: message, provider }); + signature = await generateSignature({ identifier, nonce: message, provider, walletName }); } catch (err) { // There is a chance that as a first time visitor when you try to setup and use the // Coinbase Wallet from scratch in order to authenticate, the initial generate @@ -376,6 +379,23 @@ export class SignUp extends BaseResource implements SignUpResource { }); }; + public authenticateWithSolana = async ( + params?: SignUpAuthenticateWithWeb3Params & { + walletName?: string; + legalAccepted?: boolean; + }, + ): Promise => { + const identifier = await getSolanaIdentifier({ walletName: params?.walletName }); + return this.authenticateWithWeb3({ + identifier, + generateSignature: generateSignatureWithSolana, + unsafeMetadata: params?.unsafeMetadata, + strategy: 'web3_solana_signature', + legalAccepted: params?.legalAccepted, + walletName: params?.walletName, + }); + }; + private authenticateWithRedirectOrPopup = async ( params: AuthenticateWithRedirectParams & { unsafeMetadata?: SignUpUnsafeMetadata; diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx index 4e3e81054de..e318345e719 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx @@ -222,8 +222,6 @@ function SignInFactorOneInternal(): JSX.Element { onShowAlternativeMethodsClicked={toggleAllStrategies} /> ); - // case 'web3_solana_signature': - // return ; case 'reset_password_phone_code': return ( { + const clerk = useClerk(); + const card = useCardState(); + const router = useRouter(); + const ctx = useSignInContext(); + + const onSelect = async ({ walletName }: { walletName: string }) => { + card.setLoading(walletName); + try { + await clerk.authenticateWithWeb3({ + strategy: 'web3_solana_signature', + redirectUrl: ctx.afterSignInUrl || '/', + signUpContinueUrl: ctx.isCombinedFlow ? '../create/continue' : ctx.signUpContinueUrl, + customNavigate: router.navigate, + secondFactorUrl: 'factor-two', + walletName, + }); + } catch (err) { + handleError(err as Error, [], card.setError); + card.setIdle(); + } + }; + + const onBackLinkClick = () => { + void router.navigate('../'); + }; + + return ( + + + + + Continue with Solana Wallet + Select a wallet below to sign in + + {card.error} + + + + + + + + + + ); +}; + +export const SignInFactorOneSolanaWalletsCard = withRedirectToSignInTask( + withRedirectToAfterSignIn(withCardStateProvider(SignInFactorOneSolanaWalletsCardInner)), +); diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx index 4386a33aba2..0f40d991b5a 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx @@ -58,9 +58,9 @@ export const SignInSocialButtons = React.memo((props: SignInSocialButtonsProps) .catch(err => handleError(err, [], card.setError)); }} web3Callback={strategy => { - // if (strategy === 'web3_solana_signature') { - // return navigate('factor-one'); - // } + if (strategy === 'web3_solana_signature') { + return navigate(`choose-wallet?strategy=${strategy}`); + } return clerk .authenticateWithWeb3({ diff --git a/packages/clerk-js/src/ui/components/SignIn/index.tsx b/packages/clerk-js/src/ui/components/SignIn/index.tsx index 7cdea9e8d30..62c3abe2d13 100644 --- a/packages/clerk-js/src/ui/components/SignIn/index.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/index.tsx @@ -3,6 +3,7 @@ import type { SignInModalProps, SignInProps } from '@clerk/shared/types'; import React from 'react'; import { SignInEmailLinkFlowComplete, SignUpEmailLinkFlowComplete } from '@/ui/common/EmailLinkCompleteFlowCard'; +import { SignInFactorOneSolanaWalletsCard } from '@/ui/components/SignIn/SignInFactorOneSolanaWalletsCard'; import { SignInContext, SignUpContext, @@ -77,6 +78,9 @@ function SignInRoutes(): JSX.Element { + + + handleError(err, [], card.setError)); }} web3Callback={strategy => { + if (strategy === 'web3_solana_signature') { + // TODO: Add support to pass legalAccepted status + return navigate(`choose-wallet?strategy=${strategy}`); + } + return clerk .authenticateWithWeb3({ customNavigate: navigate, diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx new file mode 100644 index 00000000000..64b8ec1a3cd --- /dev/null +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx @@ -0,0 +1,77 @@ +import { useClerk } from '@clerk/shared/react'; + +import { withRedirectToAfterSignUp, withRedirectToSignUpTask } from '@/ui/common/withRedirect'; +import { descriptors, Flex, Flow } from '@/ui/customizables'; +import { BackLink } from '@/ui/elements/BackLink'; +import { Card } from '@/ui/elements/Card'; +import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; +import { Header } from '@/ui/elements/Header'; +import { Web3WalletButtons } from '@/ui/elements/Web3WalletButtons'; +import { handleError } from '@/ui/utils/errorHandler'; +import { sleep } from '@/ui/utils/sleep'; + +import { useSignUpContext } from '../../contexts'; +import { useRouter } from '../../router'; + +const SignUpStartSolanaWalletsCardInner = () => { + const clerk = useClerk(); + const card = useCardState(); + const router = useRouter(); + const ctx = useSignUpContext(); + + const onSelect = async ({ walletName }: { walletName: string }) => { + card.setLoading(walletName); + try { + await clerk.authenticateWithWeb3({ + customNavigate: router.navigate, + redirectUrl: ctx.afterSignUpUrl || '/', + signUpContinueUrl: '../continue', + unsafeMetadata: ctx.unsafeMetadata, + strategy: 'web3_solana_signature', + // TODO: Add support to pass legalAccepted status + // legalAccepted: , + walletName, + }); + } catch (err) { + await sleep(1000); + handleError(err as Error, [], card.setError); + card.setIdle(); + } + await sleep(5000); + card.setIdle(); + }; + + const onBackLinkClick = () => { + void router.navigate('../'); + }; + + return ( + + + + + Sign up with Solana Wallet + Select a wallet below to sign up + + {card.error} + + + + + + + + + ); +}; + +export const SignUpStartSolanaWalletsCard = withRedirectToSignUpTask( + withRedirectToAfterSignUp(withCardStateProvider(SignUpStartSolanaWalletsCardInner)), +); diff --git a/packages/clerk-js/src/ui/components/SignUp/index.tsx b/packages/clerk-js/src/ui/components/SignUp/index.tsx index 3ba8a39b6be..eae05b32e1c 100644 --- a/packages/clerk-js/src/ui/components/SignUp/index.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/index.tsx @@ -2,6 +2,7 @@ import { useClerk } from '@clerk/shared/react'; import type { SignUpModalProps, SignUpProps } from '@clerk/shared/types'; import React from 'react'; +import { SignUpStartSolanaWalletsCard } from '@/ui/components/SignUp/SignUpStartSolanaWalletsCard'; import { usePreloadTasks } from '@/ui/hooks/usePreloadTasks'; import { SessionTasks as LazySessionTasks } from '../../../ui/lazyModules/components'; @@ -86,6 +87,9 @@ function SignUpRoutes(): JSX.Element { + + + diff --git a/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx b/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx new file mode 100644 index 00000000000..d7483667d4a --- /dev/null +++ b/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx @@ -0,0 +1,123 @@ +import { WalletReadyState } from '@solana/wallet-adapter-base'; +import { ConnectionProvider, useWallet, WalletProvider } from '@solana/wallet-adapter-react'; +import { MAINNET_ENDPOINT } from '@solana/wallet-standard'; +import React, { useMemo } from 'react'; + +import { Button, Flex, Grid, Image, Link, Text } from '@/ui/customizables'; +import { Card } from '@/ui/elements/Card'; +import { useCardState } from '@/ui/elements/contexts'; + +type Web3WalletButtonsProps = { + onSelect: (props: { walletName: string }) => Promise; +}; + +const Web3WalletButtonsInner = ({ onSelect }: Web3WalletButtonsProps) => { + const card = useCardState(); + const { wallets } = useWallet(); + + // Filter to only show installed wallets + const installedWallets = React.useMemo( + () => + wallets + .filter(w => { + return w.readyState === WalletReadyState.Installed; + }) + .map(wallet => { + return { + name: wallet.adapter.name, + icon: wallet.adapter.icon, + }; + }), + [wallets], + ); + + if (installedWallets.length === 0) { + return ( + + No Solana wallets detected. Please install a Solana supported wallet extension like{' '} + + Phantom + {' '} + or{' '} + + Backpack + + . + + ); + } + return ( + + {installedWallets.map(w => ( + + ))} + + ); +}; + +export const Web3WalletButtons = (props: Web3WalletButtonsProps) => { + const network = MAINNET_ENDPOINT; + const wallets = useMemo(() => [], [network]); + return ( + + { + console.error(err); + }} + > + {/* */} + + {/* */} + + + ); +}; diff --git a/packages/clerk-js/src/ui/elements/contexts/index.tsx b/packages/clerk-js/src/ui/elements/contexts/index.tsx index f14986eedd2..3a34dcbfd52 100644 --- a/packages/clerk-js/src/ui/elements/contexts/index.tsx +++ b/packages/clerk-js/src/ui/elements/contexts/index.tsx @@ -125,7 +125,8 @@ export type FlowMetadata = { | 'complete' | 'accountSwitcher' | 'chooseOrganization' - | 'enterpriseConnections'; + | 'enterpriseConnections' + | 'choose-wallet'; }; const [FlowMetadataCtx, useFlowMetadata] = createContextAndHook('FlowMetadata'); diff --git a/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts index f1451c6628b..c740c29f647 100644 --- a/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts +++ b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts @@ -1,17 +1,16 @@ -import type { Wallet } from '@wallet-standard/core'; +import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard'; +import { type Wallet } from '@wallet-standard/core'; -//https://eips.ethereum.org/EIPS/eip-6963 +//https://eips.ethereum.org/EIPS/eip-4361 class InjectedWeb3SolanaProviders { #wallets: readonly Wallet[] | undefined = undefined; - static #instance: InjectedWeb3SolanaProviders | null = null; private constructor() { if (typeof window === 'undefined') { return; } - this.#initialize(); } async #initialize() { @@ -26,6 +25,14 @@ class InjectedWeb3SolanaProviders { }); } + #isSolanaWallet(wallet: Wallet): wallet is SolanaWalletAdapterWallet { + return wallet.chains?.some(chain => chain.startsWith('solana:')) ?? false; + } + + #hasSignMessage(wallet: Wallet): boolean { + return 'solana:signMessage' in wallet.features; + } + public static getInstance(): InjectedWeb3SolanaProviders { if (!InjectedWeb3SolanaProviders.#instance) { InjectedWeb3SolanaProviders.#instance = new InjectedWeb3SolanaProviders(); @@ -33,13 +40,13 @@ class InjectedWeb3SolanaProviders { return InjectedWeb3SolanaProviders.#instance; } - // Get a provider by its wallet name and optional chain - get = (walletName: string) => { - // Try to find the requested Solana provider among the registered wallets + get = async (walletName: string): Promise => { + await this.#initialize(); if (this.#wallets) { - // Try to find the requested wallet by matching its name and chain (if provided) - const wallet = this.#wallets.find(w => w.name === walletName && w.chains?.includes(`solana:`)); - if (wallet) { + const wallet = this.#wallets.find( + w => w.name === walletName && this.#isSolanaWallet(w) && this.#hasSignMessage(w), + ); + if (wallet && this.#isSolanaWallet(wallet)) { return wallet; } } @@ -47,7 +54,15 @@ class InjectedWeb3SolanaProviders { // In case we weren't able to find the requested provider, fallback to the // global injected provider instead, if any, to allow the user to continue // the flow rather than blocking it - return (window as any).solana; + const fallbackProvider = (window as any).solana; + if ( + fallbackProvider && + typeof fallbackProvider.connect === 'function' && + typeof fallbackProvider.signMessage === 'function' + ) { + return fallbackProvider as SolanaWalletAdapterWallet; + } + return undefined; }; } diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index 6ac2cedb9ed..d639804ff78 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -1,5 +1,5 @@ import type { Web3Provider } from '@clerk/shared/types'; -import type { Wallet } from '@wallet-standard/core'; +import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard'; import { clerkUnsupportedEnvironmentWarning } from '@/core/errors'; import { getInjectedWeb3SolanaProviders } from '@/utils/injectedWeb3SolanaProviders'; @@ -7,17 +7,15 @@ import { getInjectedWeb3SolanaProviders } from '@/utils/injectedWeb3SolanaProvid import { toHex } from './hex'; import { getInjectedWeb3EthProviders } from './injectedWeb3EthProviders'; -// type InjectedWeb3Wallet = MetamaskWeb3Provider | OKXWalletWeb3Provider; -// const web3WalletProviderMap: Record = { -// metamask: 'MetaMask', -// okx_wallet: 'OKX Wallet', -// } as const; - type GetWeb3IdentifierParams = { provider: Web3Provider; walletName?: string; }; +// '@solana/wallet-standard' +const StandardConnect = `standard:connect`; +const SolanaSignMessage = `solana:signMessage`; + export async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promise { const { provider, walletName } = params; const walletProvider = await getWeb3WalletProvider(provider, walletName); @@ -29,12 +27,12 @@ export async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promis return ''; } - if (params.provider === 'solana') { - // Solana provider - const identifiers = (walletProvider as Wallet).accounts; - return (identifiers && identifiers[0].address) || ''; + if (provider === 'solana') { + const identifiers = await walletProvider.features[StandardConnect].connect(); + return (identifiers && identifiers.accounts[0].address) || ''; } + // Ethereum providers const identifiers = await walletProvider.request({ method: 'eth_requestAccounts' }); // @ts-ignore -- Provider SDKs may return unknown shape; use first address if present return (identifiers && identifiers[0]) || ''; @@ -47,7 +45,6 @@ type GenerateWeb3SignatureParams = GenerateSignatureParams & { export async function generateWeb3Signature(params: GenerateWeb3SignatureParams): Promise { const { identifier, nonce, provider } = params; - const wallet = await getWeb3WalletProvider(provider, params?.walletName); // TODO - core-3: Improve error handling for the case when the provider is not found @@ -56,18 +53,23 @@ export async function generateWeb3Signature(params: GenerateWeb3SignatureParams) // the flow will fail as it has been the expected behavior so far. return ''; } - if (provider === 'solana' && 'features' in wallet && wallet.features) { - if (!(wallet as Wallet).accounts.find(a => a.address === identifier)) { - throw new Error(`The connected wallet does not have the specified identifier.`); - } - if (!wallet.features[`solana:signMessage`]) { - throw new Error(`The connected wallet does not support signing messages on Solana.`); + + if (provider === 'solana') { + const bs58 = await import('bs58').then(mod => mod.default); + const walletAccount = (wallet as SolanaWalletAdapterWallet).accounts.find(a => a.address === identifier); + if (!walletAccount) { + console.warn(`Wallet account with address ${identifier} not found`); + return ''; } - const signedMessages = await wallet.features[`solana:signMessage`].signMessage({ - account: identifier, - message: nonce, + const signedMessages = await wallet.features[SolanaSignMessage]?.signMessage({ + account: walletAccount, + message: new TextEncoder().encode(nonce), }); - return signedMessages[0].signature; + if (!signedMessages || signedMessages.length === 0) { + console.warn('No signed messages returned from wallet'); + return ''; + } + return bs58.encode(signedMessages[0].signature); } return await wallet.request({ @@ -92,7 +94,11 @@ export async function getBaseIdentifier(): Promise { return await getWeb3Identifier({ provider: 'base' }); } -export async function getSolanaIdentifier({ walletName }: { walletName?: string }): Promise { +type GetSolanaIdentifierParams = { + walletName?: string; +}; + +export async function getSolanaIdentifier({ walletName }: GetSolanaIdentifierParams): Promise { return await getWeb3Identifier({ provider: 'solana', walletName }); } @@ -164,9 +170,10 @@ async function getWeb3WalletProvider(provider: Web3Provider, walletName?: string if (provider === 'solana') { if (!walletName) { + console.warn('Wallet name must be provided to get Solana wallet provider'); return null; } - return getInjectedWeb3SolanaProviders().get(walletName); + return await getInjectedWeb3SolanaProviders().get(walletName); } return getInjectedWeb3EthProviders().get(provider); diff --git a/packages/elements/src/internals/machines/sign-in/start.machine.ts b/packages/elements/src/internals/machines/sign-in/start.machine.ts index 8a9f3a9e657..49963395bbe 100644 --- a/packages/elements/src/internals/machines/sign-in/start.machine.ts +++ b/packages/elements/src/internals/machines/sign-in/start.machine.ts @@ -42,6 +42,9 @@ export const SignInStartMachine = setup({ if (strategy === 'web3_okx_wallet_signature') { return parent.getSnapshot().context.clerk.client.signIn.authenticateWithOKXWallet(); } + if (strategy === 'web3_solana_signature') { + return parent.getSnapshot().context.clerk.client.signIn.authenticateWithSolana(); + } throw new ClerkElementsRuntimeError(`Unsupported Web3 strategy: ${strategy}`); }, ), diff --git a/packages/elements/src/internals/machines/sign-up/start.machine.ts b/packages/elements/src/internals/machines/sign-up/start.machine.ts index 315207acc1d..afe01ce2f79 100644 --- a/packages/elements/src/internals/machines/sign-up/start.machine.ts +++ b/packages/elements/src/internals/machines/sign-up/start.machine.ts @@ -47,6 +47,9 @@ export const SignUpStartMachine = setup({ if (strategy === 'web3_okx_wallet_signature') { return parent.getSnapshot().context.clerk.client.signUp.authenticateWithOKXWallet(); } + if (strategy === 'web3_solana_signature') { + return parent.getSnapshot().context.clerk.client.signUp.authenticateWithSolana(); + } throw new ClerkElementsRuntimeError(`Unsupported Web3 strategy: ${strategy}`); }, ), diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index bb0ffd1633c..b2cec8a3ac7 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -15,6 +15,7 @@ import type { AuthenticateWithGoogleOneTapParams, AuthenticateWithMetamaskParams, AuthenticateWithOKXWalletParams, + AuthenticateWithSolanaParams, BillingNamespace, Clerk, ClerkAuthenticateWithWeb3Params, @@ -1408,6 +1409,15 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; + authenticateWithSolana = async (params?: AuthenticateWithSolanaParams) => { + const callback = () => this.clerkjs?.authenticateWithSolana(params); + if (this.clerkjs && this.loaded) { + return callback() as Promise; + } else { + this.premountMethodCalls.set('authenticateWithSolana', callback); + } + }; + authenticateWithWeb3 = async (params: ClerkAuthenticateWithWeb3Params) => { const callback = () => this.clerkjs?.authenticateWithWeb3(params); if (this.clerkjs && this.loaded) { diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 9f2c7c73506..91a48522a1a 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -869,6 +869,11 @@ export interface Clerk { */ authenticateWithBase: (params?: AuthenticateWithBaseParams) => Promise; + /** + * Authenticates user using their Solana supported Web3 wallet browser extension + */ + authenticateWithSolana: (params?: AuthenticateWithSolanaParams) => Promise; + /** * Authenticates user using their Web3 Wallet browser extension */ diff --git a/packages/shared/src/types/signIn.ts b/packages/shared/src/types/signIn.ts index de6d26743b5..9d65bb17da0 100644 --- a/packages/shared/src/types/signIn.ts +++ b/packages/shared/src/types/signIn.ts @@ -77,7 +77,7 @@ export interface SignInResource extends ClerkResource { authenticateWithBase: () => Promise; - authenticateWithSolana: (params: AuthenticateWithSolanaParams) => Promise; + authenticateWithSolana: (params?: AuthenticateWithSolanaParams) => Promise; authenticateWithPasskey: (params?: AuthenticateWithPasskeyParams) => Promise; diff --git a/packages/shared/src/types/signUp.ts b/packages/shared/src/types/signUp.ts index 8cfcc7debce..2883d1e9d9b 100644 --- a/packages/shared/src/types/signUp.ts +++ b/packages/shared/src/types/signUp.ts @@ -6,6 +6,7 @@ import type { ClerkResource } from './resource'; import type { AttemptVerificationParams, PrepareVerificationParams, + SignUpAuthenticateWithSolanaParams, SignUpAuthenticateWithWeb3Params, SignUpCreateParams, SignUpField, @@ -107,6 +108,7 @@ export interface SignUpResource extends ClerkResource { authenticateWithCoinbaseWallet: (params?: SignUpAuthenticateWithWeb3Params) => Promise; authenticateWithOKXWallet: (params?: SignUpAuthenticateWithWeb3Params) => Promise; authenticateWithBase: (params?: SignUpAuthenticateWithWeb3Params) => Promise; + authenticateWithSolana: (params?: SignUpAuthenticateWithSolanaParams) => Promise; __internal_toSnapshot: () => SignUpJSONSnapshot; /** diff --git a/packages/shared/src/types/signUpCommon.ts b/packages/shared/src/types/signUpCommon.ts index a40504a0c2a..e23de564beb 100644 --- a/packages/shared/src/types/signUpCommon.ts +++ b/packages/shared/src/types/signUpCommon.ts @@ -117,6 +117,10 @@ export type SignUpAuthenticateWithWeb3Params = { unsafeMetadata?: SignUpUnsafeMetadata; }; +export type SignUpAuthenticateWithSolanaParams = SignUpAuthenticateWithWeb3Params & { + walletName: string; +}; + export interface SignUpVerificationsResource { emailAddress: SignUpVerificationResource; phoneNumber: SignUpVerificationResource; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 245105c2ac6..d7439e66e47 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -452,6 +452,9 @@ importers: '@formkit/auto-animate': specifier: ^0.8.2 version: 0.8.2 + '@solana/wallet-adapter-react': + specifier: ^0.15.39 + version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) '@solana/wallet-standard': specifier: ^1.1.4 version: 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) @@ -482,6 +485,9 @@ importers: browser-tabs-lock: specifier: 1.3.0 version: 1.3.0 + bs58: + specifier: ^6.0.0 + version: 6.0.0 copy-to-clipboard: specifier: 3.3.3 version: 3.3.3 @@ -525,6 +531,9 @@ importers: '@rspack/plugin-react-refresh': specifier: ^1.5.0 version: 1.5.0(react-refresh@0.17.0) + '@solana/wallet-adapter-base': + specifier: ^0.9.27 + version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) '@svgr/webpack': specifier: ^6.5.1 version: 6.5.1 @@ -2605,7 +2614,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {'0': node >=0.10.0} + engines: {node: '>=0.10.0'} '@expo/cli@0.22.26': resolution: {integrity: sha512-I689wc8Fn/AX7aUGiwrh3HnssiORMJtR2fpksX+JIe8Cj/EDleblYMSwRPd0025wrwOV9UN1KM/RuEt/QjCS3Q==} @@ -4098,6 +4107,11 @@ packages: '@types/react': optional: true + '@react-native-async-storage/async-storage@1.24.0': + resolution: {integrity: sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==} + peerDependencies: + react-native: ^0.0.0-0 || >=0.60 <1.0 + '@react-native-community/cli-clean@12.3.7': resolution: {integrity: sha512-BCYW77QqyxfhiMEBOoHyciJRNV6Rhz1RvclReIKnCA9wAwmoJBeu4Mu+AwiECA2bUITX16fvPt3NwDsSd1jwfQ==} @@ -4739,6 +4753,24 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5': + resolution: {integrity: sha512-xfQl6Kee0ZXagUG5mpy+bMhQTNf2LAzF65m5SSgNJp47y/nP9GdXWi9blVH8IPP+QjF/+DnCtURaXS14bk3WJw==} + peerDependencies: + '@solana/web3.js': ^1.58.0 + + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5': + resolution: {integrity: sha512-kCI+0/umWm98M9g12ndpS56U6wBzq4XdhobCkDPF8qRDYX/iTU8CD+QMcalh7VgRT7GWEmySQvQdaugM0Chf0g==} + peerDependencies: + react-native: '>0.69' + + '@solana-mobile/wallet-adapter-mobile@2.2.5': + resolution: {integrity: sha512-Zpzfwm3N4FfI63ZMs2qZChQ1j0z+p2prkZbSU51NyTnE+K9l9sDAl8RmRCOWnE29y+/AN10WuQZQoIAccHVOFg==} + peerDependencies: + '@solana/web3.js': ^1.58.0 + + '@solana-mobile/wallet-standard-mobile@0.4.4': + resolution: {integrity: sha512-LMvqkS5/aEH+EiDje9Dk351go6wO3POysgmobM4qm8RsG5s6rDAW3U0zA+5f2coGCTyRx8BKE1I/9nHlwtBuow==} + '@solana/buffer-layout@4.0.1': resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} @@ -4749,12 +4781,31 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-core@4.0.0': + resolution: {integrity: sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/codecs-numbers@2.3.0': resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-numbers@4.0.0': + resolution: {integrity: sha512-z9zpjtcwzqT9rbkKVZpkWB5/0V7+6YRKs6BccHkGJlaDx8Pe/+XOvPi2rEdXPqrPd9QWb5Xp1iBfcgaDMyiOiA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-strings@4.0.0': + resolution: {integrity: sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.3.3' + '@solana/errors@2.3.0': resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} engines: {node: '>=20.18.0'} @@ -4762,12 +4813,26 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/errors@4.0.0': + resolution: {integrity: sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + '@solana/wallet-adapter-base@0.9.27': resolution: {integrity: sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==} engines: {node: '>=20'} peerDependencies: '@solana/web3.js': ^1.98.0 + '@solana/wallet-adapter-react@0.15.39': + resolution: {integrity: sha512-WXtlo88ith5m22qB+qiGw301/Zb9r5pYr4QdXWmlXnRNqwST5MGmJWhG+/RVrzc+OG7kSb3z1gkVNv+2X/Y0Gg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + react: 18.3.1 + '@solana/wallet-standard-chains@1.1.1': resolution: {integrity: sha512-Us3TgL4eMVoVWhuC4UrePlYnpWN+lwteCBlhZDUhFZBJ5UMGh94mYPXno3Ho7+iHPYRtuCi/ePvPcYBqCGuBOw==} engines: {node: '>=16'} @@ -6623,6 +6688,9 @@ packages: base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + base-x@5.0.1: resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} @@ -6756,6 +6824,9 @@ packages: bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + bs58@6.0.0: resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} @@ -7900,6 +7971,9 @@ packages: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -8782,6 +8856,9 @@ packages: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} + fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} @@ -9893,6 +9970,10 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -10267,6 +10348,9 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + js-beautify@1.15.1: resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} engines: {node: '>=14'} @@ -11036,6 +11120,10 @@ packages: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -12192,6 +12280,10 @@ packages: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + portfinder@1.0.32: resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} @@ -12625,6 +12717,11 @@ packages: peerDependencies: react: 18.3.1 + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -19401,6 +19498,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.26 + '@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))': + dependencies: + merge-options: 3.0.4 + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + optional: true + '@react-native-community/cli-clean@12.3.7': dependencies: '@react-native-community/cli-tools': 12.3.7 @@ -20277,6 +20380,69 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + bs58: 5.0.0 + js-base64: 3.7.8 + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - fastestsmallesttextencoderdecoder + - react + - react-native + - typescript + + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/wallet-standard': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) + '@solana/wallet-standard-util': 1.1.2 + '@wallet-standard/core': 1.1.1 + js-base64: 3.7.8 + react-native: 0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - fastestsmallesttextencoderdecoder + - react + - typescript + + '@solana-mobile/wallet-adapter-mobile@2.2.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-features': 1.3.0 + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + js-base64: 3.7.8 + optionalDependencies: + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - react + - react-native + - typescript + + '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + bs58: 5.0.0 + js-base64: 3.7.8 + qrcode: 1.5.4 + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - fastestsmallesttextencoderdecoder + - react + - react-native + - typescript + '@solana/buffer-layout@4.0.1': dependencies: buffer: 6.0.3 @@ -20286,18 +20452,43 @@ snapshots: '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/codecs-core@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + '@solana/codecs-numbers@2.3.0(typescript@5.8.3)': dependencies: '@solana/codecs-core': 2.3.0(typescript@5.8.3) '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/codecs-numbers@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/codecs-strings@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-numbers': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.8.3 + '@solana/errors@2.3.0(typescript@5.8.3)': dependencies: chalk: 5.6.2 commander: 14.0.1 typescript: 5.8.3 + '@solana/errors@4.0.0(typescript@5.8.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.1 + typescript: 5.8.3 + '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-standard-features': 1.3.0 @@ -20306,6 +20497,19 @@ snapshots: '@wallet-standard/features': 1.1.0 eventemitter3: 5.0.1 + '@solana/wallet-adapter-react@0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3)': + dependencies: + '@solana-mobile/wallet-adapter-mobile': 2.2.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + react: 18.3.1 + transitivePeerDependencies: + - bs58 + - fastestsmallesttextencoderdecoder + - react-native + - typescript + '@solana/wallet-standard-chains@1.1.1': dependencies: '@wallet-standard/base': 1.1.0 @@ -20327,6 +20531,19 @@ snapshots: '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 + '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-chains': 1.1.1 + '@solana/wallet-standard-features': 1.3.0 + '@solana/wallet-standard-util': 1.1.2 + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + '@wallet-standard/wallet': 1.1.0 + bs58: 5.0.0 + '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -20340,6 +20557,17 @@ snapshots: '@wallet-standard/wallet': 1.1.0 bs58: 6.0.0 + '@solana/wallet-standard-wallet-adapter-react@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0) + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + react: 18.3.1 + transitivePeerDependencies: + - '@solana/web3.js' + - bs58 + '@solana/wallet-standard-wallet-adapter-react@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1)': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -20351,6 +20579,16 @@ snapshots: - '@solana/web3.js' - bs58 + '@solana/wallet-standard-wallet-adapter@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0) + '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + '@solana/wallet-standard-wallet-adapter@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1)': dependencies: '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0) @@ -20361,6 +20599,16 @@ snapshots: - bs58 - react + '@solana/wallet-standard@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1)': + dependencies: + '@solana/wallet-standard-core': 1.1.2 + '@solana/wallet-standard-wallet-adapter': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@18.3.1) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + '@solana/wallet-standard@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1)': dependencies: '@solana/wallet-standard-core': 1.1.2 @@ -22768,6 +23016,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + base-x@4.0.1: {} + base-x@5.0.1: {} base64-js@1.5.1: {} @@ -22938,6 +23188,10 @@ snapshots: dependencies: base-x: 3.0.11 + bs58@5.0.0: + dependencies: + base-x: 4.0.1 + bs58@6.0.0: dependencies: base-x: 5.0.1 @@ -23317,7 +23571,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - optional: true cliui@7.0.4: dependencies: @@ -24117,6 +24370,8 @@ snapshots: diff@8.0.2: {} + dijkstrajs@1.0.3: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -25330,6 +25585,8 @@ snapshots: fastest-levenshtein@1.0.16: {} + fastestsmallesttextencoderdecoder@1.0.22: {} + fastify-plugin@5.0.1: {} fastify@5.6.1: @@ -26583,6 +26840,9 @@ snapshots: is-plain-obj@1.1.0: {} + is-plain-obj@2.1.0: + optional: true + is-plain-obj@3.0.0: {} is-plain-obj@4.1.0: {} @@ -27156,6 +27416,8 @@ snapshots: joycon@3.1.1: {} + js-base64@3.7.8: {} + js-beautify@1.15.1: dependencies: config-chain: 1.1.13 @@ -28071,6 +28333,11 @@ snapshots: merge-descriptors@2.0.0: {} + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + optional: true + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -29708,6 +29975,8 @@ snapshots: pngjs@3.4.0: {} + pngjs@5.0.0: {} + portfinder@1.0.32: dependencies: async: 2.6.4 @@ -30053,6 +30322,12 @@ snapshots: dependencies: react: 18.3.1 + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + qs@6.13.0: dependencies: side-channel: 1.1.0 @@ -30499,8 +30774,7 @@ snapshots: require-from-string@2.0.2: {} - require-main-filename@2.0.0: - optional: true + require-main-filename@2.0.0: {} requireg@0.2.2: dependencies: @@ -30909,8 +31183,7 @@ snapshots: server-only@0.0.1: {} - set-blocking@2.0.0: - optional: true + set-blocking@2.0.0: {} set-cookie-parser@2.6.0: {} @@ -33161,8 +33434,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.3 - which-module@2.0.1: - optional: true + which-module@2.0.1: {} which-pm-runs@1.1.0: {} @@ -33324,8 +33596,7 @@ snapshots: xxhash-wasm@1.1.0: {} - y18n@4.0.3: - optional: true + y18n@4.0.3: {} y18n@5.0.8: {} @@ -33362,7 +33633,6 @@ snapshots: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - optional: true yargs-parser@20.2.9: {} @@ -33381,7 +33651,6 @@ snapshots: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 - optional: true yargs@16.2.0: dependencies: From f66590aae28f2fa6a3e4bbafe14e1c3c522319ed Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:11:47 -0500 Subject: [PATCH 04/11] feat(clerk-js): remove Solana authentication strategy from clerk-elements Signed-off-by: Kenton Duprey --- .../elements/src/internals/machines/sign-in/start.machine.ts | 3 --- .../elements/src/internals/machines/sign-up/start.machine.ts | 3 --- 2 files changed, 6 deletions(-) diff --git a/packages/elements/src/internals/machines/sign-in/start.machine.ts b/packages/elements/src/internals/machines/sign-in/start.machine.ts index 49963395bbe..8a9f3a9e657 100644 --- a/packages/elements/src/internals/machines/sign-in/start.machine.ts +++ b/packages/elements/src/internals/machines/sign-in/start.machine.ts @@ -42,9 +42,6 @@ export const SignInStartMachine = setup({ if (strategy === 'web3_okx_wallet_signature') { return parent.getSnapshot().context.clerk.client.signIn.authenticateWithOKXWallet(); } - if (strategy === 'web3_solana_signature') { - return parent.getSnapshot().context.clerk.client.signIn.authenticateWithSolana(); - } throw new ClerkElementsRuntimeError(`Unsupported Web3 strategy: ${strategy}`); }, ), diff --git a/packages/elements/src/internals/machines/sign-up/start.machine.ts b/packages/elements/src/internals/machines/sign-up/start.machine.ts index afe01ce2f79..315207acc1d 100644 --- a/packages/elements/src/internals/machines/sign-up/start.machine.ts +++ b/packages/elements/src/internals/machines/sign-up/start.machine.ts @@ -47,9 +47,6 @@ export const SignUpStartMachine = setup({ if (strategy === 'web3_okx_wallet_signature') { return parent.getSnapshot().context.clerk.client.signUp.authenticateWithOKXWallet(); } - if (strategy === 'web3_solana_signature') { - return parent.getSnapshot().context.clerk.client.signUp.authenticateWithSolana(); - } throw new ClerkElementsRuntimeError(`Unsupported Web3 strategy: ${strategy}`); }, ), From 44ef411ce0301de835ccf2b248c626e26d9a05d7 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:39:33 -0500 Subject: [PATCH 05/11] chore: Set version for solana wallet dependencies Signed-off-by: Kenton Duprey --- packages/clerk-js/package.json | 10 +-- pnpm-lock.yaml | 110 ++++++++++++++++----------------- 2 files changed, 59 insertions(+), 61 deletions(-) diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 4848621b514..9f66597817b 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -69,13 +69,14 @@ "@floating-ui/react": "0.27.12", "@floating-ui/react-dom": "^2.1.3", "@formkit/auto-animate": "^0.8.2", - "@solana/wallet-adapter-react": "^0.15.39", - "@solana/wallet-standard": "^1.1.4", + "@solana/wallet-adapter-base": "0.9.27", + "@solana/wallet-adapter-react": "0.15.39", + "@solana/wallet-standard": "1.1.4", "@stripe/stripe-js": "5.6.0", "@swc/helpers": "^0.5.17", "@tanstack/query-core": "5.87.4", - "@wallet-standard/core": "^1.1.1", - "@wallet-standard/react": "^1.0.1", + "@wallet-standard/core": "1.1.1", + "@wallet-standard/react": "1.0.1", "@zxcvbn-ts/core": "3.0.4", "@zxcvbn-ts/language-common": "3.0.4", "alien-signals": "2.0.6", @@ -95,7 +96,6 @@ "@rspack/cli": "^1.4.11", "@rspack/core": "^1.4.11", "@rspack/plugin-react-refresh": "^1.5.0", - "@solana/wallet-adapter-base": "^0.9.27", "@svgr/webpack": "^6.5.1", "@types/cloudflare-turnstile": "^0.2.2", "@types/node": "^22.18.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7439e66e47..9906328dce3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -264,7 +264,7 @@ importers: version: 1.2.2 ts-jest: specifier: 29.2.5 - version: 29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.25.10)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3) tsdown: specifier: catalog:repo version: 0.15.7(publint@0.3.12)(typescript@5.8.3) @@ -452,11 +452,14 @@ importers: '@formkit/auto-animate': specifier: ^0.8.2 version: 0.8.2 + '@solana/wallet-adapter-base': + specifier: 0.9.27 + version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-react': - specifier: ^0.15.39 + specifier: 0.15.39 version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.81.4(@babel/core@7.28.4)(@react-native-community/cli@12.3.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.8.3) '@solana/wallet-standard': - specifier: ^1.1.4 + specifier: 1.1.4 version: 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@18.3.1) '@stripe/stripe-js': specifier: 5.6.0 @@ -468,10 +471,10 @@ importers: specifier: 5.87.4 version: 5.87.4 '@wallet-standard/core': - specifier: ^1.1.1 + specifier: 1.1.1 version: 1.1.1 '@wallet-standard/react': - specifier: ^1.0.1 + specifier: 1.0.1 version: 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@zxcvbn-ts/core': specifier: 3.0.4 @@ -521,19 +524,16 @@ importers: version: link:../testing '@rsdoctor/rspack-plugin': specifier: ^0.4.13 - version: 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + version: 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rspack/cli': specifier: ^1.4.11 - version: 1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + version: 1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rspack/core': specifier: ^1.4.11 version: 1.4.11(@swc/helpers@0.5.17) '@rspack/plugin-react-refresh': specifier: ^1.5.0 version: 1.5.0(react-refresh@0.17.0) - '@solana/wallet-adapter-base': - specifier: ^0.9.27 - version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)) '@svgr/webpack': specifier: ^6.5.1 version: 6.5.1 @@ -1001,7 +1001,7 @@ importers: version: 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start': specifier: 1.132.0 - version: 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + version: 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) esbuild-plugin-file-path-extensions: specifier: ^2.1.4 version: 2.1.4 @@ -2614,7 +2614,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {node: '>=0.10.0'} + engines: {'0': node >=0.10.0} '@expo/cli@0.22.26': resolution: {integrity: sha512-I689wc8Fn/AX7aUGiwrh3HnssiORMJtR2fpksX+JIe8Cj/EDleblYMSwRPd0025wrwOV9UN1KM/RuEt/QjCS3Q==} @@ -20084,12 +20084,12 @@ snapshots: '@rsdoctor/client@0.4.13': {} - '@rsdoctor/core@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@rsdoctor/core@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: - '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) axios: 1.7.9 enhanced-resolve: 5.12.0 filesize: 10.1.6 @@ -20107,10 +20107,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@rsdoctor/graph@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) lodash.unionby: 4.8.0 socket.io: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) source-map: 0.7.6 @@ -20121,13 +20121,13 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@rsdoctor/rspack-plugin@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: - '@rsdoctor/core': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/core': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/sdk': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@rspack/core': 1.4.11(@swc/helpers@0.5.17) lodash: 4.17.21 transitivePeerDependencies: @@ -20137,12 +20137,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@rsdoctor/sdk@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@rsdoctor/client': 0.4.13 - '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) - '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/graph': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@rsdoctor/utils': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@types/fs-extra': 11.0.4 body-parser: 1.20.3 cors: 2.8.5 @@ -20162,20 +20162,20 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@rsdoctor/types@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 '@types/tapable': 2.2.7 source-map: 0.7.6 - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) optionalDependencies: '@rspack/core': 1.4.11(@swc/helpers@0.5.17) - '@rsdoctor/utils@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@rsdoctor/utils@0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@babel/code-frame': 7.25.7 - '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rsdoctor/types': 0.4.13(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@types/estree': 1.0.5 acorn: 8.15.0 acorn-import-assertions: 1.9.0(acorn@8.15.0) @@ -20241,11 +20241,11 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.4.11 '@rspack/binding-win32-x64-msvc': 1.4.11 - '@rspack/cli@1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@rspack/cli@1.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@discoveryjs/json-ext': 0.5.7 '@rspack/core': 1.4.11(@swc/helpers@0.5.17) - '@rspack/dev-server': 1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@rspack/dev-server': 1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) colorette: 2.0.20 exit-hook: 4.0.0 interpret: 3.1.1 @@ -20269,13 +20269,13 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.17 - '@rspack/dev-server@1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@rspack/dev-server@1.1.3(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@types/express@4.17.23)(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@rspack/core': 1.4.11(@swc/helpers@0.5.17) chokidar: 3.6.0 http-proxy-middleware: 2.0.9(@types/express@4.17.23) p-retry: 6.2.0 - webpack-dev-server: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + webpack-dev-server: 5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@types/express' @@ -20873,14 +20873,14 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@tanstack/react-start@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@tanstack/react-router': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start-client': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start-server': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-utils': 1.132.0 '@tanstack/start-client-core': 1.132.0 - '@tanstack/start-plugin-core': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@tanstack/start-plugin-core': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) pathe: 2.0.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -20922,7 +20922,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@tanstack/router-plugin@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -20941,7 +20941,7 @@ snapshots: optionalDependencies: '@tanstack/react-router': 1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) vite: 7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1) - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) transitivePeerDependencies: - supports-color @@ -20983,14 +20983,14 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10))': + '@tanstack/start-plugin-core@1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.4 '@babel/types': 7.28.4 '@tanstack/router-core': 1.132.0 '@tanstack/router-generator': 1.132.0 - '@tanstack/router-plugin': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + '@tanstack/router-plugin': 1.132.0(@tanstack/react-router@1.132.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) '@tanstack/router-utils': 1.132.0 '@tanstack/server-functions-plugin': 1.132.0(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.19.2)(yaml@2.8.1)) '@tanstack/start-server-core': 1.132.0 @@ -31953,17 +31953,16 @@ snapshots: ansi-escapes: 5.0.0 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)): + terser-webpack-plugin@5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.0 - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) optionalDependencies: '@swc/core': 1.11.29(@swc/helpers@0.5.17) - esbuild: 0.25.10 terser@5.44.0: dependencies: @@ -32137,7 +32136,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.25.10)(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.2.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(jest@29.7.0(@types/node@22.18.12)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -32155,7 +32154,6 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.28.4) - esbuild: 0.25.10 ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.8.3): dependencies: @@ -33259,7 +33257,7 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@7.4.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)): + webpack-dev-middleware@7.4.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))): dependencies: colorette: 2.0.20 memfs: 4.14.0 @@ -33268,9 +33266,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) - webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)): + webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -33298,10 +33296,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10) + webpack: 5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)) transitivePeerDependencies: - bufferutil - debug @@ -33318,7 +33316,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10): + webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17)): dependencies: '@types/estree': 1.0.8 '@webassemblyjs/ast': 1.14.1 @@ -33340,7 +33338,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.10)) + terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(webpack@5.94.0(@swc/core@1.11.29(@swc/helpers@0.5.17))) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: From 6007a657670d55771f197df4d8a28b56893b1f4b Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:42:18 -0500 Subject: [PATCH 06/11] feat(clerk-js): enforce required parameters for Solana authentication methods Signed-off-by: Kenton Duprey --- packages/shared/src/types/clerk.ts | 4 ++-- packages/shared/src/types/signIn.ts | 2 +- packages/shared/src/types/signUp.ts | 2 +- packages/shared/src/types/web3.ts | 7 +------ packages/shared/src/types/web3Wallet.ts | 12 +++++++----- 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 91a48522a1a..057c47c4f62 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -872,7 +872,7 @@ export interface Clerk { /** * Authenticates user using their Solana supported Web3 wallet browser extension */ - authenticateWithSolana: (params?: AuthenticateWithSolanaParams) => Promise; + authenticateWithSolana: (params: AuthenticateWithSolanaParams) => Promise; /** * Authenticates user using their Web3 Wallet browser extension @@ -2305,7 +2305,7 @@ export interface AuthenticateWithSolanaParams { signUpContinueUrl?: string; unsafeMetadata?: SignUpUnsafeMetadata; legalAccepted?: boolean; - walletName?: string; + walletName: string; } export interface LoadedClerk extends Clerk { diff --git a/packages/shared/src/types/signIn.ts b/packages/shared/src/types/signIn.ts index 9d65bb17da0..de6d26743b5 100644 --- a/packages/shared/src/types/signIn.ts +++ b/packages/shared/src/types/signIn.ts @@ -77,7 +77,7 @@ export interface SignInResource extends ClerkResource { authenticateWithBase: () => Promise; - authenticateWithSolana: (params?: AuthenticateWithSolanaParams) => Promise; + authenticateWithSolana: (params: AuthenticateWithSolanaParams) => Promise; authenticateWithPasskey: (params?: AuthenticateWithPasskeyParams) => Promise; diff --git a/packages/shared/src/types/signUp.ts b/packages/shared/src/types/signUp.ts index 2883d1e9d9b..38da8659e9b 100644 --- a/packages/shared/src/types/signUp.ts +++ b/packages/shared/src/types/signUp.ts @@ -108,7 +108,7 @@ export interface SignUpResource extends ClerkResource { authenticateWithCoinbaseWallet: (params?: SignUpAuthenticateWithWeb3Params) => Promise; authenticateWithOKXWallet: (params?: SignUpAuthenticateWithWeb3Params) => Promise; authenticateWithBase: (params?: SignUpAuthenticateWithWeb3Params) => Promise; - authenticateWithSolana: (params?: SignUpAuthenticateWithSolanaParams) => Promise; + authenticateWithSolana: (params: SignUpAuthenticateWithSolanaParams) => Promise; __internal_toSnapshot: () => SignUpJSONSnapshot; /** diff --git a/packages/shared/src/types/web3.ts b/packages/shared/src/types/web3.ts index 182e2536766..450c8533946 100644 --- a/packages/shared/src/types/web3.ts +++ b/packages/shared/src/types/web3.ts @@ -12,12 +12,7 @@ export type OKXWalletWeb3Provider = 'okx_wallet'; export type BaseWeb3Provider = 'base'; export type SolanaWeb3Provider = 'solana'; -export type Web3Provider = - | MetamaskWeb3Provider - | BaseWeb3Provider - | CoinbaseWalletWeb3Provider - | OKXWalletWeb3Provider - | SolanaWeb3Provider; +export type Web3Provider = EthereumWeb3Provider | SolanaWeb3Provider; export type EthereumWeb3Provider = | MetamaskWeb3Provider diff --git a/packages/shared/src/types/web3Wallet.ts b/packages/shared/src/types/web3Wallet.ts index e85d55401f2..0cd683b6f03 100644 --- a/packages/shared/src/types/web3Wallet.ts +++ b/packages/shared/src/types/web3Wallet.ts @@ -2,7 +2,7 @@ import type { ClerkResource } from './resource'; import type { Web3WalletJSONSnapshot } from './snapshots'; import type { Web3Strategy } from './strategies'; import type { VerificationResource } from './verification'; -import type { Web3Provider } from './web3'; +import type { EthereumWeb3Provider, SolanaWeb3Provider } from './web3'; export type PrepareWeb3WalletVerificationParams = { strategy: Web3Strategy; @@ -25,7 +25,9 @@ export interface Web3WalletResource extends ClerkResource { __internal_toSnapshot: () => Web3WalletJSONSnapshot; } -export type GenerateSignature = (opts: GenerateSignatureParams | GenerateSolanaSignatureParams) => Promise; +export type GenerateSignature = ( + opts: GenerateEthereumSignatureParams | GenerateSolanaSignatureParams, +) => Promise; export interface AuthenticateWithWeb3Params { identifier: string; @@ -34,16 +36,16 @@ export interface AuthenticateWithWeb3Params { walletName?: string; } -export interface GenerateSignatureParams { +export interface GenerateEthereumSignatureParams { identifier: string; nonce: string; - provider?: Web3Provider; + provider: EthereumWeb3Provider; walletName?: string; } export interface GenerateSolanaSignatureParams { identifier: string; nonce: string; - provider: Extract; + provider: SolanaWeb3Provider; walletName: string; } From e5f180c60035b7bb82ab82b2c204fbd04da71e92 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:43:38 -0500 Subject: [PATCH 07/11] refactor(clerk-js): refactor web3 identifier functions with additional error handling and strict types Signed-off-by: Kenton Duprey --- packages/clerk-js/src/utils/web3.ts | 38 ++++++++++------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index d639804ff78..27a261aa00c 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -1,7 +1,8 @@ -import type { Web3Provider } from '@clerk/shared/types'; +import type { GenerateSignature, GenerateSolanaSignatureParams, Web3Provider } from '@clerk/shared/types'; import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard'; import { clerkUnsupportedEnvironmentWarning } from '@/core/errors'; +import { errorThrower } from '@/utils/errorThrower'; import { getInjectedWeb3SolanaProviders } from '@/utils/injectedWeb3SolanaProviders'; import { toHex } from './hex'; @@ -18,7 +19,7 @@ const SolanaSignMessage = `solana:signMessage`; export async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promise { const { provider, walletName } = params; - const walletProvider = await getWeb3WalletProvider(provider, walletName); + const walletProvider = await getWeb3Wallet(provider, walletName); // TODO - core-3: Improve error handling for the case when the provider is not found if (!walletProvider) { @@ -38,14 +39,9 @@ export async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promis return (identifiers && identifiers[0]) || ''; } -type GenerateWeb3SignatureParams = GenerateSignatureParams & { - provider: Web3Provider; - walletName?: string; -}; - -export async function generateWeb3Signature(params: GenerateWeb3SignatureParams): Promise { - const { identifier, nonce, provider } = params; - const wallet = await getWeb3WalletProvider(provider, params?.walletName); +export const generateWeb3Signature: GenerateSignature = async (params): Promise => { + const { identifier, nonce, provider, walletName = '' } = params; + const wallet = await getWeb3Wallet(provider, walletName); // TODO - core-3: Improve error handling for the case when the provider is not found if (!wallet) { @@ -61,7 +57,7 @@ export async function generateWeb3Signature(params: GenerateWeb3SignatureParams) console.warn(`Wallet account with address ${identifier} not found`); return ''; } - const signedMessages = await wallet.features[SolanaSignMessage]?.signMessage({ + const signedMessages = await (wallet as SolanaWalletAdapterWallet).features[SolanaSignMessage]?.signMessage({ account: walletAccount, message: new TextEncoder().encode(nonce), }); @@ -76,7 +72,7 @@ export async function generateWeb3Signature(params: GenerateWeb3SignatureParams) method: 'personal_sign', params: [`0x${toHex(nonce)}`, identifier], }); -} +}; export async function getMetamaskIdentifier(): Promise { return await getWeb3Identifier({ provider: 'metamask' }); @@ -94,11 +90,7 @@ export async function getBaseIdentifier(): Promise { return await getWeb3Identifier({ provider: 'base' }); } -type GetSolanaIdentifierParams = { - walletName?: string; -}; - -export async function getSolanaIdentifier({ walletName }: GetSolanaIdentifierParams): Promise { +export async function getSolanaIdentifier(walletName: string): Promise { return await getWeb3Identifier({ provider: 'solana', walletName }); } @@ -107,10 +99,6 @@ type GenerateSignatureParams = { nonce: string; }; -type GenerateSolanaSignatureParams = GenerateSignatureParams & { - walletName?: string; -}; - export async function generateSignatureWithMetamask(params: GenerateSignatureParams): Promise { return await generateWeb3Signature({ ...params, provider: 'metamask' }); } @@ -128,10 +116,10 @@ export async function generateSignatureWithBase(params: GenerateSignatureParams) } export async function generateSignatureWithSolana(params: GenerateSolanaSignatureParams): Promise { - return await generateWeb3Signature({ ...params, provider: 'solana', walletName: params.walletName }); + return await generateWeb3Signature({ ...params, provider: 'solana' }); } -async function getWeb3WalletProvider(provider: Web3Provider, walletName?: string) { +async function getWeb3Wallet(provider: Web3Provider, walletName?: string) { if (provider === 'coinbase_wallet') { if (__BUILD_DISABLE_RHC__) { clerkUnsupportedEnvironmentWarning('Coinbase Wallet'); @@ -170,8 +158,8 @@ async function getWeb3WalletProvider(provider: Web3Provider, walletName?: string if (provider === 'solana') { if (!walletName) { - console.warn('Wallet name must be provided to get Solana wallet provider'); - return null; + errorThrower.throw('Wallet name must be provided to get Solana wallet provider'); + return; } return await getInjectedWeb3SolanaProviders().get(walletName); } From 1c13a4ac7ef8ce707dc149e66f9460ca07b49d32 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:44:17 -0500 Subject: [PATCH 08/11] refactor(clerk-js): simplify constructor and improve wallet retrieval logic Signed-off-by: Kenton Duprey --- .../src/utils/injectedWeb3SolanaProviders.ts | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts index c740c29f647..91118cc667b 100644 --- a/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts +++ b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts @@ -7,11 +7,7 @@ class InjectedWeb3SolanaProviders { #wallets: readonly Wallet[] | undefined = undefined; static #instance: InjectedWeb3SolanaProviders | null = null; - private constructor() { - if (typeof window === 'undefined') { - return; - } - } + private constructor() {} async #initialize() { const wallets = await import('@wallet-standard/core').then(mod => mod.getWallets()); @@ -42,15 +38,16 @@ class InjectedWeb3SolanaProviders { get = async (walletName: string): Promise => { await this.#initialize(); - if (this.#wallets) { - const wallet = this.#wallets.find( - w => w.name === walletName && this.#isSolanaWallet(w) && this.#hasSignMessage(w), - ); - if (wallet && this.#isSolanaWallet(wallet)) { - return wallet; - } + const wallet = (this.#wallets || []).find( + w => w.name === walletName && this.#isSolanaWallet(w) && this.#hasSignMessage(w), + ); + if (wallet && this.#isSolanaWallet(wallet)) { + return wallet; } + if (typeof window === 'undefined') { + return undefined; + } // In case we weren't able to find the requested provider, fallback to the // global injected provider instead, if any, to allow the user to continue // the flow rather than blocking it From 5ad0053a5b729b2dad3723ea548d24a6f76b5be3 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:44:45 -0500 Subject: [PATCH 09/11] fix(clerk-js): require parameters for authenticateWithSolana method Signed-off-by: Kenton Duprey --- packages/react/src/isomorphicClerk.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index b2cec8a3ac7..c0b3b486fe4 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -1409,7 +1409,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; - authenticateWithSolana = async (params?: AuthenticateWithSolanaParams) => { + authenticateWithSolana = async (params: AuthenticateWithSolanaParams) => { const callback = () => this.clerkjs?.authenticateWithSolana(params); if (this.clerkjs && this.loaded) { return callback() as Promise; From 5ac37e0c8a69c6d601ef37335075b8814bec054e Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:46:50 -0500 Subject: [PATCH 10/11] wip: feat(clerk-js): enforce required walletName parameter for Solana authentication methods Signed-off-by: Kenton Duprey --- packages/clerk-js/src/core/clerk.ts | 6 +++--- .../clerk-js/src/core/resources/SignIn.ts | 19 +++++++++---------- .../clerk-js/src/core/resources/SignUp.ts | 8 ++++---- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index e25fbc02e3d..2ce4ea0a09d 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -49,7 +49,7 @@ import type { EnvironmentJSON, EnvironmentJSONSnapshot, EnvironmentResource, - GenerateSignatureParams, + GenerateSignature, GoogleOneTapProps, HandleEmailLinkVerificationParams, HandleOAuthCallbackParams, @@ -2257,7 +2257,7 @@ export class Clerk implements ClerkInterface { }); }; - public authenticateWithSolana = async (props: AuthenticateWithSolanaParams = {}): Promise => { + public authenticateWithSolana = async (props: AuthenticateWithSolanaParams): Promise => { await this.authenticateWithWeb3({ ...props, strategy: 'web3_solana_signature', @@ -2282,7 +2282,7 @@ export class Clerk implements ClerkInterface { const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; const identifier = await getWeb3Identifier({ provider, walletName }); - let generateSignature: (params: GenerateSignatureParams) => Promise; + let generateSignature: GenerateSignature; switch (provider) { case 'metamask': generateSignature = generateSignatureWithMetamask; diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index d11fd24984e..5970551c0a6 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -16,6 +16,7 @@ import type { EmailLinkConfig, EmailLinkFactor, EnterpriseSSOConfig, + GenerateSignature, PassKeyConfig, PasskeyFactor, PhoneCodeConfig, @@ -468,8 +469,8 @@ export class SignIn extends BaseResource implements SignInResource { }); }; - public authenticateWithSolana = async (params?: AuthenticateWithSolanaParams): Promise => { - const identifier = await getSolanaIdentifier({ walletName: params?.walletName }); + public authenticateWithSolana = async (params: AuthenticateWithSolanaParams): Promise => { + const identifier = await getSolanaIdentifier(params.walletName); return this.authenticateWithWeb3({ identifier, generateSignature: generateSignatureWithSolana, @@ -982,11 +983,12 @@ class SignInFuture implements SignInFutureResource { async web3(params: SignInFutureWeb3Params): Promise<{ error: ClerkError | null }> { const { strategy } = params; - const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; + const provider = strategy.replace('web3_', '').replace('_signature', ''); + // as Web3Provider; return runAsyncResourceTask(this.resource, async () => { let identifier; - let generateSignature; + let generateSignature: GenerateSignature; switch (provider) { case 'metamask': identifier = await getMetamaskIdentifier(); @@ -1006,11 +1008,9 @@ class SignInFuture implements SignInFutureResource { break; case 'solana': if (!params.walletName) { - throw new ClerkRuntimeError('walletName is required for solana web3 authentication', { - code: 'missing_wallet_name', - }); + throw new Error('walletName is required for solana web3 authentication'); } - identifier = await getSolanaIdentifier({ walletName: params.walletName }); + identifier = await getSolanaIdentifier(params.walletName); generateSignature = generateSignatureWithSolana; break; default: @@ -1041,7 +1041,7 @@ class SignInFuture implements SignInFutureResource { signature = await generateSignature({ identifier, nonce: message, - walletName: params.walletName, + walletName: params?.walletName, }); } catch (err) { // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing @@ -1054,7 +1054,6 @@ class SignInFuture implements SignInFutureResource { signature = await generateSignature({ identifier, nonce: message, - walletName: params.walletName, }); } else { throw err; diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 792816ec373..2af603e23cd 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -380,19 +380,19 @@ export class SignUp extends BaseResource implements SignUpResource { }; public authenticateWithSolana = async ( - params?: SignUpAuthenticateWithWeb3Params & { - walletName?: string; + params: SignUpAuthenticateWithWeb3Params & { + walletName: string; legalAccepted?: boolean; }, ): Promise => { - const identifier = await getSolanaIdentifier({ walletName: params?.walletName }); + const identifier = await getSolanaIdentifier(params.walletName); return this.authenticateWithWeb3({ identifier, generateSignature: generateSignatureWithSolana, unsafeMetadata: params?.unsafeMetadata, strategy: 'web3_solana_signature', legalAccepted: params?.legalAccepted, - walletName: params?.walletName, + walletName: params.walletName, }); }; From a1f884ec24926aa6b596379c4bf27cb25520d642 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Wed, 26 Nov 2025 16:01:44 -0500 Subject: [PATCH 11/11] fix(clerk-js): update signature generation param types to allow optional walletname Signed-off-by: Kenton Duprey --- packages/clerk-js/src/core/resources/SignIn.ts | 7 ++++--- packages/clerk-js/src/utils/web3.ts | 6 +++--- packages/shared/src/types/web3Wallet.ts | 17 ++++------------- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 5970551c0a6..62926f0161d 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -412,7 +412,7 @@ export class SignIn extends BaseResource implements SignInResource { let signature: string; try { - signature = await generateSignature({ identifier, nonce: message, provider, walletName }); + signature = await generateSignature({ identifier, nonce: message, walletName, provider }); } catch (err) { // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing // Passkey in order to authenticate, the initial generate signature request to be rejected. For this @@ -983,8 +983,7 @@ class SignInFuture implements SignInFutureResource { async web3(params: SignInFutureWeb3Params): Promise<{ error: ClerkError | null }> { const { strategy } = params; - const provider = strategy.replace('web3_', '').replace('_signature', ''); - // as Web3Provider; + const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; return runAsyncResourceTask(this.resource, async () => { let identifier; @@ -1042,6 +1041,7 @@ class SignInFuture implements SignInFutureResource { identifier, nonce: message, walletName: params?.walletName, + provider, }); } catch (err) { // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing @@ -1054,6 +1054,7 @@ class SignInFuture implements SignInFutureResource { signature = await generateSignature({ identifier, nonce: message, + provider, }); } else { throw err; diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index 27a261aa00c..404c2847166 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -1,4 +1,4 @@ -import type { GenerateSignature, GenerateSolanaSignatureParams, Web3Provider } from '@clerk/shared/types'; +import type { GenerateSignature, Web3Provider } from '@clerk/shared/types'; import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard'; import { clerkUnsupportedEnvironmentWarning } from '@/core/errors'; @@ -115,7 +115,7 @@ export async function generateSignatureWithBase(params: GenerateSignatureParams) return await generateWeb3Signature({ ...params, provider: 'base' }); } -export async function generateSignatureWithSolana(params: GenerateSolanaSignatureParams): Promise { +export async function generateSignatureWithSolana(params: GenerateSignatureParams): Promise { return await generateWeb3Signature({ ...params, provider: 'solana' }); } @@ -157,7 +157,7 @@ async function getWeb3Wallet(provider: Web3Provider, walletName?: string) { } if (provider === 'solana') { - if (!walletName) { + if (!walletName || walletName.length === 0) { errorThrower.throw('Wallet name must be provided to get Solana wallet provider'); return; } diff --git a/packages/shared/src/types/web3Wallet.ts b/packages/shared/src/types/web3Wallet.ts index 0cd683b6f03..0658cd87744 100644 --- a/packages/shared/src/types/web3Wallet.ts +++ b/packages/shared/src/types/web3Wallet.ts @@ -2,7 +2,7 @@ import type { ClerkResource } from './resource'; import type { Web3WalletJSONSnapshot } from './snapshots'; import type { Web3Strategy } from './strategies'; import type { VerificationResource } from './verification'; -import type { EthereumWeb3Provider, SolanaWeb3Provider } from './web3'; +import type { Web3Provider } from './web3'; export type PrepareWeb3WalletVerificationParams = { strategy: Web3Strategy; @@ -25,9 +25,7 @@ export interface Web3WalletResource extends ClerkResource { __internal_toSnapshot: () => Web3WalletJSONSnapshot; } -export type GenerateSignature = ( - opts: GenerateEthereumSignatureParams | GenerateSolanaSignatureParams, -) => Promise; +export type GenerateSignature = (opts: GenerateSignatureParams) => Promise; export interface AuthenticateWithWeb3Params { identifier: string; @@ -36,16 +34,9 @@ export interface AuthenticateWithWeb3Params { walletName?: string; } -export interface GenerateEthereumSignatureParams { +export interface GenerateSignatureParams { identifier: string; nonce: string; - provider: EthereumWeb3Provider; + provider: Web3Provider; walletName?: string; } - -export interface GenerateSolanaSignatureParams { - identifier: string; - nonce: string; - provider: SolanaWeb3Provider; - walletName: string; -}