From 39f392fcbad579ff024a20f1cf57ea8b23385200 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Wed, 19 Nov 2025 02:09:06 -0500 Subject: [PATCH 01/35] 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 da8f4f62bb6..e6e2bb50cf4 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -37,6 +37,7 @@ import type { AuthenticateWithGoogleOneTapParams, AuthenticateWithMetamaskParams, AuthenticateWithOKXWalletParams, + AuthenticateWithSolanaParams, BillingNamespace, Clerk as ClerkInterface, ClerkAPIError, @@ -119,6 +120,7 @@ import { generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, + generateSignatureWithSolana, getClerkQueryParam, getWeb3Identifier, hasExternalAccountSignUpError, @@ -2359,6 +2361,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, @@ -2367,6 +2376,7 @@ export class Clerk implements ClerkInterface { strategy, legalAccepted, secondFactorUrl, + walletName, }: ClerkAuthenticateWithWeb3Params): Promise => { if (!this.client || !this.environment) { return; @@ -2387,6 +2397,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 73f43de78e6..f24fac489c2 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 || {}; @@ -990,6 +1002,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}`); } @@ -1015,7 +1031,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 @@ -1024,7 +1044,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 c493c19dfd9..92a8677b3b7 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx @@ -243,6 +243,8 @@ function SignInFactorOneInternal(): JSX.Element { onShowAlternativeMethodsClicked={toggleAllStrategies} /> ); + // case 'web3_solana_signature': + // return ; case 'reset_password_phone_code': return ( handleError(err)); }} 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 c57d931bd40..163411bad4e 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -2284,6 +2284,7 @@ export interface ClerkAuthenticateWithWeb3Params { strategy: Web3Strategy; legalAccepted?: boolean; secondFactorUrl?: string; + walletName?: string; } export type JoinWaitlistParams = { @@ -2327,6 +2328,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 dffeaefbb6af7ce7c7cec384787e48312ac1cafb Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Fri, 21 Nov 2025 15:40:37 -0500 Subject: [PATCH 02/35] 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 bcbbeb86c4b..436a3433792 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -68,9 +68,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 e6e2bb50cf4..cd139207394 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -2385,7 +2385,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 f24fac489c2..156fbef40d7 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, @@ -1003,7 +1008,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: @@ -1034,7 +1044,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 @@ -1047,7 +1057,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 163411bad4e..42341cd4b78 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -2334,6 +2334,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 56086e7818ed35ea0affc1ead3783b1fec5304cb Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 24 Nov 2025 03:16:50 -0500 Subject: [PATCH 03/35] 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 436a3433792..bfa5add57ba 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -68,6 +68,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", @@ -78,6 +79,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", @@ -92,6 +94,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 cd139207394..786546f99d9 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -2429,6 +2429,7 @@ export class Clerk implements ClerkInterface { identifier, generateSignature, strategy, + walletName, }); } catch (err) { if (isError(err, ERROR_CODES.FORM_IDENTIFIER_NOT_FOUND)) { @@ -2438,6 +2439,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 156fbef40d7..7d1dea6f7bd 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 f234ded2ddd..f0d0b27dd09 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 92a8677b3b7..c493c19dfd9 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx @@ -243,8 +243,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 d060373c57f..15ceae5c035 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx @@ -80,9 +80,9 @@ export const SignInSocialButtons = React.memo((props: SignInSocialButtonsProps) .catch(err => handleError(err)); }} 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 6f660525375..62c995374dd 100644 --- a/packages/clerk-js/src/ui/elements/contexts/index.tsx +++ b/packages/clerk-js/src/ui/elements/contexts/index.tsx @@ -128,7 +128,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 fc8b450987f..a03222e6d58 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -18,6 +18,7 @@ import type { AuthenticateWithGoogleOneTapParams, AuthenticateWithMetamaskParams, AuthenticateWithOKXWalletParams, + AuthenticateWithSolanaParams, BillingNamespace, Clerk, ClerkAuthenticateWithWeb3Params, @@ -1432,6 +1433,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 42341cd4b78..ff2b25852d2 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -887,6 +887,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 774a2ac47a0b89476a37cba10bb8b4c2814c153b Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:11:47 -0500 Subject: [PATCH 04/35] 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 addc5e0e0330f31b791540e393b41a25749ca0fc Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:39:33 -0500 Subject: [PATCH 05/35] 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 bfa5add57ba..5440f1f8d87 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -68,13 +68,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", @@ -94,7 +95,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 e6fcc916602dfa087f22dcb5c88ac8d3a89b2f99 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:42:18 -0500 Subject: [PATCH 06/35] 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 ff2b25852d2..5834e54270c 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -890,7 +890,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 @@ -2339,7 +2339,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 d71f50affb1bc9f43a91c1be9d90b60013eb818f Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:43:38 -0500 Subject: [PATCH 07/35] 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 a42bd0cde932907ba4cdad22052768a23e964931 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:44:17 -0500 Subject: [PATCH 08/35] 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 d5c58976ed315fe33dcf908c2ee7689e99b95c07 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:44:45 -0500 Subject: [PATCH 09/35] 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 a03222e6d58..8a77e630509 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -1433,7 +1433,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 e139478cab0101a152ba50c0e2d26995a12ff10c Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 25 Nov 2025 23:46:50 -0500 Subject: [PATCH 10/35] 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 786546f99d9..91fa72f9e0e 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -52,7 +52,7 @@ import type { EnvironmentJSON, EnvironmentJSONSnapshot, EnvironmentResource, - GenerateSignatureParams, + GenerateSignature, GoogleOneTapProps, HandleEmailLinkVerificationParams, HandleOAuthCallbackParams, @@ -2361,7 +2361,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', @@ -2386,7 +2386,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 7d1dea6f7bd..37690893211 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, @@ -986,11 +987,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(); @@ -1010,11 +1012,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: @@ -1045,7 +1045,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 @@ -1058,7 +1058,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 f0d0b27dd09..60677cbaab5 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 741ce437b7506bd5baaf41b719ae6b9570babeb2 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Wed, 26 Nov 2025 16:01:44 -0500 Subject: [PATCH 11/35] 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 37690893211..15bb71a1e5c 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 @@ -987,8 +987,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; @@ -1046,6 +1045,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 @@ -1058,6 +1058,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; -} From cdd0a4b72d00763f43eabb9d3738557a6bd98b37 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 1 Dec 2025 22:51:35 -0500 Subject: [PATCH 12/35] chore(clerk-js): remove unused @wallet-standard/react dependency from package.json and pnpm-lock.yaml Signed-off-by: Kenton Duprey --- packages/clerk-js/package.json | 1 - pnpm-lock.yaml | 90 ---------------------------------- 2 files changed, 91 deletions(-) diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 5440f1f8d87..d14de10bbe6 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -75,7 +75,6 @@ "@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/pnpm-lock.yaml b/pnpm-lock.yaml index 9906328dce3..3475629afdd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -473,9 +473,6 @@ importers: '@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 @@ -6006,45 +6003,10 @@ packages: 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'} @@ -22119,62 +22081,10 @@ snapshots: 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 From ab02fa67527e99a827efce06137accee63bbf3a3 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 2 Dec 2025 01:50:14 -0500 Subject: [PATCH 13/35] chore(clerk-js): remove bs58 dependency from package.json and pnpm-lock.yaml Signed-off-by: Kenton Duprey --- packages/clerk-js/package.json | 1 - packages/clerk-js/src/utils/web3.ts | 45 +++++++++++++++++++---------- pnpm-lock.yaml | 3 -- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index d14de10bbe6..958d9aeabbe 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -79,7 +79,6 @@ "@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", diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index 404c2847166..e33f82c47b3 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -2,6 +2,7 @@ import type { GenerateSignature, Web3Provider } from '@clerk/shared/types'; import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard'; import { clerkUnsupportedEnvironmentWarning } from '@/core/errors'; +import { ClerkRuntimeError } from '@/index.headless'; import { errorThrower } from '@/utils/errorThrower'; import { getInjectedWeb3SolanaProviders } from '@/utils/injectedWeb3SolanaProviders'; @@ -51,21 +52,32 @@ export const generateWeb3Signature: GenerateSignature = async (params): Promise< } 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 as SolanaWalletAdapterWallet).features[SolanaSignMessage]?.signMessage({ - account: walletAccount, - message: new TextEncoder().encode(nonce), - }); - if (!signedMessages || signedMessages.length === 0) { - console.warn('No signed messages returned from wallet'); - return ''; + try { + 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 as SolanaWalletAdapterWallet).features[SolanaSignMessage]?.signMessage({ + account: walletAccount, + message: new TextEncoder().encode(nonce), + }); + if (!signedMessages || signedMessages.length === 0) { + console.warn('No signed messages returned from wallet'); + return ''; + } + return Array.from(signedMessages[0].signature).toString(); + } catch (err) { + if (err instanceof Error && err.message.includes('User rejected the request.')) { + throw new ClerkRuntimeError('Web3 signature request was rejected by the user.', { + code: 'web3_signature_request_rejected', + }); + } + throw new ClerkRuntimeError('An error occurred while generating the Solana signature.', { + code: 'web3_solana_signature_error', + cause: err, + }); } - return bs58.encode(signedMessages[0].signature); } return await wallet.request({ @@ -90,7 +102,10 @@ export async function getBaseIdentifier(): Promise { return await getWeb3Identifier({ provider: 'base' }); } -export async function getSolanaIdentifier(walletName: string): Promise { +export async function getSolanaIdentifier(walletName?: string): Promise { + if (!walletName) { + throw new Error('walletName is required for solana web3 authentication'); + } return await getWeb3Identifier({ provider: 'solana', walletName }); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3475629afdd..6e651082b19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -485,9 +485,6 @@ 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 From 16d3baa3378c9ba61a5ce822e09d625f0957b1d5 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 2 Dec 2025 02:06:59 -0500 Subject: [PATCH 14/35] fix(clerk-js): cleanup solana authentication flow and improve error handling Signed-off-by: Kenton Duprey --- .../clerk-js/src/core/resources/SignIn.ts | 5 +- .../SignInFactorOneSolanaWalletsCard.tsx | 34 ++- .../SignUp/SignUpStartSolanaWalletsCard.tsx | 42 ++-- .../src/ui/elements/Web3WalletButtons.tsx | 224 +++++++++++++++--- .../src/ui/utils/web3CallbackErrorHandler.ts | 4 +- packages/clerk-js/src/utils/web3.ts | 6 +- 6 files changed, 222 insertions(+), 93 deletions(-) diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 15bb71a1e5c..566b2733863 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -475,7 +475,7 @@ export class SignIn extends BaseResource implements SignInResource { identifier, generateSignature: generateSignatureWithSolana, strategy: 'web3_solana_signature', - walletName: params?.walletName, + walletName: params.walletName, }); }; @@ -1010,9 +1010,6 @@ class SignInFuture implements SignInFutureResource { generateSignature = generateSignatureWithOKXWallet; break; case 'solana': - if (!params.walletName) { - throw new Error('walletName is required for solana web3 authentication'); - } identifier = await getSolanaIdentifier(params.walletName); generateSignature = generateSignatureWithSolana; break; diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx index 359598ff551..bc6f31213f7 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx @@ -7,7 +7,7 @@ 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 { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler'; import { useSignInContext } from '../../contexts'; import { useRouter } from '../../router'; @@ -18,23 +18,6 @@ const SignInFactorOneSolanaWalletsCardInner = () => { 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('../'); }; @@ -52,7 +35,20 @@ const SignInFactorOneSolanaWalletsCardInner = () => { direction='col' gap={4} > - + { + return clerk + .authenticateWithWeb3({ + customNavigate: router.navigate, + redirectUrl: ctx.afterSignInUrl || '/', + secondFactorUrl: 'factor-two', + signUpContinueUrl: ctx.isCombinedFlow ? '../create/continue' : ctx.signUpContinueUrl, + strategy: 'web3_solana_signature', + walletName, + }) + .catch(err => web3CallbackErrorHandler(err, card.setError)); + }} + /> { 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('../'); }; @@ -58,7 +35,22 @@ const SignUpStartSolanaWalletsCardInner = () => { direction='col' gap={4} > - + { + return clerk + .authenticateWithWeb3({ + customNavigate: router.navigate, + redirectUrl: ctx.afterSignUpUrl || '/', + signUpContinueUrl: '../continue', + strategy: 'web3_solana_signature', + unsafeMetadata: ctx.unsafeMetadata, + // TODO: Add support to pass legalAccepted status + // legalAccepted: , + walletName, + }) + .catch(err => web3CallbackErrorHandler(err, card.setError)); + }} + /> Promise; + web3AuthCallback: ({ walletName }: { walletName: string }) => Promise; }; -const Web3WalletButtonsInner = ({ onSelect }: Web3WalletButtonsProps) => { +const SOCIAL_BUTTON_BLOCK_THRESHOLD = 2; +const SOCIAL_BUTTON_PRE_TEXT_THRESHOLD = 1; +const MAX_STRATEGIES_PER_ROW = 5; + +const Web3WalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsProps) => { const card = useCardState(); const { wallets } = useWallet(); @@ -31,6 +40,24 @@ const Web3WalletButtonsInner = ({ onSelect }: Web3WalletButtonsProps) => { [wallets], ); + const startWeb3AuthFlow = (walletName: string) => async () => { + card.setLoading(walletName); + try { + await web3AuthCallback({ walletName }); + } catch (error) { + await sleep(1000); + card.setError(error); + } finally { + await sleep(5000); + card.setIdle(); + } + }; + + const { strategyRows } = distributeStrategiesIntoRows(installedWallets, MAX_STRATEGIES_PER_ROW, undefined); + const strategyRowOneLength = strategyRows.at(0)?.length ?? 0; + const shouldForceSingleColumnOnMobile = installedWallets.length === 2; + const ButtonElement = installedWallets.length <= SOCIAL_BUTTON_BLOCK_THRESHOLD ? WalletButtonBlock : WalletButtonIcon; + if (installedWallets.length === 0) { return ( @@ -58,50 +85,173 @@ const Web3WalletButtonsInner = ({ onSelect }: Web3WalletButtonsProps) => { ); } + return ( - - {installedWallets.map(w => ( - + ); +}); + +const WalletButtonBlock = forwardRef((props: WalletButtonProps, ref: Ref | null): JSX.Element => { + const { id, icon, isLoading, label, ...rest } = props; + const isIconElement = isValidElement(icon); + + return ( + [ + { + gap: theme.space.$4, + position: 'relative', + justifyContent: 'flex-start', + }, + props.sx, + ]} + > + + {(isLoading || icon) && ( ({ flex: `0 0 ${theme.space.$4}` })} > - {w.icon && ( - {w.name} ({ width: theme.sizes.$4, height: 'auto', maxWidth: '100%' })} + {isLoading ? ( + + ) : !isIconElement && icon ? ( + ({ + color: theme.colors.$neutralAlpha600, + width: theme.sizes.$4, + position: 'absolute', + }), + ]} + /> + ) : ( + icon )} - - {w.name} - - - ))} - + )} + + {label} + + + ); -}; +}); export const Web3WalletButtons = (props: Web3WalletButtonsProps) => { const network = MAINNET_ENDPOINT; @@ -114,9 +264,7 @@ export const Web3WalletButtons = (props: Web3WalletButtonsProps) => { console.error(err); }} > - {/* */} - - {/* */} + ); diff --git a/packages/clerk-js/src/ui/utils/web3CallbackErrorHandler.ts b/packages/clerk-js/src/ui/utils/web3CallbackErrorHandler.ts index 62fd98dcfe8..985b73f2861 100644 --- a/packages/clerk-js/src/ui/utils/web3CallbackErrorHandler.ts +++ b/packages/clerk-js/src/ui/utils/web3CallbackErrorHandler.ts @@ -10,8 +10,8 @@ type Web3CallbackErrorHandler = { export const web3CallbackErrorHandler: Web3CallbackErrorHandler = (err, setError) => { if ( isClerkAPIResponseError(err) && - err.errors[0].meta?.paramName === 'identifier' && - err.errors[0].code === 'form_param_nil' + err.errors?.[0]?.meta?.paramName === 'identifier' && + err.errors?.[0]?.code === 'form_param_nil' ) { const error = new ClerkRuntimeError('A Web3 Wallet extension cannot be found. Please install one to continue.', { code: 'web3_missing_identifier', diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index e33f82c47b3..778c635c105 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -62,11 +62,7 @@ export const generateWeb3Signature: GenerateSignature = async (params): Promise< account: walletAccount, message: new TextEncoder().encode(nonce), }); - if (!signedMessages || signedMessages.length === 0) { - console.warn('No signed messages returned from wallet'); - return ''; - } - return Array.from(signedMessages[0].signature).toString(); + return signedMessages?.[0]?.signature ? Array.from(signedMessages[0].signature).toString() : ''; } catch (err) { if (err instanceof Error && err.message.includes('User rejected the request.')) { throw new ClerkRuntimeError('Web3 signature request was rejected by the user.', { From b8881605ab7a76433fe830eebf17bd2c0345a2a8 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 2 Dec 2025 16:42:48 -0500 Subject: [PATCH 15/35] feat(clerk-js): enhance Solana wallet integration with localization support Signed-off-by: Kenton Duprey --- .../SignInFactorOneSolanaWalletsCard.tsx | 7 +-- .../SignUp/SignUpStartSolanaWalletsCard.tsx | 6 +- .../src/ui/elements/Web3WalletButtons.tsx | 56 +++++++++++-------- packages/localizations/src/en-US.ts | 14 +++++ packages/shared/src/types/localization.ts | 14 +++++ 5 files changed, 66 insertions(+), 31 deletions(-) diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx index bc6f31213f7..e5049bff82c 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx @@ -1,7 +1,7 @@ import { useClerk } from '@clerk/shared/react'; import { withRedirectToAfterSignIn, withRedirectToSignInTask } from '@/ui/common/withRedirect'; -import { descriptors, Flex, Flow } from '@/ui/customizables'; +import { descriptors, Flex, Flow, localizationKeys } from '@/ui/customizables'; import { BackLink } from '@/ui/elements/BackLink'; import { Card } from '@/ui/elements/Card'; import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; @@ -27,8 +27,8 @@ const SignInFactorOneSolanaWalletsCardInner = () => { - Continue with Solana Wallet - Select a wallet below to sign in + + {card.error} { .catch(err => web3CallbackErrorHandler(err, card.setError)); }} /> - { - Sign up with Solana Wallet - Select a wallet below to sign up + + {card.error} { const card = useCardState(); const { wallets } = useWallet(); + const { t } = useLocalizations(); // Filter to only show installed wallets const installedWallets = React.useMemo( @@ -61,27 +75,19 @@ const Web3WalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsProps) => if (installedWallets.length === 0) { return ( - No Solana wallets detected. Please install a Solana supported wallet extension like{' '} - - Phantom - {' '} - or{' '} - - Backpack - - . + sx={t => ({ + textDecoration: 'underline', + textUnderlineOffset: t.space.$1, + color: 'inherit', + })} + /> ); } @@ -120,14 +126,16 @@ const Web3WalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsProps) => > {row.map(w => { const shouldShowPreText = installedWallets.length === SOCIAL_BUTTON_PRE_TEXT_THRESHOLD; - const label = shouldShowPreText ? `Continue with ${w.name}` : w.name; + const label = shouldShowPreText + ? localizationKeys('web3WalletButtons.continue', { walletName: w.name }) + : w.name; const imageOrInitial = w.icon ? ( {`Sign ({ width: theme.sizes.$4, height: 'auto', maxWidth: '100%' })} /> ) : ( @@ -145,7 +153,7 @@ const Web3WalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsProps) => onClick={startWeb3AuthFlow(w.name)} isLoading={card.loadingMetadata === w.name} isDisabled={card.isLoading} - label={label} + label={t(label)} icon={imageOrInitial} /> ); diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index 380c4dc31d7..aedd8320d1c 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -747,6 +747,10 @@ export const enUS: LocalizationResource = { subtitle: 'To continue, please enter the verification code generated by your authenticator app', title: 'Two-step verification', }, + web3Solana: { + title: 'Sign in with Solana', + subtitle: 'Select a wallet below to sign in', + }, }, signInEnterPasswordTitle: 'Enter your password', signUp: { @@ -839,6 +843,16 @@ export const enUS: LocalizationResource = { title: 'Create your account', titleCombined: 'Create your account', }, + web3Solana: { + title: 'Sign up with Solana', + subtitle: 'Select a wallet below to sign up', + }, + }, + web3WalletButtons: { + connect: 'Connect with {{walletName}}', + continue: 'Continue with {{walletName}}', + noneAvailable: + 'No Solana Web3 wallets detected. Please install a Web3 supported {{ solanaWalletsLink || link("wallet extension") }}.', }, socialButtonsBlockButton: 'Continue with {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index 266cc6cb00b..78d245c130d 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -369,6 +369,11 @@ export type __internal_LocalizationResource = { title: LocalizationValue; subtitle: LocalizationValue; }; + web3Solana: { + title: LocalizationValue; + subtitle: LocalizationValue; + noAvailableWallets: LocalizationValue; + }; }; signIn: { start: { @@ -547,6 +552,10 @@ export type __internal_LocalizationResource = { title: LocalizationValue; subtitle: LocalizationValue; }; + web3Solana: { + title: LocalizationValue; + subtitle: LocalizationValue; + }; }; reverification: { password: { @@ -1299,6 +1308,11 @@ export type __internal_LocalizationResource = { }; formButtonPrimary: LocalizationValue; }; + web3WalletButtons: { + connect: LocalizationValue<'walletName'>; + continue: LocalizationValue<'walletName'>; + noneAvailable: LocalizationValue<'solanaWalletsLink'>; + }; }; type WithParamName = T & From 69662d49874adb32f2a6329d7e040bbbe33865bc Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 2 Dec 2025 19:17:53 -0500 Subject: [PATCH 16/35] fix(clerk-js): require wallet name for Solana authentication and improve error handling Signed-off-by: Kenton Duprey --- packages/clerk-js/src/core/clerk.ts | 8 +++++++- packages/clerk-js/src/core/resources/SignIn.ts | 9 +++++++-- packages/clerk-js/src/core/resources/SignUp.ts | 2 +- packages/clerk-js/src/utils/web3.ts | 11 ++++++----- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 91fa72f9e0e..d67d37c00f5 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -2398,7 +2398,13 @@ export class Clerk implements ClerkInterface { generateSignature = generateSignatureWithCoinbaseWallet; break; case 'solana': - generateSignature = generateSignatureWithSolana; + if (!walletName) { + throw new ClerkRuntimeError('Wallet name is required for Solana authentication.', { + code: 'web3_solana_wallet_name_required', + }); + } + // Solana requires walletName; bind it into the helper + generateSignature = params => generateSignatureWithSolana({ ...params, walletName }); break; default: generateSignature = generateSignatureWithOKXWallet; diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 566b2733863..e60c23eab91 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -473,7 +473,7 @@ export class SignIn extends BaseResource implements SignInResource { const identifier = await getSolanaIdentifier(params.walletName); return this.authenticateWithWeb3({ identifier, - generateSignature: generateSignatureWithSolana, + generateSignature: p => generateSignatureWithSolana({ ...p, walletName: params.walletName }), strategy: 'web3_solana_signature', walletName: params.walletName, }); @@ -1010,8 +1010,13 @@ class SignInFuture implements SignInFutureResource { generateSignature = generateSignatureWithOKXWallet; break; case 'solana': + if (!params.walletName) { + throw new ClerkRuntimeError('Wallet name is required for Solana authentication.', { + code: 'web3_solana_wallet_name_required', + }); + } identifier = await getSolanaIdentifier(params.walletName); - generateSignature = generateSignatureWithSolana; + generateSignature = p => generateSignatureWithSolana({ ...p, walletName: params.walletName as string }); break; default: throw new Error(`Unsupported Web3 provider: ${provider}`); diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 60677cbaab5..1ef742b87ed 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -388,7 +388,7 @@ export class SignUp extends BaseResource implements SignUpResource { const identifier = await getSolanaIdentifier(params.walletName); return this.authenticateWithWeb3({ identifier, - generateSignature: generateSignatureWithSolana, + generateSignature: p => generateSignatureWithSolana({ ...p, walletName: params.walletName }), unsafeMetadata: params?.unsafeMetadata, strategy: 'web3_solana_signature', legalAccepted: params?.legalAccepted, diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index 778c635c105..92ab454a276 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -98,10 +98,7 @@ export async function getBaseIdentifier(): Promise { return await getWeb3Identifier({ provider: 'base' }); } -export async function getSolanaIdentifier(walletName?: string): Promise { - if (!walletName) { - throw new Error('walletName is required for solana web3 authentication'); - } +export async function getSolanaIdentifier(walletName: string): Promise { return await getWeb3Identifier({ provider: 'solana', walletName }); } @@ -110,6 +107,10 @@ type GenerateSignatureParams = { nonce: string; }; +type GenerateSolanaSignatureParams = GenerateSignatureParams & { + walletName: string; +}; + export async function generateSignatureWithMetamask(params: GenerateSignatureParams): Promise { return await generateWeb3Signature({ ...params, provider: 'metamask' }); } @@ -126,7 +127,7 @@ export async function generateSignatureWithBase(params: GenerateSignatureParams) return await generateWeb3Signature({ ...params, provider: 'base' }); } -export async function generateSignatureWithSolana(params: GenerateSignatureParams): Promise { +export async function generateSignatureWithSolana(params: GenerateSolanaSignatureParams): Promise { return await generateWeb3Signature({ ...params, provider: 'solana' }); } From be0c43c2b71ae594b684a2ede23b72152d30c24c Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 2 Dec 2025 23:03:15 -0500 Subject: [PATCH 17/35] feat(web3): convert signature Uint8Array to base64 string in generateWeb3Signature Signed-off-by: Kenton Duprey --- packages/clerk-js/src/utils/web3.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index 92ab454a276..d0e9247776b 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -62,7 +62,8 @@ export const generateWeb3Signature: GenerateSignature = async (params): Promise< account: walletAccount, message: new TextEncoder().encode(nonce), }); - return signedMessages?.[0]?.signature ? Array.from(signedMessages[0].signature).toString() : ''; + // Convert signature Uint8Array to base64 string + return signedMessages?.[0]?.signature ? btoa(String.fromCharCode(...signedMessages[0].signature)) : ''; } catch (err) { if (err instanceof Error && err.message.includes('User rejected the request.')) { throw new ClerkRuntimeError('Web3 signature request was rejected by the user.', { From 6a9cae3e1806a4ce77cb8c614b1bab64020a200f Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Wed, 3 Dec 2025 23:23:23 -0500 Subject: [PATCH 18/35] feat(clerk-js): improve error handling localization for Solana signature generation Signed-off-by: Kenton Duprey --- packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx | 5 +---- packages/clerk-js/src/utils/web3.ts | 2 +- packages/localizations/src/en-US.ts | 3 +++ packages/shared/src/types/localization.ts | 2 ++ 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx b/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx index 8413426831a..e1c41664dca 100644 --- a/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx +++ b/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx @@ -58,11 +58,8 @@ const Web3WalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsProps) => card.setLoading(walletName); try { await web3AuthCallback({ walletName }); - } catch (error) { + } catch { await sleep(1000); - card.setError(error); - } finally { - await sleep(5000); card.setIdle(); } }; diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index d0e9247776b..f7dda84318f 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -71,7 +71,7 @@ export const generateWeb3Signature: GenerateSignature = async (params): Promise< }); } throw new ClerkRuntimeError('An error occurred while generating the Solana signature.', { - code: 'web3_solana_signature_error', + code: 'web3_solana_signature_generation_failed', cause: err, }); } diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index aedd8320d1c..c6d0e5665f6 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -951,6 +951,9 @@ export const enUS: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'A Web3 Wallet extension cannot be found. Please install one to continue.', + web3_signature_request_rejected: 'You have rejected the signature request. Please try again to continue.', + web3_solana_signature_generation_failed: + 'An error occurred while generating the signature. Please try again to continue.', zxcvbn: { couldBeStronger: 'Your password works, but could be stronger. Try adding more characters.', goodPassword: 'Your password meets all the necessary requirements.', diff --git a/packages/shared/src/types/localization.ts b/packages/shared/src/types/localization.ts index 78d245c130d..cde6c6f3976 100644 --- a/packages/shared/src/types/localization.ts +++ b/packages/shared/src/types/localization.ts @@ -1331,6 +1331,8 @@ type UnstableErrors = WithParamName<{ passkey_registration_cancelled: LocalizationValue; passkey_already_exists: LocalizationValue; web3_missing_identifier: LocalizationValue; + web3_solana_signature_generation_failed: LocalizationValue; + web3_signature_request_rejected: LocalizationValue; form_password_pwned: LocalizationValue; form_password_pwned__sign_in: LocalizationValue; /** @deprecated Use `form_password_compromised__sign_in` instead */ From e8dbc8d994a29b1da667df28dbd7317b7a875fc7 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Wed, 3 Dec 2025 23:47:59 -0500 Subject: [PATCH 19/35] fix(clerk-js): Dynamically load Web3WalletButtons (#7364) Co-authored-by: Dylan Staley <88163+dstaley@users.noreply.github.com> --- packages/clerk-js/bundle-check.mjs | 4 +- packages/clerk-js/bundlewatch.config.json | 13 +++--- packages/clerk-js/rspack.config.js | 30 +++++++++++-- .../SignInFactorOneSolanaWalletsCard.tsx | 39 ++++++++++------- .../SignUp/SignUpStartSolanaWalletsCard.tsx | 42 +++++++++++-------- 5 files changed, 85 insertions(+), 43 deletions(-) diff --git a/packages/clerk-js/bundle-check.mjs b/packages/clerk-js/bundle-check.mjs index b3058837813..ee31203690a 100644 --- a/packages/clerk-js/bundle-check.mjs +++ b/packages/clerk-js/bundle-check.mjs @@ -5,7 +5,7 @@ import path from 'node:path'; import { pipeline } from 'node:stream'; import zlib from 'node:zlib'; -import { chromium } from 'playwright'; +import { chromium } from '@playwright/test'; /** * This script generates a CLI report detailing the gzipped size of JavaScript resources loaded by `clerk-js` for a @@ -212,7 +212,7 @@ function report(url, responses) { /** * Loads the given `url` in `browser`, capturing all HTTP requests that occur. - * @param {import('playwright').Browser} browser + * @param {import('@playwright/test').Browser} browser * @param {string} url */ async function getResponseSizes(browser, url) { diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index 3425146261d..2bb27648ace 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,12 +1,13 @@ { "files": [ - { "path": "./dist/clerk.js", "maxSize": "840KB" }, - { "path": "./dist/clerk.browser.js", "maxSize": "83KB" }, - { "path": "./dist/clerk.legacy.browser.js", "maxSize": "127KB" }, + { "path": "./dist/clerk.js", "maxSize": "918KB" }, + { "path": "./dist/clerk.browser.js", "maxSize": "84KB" }, + { "path": "./dist/clerk.channel.browser.js", "maxSize": "85KB" }, + { "path": "./dist/clerk.legacy.browser.js", "maxSize": "129KB" }, { "path": "./dist/clerk.headless*.js", "maxSize": "65KB" }, { "path": "./dist/ui-common*.js", "maxSize": "119KB" }, { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "122KB" }, - { "path": "./dist/vendors*.js", "maxSize": "47KB" }, + { "path": "./dist/vendors*.js", "maxSize": "50KB" }, { "path": "./dist/coinbase*.js", "maxSize": "38KB" }, { "path": "./dist/stripe-vendors*.js", "maxSize": "1KB" }, { "path": "./dist/createorganization*.js", "maxSize": "5KB" }, @@ -15,11 +16,11 @@ { "path": "./dist/organizationswitcher*.js", "maxSize": "5KB" }, { "path": "./dist/organizationlist*.js", "maxSize": "5.5KB" }, { "path": "./dist/signin*.js", "maxSize": "18KB" }, - { "path": "./dist/signup*.js", "maxSize": "9.5KB" }, + { "path": "./dist/signup*.js", "maxSize": "11KB" }, { "path": "./dist/userbutton*.js", "maxSize": "5KB" }, { "path": "./dist/userprofile*.js", "maxSize": "16KB" }, { "path": "./dist/userverification*.js", "maxSize": "5KB" }, - { "path": "./dist/onetap*.js", "maxSize": "1KB" }, + { "path": "./dist/onetap*.js", "maxSize": "3KB" }, { "path": "./dist/waitlist*.js", "maxSize": "1.5KB" }, { "path": "./dist/keylessPrompt*.js", "maxSize": "6.5KB" }, { "path": "./dist/enableOrganizationsPrompt*.js", "maxSize": "6.5KB" }, diff --git a/packages/clerk-js/rspack.config.js b/packages/clerk-js/rspack.config.js index 9b082397aa8..ff22955e6f7 100644 --- a/packages/clerk-js/rspack.config.js +++ b/packages/clerk-js/rspack.config.js @@ -126,17 +126,41 @@ const common = ({ mode, variant, disableRHC = false }) => { signUp: { minChunks: 1, name: 'signup', - test: module => !!(module.resource && module.resource.includes('/ui/components/SignUp')), + test: module => + !!( + module instanceof rspack.NormalModule && + module.resource && + module.resource.includes('/ui/components/SignUp') + ), }, common: { minChunks: 1, name: 'ui-common', priority: -20, - test: module => !!(module.resource && !module.resource.includes('/ui/components')), + test: module => + !!( + module instanceof rspack.NormalModule && + module.resource && + !module.resource.includes('/ui/components') && + !module.resource.includes('node_modules') + ), }, defaultVendors: { minChunks: 1, - test: /[\\/]node_modules[\\/]/, + test: module => { + if (!(module instanceof rspack.NormalModule) || !module.resource) { + return false; + } + // Exclude Solana packages and their known transitive dependencies + if ( + /[\\/]node_modules[\\/](@solana|@solana-mobile|@wallet-standard|bn\.js|borsh|buffer|superstruct|bs58|jayson|rpc-websockets|qrcode)[\\/]/.test( + module.resource, + ) + ) { + return false; + } + return /[\\/]node_modules[\\/]/.test(module.resource); + }, name: 'vendors', priority: -10, }, diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx index e5049bff82c..187191216e0 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx @@ -1,4 +1,5 @@ import { useClerk } from '@clerk/shared/react'; +import { lazy, Suspense } from 'react'; import { withRedirectToAfterSignIn, withRedirectToSignInTask } from '@/ui/common/withRedirect'; import { descriptors, Flex, Flow, localizationKeys } from '@/ui/customizables'; @@ -6,9 +7,14 @@ 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 { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler'; +const Web3WalletButtons = lazy(() => + import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3WalletButtons').then(m => ({ + default: m.Web3WalletButtons, + })), +); + import { useSignInContext } from '../../contexts'; import { useRouter } from '../../router'; @@ -35,20 +41,23 @@ const SignInFactorOneSolanaWalletsCardInner = () => { direction='col' gap={4} > - { - return clerk - .authenticateWithWeb3({ - customNavigate: router.navigate, - redirectUrl: ctx.afterSignInUrl || '/', - secondFactorUrl: 'factor-two', - signUpContinueUrl: ctx.isCombinedFlow ? '../create/continue' : ctx.signUpContinueUrl, - strategy: 'web3_solana_signature', - walletName, - }) - .catch(err => web3CallbackErrorHandler(err, card.setError)); - }} - /> + + { + return clerk + .authenticateWithWeb3({ + customNavigate: router.navigate, + redirectUrl: ctx.afterSignInUrl || '/', + secondFactorUrl: 'factor-two', + signUpContinueUrl: ctx.isCombinedFlow ? '../create/continue' : ctx.signUpContinueUrl, + strategy: 'web3_solana_signature', + walletName, + }) + .catch(err => web3CallbackErrorHandler(err, card.setError)); + }} + /> + + + import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3WalletButtons').then(m => ({ + default: m.Web3WalletButtons, + })), +); + import { useSignUpContext } from '../../contexts'; import { useRouter } from '../../router'; @@ -35,22 +41,24 @@ const SignUpStartSolanaWalletsCardInner = () => { direction='col' gap={4} > - { - return clerk - .authenticateWithWeb3({ - customNavigate: router.navigate, - redirectUrl: ctx.afterSignUpUrl || '/', - signUpContinueUrl: '../continue', - strategy: 'web3_solana_signature', - unsafeMetadata: ctx.unsafeMetadata, - // TODO: Add support to pass legalAccepted status - // legalAccepted: , - walletName, - }) - .catch(err => web3CallbackErrorHandler(err, card.setError)); - }} - /> + + { + return clerk + .authenticateWithWeb3({ + customNavigate: router.navigate, + redirectUrl: ctx.afterSignUpUrl || '/', + signUpContinueUrl: '../continue', + strategy: 'web3_solana_signature', + unsafeMetadata: ctx.unsafeMetadata, + // TODO: Add support to pass legalAccepted status + // legalAccepted: , + walletName, + }) + .catch(err => web3CallbackErrorHandler(err, card.setError)); + }} + /> + Date: Thu, 4 Dec 2025 04:01:56 -0500 Subject: [PATCH 20/35] fix(clerk-js): ensure card state resets after web3AuthCallback execution Signed-off-by: Kenton Duprey --- packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx b/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx index e1c41664dca..92c800d3e80 100644 --- a/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx +++ b/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx @@ -60,6 +60,7 @@ const Web3WalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsProps) => await web3AuthCallback({ walletName }); } catch { await sleep(1000); + } finally { card.setIdle(); } }; From cd4dce48811b03173a862326fa47c3e9ba374647 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Thu, 4 Dec 2025 04:18:38 -0500 Subject: [PATCH 21/35] fix(bundlewatch): update maxSize values for clerk.js and clerk.browser.js Signed-off-by: Kenton Duprey --- packages/clerk-js/bundlewatch.config.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index 2bb27648ace..0dcacfcef0b 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,12 +1,11 @@ { "files": [ - { "path": "./dist/clerk.js", "maxSize": "918KB" }, - { "path": "./dist/clerk.browser.js", "maxSize": "84KB" }, - { "path": "./dist/clerk.channel.browser.js", "maxSize": "85KB" }, + { "path": "./dist/clerk.js", "maxSize": "922KB" }, + { "path": "./dist/clerk.browser.js", "maxSize": "87KB" }, { "path": "./dist/clerk.legacy.browser.js", "maxSize": "129KB" }, - { "path": "./dist/clerk.headless*.js", "maxSize": "65KB" }, + { "path": "./dist/clerk.headless*.js", "maxSize": "66KB" }, { "path": "./dist/ui-common*.js", "maxSize": "119KB" }, - { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "122KB" }, + { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "123KB" }, { "path": "./dist/vendors*.js", "maxSize": "50KB" }, { "path": "./dist/coinbase*.js", "maxSize": "38KB" }, { "path": "./dist/stripe-vendors*.js", "maxSize": "1KB" }, From c727058b2323258262471cc13fbe1337d57a9049 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Thu, 4 Dec 2025 04:30:20 -0500 Subject: [PATCH 22/35] fix(clerk-js): standardize Flow.Part prop name from 'choose-wallet' to 'chooseWallet' Signed-off-by: Kenton Duprey --- .../ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx | 2 +- .../src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx | 2 +- packages/clerk-js/src/ui/elements/contexts/index.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx index 187191216e0..a1aebe38e2a 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx @@ -29,7 +29,7 @@ const SignInFactorOneSolanaWalletsCardInner = () => { }; return ( - + diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx index 6c1f327035a..22e12e25163 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx @@ -29,7 +29,7 @@ const SignUpStartSolanaWalletsCardInner = () => { }; return ( - + diff --git a/packages/clerk-js/src/ui/elements/contexts/index.tsx b/packages/clerk-js/src/ui/elements/contexts/index.tsx index 62c995374dd..1a719083777 100644 --- a/packages/clerk-js/src/ui/elements/contexts/index.tsx +++ b/packages/clerk-js/src/ui/elements/contexts/index.tsx @@ -129,7 +129,7 @@ export type FlowMetadata = { | 'accountSwitcher' | 'chooseOrganization' | 'enterpriseConnections' - | 'choose-wallet'; + | 'chooseWallet'; }; const [FlowMetadataCtx, useFlowMetadata] = createContextAndHook('FlowMetadata'); From b0bb9e89a5a090d78db4000f31a477b7f10f575c Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Thu, 4 Dec 2025 05:00:52 -0500 Subject: [PATCH 23/35] chore(clerk-js): Add changeset update summary Signed-off-by: Kenton Duprey --- .changeset/legal-jokes-beg.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/legal-jokes-beg.md diff --git a/.changeset/legal-jokes-beg.md b/.changeset/legal-jokes-beg.md new file mode 100644 index 00000000000..89a53e27c30 --- /dev/null +++ b/.changeset/legal-jokes-beg.md @@ -0,0 +1,9 @@ +--- +'@clerk/localizations': minor +'@clerk/clerk-js': minor +'@clerk/elements': minor +'@clerk/shared': minor +'@clerk/clerk-react': minor +--- + +Implemented Sign in with Solana authentication flow to support new authentication method feature. From dabe8befa74f53f2bbff41e1c891b71336c4e16d Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Fri, 5 Dec 2025 11:19:01 -0500 Subject: [PATCH 24/35] chore(localizations): run pnpm generate to ensure new fields are propegated Signed-off-by: Kenton Duprey --- packages/localizations/src/ar-SA.ts | 15 +++++++++++++++ packages/localizations/src/be-BY.ts | 15 +++++++++++++++ packages/localizations/src/bg-BG.ts | 15 +++++++++++++++ packages/localizations/src/bn-IN.ts | 15 +++++++++++++++ packages/localizations/src/ca-ES.ts | 15 +++++++++++++++ packages/localizations/src/cs-CZ.ts | 15 +++++++++++++++ packages/localizations/src/da-DK.ts | 15 +++++++++++++++ packages/localizations/src/de-DE.ts | 15 +++++++++++++++ packages/localizations/src/el-GR.ts | 15 +++++++++++++++ packages/localizations/src/en-GB.ts | 15 +++++++++++++++ packages/localizations/src/en-US.ts | 16 ++++++++-------- packages/localizations/src/es-CR.ts | 15 +++++++++++++++ packages/localizations/src/es-ES.ts | 15 +++++++++++++++ packages/localizations/src/es-MX.ts | 15 +++++++++++++++ packages/localizations/src/es-UY.ts | 15 +++++++++++++++ packages/localizations/src/fa-IR.ts | 15 +++++++++++++++ packages/localizations/src/fi-FI.ts | 15 +++++++++++++++ packages/localizations/src/fr-FR.ts | 15 +++++++++++++++ packages/localizations/src/he-IL.ts | 15 +++++++++++++++ packages/localizations/src/hi-IN.ts | 15 +++++++++++++++ packages/localizations/src/hr-HR.ts | 15 +++++++++++++++ packages/localizations/src/hu-HU.ts | 15 +++++++++++++++ packages/localizations/src/id-ID.ts | 15 +++++++++++++++ packages/localizations/src/is-IS.ts | 15 +++++++++++++++ packages/localizations/src/it-IT.ts | 15 +++++++++++++++ packages/localizations/src/ja-JP.ts | 15 +++++++++++++++ packages/localizations/src/kk-KZ.ts | 15 +++++++++++++++ packages/localizations/src/ko-KR.ts | 15 +++++++++++++++ packages/localizations/src/mn-MN.ts | 15 +++++++++++++++ packages/localizations/src/ms-MY.ts | 15 +++++++++++++++ packages/localizations/src/nb-NO.ts | 15 +++++++++++++++ packages/localizations/src/nl-BE.ts | 15 +++++++++++++++ packages/localizations/src/nl-NL.ts | 15 +++++++++++++++ packages/localizations/src/pl-PL.ts | 15 +++++++++++++++ packages/localizations/src/pt-BR.ts | 15 +++++++++++++++ packages/localizations/src/pt-PT.ts | 15 +++++++++++++++ packages/localizations/src/ro-RO.ts | 15 +++++++++++++++ packages/localizations/src/ru-RU.ts | 15 +++++++++++++++ packages/localizations/src/sk-SK.ts | 15 +++++++++++++++ packages/localizations/src/sr-RS.ts | 15 +++++++++++++++ packages/localizations/src/sv-SE.ts | 15 +++++++++++++++ packages/localizations/src/ta-IN.ts | 15 +++++++++++++++ packages/localizations/src/te-IN.ts | 15 +++++++++++++++ packages/localizations/src/th-TH.ts | 15 +++++++++++++++ packages/localizations/src/tr-TR.ts | 15 +++++++++++++++ packages/localizations/src/uk-UA.ts | 15 +++++++++++++++ packages/localizations/src/vi-VN.ts | 15 +++++++++++++++ packages/localizations/src/zh-CN.ts | 15 +++++++++++++++ packages/localizations/src/zh-TW.ts | 15 +++++++++++++++ 49 files changed, 728 insertions(+), 8 deletions(-) diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index 28143c90a2d..d6cce6dceb8 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -747,6 +747,10 @@ export const arSA: LocalizationResource = { subtitle: 'للمتابعة، يرجى إدخال رمز التحقق الذي تم إنشاؤه بواسطة تطبيق المصادقة الخاص بك', title: 'نظام التحقق بخطوتين', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'إدخل كلمة المرور', signUp: { @@ -837,6 +841,10 @@ export const arSA: LocalizationResource = { title: 'أنشاء حساب جديد', titleCombined: 'أنشاء حساب جديد', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'للمتابعة مع {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -933,6 +941,8 @@ export const arSA: LocalizationResource = { phone_number_exists: 'هذا الرقم مأخوذ الرجاء أختيار رقم آخر', session_exists: 'لقد قمت بتسجيل الدخول بالفعل', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'كلمة مرورك سليمة من الأفضل ان تكون اقوى. الرجاء أضافة حروف أكثر', goodPassword: 'كلمة مرورك طابقت جميع المتطلبات الازمة', @@ -1332,4 +1342,9 @@ export const arSA: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index b0747a0a68a..63312a3d744 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -753,6 +753,10 @@ export const beBY: LocalizationResource = { subtitle: 'Увядзіце код, атрыманы з вашага TOTP-генератара.', title: 'Двухфактарная верыфікацыя', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: undefined, signUp: { @@ -845,6 +849,10 @@ export const beBY: LocalizationResource = { title: 'Стварыце Ваш акаўнт', titleCombined: 'Стварыце Ваш акаўнт', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Працягнуць з дапамогай {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -942,6 +950,8 @@ export const beBY: LocalizationResource = { phone_number_exists: 'Гэты нумар тэлефона ўжо заняты. Калі ласка, паспрабуйце іншы.', session_exists: 'Вы ўжо ўвайшлі.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ваш пароль падыходзіць, але мог бы быць надзейнейшым. Паспрабуйце дадаць больш сімвалаў.', goodPassword: 'Добрая праца. Гэта выдатны пароль.', @@ -1349,4 +1359,9 @@ export const beBY: LocalizationResource = { title: 'Вы ў чакальным спісе', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index 41073458051..066699b155a 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -750,6 +750,10 @@ export const bgBG: LocalizationResource = { 'За да продължите, моля въведете кода за потвърждение, генериран от вашето приложение за удостоверяване', title: 'Двустепенна верификация', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Въведете вашата парола', signUp: { @@ -841,6 +845,10 @@ export const bgBG: LocalizationResource = { title: 'Създайте своя акаунт', titleCombined: 'Създайте своя акаунт', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Продължи с {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -935,6 +943,8 @@ export const bgBG: LocalizationResource = { phone_number_exists: 'Този телефонен номер е зает. Моля, опитайте с друг.', session_exists: 'Вече сте влезнали.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Вашата парола работи, но може да бъде по-сигурна. Опитайте да добавите повече символи.', goodPassword: 'Вашата парола отговаря на всички необходими изисквания.', @@ -1340,4 +1350,9 @@ export const bgBG: LocalizationResource = { title: 'Waitlist successful', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/bn-IN.ts b/packages/localizations/src/bn-IN.ts index b399b3aac91..41a0af93cf3 100644 --- a/packages/localizations/src/bn-IN.ts +++ b/packages/localizations/src/bn-IN.ts @@ -753,6 +753,10 @@ export const bnIN: LocalizationResource = { subtitle: 'চালিয়ে যেতে, আপনার অথেনটিকেটর অ্যাপ দ্বারা উৎপন্ন যাচাইকরণ কোড লিখুন', title: 'দুই-ধাপ যাচাইকরণ', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'আপনার পাসওয়ার্ড লিখুন', signUp: { @@ -845,6 +849,10 @@ export const bnIN: LocalizationResource = { title: 'আপনার অ্যাকাউন্ট তৈরি করুন', titleCombined: 'আপনার অ্যাকাউন্ট তৈরি করুন', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} দিয়ে চালিয়ে যান', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -946,6 +954,8 @@ export const bnIN: LocalizationResource = { phone_number_exists: 'এই ফোন নম্বর ব্যবহৃত হয়েছে। দয়া করে অন্য একটি ব্যবহার করুন।', session_exists: undefined, web3_missing_identifier: 'একটি Web3 ওয়ালেট এক্সটেনশন পাওয়া যায়নি। চালিয়ে যেতে দয়া করে একটি ইনস্টল করুন।', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'আপনার পাসওয়ার্ড কাজ করে, কিন্তু আরও শক্তিশালী হতে পারে। আরও অক্ষর যোগ করার চেষ্টা করুন।', goodPassword: 'আপনার পাসওয়ার্ড সমস্ত প্রয়োজনীয় শর্ত পূরণ করে।', @@ -1351,4 +1361,9 @@ export const bnIN: LocalizationResource = { title: 'ওয়েটলিস্টে যোগ দেওয়ার জন্য ধন্যবাদ!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ca-ES.ts b/packages/localizations/src/ca-ES.ts index 1af94c25ed4..0a71dd40afd 100644 --- a/packages/localizations/src/ca-ES.ts +++ b/packages/localizations/src/ca-ES.ts @@ -750,6 +750,10 @@ export const caES: LocalizationResource = { subtitle: "Per continuar, introdueix el codi de verificació generat per la teva aplicació d'autenticació", title: 'Verificació de dos passos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Introdueix la teva contrasenya', signUp: { @@ -840,6 +844,10 @@ export const caES: LocalizationResource = { title: 'Crea el teu compte', titleCombined: 'Crea el teu compte', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continua amb {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -937,6 +945,8 @@ export const caES: LocalizationResource = { phone_number_exists: "Aquest número de telèfon ja està en ús. Si us plau, prova'n un altre.", session_exists: 'Ja estàs connectat.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'La teva contrasenya funciona, però podria ser més forta. Prova afegint més caràcters.', goodPassword: 'La teva contrasenya compleix tots els requisits necessaris.', @@ -1346,4 +1356,9 @@ export const caES: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index 25d3602a745..8bb2bf3bf85 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -757,6 +757,10 @@ export const csCZ: LocalizationResource = { subtitle: 'Pro pokračování zadejte ověřovací kód vygenerovaný vaší aplikací pro ověřování', title: 'Dvoufázové ověření', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Zadejte své heslo', signUp: { @@ -851,6 +855,10 @@ export const csCZ: LocalizationResource = { title: 'Vytvořte si účet', titleCombined: 'Vytvořte si účet', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Pokračovat s {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -947,6 +955,8 @@ export const csCZ: LocalizationResource = { phone_number_exists: 'Toto telefonní číslo se používá. Zkuste prosím jiný.', session_exists: 'Jste již přihlášen.', web3_missing_identifier: 'Rozšíření peněženky Web3 nebylo nalezeno. Pro pokračování prosím nainstalujte jednu.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Vaše heslo funguje, ale mohlo by být silnější. Zkuste přidat více znaků.', goodPassword: 'Vaše heslo splňuje všechny potřebné požadavky.', @@ -1353,4 +1363,9 @@ export const csCZ: LocalizationResource = { title: 'Děkujeme za připojení k čekací listině!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index 1c03e120293..02d2c9058a5 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -748,6 +748,10 @@ export const daDK: LocalizationResource = { subtitle: undefined, title: 'Totrinsbekræftelse', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Indtast din adgangskode', signUp: { @@ -838,6 +842,10 @@ export const daDK: LocalizationResource = { title: 'Opret din konto', titleCombined: 'Opret din konto', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Forsæt med {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -934,6 +942,8 @@ export const daDK: LocalizationResource = { phone_number_exists: 'Dette telefonnummer er allerede taget. Prøv et andet.', session_exists: 'Du er allerede logget ind.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Din adgangskode virker, men kunne være stærkere. Prøv at tilføje flere tegn.', goodPassword: 'Din adgangskode opfylder alle nødvendige krav.', @@ -1338,4 +1348,9 @@ export const daDK: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index 4a57fc3a735..0f719f08935 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -764,6 +764,10 @@ export const deDE: LocalizationResource = { 'Um fortzufahren, geben Sie bitte den Verifizierungscode ein, der von Ihrer Authenticator-App generiert wurde.', title: 'Bestätigung in zwei Schritten', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Geben Sie Ihr Passwort ein', signUp: { @@ -855,6 +859,10 @@ export const deDE: LocalizationResource = { title: 'Erstellen Sie Ihr Konto', titleCombined: 'Erstellen Sie Ihr Konto', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Weiter mit {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -962,6 +970,8 @@ export const deDE: LocalizationResource = { session_exists: 'Sie sind bereits angemeldet.', web3_missing_identifier: 'Eine Web3 Wallet-Erweiterung wurde nicht gefunden. Bitte installieren Sie eine, um fortzufahren.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ihr Passwort funktioniert, könnte aber besser sein. Versuchen Sie, mehr Zeichen hinzuzufügen.', goodPassword: 'Ihr Passwort erfüllt alle notwendigen Anforderungen.', @@ -1373,4 +1383,9 @@ export const deDE: LocalizationResource = { title: 'Erfolgreich auf die Warteliste gesetzt', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index 0bcb5b3bc0e..f7b5844211e 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -751,6 +751,10 @@ export const elGR: LocalizationResource = { subtitle: undefined, title: 'Aυθεντικοποίηση δύο βημάτων', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Εισαγωγή κωδικού πρόσβασης', signUp: { @@ -842,6 +846,10 @@ export const elGR: LocalizationResource = { title: 'Δημιουργήστε τον λογαριασμό σας', titleCombined: 'Δημιουργήστε τον λογαριασμό σας', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Συνέχεια με {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -939,6 +947,8 @@ export const elGR: LocalizationResource = { phone_number_exists: 'Αυτός ο αριθμός τηλεφώνου χρησιμοποιείται ήδη. Δοκιμάστε έναν άλλο.', session_exists: 'Έχετε ήδη συνδεθεί.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ο κωδικός πρόσβασής σας είναι αρκετός, αλλά θα μπορούσε να είναι πιο ισχυρός. Δοκιμάστε να προσθέσετε περισσότερους χαρακτήρες.', @@ -1349,4 +1359,9 @@ export const elGR: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/en-GB.ts b/packages/localizations/src/en-GB.ts index d97e70d64df..6472935a562 100644 --- a/packages/localizations/src/en-GB.ts +++ b/packages/localizations/src/en-GB.ts @@ -750,6 +750,10 @@ export const enGB: LocalizationResource = { subtitle: 'To continue, please enter the verification code generated by your authenticator app', title: 'Two-step verification', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Enter your password', signUp: { @@ -842,6 +846,10 @@ export const enGB: LocalizationResource = { title: 'Create your account', titleCombined: 'Create your account', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continue with {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -942,6 +950,8 @@ export const enGB: LocalizationResource = { phone_number_exists: 'This phone number is taken. Please try another.', session_exists: "You're already signed in.", web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Your password works, but could be stronger. Try adding more characters.', goodPassword: 'Your password meets all the necessary requirements.', @@ -1346,4 +1356,9 @@ export const enGB: LocalizationResource = { title: 'Thanks for joining the waitlist!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index c6d0e5665f6..0d570ea0aae 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -748,8 +748,8 @@ export const enUS: LocalizationResource = { title: 'Two-step verification', }, web3Solana: { - title: 'Sign in with Solana', subtitle: 'Select a wallet below to sign in', + title: 'Sign in with Solana', }, }, signInEnterPasswordTitle: 'Enter your password', @@ -844,16 +844,10 @@ export const enUS: LocalizationResource = { titleCombined: 'Create your account', }, web3Solana: { - title: 'Sign up with Solana', subtitle: 'Select a wallet below to sign up', + title: 'Sign up with Solana', }, }, - web3WalletButtons: { - connect: 'Connect with {{walletName}}', - continue: 'Continue with {{walletName}}', - noneAvailable: - 'No Solana Web3 wallets detected. Please install a Web3 supported {{ solanaWalletsLink || link("wallet extension") }}.', - }, socialButtonsBlockButton: 'Continue with {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', taskChooseOrganization: { @@ -1359,4 +1353,10 @@ export const enUS: LocalizationResource = { title: 'Thanks for joining the waitlist!', }, }, + web3WalletButtons: { + connect: 'Connect with {{walletName}}', + continue: 'Continue with {{walletName}}', + noneAvailable: + 'No Solana Web3 wallets detected. Please install a Web3 supported {{ solanaWalletsLink || link("wallet extension") }}.', + }, } as const; diff --git a/packages/localizations/src/es-CR.ts b/packages/localizations/src/es-CR.ts index 213a7556a69..5a9f8ab07f7 100644 --- a/packages/localizations/src/es-CR.ts +++ b/packages/localizations/src/es-CR.ts @@ -755,6 +755,10 @@ export const esCR: LocalizationResource = { subtitle: 'Para continuar, por favor introduce el código generado por tu aplicación de autenticación', title: 'Verificación de dos pasos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ingresa tu contraseña', signUp: { @@ -847,6 +851,10 @@ export const esCR: LocalizationResource = { title: 'Crea tu cuenta', titleCombined: 'Crea tu cuenta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar con {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -946,6 +954,8 @@ export const esCR: LocalizationResource = { phone_number_exists: 'Este número de telefónico ya está en uso.', session_exists: undefined, web3_missing_identifier: 'No se puede encontrar la extension de la billetera Web3. Instala una para continuar', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Tu contraseña funciona, pero puede ser más segura. Prueba añadiendo más caracteres.', goodPassword: 'Tu contraseña cumple con todos los requisitos necesarios.', @@ -1353,4 +1363,9 @@ export const esCR: LocalizationResource = { title: '¡Gracias por unirte a la lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index 636f8be93a5..c678109b0f1 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -750,6 +750,10 @@ export const esES: LocalizationResource = { subtitle: 'Introduce el código que te enviamos a tu dispositivo', title: 'Verificación de dos pasos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ingresa tu contraseña', signUp: { @@ -841,6 +845,10 @@ export const esES: LocalizationResource = { title: 'Crea tu cuenta', titleCombined: 'Crea tu cuenta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar con {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -940,6 +948,8 @@ export const esES: LocalizationResource = { phone_number_exists: 'Este número de teléfono ya está en uso. Por favor, inténtelo con otro.', session_exists: 'Ya has iniciado sesión', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: undefined, goodPassword: undefined, @@ -1347,4 +1357,9 @@ export const esES: LocalizationResource = { title: '¡Te has unido a la lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index f686ac06b21..f75041d99ce 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -756,6 +756,10 @@ export const esMX: LocalizationResource = { subtitle: 'Para continuar, por favor introduce el código generado por tu aplicación de autenticación', title: 'Verificación de dos pasos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ingresa tu contraseña', signUp: { @@ -848,6 +852,10 @@ export const esMX: LocalizationResource = { title: 'Crea tu cuenta', titleCombined: 'Crea tu cuenta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar con {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -947,6 +955,8 @@ export const esMX: LocalizationResource = { phone_number_exists: 'Este número de telefónico ya está en uso.', session_exists: 'Ya has iniciado sesión', web3_missing_identifier: 'No se puede encontrar la extension de la billetera Web3. Instala una para continuar', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Tu contraseña funciona, pero puede ser más segura. Prueba añadiendo más caracteres.', goodPassword: 'Tu contraseña cumple con todos los requisitos necesarios.', @@ -1354,4 +1364,9 @@ export const esMX: LocalizationResource = { title: '¡Gracias por unirte a la lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/es-UY.ts b/packages/localizations/src/es-UY.ts index 2de2c9f8dd4..f5cafcd5956 100644 --- a/packages/localizations/src/es-UY.ts +++ b/packages/localizations/src/es-UY.ts @@ -753,6 +753,10 @@ export const esUY: LocalizationResource = { subtitle: 'Para continuar, ingresá el código generado por tu aplicación autenticadora', title: 'Verificación en dos pasos', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ingresá tu contraseña', signUp: { @@ -847,6 +851,10 @@ export const esUY: LocalizationResource = { title: 'Creá tu cuenta', titleCombined: 'Creá tu cuenta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar con {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -948,6 +956,8 @@ export const esUY: LocalizationResource = { phone_number_exists: 'Este número de teléfono ya está en uso. Por favor, probá con otro.', session_exists: 'Ya has iniciado sesión', web3_missing_identifier: 'No se encontró una extensión de cartera Web3. Por favor, instalá una para continuar.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Tu contraseña funciona, pero podría ser más fuerte. Intentá agregar más caracteres.', goodPassword: 'Tu contraseña cumple con todos los requisitos necesarios.', @@ -1353,4 +1363,9 @@ export const esUY: LocalizationResource = { title: '¡Gracias por unirte a la lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/fa-IR.ts b/packages/localizations/src/fa-IR.ts index 207f624ab1e..3d369622add 100644 --- a/packages/localizations/src/fa-IR.ts +++ b/packages/localizations/src/fa-IR.ts @@ -758,6 +758,10 @@ export const faIR: LocalizationResource = { subtitle: 'برای ادامه، لطفاً کد تأیید تولید شده توسط برنامه تأیید هویت خود را وارد کنید', title: 'تأیید دو مرحله‌ای', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'رمز عبور خود را وارد کنید', signUp: { @@ -851,6 +855,10 @@ export const faIR: LocalizationResource = { title: 'حساب کاربری خود را ایجاد کنید', titleCombined: 'حساب کاربری خود را ایجاد کنید', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'ادامه با {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -946,6 +954,8 @@ export const faIR: LocalizationResource = { phone_number_exists: 'این شماره تلفن قبلاً استفاده شده است.', session_exists: 'جلسه از قبل وجود دارد.', web3_missing_identifier: 'افزونه‌ی کیف پول وب۳ پیدا نشد. برای ادامه، لطفاً یکی نصب کنید.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'رمز عبور شما کار می‌کند، اما می‌توانست قوی‌تر باشد. سعی کنید کاراکترهای بیشتری اضافه کنید.', goodPassword: 'رمز عبور شما تمام شرایط لازم را برآورده می‌کند.', @@ -1350,4 +1360,9 @@ export const faIR: LocalizationResource = { title: 'ممنون که به لیست انتظار پیوستید!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index 79c278071f2..90acd1b0011 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -750,6 +750,10 @@ export const fiFI: LocalizationResource = { subtitle: 'Syötä todennuskoodi autentikointisovelluksestasi', title: 'Kaksivaiheinen todennus', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Syötä salasanasi', signUp: { @@ -841,6 +845,10 @@ export const fiFI: LocalizationResource = { title: 'Luo tili', titleCombined: 'Luo tili', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Jatka palvelun {{provider|titleize}} avulla', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -937,6 +945,8 @@ export const fiFI: LocalizationResource = { phone_number_exists: 'Tämä puhelinnumero on jo käytössä. Kokeile toista.', session_exists: 'Olet jo kirjautunut sisään.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Salasanasi toimii, mutta se voisi olla vahvempi. Kokeile lisätä erikoismerkkejä tai numeroita.', goodPassword: 'Salasanasi täyttää kaikki tarvittavat vaatimukset.', @@ -1343,4 +1353,9 @@ export const fiFI: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index a038f4347dd..0ec86cbe5e9 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -764,6 +764,10 @@ export const frFR: LocalizationResource = { subtitle: "Entrez le code de l'application d'authentification.", title: 'Vérification en deux étapes', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Tapez votre mot de passe', signUp: { @@ -856,6 +860,10 @@ export const frFR: LocalizationResource = { title: 'Créez votre compte', titleCombined: 'Créez votre compte', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuer avec {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -955,6 +963,8 @@ export const frFR: LocalizationResource = { phone_number_exists: 'Ce numéro de téléphone est déjà utilisé. Veuillez essayer un autre.', session_exists: 'Vous êtes déjà connecté.', web3_missing_identifier: 'Aucune extension de portefeuille Web3 trouvée. Veuillez en installer une pour continuer.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: "Votre mot de passe fonctionne mais pourrait être plus sûr. Essayez d'ajouter des caractères.", goodPassword: "Bien joué. C'est un excellent mot de passe.", @@ -1363,4 +1373,9 @@ export const frFR: LocalizationResource = { title: 'Inscription réussie', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index 75528acfb7f..f7cf0847735 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -741,6 +741,10 @@ export const heIL: LocalizationResource = { subtitle: 'להמשך, אנא הכנס את קוד האימות שנוצר על ידי אפליקציית האימות שלך', title: 'אימות שני שלבים', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'הזן את הסיסמה שלך', signUp: { @@ -831,6 +835,10 @@ export const heIL: LocalizationResource = { title: 'צור את החשבון שלך', titleCombined: 'צור את החשבון שלך', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'המשך עם {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -926,6 +934,8 @@ export const heIL: LocalizationResource = { phone_number_exists: 'מספר הטלפון הזה כבר בשימוש. אנא נסה מספר אחר.', session_exists: 'אתה כבר מחובר לחשבון.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'הסיסמה שלך תקפה, אך יכולה להיות חזקה יותר. נסה להוסיף יותר תווים.', goodPassword: 'עבודה טובה. זו סיסמה מצוינת.', @@ -1319,4 +1329,9 @@ export const heIL: LocalizationResource = { title: 'תודה שהצטרפת לרשימת ההמתנה!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/hi-IN.ts b/packages/localizations/src/hi-IN.ts index 4c49e58c1fb..bc5721137bd 100644 --- a/packages/localizations/src/hi-IN.ts +++ b/packages/localizations/src/hi-IN.ts @@ -752,6 +752,10 @@ export const hiIN: LocalizationResource = { subtitle: 'जारी रखने के लिए, कृपया अपने प्रमाणकर्ता ऐप द्वारा जनरेट किए गए कोड को दर्ज करें', title: 'दो-चरण सत्यापन', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'अपना पासवर्ड दर्ज करें', signUp: { @@ -845,6 +849,10 @@ export const hiIN: LocalizationResource = { title: 'अपना खाता बनाएं', titleCombined: 'अपना खाता बनाएं', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} के साथ जारी रखें', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -947,6 +955,8 @@ export const hiIN: LocalizationResource = { phone_number_exists: 'यह फोन नंबर पहले से लिया गया है। कृपया दूसरा प्रयास करें।', session_exists: undefined, web3_missing_identifier: 'Web3 वॉलेट एक्सटेंशन नहीं मिल सका। जारी रखने के लिए कृपया एक इंस्टॉल करें।', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'आपका पासवर्ड काम करता है, लेकिन मजबूत हो सकता है। अधिक अक्षर जोड़ने का प्रयास करें।', goodPassword: 'आपका पासवर्ड सभी आवश्यक आवश्यकताओं को पूरा करता है।', @@ -1351,4 +1361,9 @@ export const hiIN: LocalizationResource = { title: 'प्रतीक्षा सूची में शामिल होने के लिए धन्यवाद!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index 4121c556338..747103b0de7 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -750,6 +750,10 @@ export const hrHR: LocalizationResource = { subtitle: 'Za nastavak, unesite verifikacijski kod generiran vašom aplikacijom za autentifikaciju', title: 'Dvostupanjska verifikacija', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Unesite svoju lozinku', signUp: { @@ -842,6 +846,10 @@ export const hrHR: LocalizationResource = { title: 'Kreirajte svoj račun', titleCombined: 'Kreirajte svoj račun', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Nastavite s {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -942,6 +950,8 @@ export const hrHR: LocalizationResource = { phone_number_exists: 'Ovaj telefonski broj je zauzet. Molimo pokušajte s drugim.', session_exists: 'Već ste prijavljeni.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Vaša lozinka funkcionira, ali mogla bi biti jača. Pokušajte dodati više znakova.', goodPassword: 'Vaša lozinka zadovoljava sve potrebne zahtjeve.', @@ -1345,4 +1355,9 @@ export const hrHR: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index 6e6a5b6c2ab..5910e7f663c 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -749,6 +749,10 @@ export const huHU: LocalizationResource = { subtitle: 'A folytatáshoz, kérlek írd be a visszaigazoló kódot, amit a hitelesítő app készített.', title: 'Két lépécsős azonosítás', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Írd be a jelszavad', signUp: { @@ -839,6 +843,10 @@ export const huHU: LocalizationResource = { title: 'Fiók létrehozása', titleCombined: 'Fiók létrehozása', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Folytatás {{provider|titleize}} segítségével', socialButtonsBlockButtonManyInView: undefined, @@ -937,6 +945,8 @@ export const huHU: LocalizationResource = { phone_number_exists: 'Ez a telefonszám már foglalt. Kérlek próbálj meg egy másikat.', session_exists: 'Már be vagy jelentkezve.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'A jelszavad, jó, de lehetne erősebb. Adj hozzá több karaktert.', goodPassword: 'A jelszavad megfelel az elvárásoknak.', @@ -1343,4 +1353,9 @@ export const huHU: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/id-ID.ts b/packages/localizations/src/id-ID.ts index 8d41059fda4..bc7203caeb7 100644 --- a/packages/localizations/src/id-ID.ts +++ b/packages/localizations/src/id-ID.ts @@ -752,6 +752,10 @@ export const idID: LocalizationResource = { subtitle: 'Untuk melanjutkan, masukkan kode verifikasi yang dihasilkan oleh aplikasi autentikator Anda', title: 'Verifikasi dua langkah', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Masukkan kata sandi Anda', signUp: { @@ -846,6 +850,10 @@ export const idID: LocalizationResource = { title: 'Buat akun Anda', titleCombined: 'Buat akun Anda', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Lanjutkan dengan {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -946,6 +954,8 @@ export const idID: LocalizationResource = { phone_number_exists: 'Nomor telepon ini sudah digunakan. Silakan coba yang lain.', session_exists: 'Anda sudah masuk.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Kata sandi Anda berfungsi, tapi bisa lebih kuat. Coba tambahkan lebih banyak karakter.', goodPassword: 'Kata sandi Anda memenuhi semua persyaratan yang diperlukan.', @@ -1340,4 +1350,9 @@ export const idID: LocalizationResource = { title: 'Terima kasih telah bergabung dengan daftar tunggu!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index d404701f2b5..edd41446795 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -751,6 +751,10 @@ export const isIS: LocalizationResource = { subtitle: 'Til að halda áfram, vinsamlegast sláðu inn staðfestingarkóðann sem auðkennisforritið þitt bjó til', title: 'Tveggja þrepa auðkenning', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Sláðu inn lykilorðið þitt', signUp: { @@ -842,6 +846,10 @@ export const isIS: LocalizationResource = { title: 'Stofna reikning', titleCombined: 'Stofna reikning', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Halda áfram með {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -941,6 +949,8 @@ export const isIS: LocalizationResource = { phone_number_exists: 'Þetta símanúmer er þegar í notkun. Vinsamlegast reyndu annað.', session_exists: 'Þú ert nú þegar innskráður.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Lykilorðið þitt virkar, en gæti verið sterkara. Reyndu að bæta við fleiri stöfum.', goodPassword: 'Lykilorðið þitt uppfyllir allar nauðsynlegar kröfur.', @@ -1347,4 +1357,9 @@ export const isIS: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index 23504a4b538..eac7900c2e1 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -756,6 +756,10 @@ export const itIT: LocalizationResource = { subtitle: 'Inserisci il codice di verifica dalla tua app di autenticazione.', title: 'Verifica in due passaggi', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Inserisci la tua password', signUp: { @@ -848,6 +852,10 @@ export const itIT: LocalizationResource = { title: 'Crea il tuo account', titleCombined: 'Crea il tuo account', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continua con {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -945,6 +953,8 @@ export const itIT: LocalizationResource = { phone_number_exists: 'Questo numero di telefono è già in uso. Per favore, prova con un altro.', session_exists: 'Sei già loggato.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: undefined, goodPassword: undefined, @@ -1352,4 +1362,9 @@ export const itIT: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index 69d76227aa5..2ee8e4223d4 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -759,6 +759,10 @@ export const jaJP: LocalizationResource = { subtitle: '続行するには、認証アプリで生成された検証コードを入力してください', title: '二段階認証', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'パスワードを入力してください', signUp: { @@ -852,6 +856,10 @@ export const jaJP: LocalizationResource = { title: 'アカウントを作成', titleCombined: 'アカウントを作成', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}}で続ける', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -949,6 +957,8 @@ export const jaJP: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'Web3ウォレット拡張機能が見つかりません。続行するにはインストールしてください。', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'パスワードは有効ですが、もう少し強化できます。文字を追加してみてください。', goodPassword: 'パスワードはすべての要件を満たしています。', @@ -1350,4 +1360,9 @@ export const jaJP: LocalizationResource = { title: '待機リストへの参加ありがとうございます!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/kk-KZ.ts b/packages/localizations/src/kk-KZ.ts index 5a185e72d41..3b3ddb025fe 100644 --- a/packages/localizations/src/kk-KZ.ts +++ b/packages/localizations/src/kk-KZ.ts @@ -741,6 +741,10 @@ export const kkKZ: LocalizationResource = { subtitle: 'Аутентификатор қолданбасындағы кодты енгізіңіз', title: 'Екі қадамды растау', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Құпия сөзді енгізіңіз', signUp: { @@ -832,6 +836,10 @@ export const kkKZ: LocalizationResource = { title: 'Есептік жазбаны құру', titleCombined: 'Есептік жазбаны құру', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} арқылы жалғастыру', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -926,6 +934,8 @@ export const kkKZ: LocalizationResource = { phone_number_exists: 'Бұл телефон нөмірі тіркелген. Басқасын қолданыңыз.', session_exists: undefined, web3_missing_identifier: 'Web3 Wallet кеңейтуі табылмады. Орнатыңыз.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Құпия сөз әлсіз. Таңбалар санын көбейтіңіз.', goodPassword: 'Құпия сөз талаптарға сай.', @@ -1319,4 +1329,9 @@ export const kkKZ: LocalizationResource = { title: 'Күту тізіміне қосылғаныңыз үшін рақмет!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index a3fc0a74a4c..dee3d7b1430 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -743,6 +743,10 @@ export const koKR: LocalizationResource = { subtitle: '계속하려면 인증 앱에서 생성된 인증 코드를 입력하세요', title: '2단계 인증', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: '비밀번호를 입력하세요', signUp: { @@ -833,6 +837,10 @@ export const koKR: LocalizationResource = { title: '계정 만들기', titleCombined: '계정 만들기', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}}로 계속하기', socialButtonsBlockButtonManyInView: undefined, @@ -929,6 +937,8 @@ export const koKR: LocalizationResource = { phone_number_exists: '이 전화번호는 이미 사용중입니다. 다른 번호를 시도해 주세요.', session_exists: '이미 로그인 중입니다.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: '비밀번호는 작동하지만 더 강력할 수 있습니다. 문자를 더 추가해 보세요.', goodPassword: '수고하셨습니다. 훌륭한 비밀번호입니다.', @@ -1325,4 +1335,9 @@ export const koKR: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index 8d2437bfe52..2e51b7765dc 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -750,6 +750,10 @@ export const mnMN: LocalizationResource = { subtitle: 'Үргэлжлүүлэхийн тулд authenticator апп-аар үүсгэсэн баталгаажуулах кодыг оруулна уу', title: 'Two-step баталгаажуулалт', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Нууц үгээ оруулна уу', signUp: { @@ -840,6 +844,10 @@ export const mnMN: LocalizationResource = { title: 'Бүртгэл үүсгэх', titleCombined: 'Бүртгэл үүсгэх', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}}-р үргэлжлүүлэх', socialButtonsBlockButtonManyInView: undefined, @@ -937,6 +945,8 @@ export const mnMN: LocalizationResource = { phone_number_exists: 'Энэ утасны дугаарыг авсан. Өөр оролдоно уу.', session_exists: 'Та аль хэдийн нэвтэрсэн байна.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Таны нууц үг ажилладаг, гэхдээ илүү хүчтэй байж болно. Илүү олон тэмдэгт нэмж үзээрэй.', goodPassword: 'Таны нууц үг шаардлагатай бүх шаардлагыг хангаж байна.', @@ -1341,4 +1351,9 @@ export const mnMN: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ms-MY.ts b/packages/localizations/src/ms-MY.ts index 0091af6a8d9..b70746b2185 100644 --- a/packages/localizations/src/ms-MY.ts +++ b/packages/localizations/src/ms-MY.ts @@ -754,6 +754,10 @@ export const msMY: LocalizationResource = { subtitle: 'Untuk meneruskan, sila masukkan kod pengesahan yang dijana oleh aplikasi pengesah anda', title: 'Pengesahan dua langkah', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Masukkan kata laluan anda', signUp: { @@ -848,6 +852,10 @@ export const msMY: LocalizationResource = { title: 'Cipta akaun anda', titleCombined: 'Cipta akaun anda', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Teruskan dengan {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -952,6 +960,8 @@ export const msMY: LocalizationResource = { phone_number_exists: 'Nombor telefon ini telah diambil. Sila cuba yang lain.', session_exists: undefined, web3_missing_identifier: 'Sambungan Dompet Web3 tidak dapat dijumpai. Sila pasang satu untuk meneruskan.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Kata laluan anda berfungsi, tetapi boleh lebih kuat. Cuba tambah lebih banyak aksara.', goodPassword: 'Kata laluan anda memenuhi semua keperluan yang diperlukan.', @@ -1359,4 +1369,9 @@ export const msMY: LocalizationResource = { title: 'Terima kasih kerana menyertai senarai menunggu!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index 0576cdbe540..0a4b57b16b1 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -749,6 +749,10 @@ export const nbNO: LocalizationResource = { subtitle: undefined, title: 'To-trinns verifisering', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Skriv inn passordet ditt', signUp: { @@ -839,6 +843,10 @@ export const nbNO: LocalizationResource = { title: 'Opprett kontoen din', titleCombined: 'Opprett kontoen din', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Fortsett med {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -936,6 +944,8 @@ export const nbNO: LocalizationResource = { phone_number_exists: 'Dette telefonnummeret er allerede i bruk. Vennligst bruk et annet telefonnummer.', session_exists: 'Du er allerede logget inn.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Passordet ditt fungerer, men det kan være sterkere. Prøv å legge til flere tegn.', goodPassword: 'Godt jobbet. Dette er et utmerket passord.', @@ -1340,4 +1350,9 @@ export const nbNO: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/nl-BE.ts b/packages/localizations/src/nl-BE.ts index c4a8d266ac7..fc4c103c48b 100644 --- a/packages/localizations/src/nl-BE.ts +++ b/packages/localizations/src/nl-BE.ts @@ -749,6 +749,10 @@ export const nlBE: LocalizationResource = { subtitle: '', title: 'Tweestapsverificatie', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Vul je wachtwoord in', signUp: { @@ -840,6 +844,10 @@ export const nlBE: LocalizationResource = { title: 'Maak je account aan', titleCombined: 'Maak je account aan', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Ga verder met {{provider|titleize}}', socialButtonsBlockButtonManyInView: 'Ga verder met {{provider|titleize}}', @@ -936,6 +944,8 @@ export const nlBE: LocalizationResource = { phone_number_exists: 'Dit telefoonnummer is al in gebruik. Probeer een ander nummer.', session_exists: 'Je bent al ingelogd.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Je wachtwoord werkt, maar kan sterker zijn. Probeer meer tekens toe te voegen.', goodPassword: 'Je wachtwoord voldoet aan alle vereisten.', @@ -1338,4 +1348,9 @@ export const nlBE: LocalizationResource = { title: 'Succes!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index d52e28fb6d8..3d62bf50fce 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -749,6 +749,10 @@ export const nlNL: LocalizationResource = { subtitle: '', title: 'Tweestapsverificatie', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Vul je wachtwoord in', signUp: { @@ -840,6 +844,10 @@ export const nlNL: LocalizationResource = { title: 'Maak je account aan', titleCombined: 'Maak je account aan', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Ga verder met {{provider|titleize}}', socialButtonsBlockButtonManyInView: 'Ga verder met {{provider|titleize}}', @@ -936,6 +944,8 @@ export const nlNL: LocalizationResource = { phone_number_exists: 'Dit telefoonnummer is al in gebruik. Probeer een ander nummer.', session_exists: 'Je bent al ingelogd.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Je wachtwoord werkt, maar kan sterker zijn. Probeer meer tekens toe te voegen.', goodPassword: 'Je wachtwoord voldoet aan alle vereisten.', @@ -1338,4 +1348,9 @@ export const nlNL: LocalizationResource = { title: 'Succes!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index e480748b435..feaedc8fbec 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -751,6 +751,10 @@ export const plPL: LocalizationResource = { subtitle: 'Aby kontynuować, wprowadź kod weryfikacyjny wygenerowany przez aplikację uwierzytelniającą', title: 'Weryfikacja dwustopniowa', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Wprowadź swoje hasło', signUp: { @@ -845,6 +849,10 @@ export const plPL: LocalizationResource = { title: 'Utwórz swoje konto', titleCombined: 'Utwórz swoje konto', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Kontynuuj z {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -945,6 +953,8 @@ export const plPL: LocalizationResource = { phone_number_exists: 'Numer telefonu jest już zajęty. Proszę spróbować innego.', session_exists: 'Jesteś już zalogowany.', web3_missing_identifier: 'Nie można znaleźć rozszerzenia Web3 Wallet. Zainstaluj je, aby kontynuować.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Twoje hasło jest odpowiednie, ale mogłoby być silniejsze. Spróbuj dodać więcej znaków.', goodPassword: 'Twoje hasło jest wystarczająco silne.', @@ -1350,4 +1360,9 @@ export const plPL: LocalizationResource = { title: 'Dziękujemy za dołączenie do listy oczekujących!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index 291ec7d640f..106542a8886 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -758,6 +758,10 @@ export const ptBR: LocalizationResource = { subtitle: 'Para continuar, insira o código gerado pelo seu aplicativo autenticador.', title: 'Verificação em duas etapas', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Insira sua senha', signUp: { @@ -852,6 +856,10 @@ export const ptBR: LocalizationResource = { title: 'Criar sua conta', titleCombined: 'Criar sua conta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar com {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -952,6 +960,8 @@ export const ptBR: LocalizationResource = { session_exists: 'Você já está conectado.', web3_missing_identifier: 'Uma extensão de carteira Web3 não pode ser encontrada. Por favor, instale uma para continuar.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Sua senha funciona, mas poderia ser mais forte. Tente adicionar mais caracteres.', goodPassword: 'Sua senha atende a todos os requisitos necessários.', @@ -1359,4 +1369,9 @@ export const ptBR: LocalizationResource = { title: 'Obrigado por entrar na lista de espera!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index 72c5d76da41..ebfe76f095a 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -747,6 +747,10 @@ export const ptPT: LocalizationResource = { subtitle: 'Insira o código de verificação enviado para o seu dispositivo.', title: 'Verificação de duas etapas', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Insira a sua palavra-passe', signUp: { @@ -838,6 +842,10 @@ export const ptPT: LocalizationResource = { title: 'Criar a sua conta', titleCombined: 'Criar a sua conta', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuar com {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -936,6 +944,8 @@ export const ptPT: LocalizationResource = { phone_number_exists: 'Este número de telemóvel já está em uso. Por favor, tente outro.', session_exists: 'Já está conectado.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'A sua palavra-passe funciona, mas poderia ser mais forte. Tente adicionar mais caracteres.', goodPassword: 'A sua palavra-passe atende a todos os requisitos necessários.', @@ -1339,4 +1349,9 @@ export const ptPT: LocalizationResource = { title: 'Inscrição bem-sucedida na lista de espera', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index 49e08a6e800..ca50d61c3e1 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -760,6 +760,10 @@ export const roRO: LocalizationResource = { subtitle: 'Pentru a continua, introdu codul generat de aplicația ta de autentificare', title: 'Verificare în doi pași', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Introdu parola', signUp: { @@ -853,6 +857,10 @@ export const roRO: LocalizationResource = { title: 'Creează-ți contul', titleCombined: 'Creează-ți contul', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Continuă cu {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -952,6 +960,8 @@ export const roRO: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'Nu am găsit o extensie pentru portofel Web3. Te rugăm instalează una pentru a continua.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Parola ta funcționează, dar ar putea fi mai puternică. Încearcă să adaugi mai multe caractere.', goodPassword: 'Parola ta îndeplinește toate cerințele necesare.', @@ -1355,4 +1365,9 @@ export const roRO: LocalizationResource = { title: 'Mulțumim pentru înscriere!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index d5d74dcafef..dd8b5bb7821 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -758,6 +758,10 @@ export const ruRU: LocalizationResource = { subtitle: 'Чтобы продолжить, пожалуйста, введите код проверки, сгенерированный вашим приложением аутентификации.', title: 'Двухфакторная верификация', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Введите Ваш пароль', signUp: { @@ -852,6 +856,10 @@ export const ruRU: LocalizationResource = { title: 'Создайте Вашу учетную запись', titleCombined: 'Создайте Вашу учетную запись', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Продолжить с помощью {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -951,6 +959,8 @@ export const ruRU: LocalizationResource = { phone_number_exists: 'Этот номер телефона уже занят. Пожалуйста, попробуйте другой.', session_exists: 'Вы уже вошли в систему.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ваш пароль подходит, но мог бы быть надежнее. Попробуйте добавить больше символов.', goodPassword: 'Хорошая работа. Это отличный пароль.', @@ -1360,4 +1370,9 @@ export const ruRU: LocalizationResource = { title: 'Спасибо за присоединение к списку ожидания!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index 1f047d65eba..7d48527742b 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -751,6 +751,10 @@ export const skSK: LocalizationResource = { subtitle: 'Pre pokračovanie zadajte overovací kód z vašej autentifikačnej aplikácie', title: 'Dvojfaktorové overenie', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Zadajte svoje heslo', signUp: { @@ -845,6 +849,10 @@ export const skSK: LocalizationResource = { title: 'Vytvorte si účet', titleCombined: 'Vytvorte si účet', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Pokračovať s {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -943,6 +951,8 @@ export const skSK: LocalizationResource = { phone_number_exists: 'Toto telefónne číslo je už obsadené. Skúste prosím iné.', session_exists: 'Jste už přihlášen.', web3_missing_identifier: 'Rozšírenie Web3 Peňaženky nebolo nájdené. Je potrebné ho nainštalovať.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Vaše heslo funguje, ale mohlo by byť silnejšie. Skúste pridať viac znakov.', goodPassword: 'Dobrá práca. Toto je vynikajúce heslo.', @@ -1346,4 +1356,9 @@ export const skSK: LocalizationResource = { title: 'Ďakujeme, že ste sa pridali na waitlist!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index a70624a1f66..4531320abcd 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -748,6 +748,10 @@ export const srRS: LocalizationResource = { subtitle: 'Da nastaviš, molimo unesi verifikacioni kod generisan tvojom aplikacijom za autentifikaciju', title: 'Dvostepena verifikacija', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Unesi svoju lozinku', signUp: { @@ -838,6 +842,10 @@ export const srRS: LocalizationResource = { title: 'Kreiraj svoj nalog', titleCombined: 'Kreiraj svoj nalog', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Nastavi sa {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -936,6 +944,8 @@ export const srRS: LocalizationResource = { phone_number_exists: 'Ovaj telefonski broj je zauzet. Molimo pokušaj sa drugim.', session_exists: 'Već ste prijavljeni.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Tvoja lozinka funkcioniše, ali može biti jača. Pokušaj dodati više karaktera.', goodPassword: 'Tvoja lozinka ispunjava sve potrebne zahteve.', @@ -1339,4 +1349,9 @@ export const srRS: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index b480719305d..594f35445c0 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -751,6 +751,10 @@ export const svSE: LocalizationResource = { subtitle: 'För att fortsätta, vänligen ange verifieringskoden som genereras av din autentiseringsapp', title: 'Tvåstegsverifiering', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Ange ditt lösenord', signUp: { @@ -843,6 +847,10 @@ export const svSE: LocalizationResource = { title: 'Skapa ditt konto', titleCombined: 'Skapa ditt konto', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Fortsätt med {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -939,6 +947,8 @@ export const svSE: LocalizationResource = { phone_number_exists: 'Detta telefonnummer är taget. Vänligen prova ett annat.', session_exists: 'Du är redan inloggad.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ditt lösenord fungerar, men kunde vara starkare. Försök lägga till fler tecken.', goodPassword: 'Ditt lösenord uppfyller alla nödvändiga krav.', @@ -1342,4 +1352,9 @@ export const svSE: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/ta-IN.ts b/packages/localizations/src/ta-IN.ts index f7a8b67849e..bfaee8c8bde 100644 --- a/packages/localizations/src/ta-IN.ts +++ b/packages/localizations/src/ta-IN.ts @@ -754,6 +754,10 @@ export const taIN: LocalizationResource = { subtitle: 'தொடர, உங்கள் அங்கீகாரி பயன்பாட்டால் உருவாக்கப்பட்ட சரிபார்ப்புக் குறியீட்டை உள்ளிடவும்', title: 'இரண்டு-படி சரிபார்ப்பு', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'உங்கள் கடவுச்சொல்லை உள்ளிடவும்', signUp: { @@ -847,6 +851,10 @@ export const taIN: LocalizationResource = { title: 'உங்கள் கணக்கை உருவாக்கவும்', titleCombined: 'உங்கள் கணக்கை உருவாக்கவும்', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} மூலம் தொடரவும்', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -951,6 +959,8 @@ export const taIN: LocalizationResource = { phone_number_exists: 'இந்த தொலைபேசி எண் எடுக்கப்பட்டுள்ளது. வேறொன்றை முயற்சிக்கவும்.', session_exists: undefined, web3_missing_identifier: 'Web3 வாலட் நீட்டிப்பு காணப்படவில்லை. தொடர ஒன்றை நிறுவவும்.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'உங்கள் கடவுச்சொல் செயல்படுகிறது, ஆனால் மேலும் வலுவாக இருக்கலாம். மேலும் எழுத்துகளைச் சேர்க்க முயற்சிக்கவும்.', @@ -1357,4 +1367,9 @@ export const taIN: LocalizationResource = { title: 'காத்திருப்பில் சேர்ந்ததற்கு நன்றி!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/te-IN.ts b/packages/localizations/src/te-IN.ts index 004eb48d563..dac26c8d9ad 100644 --- a/packages/localizations/src/te-IN.ts +++ b/packages/localizations/src/te-IN.ts @@ -754,6 +754,10 @@ export const teIN: LocalizationResource = { subtitle: 'కొనసాగించడానికి, దయచేసి మీ ప్రమాణీకరణ యాప్ ద్వారా రూపొందించిన ధృవీకరణ కోడ్‌ను నమోదు చేయండి', title: 'రెండు-దశల ధృవీకరణ', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'మీ పాస్‌వర్డ్‌ను నమోదు చేయండి', signUp: { @@ -847,6 +851,10 @@ export const teIN: LocalizationResource = { title: 'మీ ఖాతాను సృష్టించండి', titleCombined: 'మీ ఖాతాను సృష్టించండి', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}}తో కొనసాగించండి', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -947,6 +955,8 @@ export const teIN: LocalizationResource = { phone_number_exists: 'ఈ ఫోన్ నంబర్ తీసుకోబడింది. దయచేసి మరొకదాన్ని ప్రయత్నించండి.', session_exists: undefined, web3_missing_identifier: 'Web3 వాలెట్ పొడిగింపు కనుగొనబడలేదు. కొనసాగించడానికి దయచేసి ఒకదాన్ని ఇన్‌స్టాల్ చేయండి.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'మీ పాస్‌వర్డ్ పనిచేస్తుంది, కానీ మరింత బలంగా ఉండవచ్చు. మరిన్ని అక్షరాలను జోడించడానికి ప్రయత్నించండి.', @@ -1353,4 +1363,9 @@ export const teIN: LocalizationResource = { title: 'వెయిట్‌లిస్ట్‌లో చేరినందుకు ధన్యవాదాలు!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index 6b76efbc111..ad6c480b9d0 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -750,6 +750,10 @@ export const thTH: LocalizationResource = { subtitle: 'เพื่อดำเนินการต่อ โปรดใส่รหัสยืนยันที่สร้างโดยแอป Authenticator ของคุณ', title: 'การยืนยันตัวตนสองขั้นตอน', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'ใส่รหัสผ่านของคุณ', signUp: { @@ -841,6 +845,10 @@ export const thTH: LocalizationResource = { title: 'สร้างบัญชีของคุณ', titleCombined: 'สร้างบัญชีของคุณ', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'ดำเนินการต่อด้วย {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -937,6 +945,8 @@ export const thTH: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'ไม่พบส่วนขยาย Web3 Wallet โปรดติดตั้งเพื่อดำเนินการต่อ', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'รหัสผ่านของคุณใช้ได้ แต่อาจแข็งแกร่งกว่านี้ ลองเพิ่มตัวอักษรเพิ่มเติม', goodPassword: 'รหัสผ่านของคุณตรงตามข้อกำหนดที่จำเป็นทั้งหมด', @@ -1335,4 +1345,9 @@ export const thTH: LocalizationResource = { title: 'ขอบคุณที่เข้าร่วม Waitlist!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index 14e4ce7bab3..698f491b582 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -750,6 +750,10 @@ export const trTR: LocalizationResource = { subtitle: 'Devam etmek için lütfen kimlik doğrulayıcı uygulamanız tarafından oluşturulan doğrulama kodunu girin', title: 'İki aşamalı doğrulama', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Şifrenizi girin', signUp: { @@ -841,6 +845,10 @@ export const trTR: LocalizationResource = { title: 'Hesap oluştur', titleCombined: 'Hesap oluştur', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '{{provider|titleize}} ile giriş yapın', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -939,6 +947,8 @@ export const trTR: LocalizationResource = { phone_number_exists: 'Bu telefon numarası zaten kullanılıyor. Lütfen başka bir numara deneyin.', session_exists: 'Zaten giriş yapmışsınız.', web3_missing_identifier: 'Web3 için tanımlayıcı eksik.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Şifreniz kriterleri karşılıyor; fakat birkaç karakter daha ekleyerek daha güçlü bir şifre oluşturabilirsiniz.', @@ -1343,4 +1353,9 @@ export const trTR: LocalizationResource = { title: 'Bekleme Listesine Katıldınız', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index d6a9f5e7360..8dddd848111 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -747,6 +747,10 @@ export const ukUA: LocalizationResource = { subtitle: undefined, title: 'Двоетапна перевірка', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Введіть Ваш пароль', signUp: { @@ -837,6 +841,10 @@ export const ukUA: LocalizationResource = { title: 'Створіть Ваш акаунт', titleCombined: 'Створіть Ваш акаунт', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Продовжити за допомогою {{provider|titleize}}', socialButtonsBlockButtonManyInView: undefined, @@ -933,6 +941,8 @@ export const ukUA: LocalizationResource = { phone_number_exists: 'Цей номер телефону вже використовується. Спробуйте інший.', session_exists: 'Ви вже увійшли в систему.', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Ваш пароль підходить, але міг би бути надійнішим. Спробуйте додати більше символів.', goodPassword: 'Хороша робота. Це відмінний пароль.', @@ -1337,4 +1347,9 @@ export const ukUA: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index 766d19001e7..6410f9cdc17 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -756,6 +756,10 @@ export const viVN: LocalizationResource = { subtitle: 'Để tiếp tục, vui lòng nhập mã xác minh được tạo bởi ứng dụng xác thực của bạn', title: 'Xác thực hai bước', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: 'Nhập mật khẩu', signUp: { @@ -848,6 +852,10 @@ export const viVN: LocalizationResource = { title: 'Tạo tài khoản của bạn', titleCombined: 'Tạo tài khoản của bạn', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: 'Tiếp tục với {{provider|titleize}}', socialButtonsBlockButtonManyInView: '{{provider|titleize}}', @@ -943,6 +951,8 @@ export const viVN: LocalizationResource = { phone_number_exists: undefined, session_exists: undefined, web3_missing_identifier: 'Không tìm thấy phần mở rộng Web3 Wallet. Vui lòng cài đặt một phần mở rộng để tiếp tục.', + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: 'Mật khẩu của bạn hoạt động, nhưng có thể mạnh hơn. Hãy thử thêm nhiều ký tự.', goodPassword: 'Mật khẩu của bạn đáp ứng tất cả các yêu cầu cần thiết.', @@ -1349,4 +1359,9 @@ export const viVN: LocalizationResource = { title: 'Cảm ơn bạn đã tham gia danh sách chờ!', }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index 23fc899cb34..55b7b4faa34 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -737,6 +737,10 @@ export const zhCN: LocalizationResource = { subtitle: '请继续输入由您的身份验证应用生成的验证码。', title: '两步验证', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: '输入您的密码', signUp: { @@ -827,6 +831,10 @@ export const zhCN: LocalizationResource = { title: '创建您的账户', titleCombined: '创建您的账户', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '使用 {{provider|titleize}} 登录', socialButtonsBlockButtonManyInView: undefined, @@ -920,6 +928,8 @@ export const zhCN: LocalizationResource = { phone_number_exists: '该电话号码已被使用,请尝试其他号码。', session_exists: '您已登录。', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: '您的密码可以用,但可以更强。试着添加更多字符。', goodPassword: '做得好。这是一个优秀的密码。', @@ -1309,4 +1319,9 @@ export const zhCN: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index 4aa7e3d883c..e7883fd89fa 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -737,6 +737,10 @@ export const zhTW: LocalizationResource = { subtitle: undefined, title: '兩步驟驗證', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, signInEnterPasswordTitle: '輸入您的密碼', signUp: { @@ -828,6 +832,10 @@ export const zhTW: LocalizationResource = { title: '建立您的帳戶', titleCombined: '建立您的帳戶', }, + web3Solana: { + subtitle: undefined, + title: undefined, + }, }, socialButtonsBlockButton: '以 {{provider|titleize}} 帳戶登入', socialButtonsBlockButtonManyInView: undefined, @@ -920,6 +928,8 @@ export const zhTW: LocalizationResource = { phone_number_exists: '此電話號碼已被使用,請嘗試其他號碼。', session_exists: '您已經登錄。', web3_missing_identifier: undefined, + web3_signature_request_rejected: undefined, + web3_solana_signature_generation_failed: undefined, zxcvbn: { couldBeStronger: '您的密碼強度尚可,但可以更安全。請嘗試增加長度或複雜度。', goodPassword: '密碼強度良好。', @@ -1307,4 +1317,9 @@ export const zhTW: LocalizationResource = { title: undefined, }, }, + web3WalletButtons: { + connect: undefined, + continue: undefined, + noneAvailable: undefined, + }, } as const; From 23d4e739894fb6083c310cffe896a3a740487ea1 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 8 Dec 2025 15:45:21 -0500 Subject: [PATCH 25/35] chore(clerk-js): Update changeset summary Signed-off-by: Kenton Duprey --- .changeset/legal-jokes-beg.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/legal-jokes-beg.md b/.changeset/legal-jokes-beg.md index 89a53e27c30..981ea036ecc 100644 --- a/.changeset/legal-jokes-beg.md +++ b/.changeset/legal-jokes-beg.md @@ -6,4 +6,4 @@ '@clerk/clerk-react': minor --- -Implemented Sign in with Solana authentication flow to support new authentication method feature. +Add support for Sign in with Solana. From 3a973b2e91f4a2a8b93e84f565a02f6810104ead Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 8 Dec 2025 15:54:45 -0500 Subject: [PATCH 26/35] fix(clerk-js): Remove TODO comments regarding legalAccepted status in SignUp components This is handled after the user completes the auth flow with the wallet provider. Signed-off-by: Kenton Duprey --- .../clerk-js/src/ui/components/SignUp/SignUpSocialButtons.tsx | 1 - .../src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx | 2 -- 2 files changed, 3 deletions(-) diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpSocialButtons.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpSocialButtons.tsx index ebb66083f2a..cff829e0307 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpSocialButtons.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpSocialButtons.tsx @@ -75,7 +75,6 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps) }} web3Callback={strategy => { if (strategy === 'web3_solana_signature') { - // TODO: Add support to pass legalAccepted status return navigate(`choose-wallet?strategy=${strategy}`); } diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx index 22e12e25163..749fcdf4688 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx @@ -51,8 +51,6 @@ const SignUpStartSolanaWalletsCardInner = () => { signUpContinueUrl: '../continue', strategy: 'web3_solana_signature', unsafeMetadata: ctx.unsafeMetadata, - // TODO: Add support to pass legalAccepted status - // legalAccepted: , walletName, }) .catch(err => web3CallbackErrorHandler(err, card.setError)); From 718a64273912f9ee561a7465f0fa64e2f72e626f Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 8 Dec 2025 16:16:16 -0500 Subject: [PATCH 27/35] refactor(clerk-js): Rename Web3WalletButtons to Web3SolanaWalletButtons to match component usage Signed-off-by: Kenton Duprey --- .../components/SignIn/SignInFactorOneSolanaWalletsCard.tsx | 4 ++-- .../ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx | 4 ++-- .../{Web3WalletButtons.tsx => Web3SolanaWalletButtons.tsx} | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) rename packages/clerk-js/src/ui/elements/{Web3WalletButtons.tsx => Web3SolanaWalletButtons.tsx} (96%) diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx index a1aebe38e2a..526a11636f9 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx @@ -10,8 +10,8 @@ import { Header } from '@/ui/elements/Header'; import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler'; const Web3WalletButtons = lazy(() => - import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3WalletButtons').then(m => ({ - default: m.Web3WalletButtons, + import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({ + default: m.Web3SolanaWalletButtons, })), ); diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx index 749fcdf4688..6968e59052a 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStartSolanaWalletsCard.tsx @@ -10,8 +10,8 @@ import { Header } from '@/ui/elements/Header'; import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler'; const Web3WalletButtons = lazy(() => - import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3WalletButtons').then(m => ({ - default: m.Web3WalletButtons, + import(/* webpackChunkName: "web3-wallet-buttons" */ '@/ui/elements/Web3SolanaWalletButtons').then(m => ({ + default: m.Web3SolanaWalletButtons, })), ); diff --git a/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx b/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx similarity index 96% rename from packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx rename to packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx index 92c800d3e80..a780ee54714 100644 --- a/packages/clerk-js/src/ui/elements/Web3WalletButtons.tsx +++ b/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx @@ -33,7 +33,7 @@ const SOCIAL_BUTTON_BLOCK_THRESHOLD = 2; const SOCIAL_BUTTON_PRE_TEXT_THRESHOLD = 1; const MAX_STRATEGIES_PER_ROW = 5; -const Web3WalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsProps) => { +const Web3SolanaWalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsProps) => { const card = useCardState(); const { wallets } = useWallet(); const { t } = useLocalizations(); @@ -259,7 +259,7 @@ const WalletButtonBlock = forwardRef((props: WalletButtonProps, ref: Ref { +export const Web3SolanaWalletButtons = (props: Web3WalletButtonsProps) => { const network = MAINNET_ENDPOINT; const wallets = useMemo(() => [], [network]); return ( @@ -270,7 +270,7 @@ export const Web3WalletButtons = (props: Web3WalletButtonsProps) => { console.error(err); }} > - + ); From c6c6d6c2c73afbff36acf3235a389c6c7498b52d Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 8 Dec 2025 16:16:46 -0500 Subject: [PATCH 28/35] chore(clerk-js): Change import statement for Wallet type to use 'import type' syntax Signed-off-by: Kenton Duprey --- packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts index 91118cc667b..c2514cd78ac 100644 --- a/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts +++ b/packages/clerk-js/src/utils/injectedWeb3SolanaProviders.ts @@ -1,5 +1,5 @@ import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard'; -import { type Wallet } from '@wallet-standard/core'; +import type { Wallet } from '@wallet-standard/core'; //https://eips.ethereum.org/EIPS/eip-4361 From 6c20af3d598676b3e7ece23ef9b2c98ee5d2a233 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 8 Dec 2025 16:25:53 -0500 Subject: [PATCH 29/35] fix(clerk-js): Improve variable usage for Solana wallet account retrieval Signed-off-by: Kenton Duprey --- packages/clerk-js/src/utils/web3.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index f7dda84318f..d72a116250c 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -53,12 +53,13 @@ export const generateWeb3Signature: GenerateSignature = async (params): Promise< if (provider === 'solana') { try { - const walletAccount = (wallet as SolanaWalletAdapterWallet).accounts.find(a => a.address === identifier); + const solanaWallet = wallet as SolanaWalletAdapterWallet; + const walletAccount = solanaWallet.accounts.find(a => a.address === identifier); if (!walletAccount) { console.warn(`Wallet account with address ${identifier} not found`); return ''; } - const signedMessages = await (wallet as SolanaWalletAdapterWallet).features[SolanaSignMessage]?.signMessage({ + const signedMessages = await solanaWallet.features[SolanaSignMessage]?.signMessage({ account: walletAccount, message: new TextEncoder().encode(nonce), }); From 0b1002312e806e3174dfacc49d603350114bfeb7 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 8 Dec 2025 16:26:47 -0500 Subject: [PATCH 30/35] chore(clerk-js): Update import statement for ClerkRuntimeError to use shared error pkg Signed-off-by: Kenton Duprey --- packages/clerk-js/src/utils/web3.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index d72a116250c..9e2664cdc6f 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -1,8 +1,8 @@ +import { ClerkRuntimeError } from '@clerk/shared/error'; import type { GenerateSignature, Web3Provider } from '@clerk/shared/types'; import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard'; import { clerkUnsupportedEnvironmentWarning } from '@/core/errors'; -import { ClerkRuntimeError } from '@/index.headless'; import { errorThrower } from '@/utils/errorThrower'; import { getInjectedWeb3SolanaProviders } from '@/utils/injectedWeb3SolanaProviders'; From 488db63bac921ebe272373598921942379c2f335 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Mon, 8 Dec 2025 16:49:15 -0500 Subject: [PATCH 31/35] feat(clerk-js): Add loading spinner to Suspense fallback in SignInFactorOneSolanaWalletsCard Signed-off-by: Kenton Duprey --- .../SignInFactorOneSolanaWalletsCard.tsx | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx index 526a11636f9..321ac4ee56d 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneSolanaWalletsCard.tsx @@ -2,7 +2,7 @@ import { useClerk } from '@clerk/shared/react'; import { lazy, Suspense } from 'react'; import { withRedirectToAfterSignIn, withRedirectToSignInTask } from '@/ui/common/withRedirect'; -import { descriptors, Flex, Flow, localizationKeys } from '@/ui/customizables'; +import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables'; import { BackLink } from '@/ui/elements/BackLink'; import { Card } from '@/ui/elements/Card'; import { useCardState, withCardStateProvider } from '@/ui/elements/contexts'; @@ -41,7 +41,25 @@ const SignInFactorOneSolanaWalletsCardInner = () => { direction='col' gap={4} > - + ({ + height: '100%', + minHeight: t.sizes.$32, + })} + > + + + } + > { return clerk From 5ce98f1bb73eda5bea23c88ed9728a8467f5c0f5 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 9 Dec 2025 15:25:20 -0500 Subject: [PATCH 32/35] refactor(clerk-js,shared): Consolidate types regarding walletName requirement for Solana auth Create discriminated types (SignInAuthenticateWithSolanaParams and SignUpAuthenticateWithSolanaParams) with required walletName to prevent runtime errors. Update method signatures and clean up inline type unions. Signed-off-by: Kenton Duprey --- .../clerk-js/src/core/resources/SignIn.ts | 4 +-- .../clerk-js/src/core/resources/SignUp.ts | 30 ++++--------------- packages/shared/src/types/signIn.ts | 5 ++-- packages/shared/src/types/signUpCommon.ts | 1 + packages/shared/src/types/web3Wallet.ts | 4 +++ 5 files changed, 15 insertions(+), 29 deletions(-) diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index e60c23eab91..9074b69ed93 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -7,7 +7,6 @@ import type { AuthenticateWithPasskeyParams, AuthenticateWithPopupParams, AuthenticateWithRedirectParams, - AuthenticateWithSolanaParams, AuthenticateWithWeb3Params, ClientTrustState, CreateEmailLinkFlowReturn, @@ -27,6 +26,7 @@ import type { ResetPasswordParams, ResetPasswordPhoneCodeFactorConfig, SamlConfig, + SignInAuthenticateWithSolanaParams, SignInCreateParams, SignInFirstFactor, SignInFutureBackupCodeVerifyParams, @@ -469,7 +469,7 @@ export class SignIn extends BaseResource implements SignInResource { }); }; - public authenticateWithSolana = async (params: AuthenticateWithSolanaParams): Promise => { + public authenticateWithSolana = async (params: SignInAuthenticateWithSolanaParams): Promise => { const identifier = await getSolanaIdentifier(params.walletName); return this.authenticateWithWeb3({ identifier, diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 1ef742b87ed..0d9a3ba57b6 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -14,6 +14,7 @@ import type { PreparePhoneNumberVerificationParams, PrepareVerificationParams, PrepareWeb3WalletVerificationParams, + SignUpAuthenticateWithSolanaParams, SignUpAuthenticateWithWeb3Params, SignUpCreateParams, SignUpEnterpriseConnectionJSON, @@ -319,11 +320,7 @@ export class SignUp extends BaseResource implements SignUpResource { return this.attemptWeb3WalletVerification({ signature, strategy }); }; - public authenticateWithMetamask = async ( - params?: SignUpAuthenticateWithWeb3Params & { - legalAccepted?: boolean; - }, - ): Promise => { + public authenticateWithMetamask = async (params?: SignUpAuthenticateWithWeb3Params): Promise => { const identifier = await getMetamaskIdentifier(); return this.authenticateWithWeb3({ identifier, @@ -335,9 +332,7 @@ export class SignUp extends BaseResource implements SignUpResource { }; public authenticateWithCoinbaseWallet = async ( - params?: SignUpAuthenticateWithWeb3Params & { - legalAccepted?: boolean; - }, + params?: SignUpAuthenticateWithWeb3Params, ): Promise => { const identifier = await getCoinbaseWalletIdentifier(); return this.authenticateWithWeb3({ @@ -349,11 +344,7 @@ export class SignUp extends BaseResource implements SignUpResource { }); }; - public authenticateWithBase = async ( - params?: SignUpAuthenticateWithWeb3Params & { - legalAccepted?: boolean; - }, - ): Promise => { + public authenticateWithBase = async (params?: SignUpAuthenticateWithWeb3Params): Promise => { const identifier = await getBaseIdentifier(); return this.authenticateWithWeb3({ identifier, @@ -364,11 +355,7 @@ export class SignUp extends BaseResource implements SignUpResource { }); }; - public authenticateWithOKXWallet = async ( - params?: SignUpAuthenticateWithWeb3Params & { - legalAccepted?: boolean; - }, - ): Promise => { + public authenticateWithOKXWallet = async (params?: SignUpAuthenticateWithWeb3Params): Promise => { const identifier = await getOKXWalletIdentifier(); return this.authenticateWithWeb3({ identifier, @@ -379,12 +366,7 @@ export class SignUp extends BaseResource implements SignUpResource { }); }; - public authenticateWithSolana = async ( - params: SignUpAuthenticateWithWeb3Params & { - walletName: string; - legalAccepted?: boolean; - }, - ): Promise => { + public authenticateWithSolana = async (params: SignUpAuthenticateWithSolanaParams): Promise => { const identifier = await getSolanaIdentifier(params.walletName); return this.authenticateWithWeb3({ identifier, diff --git a/packages/shared/src/types/signIn.ts b/packages/shared/src/types/signIn.ts index de6d26743b5..b058679fe08 100644 --- a/packages/shared/src/types/signIn.ts +++ b/packages/shared/src/types/signIn.ts @@ -1,4 +1,3 @@ -import type { AuthenticateWithSolanaParams } from './clerk'; import type { ClerkResourceJSON, ClientTrustState, @@ -28,7 +27,7 @@ import type { import type { SignInFutureResource } from './signInFuture'; import type { SignInJSONSnapshot } from './snapshots'; import type { CreateEmailLinkFlowReturn, VerificationResource } from './verification'; -import type { AuthenticateWithWeb3Params } from './web3Wallet'; +import type { AuthenticateWithWeb3Params, SignInAuthenticateWithSolanaParams } from './web3Wallet'; /** * The `SignIn` object holds the state of the current sign-in and provides helper methods to navigate and complete the sign-in process. It is used to manage the sign-in lifecycle, including the first and second factor verification, and the creation of a new session. @@ -77,7 +76,7 @@ export interface SignInResource extends ClerkResource { authenticateWithBase: () => Promise; - authenticateWithSolana: (params: AuthenticateWithSolanaParams) => Promise; + authenticateWithSolana: (params: SignInAuthenticateWithSolanaParams) => Promise; authenticateWithPasskey: (params?: AuthenticateWithPasskeyParams) => Promise; diff --git a/packages/shared/src/types/signUpCommon.ts b/packages/shared/src/types/signUpCommon.ts index e23de564beb..4aa1b6918c6 100644 --- a/packages/shared/src/types/signUpCommon.ts +++ b/packages/shared/src/types/signUpCommon.ts @@ -115,6 +115,7 @@ export type SignUpAuthenticateWithMetamaskParams = SignUpAuthenticateWithWeb3Par export type SignUpAuthenticateWithWeb3Params = { unsafeMetadata?: SignUpUnsafeMetadata; + legalAccepted?: boolean; }; export type SignUpAuthenticateWithSolanaParams = SignUpAuthenticateWithWeb3Params & { diff --git a/packages/shared/src/types/web3Wallet.ts b/packages/shared/src/types/web3Wallet.ts index 0658cd87744..386b907393a 100644 --- a/packages/shared/src/types/web3Wallet.ts +++ b/packages/shared/src/types/web3Wallet.ts @@ -34,6 +34,10 @@ export interface AuthenticateWithWeb3Params { walletName?: string; } +export interface SignInAuthenticateWithSolanaParams { + walletName: string; +} + export interface GenerateSignatureParams { identifier: string; nonce: string; From cf118cc336c651c112bb4757b8e71654b6611252 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 9 Dec 2025 16:18:52 -0500 Subject: [PATCH 33/35] feat(clerk-js,types): Add WalletInitialIcon, update element descriptors for Web3 wallet buttons (#7417) Signed-off-by: Kenton Duprey --- .../src/ui/common/WalletInitialIcon.tsx | 43 +++++++++++++++++++ .../ui/customizables/elementDescriptors.ts | 11 +++++ .../ui/elements/Web3SolanaWalletButtons.tsx | 9 ++-- packages/shared/src/types/appearance.ts | 11 +++++ 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 packages/clerk-js/src/ui/common/WalletInitialIcon.tsx diff --git a/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx b/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx new file mode 100644 index 00000000000..362a9f64312 --- /dev/null +++ b/packages/clerk-js/src/ui/common/WalletInitialIcon.tsx @@ -0,0 +1,43 @@ +import { Box, descriptors, Text } from '../customizables'; +import type { PropsOfComponent } from '../styledSystem'; +import { common } from '../styledSystem'; + +type WalletInitialIconProps = PropsOfComponent & { + value: string; + /** + * The wallet provider name + */ + id: string; +}; + +export const WalletInitialIcon = (props: WalletInitialIconProps) => { + const { value, id, ...rest } = props; + + return ( + ({ + ...common.centeredFlex('inline-flex'), + width: t.space.$4, + height: t.space.$4, + borderRadius: t.radii.$sm, + color: t.colors.$colorPrimaryForeground, + backgroundColor: t.colors.$primary500, + })} + {...rest} + > + + {value[0].toUpperCase()} + + + ); +}; diff --git a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts index 9d0dfae51dc..f302c79941b 100644 --- a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts +++ b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts @@ -515,6 +515,17 @@ export const APPEARANCE_KEYS = containsAllElementsConfigKeys([ 'enterpriseConnectionsRoot', 'enterpriseConnectionButton', 'enterpriseConnectionButtonText', + + 'web3WalletButtonsRoot', + 'web3WalletButtons', + 'web3WalletButtonsIconButton', + 'web3WalletButtonsBlockButton', + 'web3WalletButtonsBlockButtonText', + 'web3WalletButtonsWalletIcon', + 'web3WalletButtonsWalletInitialIcon', + + 'walletIcon', + 'walletInitialIcon', ] as const).map(camelize) as (keyof ElementsConfig)[]; type TargettableClassname = `${typeof CLASS_PREFIX}${K}`; diff --git a/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx b/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx index a780ee54714..4ca1f61e226 100644 --- a/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx +++ b/packages/clerk-js/src/ui/elements/Web3SolanaWalletButtons.tsx @@ -4,7 +4,7 @@ import { MAINNET_ENDPOINT } from '@solana/wallet-standard'; import type { Ref } from 'react'; import React, { forwardRef, isValidElement, useMemo } from 'react'; -import { ProviderInitialIcon } from '@/ui/common'; +import { WalletInitialIcon } from '@/ui/common/WalletInitialIcon'; import { Button, descriptors, @@ -94,6 +94,7 @@ const Web3SolanaWalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsPro {strategyRows.map((row, rowIndex) => ( ({ justifyContent: 'center', @@ -130,6 +132,7 @@ const Web3SolanaWalletButtonsInner = ({ web3AuthCallback }: Web3WalletButtonsPro const imageOrInitial = w.icon ? ( ({ width: theme.sizes.$4, height: 'auto', maxWidth: '100%' })} /> ) : ( - ); diff --git a/packages/shared/src/types/appearance.ts b/packages/shared/src/types/appearance.ts index 809aae80217..739ecd36fe7 100644 --- a/packages/shared/src/types/appearance.ts +++ b/packages/shared/src/types/appearance.ts @@ -650,6 +650,17 @@ export type ElementsConfig = { enterpriseConnectionsRoot: WithOptions; enterpriseConnectionButton: WithOptions; enterpriseConnectionButtonText: WithOptions; + + web3WalletButtonsRoot: WithOptions; + web3WalletButtons: WithOptions; + web3WalletButtonsIconButton: WithOptions; + web3WalletButtonsBlockButton: WithOptions; + web3WalletButtonsBlockButtonText: WithOptions; + web3WalletButtonsWalletIcon: WithOptions; + web3WalletButtonsWalletInitialIcon: WithOptions; + + walletIcon: WithOptions; + walletInitialIcon: WithOptions; }; export type Elements = { From 52293e071528d8b26688df9800b81dfaaaadf20e Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 9 Dec 2025 16:30:21 -0500 Subject: [PATCH 34/35] refactor(types): Move SignInAuthenticateWithSolanaParams interface to signInCommon.ts Signed-off-by: Kenton Duprey --- packages/shared/src/types/signIn.ts | 3 ++- packages/shared/src/types/signInCommon.ts | 4 ++++ packages/shared/src/types/web3Wallet.ts | 4 ---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/shared/src/types/signIn.ts b/packages/shared/src/types/signIn.ts index b058679fe08..031cf9e76eb 100644 --- a/packages/shared/src/types/signIn.ts +++ b/packages/shared/src/types/signIn.ts @@ -16,6 +16,7 @@ import type { PrepareFirstFactorParams, PrepareSecondFactorParams, ResetPasswordParams, + SignInAuthenticateWithSolanaParams, SignInCreateParams, SignInFirstFactor, SignInIdentifier, @@ -27,7 +28,7 @@ import type { import type { SignInFutureResource } from './signInFuture'; import type { SignInJSONSnapshot } from './snapshots'; import type { CreateEmailLinkFlowReturn, VerificationResource } from './verification'; -import type { AuthenticateWithWeb3Params, SignInAuthenticateWithSolanaParams } from './web3Wallet'; +import type { AuthenticateWithWeb3Params } from './web3Wallet'; /** * The `SignIn` object holds the state of the current sign-in and provides helper methods to navigate and complete the sign-in process. It is used to manage the sign-in lifecycle, including the first and second factor verification, and the creation of a new session. diff --git a/packages/shared/src/types/signInCommon.ts b/packages/shared/src/types/signInCommon.ts index de07635a6d3..ccc5675915f 100644 --- a/packages/shared/src/types/signInCommon.ts +++ b/packages/shared/src/types/signInCommon.ts @@ -197,3 +197,7 @@ export type SignInStrategy = | OAuthStrategy | SamlStrategy | EnterpriseSSOStrategy; + +export interface SignInAuthenticateWithSolanaParams { + walletName: string; +} diff --git a/packages/shared/src/types/web3Wallet.ts b/packages/shared/src/types/web3Wallet.ts index 386b907393a..0658cd87744 100644 --- a/packages/shared/src/types/web3Wallet.ts +++ b/packages/shared/src/types/web3Wallet.ts @@ -34,10 +34,6 @@ export interface AuthenticateWithWeb3Params { walletName?: string; } -export interface SignInAuthenticateWithSolanaParams { - walletName: string; -} - export interface GenerateSignatureParams { identifier: string; nonce: string; From e97969e42cc66e1dfe0bebd0aecded8ffe7cd372 Mon Sep 17 00:00:00 2001 From: Kenton Duprey Date: Tue, 9 Dec 2025 16:36:28 -0500 Subject: [PATCH 35/35] chore(bundlewatch): update bundlewatch bundle sizes Signed-off-by: Kenton Duprey --- packages/clerk-js/bundlewatch.config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index 0dcacfcef0b..f1ff076fd5b 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,10 +1,10 @@ { "files": [ - { "path": "./dist/clerk.js", "maxSize": "922KB" }, + { "path": "./dist/clerk.js", "maxSize": "922.1KB" }, { "path": "./dist/clerk.browser.js", "maxSize": "87KB" }, { "path": "./dist/clerk.legacy.browser.js", "maxSize": "129KB" }, { "path": "./dist/clerk.headless*.js", "maxSize": "66KB" }, - { "path": "./dist/ui-common*.js", "maxSize": "119KB" }, + { "path": "./dist/ui-common*.js", "maxSize": "119.1KB" }, { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "123KB" }, { "path": "./dist/vendors*.js", "maxSize": "50KB" }, { "path": "./dist/coinbase*.js", "maxSize": "38KB" },