diff --git a/.changeset/silent-insects-cheat.md b/.changeset/silent-insects-cheat.md new file mode 100644 index 00000000000..c2bd2803b07 --- /dev/null +++ b/.changeset/silent-insects-cheat.md @@ -0,0 +1,8 @@ +--- +'@clerk/clerk-js': minor +'@clerk/shared': minor +'@clerk/clerk-react': minor +'@clerk/types': minor +--- + +Added support for authentication with Base diff --git a/packages/clerk-js/bundlewatch.config.json b/packages/clerk-js/bundlewatch.config.json index e1f49d6db29..6406f0f9367 100644 --- a/packages/clerk-js/bundlewatch.config.json +++ b/packages/clerk-js/bundlewatch.config.json @@ -1,12 +1,12 @@ { "files": [ - { "path": "./dist/clerk.js", "maxSize": "631KB" }, + { "path": "./dist/clerk.js", "maxSize": "818KB" }, { "path": "./dist/clerk.browser.js", "maxSize": "78KB" }, { "path": "./dist/clerk.legacy.browser.js", "maxSize": "120KB" }, { "path": "./dist/clerk.headless*.js", "maxSize": "61KB" }, { "path": "./dist/ui-common*.js", "maxSize": "117.1KB" }, { "path": "./dist/ui-common*.legacy.*.js", "maxSize": "118KB" }, - { "path": "./dist/vendors*.js", "maxSize": "43.78KB" }, + { "path": "./dist/vendors*.js", "maxSize": "45KB" }, { "path": "./dist/coinbase*.js", "maxSize": "38KB" }, { "path": "./dist/stripe-vendors*.js", "maxSize": "1KB" }, { "path": "./dist/createorganization*.js", "maxSize": "5KB" }, diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index cb98e84a48c..8340722c2ee 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -63,6 +63,7 @@ }, "browserslist": "last 2 years", "dependencies": { + "@base-org/account": "2.0.1", "@clerk/localizations": "workspace:^", "@clerk/shared": "workspace:^", "@clerk/types": "workspace:^", diff --git a/packages/clerk-js/rspack.config.js b/packages/clerk-js/rspack.config.js index 3c1aa80a6a9..e32aaabe54a 100644 --- a/packages/clerk-js/rspack.config.js +++ b/packages/clerk-js/rspack.config.js @@ -96,6 +96,11 @@ const common = ({ mode, variant, disableRHC = false }) => { name: 'zxcvbn-common', chunks: 'all', }, + baseAccountSDKVendor: { + test: /[\\/]node_modules[\\/](@base-org\/account|@noble\/curves|abitype|ox|preact|eventemitter3|viem|zustand)[\\/]/, + name: 'base-account-sdk', + chunks: 'all', + }, coinbaseWalletSDKVendor: { test: /[\\/]node_modules[\\/](@coinbase\/wallet-sdk|preact|eventemitter3|@noble\/hashes)[\\/]/, name: 'coinbase-wallet-sdk', diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index ce1b64d96ae..807942113bf 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -24,6 +24,7 @@ import type { __internal_UserVerificationModalProps, APIKeysNamespace, APIKeysProps, + AuthenticateWithBaseParams, AuthenticateWithCoinbaseWalletParams, AuthenticateWithGoogleOneTapParams, AuthenticateWithMetamaskParams, @@ -42,6 +43,7 @@ import type { EnvironmentJSON, EnvironmentJSONSnapshot, EnvironmentResource, + GenerateSignatureParams, GoogleOneTapProps, HandleEmailLinkVerificationParams, HandleOAuthCallbackParams, @@ -100,6 +102,7 @@ import { disabledAPIKeysFeature, disabledOrganizationsFeature, errorThrower, + generateSignatureWithBase, generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, @@ -2148,6 +2151,13 @@ export class Clerk implements ClerkInterface { }); }; + public authenticateWithBase = async (props: AuthenticateWithBaseParams = {}): Promise => { + await this.authenticateWithWeb3({ + ...props, + strategy: 'web3_base_signature', + }); + }; + public authenticateWithOKXWallet = async (props: AuthenticateWithOKXWalletParams = {}): Promise => { await this.authenticateWithWeb3({ ...props, @@ -2172,12 +2182,21 @@ export class Clerk implements ClerkInterface { const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; const identifier = await getWeb3Identifier({ provider }); - const generateSignature = - provider === 'metamask' - ? generateSignatureWithMetamask - : provider === 'coinbase_wallet' - ? generateSignatureWithCoinbaseWallet - : generateSignatureWithOKXWallet; + let generateSignature: (params: GenerateSignatureParams) => Promise; + switch (provider) { + case 'metamask': + generateSignature = generateSignatureWithMetamask; + break; + case 'base': + generateSignature = generateSignatureWithBase; + break; + case 'coinbase_wallet': + generateSignature = generateSignatureWithCoinbaseWallet; + break; + default: + generateSignature = generateSignatureWithOKXWallet; + break; + } const makeNavigate = (to: string) => () => customNavigate && typeof customNavigate === 'function' ? customNavigate(to) : this.navigate(to); diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 5925e5c6399..3df788e3d5c 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -44,9 +44,11 @@ import type { } from '@clerk/types'; import { + generateSignatureWithBase, generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, + getBaseIdentifier, getCoinbaseWalletIdentifier, getMetamaskIdentifier, getOKXWalletIdentifier, @@ -143,11 +145,8 @@ export class SignIn extends BaseResource implements SignInResource { } as PhoneCodeConfig; break; case 'web3_metamask_signature': - config = { web3WalletId: factor.web3WalletId } as Web3SignatureConfig; - break; + case 'web3_base_signature': case 'web3_coinbase_wallet_signature': - config = { web3WalletId: factor.web3WalletId } as Web3SignatureConfig; - break; case 'web3_okx_wallet_signature': config = { web3WalletId: factor.web3WalletId } as Web3SignatureConfig; break; @@ -361,6 +360,15 @@ export class SignIn extends BaseResource implements SignInResource { }); }; + public authenticateWithBase = async (): Promise => { + const identifier = await getBaseIdentifier(); + return this.authenticateWithWeb3({ + identifier, + generateSignature: generateSignatureWithBase, + strategy: 'web3_base_signature', + }); + }; + public authenticateWithOKXWallet = async (): Promise => { const identifier = await getOKXWalletIdentifier(); return this.authenticateWithWeb3({ diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index d1db91e3ac4..e06a03681ef 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -30,9 +30,11 @@ import type { } from '@clerk/types'; import { + generateSignatureWithBase, generateSignatureWithCoinbaseWallet, generateSignatureWithMetamask, generateSignatureWithOKXWallet, + getBaseIdentifier, getCoinbaseWalletIdentifier, getMetamaskIdentifier, getOKXWalletIdentifier, @@ -276,6 +278,21 @@ export class SignUp extends BaseResource implements SignUpResource { }); }; + public authenticateWithBase = async ( + params?: SignUpAuthenticateWithWeb3Params & { + legalAccepted?: boolean; + }, + ): Promise => { + const identifier = await getBaseIdentifier(); + return this.authenticateWithWeb3({ + identifier, + generateSignature: generateSignatureWithBase, + unsafeMetadata: params?.unsafeMetadata, + strategy: 'web3_base_signature', + legalAccepted: params?.legalAccepted, + }); + }; + public authenticateWithOKXWallet = async ( params?: SignUpAuthenticateWithWeb3Params & { legalAccepted?: boolean; diff --git a/packages/clerk-js/src/utils/web3.ts b/packages/clerk-js/src/utils/web3.ts index f6e73f1170c..9c983060134 100644 --- a/packages/clerk-js/src/utils/web3.ts +++ b/packages/clerk-js/src/utils/web3.ts @@ -21,7 +21,7 @@ export async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promis } const identifiers = await ethereum.request({ method: 'eth_requestAccounts' }); - // @ts-ignore + // @ts-ignore -- Provider SDKs may return unknown shape; use first address if present return (identifiers && identifiers[0]) || ''; } @@ -58,6 +58,10 @@ export async function getOKXWalletIdentifier(): Promise { return await getWeb3Identifier({ provider: 'okx_wallet' }); } +export async function getBaseIdentifier(): Promise { + return await getWeb3Identifier({ provider: 'base' }); +} + type GenerateSignatureParams = { identifier: string; nonce: string; @@ -75,6 +79,10 @@ export async function generateSignatureWithOKXWallet(params: GenerateSignaturePa 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) { if (provider === 'coinbase_wallet') { if (__BUILD_DISABLE_RHC__) { @@ -90,7 +98,27 @@ async function getEthereumProvider(provider: Web3Provider) { }); return sdk.getProvider(); } + if (provider === 'base') { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Base'); + return null; + } + + try { + const createBaseAccountSDK = await import('@base-org/account').then(mod => mod.createBaseAccountSDK); + + const sdk = createBaseAccountSDK({ + appName: + (typeof window !== 'undefined' && + (window.Clerk as any)?.__unstable__environment?.displayConfig?.applicationName) || + (typeof document !== 'undefined' && document.title) || + 'Web3 Application', + }); + return sdk.getProvider(); + } catch { + return null; + } + } - const injectedWeb3Providers = getInjectedWeb3Providers(); - return injectedWeb3Providers.get(provider); + return getInjectedWeb3Providers().get(provider); } diff --git a/packages/clerk-js/vitest.config.mts b/packages/clerk-js/vitest.config.mts index 1e3d89aa3e3..fa7da0d033b 100644 --- a/packages/clerk-js/vitest.config.mts +++ b/packages/clerk-js/vitest.config.mts @@ -24,6 +24,7 @@ function viteSvgMockPlugin() { export default defineConfig({ plugins: [react({ jsxRuntime: 'automatic', jsxImportSource: '@emotion/react' }), viteSvgMockPlugin()], define: { + __BUILD_DISABLE_RHC__: JSON.stringify(false), __BUILD_VARIANT_CHIPS__: JSON.stringify(false), __PKG_NAME__: JSON.stringify('@clerk/clerk-js'), __PKG_VERSION__: JSON.stringify('test'), 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 232df004cfc..8a9f3a9e657 100644 --- a/packages/elements/src/internals/machines/sign-in/start.machine.ts +++ b/packages/elements/src/internals/machines/sign-in/start.machine.ts @@ -36,6 +36,9 @@ export const SignInStartMachine = setup({ if (strategy === 'web3_coinbase_wallet_signature') { return parent.getSnapshot().context.clerk.client.signIn.authenticateWithCoinbaseWallet(); } + if (strategy === 'web3_base_signature') { + return parent.getSnapshot().context.clerk.client.signIn.authenticateWithBase(); + } if (strategy === 'web3_okx_wallet_signature') { return parent.getSnapshot().context.clerk.client.signIn.authenticateWithOKXWallet(); } 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 7f0e6f9b450..5d196cdb963 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 @@ -76,6 +76,10 @@ export const useThirdPartyProvider = < return ref.send({ type: 'AUTHENTICATE.ENTERPRISE_SSO' }); } + if (provider === 'base') { + return ref.send({ type: 'AUTHENTICATE.WEB3', strategy: 'web3_base_signature' }); + } + if (provider === 'metamask') { return ref.send({ type: 'AUTHENTICATE.WEB3', strategy: 'web3_metamask_signature' }); } diff --git a/packages/elements/src/react/utils/map-scope-to-strategy.ts b/packages/elements/src/react/utils/map-scope-to-strategy.ts index bd170d46277..39efeeff534 100644 --- a/packages/elements/src/react/utils/map-scope-to-strategy.ts +++ b/packages/elements/src/react/utils/map-scope-to-strategy.ts @@ -10,9 +10,15 @@ export function mapScopeToStrategy(scope: T): if (scope === 'provider:metamask') { return 'web3_metamask_signature'; } + if (scope === 'provider:coinbase_wallet') { return 'web3_coinbase_wallet_signature'; } + + if (scope === 'provider:base') { + return 'web3_base_signature'; + } + if (scope === 'provider:okx_wallet') { return 'web3_okx_wallet_signature'; } diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index be047efda43..3fd9bf7061c 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -11,6 +11,7 @@ import type { __internal_UserVerificationProps, APIKeysNamespace, APIKeysProps, + AuthenticateWithBaseParams, AuthenticateWithCoinbaseWalletParams, AuthenticateWithGoogleOneTapParams, AuthenticateWithMetamaskParams, @@ -1353,6 +1354,15 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; + authenticateWithBase = async (params?: AuthenticateWithBaseParams) => { + const callback = () => this.clerkjs?.authenticateWithBase(params); + if (this.clerkjs && this.loaded) { + return callback() as Promise; + } else { + this.premountMethodCalls.set('authenticateWithBase', callback); + } + }; + authenticateWithOKXWallet = async (params?: AuthenticateWithOKXWalletParams) => { const callback = () => this.clerkjs?.authenticateWithOKXWallet(params); if (this.clerkjs && this.loaded) { diff --git a/packages/shared/src/web3.ts b/packages/shared/src/web3.ts index a28ae8bfb63..7f84ffcebf5 100644 --- a/packages/shared/src/web3.ts +++ b/packages/shared/src/web3.ts @@ -6,6 +6,11 @@ export const WEB3_PROVIDERS: Web3ProviderData[] = [ strategy: 'web3_metamask_signature', name: 'MetaMask', }, + { + provider: 'base', + strategy: 'web3_base_signature', + name: 'Base', + }, { provider: 'coinbase_wallet', strategy: 'web3_coinbase_wallet_signature', diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index d0de55bff6a..cfc493f2468 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -816,6 +816,11 @@ export interface Clerk { */ authenticateWithOKXWallet: (params?: AuthenticateWithOKXWalletParams) => Promise; + /** + * Authenticates user using Base Account SDK + */ + authenticateWithBase: (params?: AuthenticateWithBaseParams) => Promise; + /** * Authenticates user using their Web3 Wallet browser extension */ @@ -2179,6 +2184,14 @@ export interface AuthenticateWithGoogleOneTapParams { legalAccepted?: boolean; } +export interface AuthenticateWithBaseParams { + customNavigate?: (to: string) => Promise; + redirectUrl?: string; + signUpContinueUrl?: string; + unsafeMetadata?: SignUpUnsafeMetadata; + legalAccepted?: boolean; +} + export interface LoadedClerk extends Clerk { client: ClientResource; } diff --git a/packages/types/src/signIn.ts b/packages/types/src/signIn.ts index 241d015ffd9..4e8a29077c6 100644 --- a/packages/types/src/signIn.ts +++ b/packages/types/src/signIn.ts @@ -115,6 +115,8 @@ export interface SignInResource extends ClerkResource { authenticateWithOKXWallet: () => Promise; + authenticateWithBase: () => Promise; + authenticateWithPasskey: (params?: AuthenticateWithPasskeyParams) => Promise; createEmailLinkFlow: () => CreateEmailLinkFlowReturn; diff --git a/packages/types/src/signUp.ts b/packages/types/src/signUp.ts index ae27c744b69..f58abed02d6 100644 --- a/packages/types/src/signUp.ts +++ b/packages/types/src/signUp.ts @@ -116,6 +116,7 @@ export interface SignUpResource extends ClerkResource { authenticateWithMetamask: (params?: SignUpAuthenticateWithWeb3Params) => Promise; authenticateWithCoinbaseWallet: (params?: SignUpAuthenticateWithWeb3Params) => Promise; authenticateWithOKXWallet: (params?: SignUpAuthenticateWithWeb3Params) => Promise; + authenticateWithBase: (params?: SignUpAuthenticateWithWeb3Params) => Promise; __internal_toSnapshot: () => SignUpJSONSnapshot; /** diff --git a/packages/types/src/web3.ts b/packages/types/src/web3.ts index 82ecda79dea..fc4249bf9b3 100644 --- a/packages/types/src/web3.ts +++ b/packages/types/src/web3.ts @@ -9,8 +9,9 @@ export interface Web3ProviderData { export type MetamaskWeb3Provider = 'metamask'; export type CoinbaseWalletWeb3Provider = 'coinbase_wallet'; export type OKXWalletWeb3Provider = 'okx_wallet'; +export type BaseWeb3Provider = 'base'; -export type Web3Provider = MetamaskWeb3Provider | CoinbaseWalletWeb3Provider | OKXWalletWeb3Provider; +export type Web3Provider = MetamaskWeb3Provider | BaseWeb3Provider | CoinbaseWalletWeb3Provider | OKXWalletWeb3Provider; /** * @deprecated Use `import { WEB3_PROVIDERS } from "@clerk/shared/web3"` instead. @@ -23,6 +24,11 @@ export const WEB3_PROVIDERS: Web3ProviderData[] = [ strategy: 'web3_metamask_signature', name: 'MetaMask', }, + { + provider: 'base', + strategy: 'web3_base_signature', + name: 'Base', + }, { provider: 'coinbase_wallet', strategy: 'web3_coinbase_wallet_signature', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 637e158a697..81de9afa4b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -365,7 +365,7 @@ importers: devDependencies: astro: specifier: ^5.13.2 - version: 5.13.2(@netlify/blobs@9.1.2)(@types/node@24.0.14)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.27.0)(rollup@4.45.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.8.0) + version: 5.13.2(@netlify/blobs@9.1.2)(@types/node@24.0.14)(db0@0.3.2)(idb-keyval@6.2.1)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.27.0)(rollup@4.45.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.8.0) packages/backend: dependencies: @@ -434,6 +434,9 @@ importers: packages/clerk-js: dependencies: + '@base-org/account': + specifier: 2.0.1 + version: 2.0.1(@types/react@18.3.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(zod@3.25.76) '@clerk/localizations': specifier: workspace:^ version: link:../localizations @@ -807,7 +810,7 @@ importers: devDependencies: nuxt: specifier: ^3.17.7 - version: 3.17.7(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.0.14)(@vue/compiler-sfc@3.5.19)(db0@0.3.2)(eslint@9.31.0(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.27.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.45.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.0) + version: 3.17.7(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.0.14)(@vue/compiler-sfc@3.5.19)(db0@0.3.2)(eslint@9.31.0(jiti@2.4.2))(idb-keyval@6.2.1)(ioredis@5.6.1)(lightningcss@1.27.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.45.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.0) typescript: specifier: catalog:repo version: 5.8.3 @@ -1155,6 +1158,9 @@ packages: '@adobe/css-tools@4.4.0': resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@ai-sdk/provider-utils@2.1.6': resolution: {integrity: sha512-Pfyaj0QZS22qyVn5Iz7IXcJ8nKIKlu2MeSAdKJzTwkAks7zdLaKVB+396Rqcp1bfQnxl7vaduQVMQiXUrgK8Gw==} engines: {node: '>=18'} @@ -1961,6 +1967,9 @@ packages: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} + '@base-org/account@2.0.1': + resolution: {integrity: sha512-tySVNx+vd6XEynZL0uvB10uKiwnAfThr8AbKTwILVG86mPbLAhEOInQIk+uDnvpTvfdUhC1Bi5T/46JvFoLZQQ==} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -3619,8 +3628,24 @@ packages: '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} - '@noble/hashes@1.7.1': - resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.2': + resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': @@ -4504,6 +4529,15 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -5782,6 +5816,17 @@ packages: resolution: {integrity: sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==} engines: {node: ^18.17.0 || >=20.5.0} + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -9135,6 +9180,9 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -9645,6 +9693,11 @@ packages: peerDependencies: ws: '*' + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -11340,6 +11393,22 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.8.6: + resolution: {integrity: sha512-eiKcgiVVEGDtEpEdFi1EGoVVI48j6icXHce9nFwCNM7CKG3uoCXKdr4TPhS00Iy1TR2aWSF1ltPD0x/YgqIL9w==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + oxc-parser@0.76.0: resolution: {integrity: sha512-l98B2e9evuhES7zN99rb1QGhbzx25829TJFaKi2j0ib3/K/G5z1FdGYz6HZkrU3U8jdH7v2FC8mX1j2l9JrOUg==} engines: {node: '>=20.0.0'} @@ -11956,6 +12025,9 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + preact@10.24.2: + resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} + preact@10.25.4: resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} @@ -14316,6 +14388,14 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + viem@2.33.3: + resolution: {integrity: sha512-aWDr6i6r3OfNCs0h9IieHFhn7xQJJ8YsuA49+9T5JRyGGAkWhLgcbLq2YMecgwM7HdUZpx1vPugZjsShqNi7Gw==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + vite-dev-rpc@1.1.0: resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} peerDependencies: @@ -14785,6 +14865,18 @@ packages: utf-8-validate: optional: true + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -14963,6 +15055,24 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zustand@5.0.3: + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -14995,6 +15105,8 @@ snapshots: '@adobe/css-tools@4.4.0': {} + '@adraffy/ens-normalize@1.11.0': {} + '@ai-sdk/provider-utils@2.1.6(zod@3.24.2)': dependencies: '@ai-sdk/provider': 1.0.7 @@ -16042,6 +16154,26 @@ 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.23)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@18.3.1))(zod@3.25.76)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + 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) + zustand: 5.0.3(@types/react@18.3.23)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + '@bcoe/v8-coverage@0.2.3': {} '@bcoe/v8-coverage@1.0.2': {} @@ -16228,7 +16360,7 @@ snapshots: '@coinbase/wallet-sdk@4.3.0': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 clsx: 1.2.1 eventemitter3: 5.0.1 preact: 10.25.4 @@ -18096,7 +18228,19 @@ snapshots: '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': optional: true - '@noble/hashes@1.7.1': {} + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.9.2': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -19297,6 +19441,19 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@scure/base@1.2.6': {} + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@sec-ant/readable-stream@0.4.1': {} '@segment/loosely-validate-event@2.0.0': @@ -19788,7 +19945,7 @@ snapshots: babel-dead-code-elimination: 1.0.10 cheerio: 1.1.0 h3: 1.13.0 - nitropack: 2.11.13(@netlify/blobs@9.1.2) + nitropack: 2.11.13(@netlify/blobs@9.1.2)(idb-keyval@6.2.1) pathe: 2.0.3 ufo: 1.6.1 vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) @@ -21058,6 +21215,11 @@ snapshots: abbrev@3.0.0: {} + abitype@1.0.8(typescript@5.8.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.8.3 + zod: 3.25.76 + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -21392,7 +21554,7 @@ snapshots: astral-regex@2.0.0: {} - astro@5.13.2(@netlify/blobs@9.1.2)(@types/node@24.0.14)(db0@0.3.2)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.27.0)(rollup@4.45.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.8.0): + astro@5.13.2(@netlify/blobs@9.1.2)(@types/node@24.0.14)(db0@0.3.2)(idb-keyval@6.2.1)(ioredis@5.6.1)(jiti@2.4.2)(lightningcss@1.27.0)(rollup@4.45.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.8.3)(yaml@2.8.0): dependencies: '@astrojs/compiler': 2.12.2 '@astrojs/internal-helpers': 0.7.2 @@ -21446,7 +21608,7 @@ snapshots: ultrahtml: 1.6.0 unifont: 0.5.2 unist-util-visit: 5.0.0 - unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.6.1) + unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(idb-keyval@6.2.1)(ioredis@5.6.1) vfile: 6.0.3 vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0) vitefu: 1.1.1(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)) @@ -25253,6 +25415,8 @@ snapshots: dependencies: safer-buffer: 2.1.2 + idb-keyval@6.2.1: {} + ieee754@1.2.1: {} ignore-walk@3.0.4: @@ -25707,6 +25871,10 @@ snapshots: dependencies: ws: 8.18.3 + isows@1.0.7(ws@8.18.2): + dependencies: + ws: 8.18.2 + isstream@0.1.2: {} istanbul-lib-coverage@3.2.2: {} @@ -27640,7 +27808,7 @@ snapshots: nice-try@1.0.5: {} - nitropack@2.11.13(@netlify/blobs@9.1.2): + nitropack@2.11.13(@netlify/blobs@9.1.2)(idb-keyval@6.2.1): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@netlify/functions': 3.1.10(rollup@4.45.0) @@ -27708,7 +27876,7 @@ snapshots: unenv: 2.0.0-rc.18 unimport: 5.1.0 unplugin-utils: 0.2.4 - unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.6.1) + unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(idb-keyval@6.2.1)(ioredis@5.6.1) untyped: 2.0.0 unwasm: 0.3.9 youch: 4.1.0-beta.8 @@ -27906,7 +28074,7 @@ snapshots: nullthrows@1.1.1: {} - nuxt@3.17.7(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.0.14)(@vue/compiler-sfc@3.5.19)(db0@0.3.2)(eslint@9.31.0(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.27.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.45.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.0): + nuxt@3.17.7(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.0.14)(@vue/compiler-sfc@3.5.19)(db0@0.3.2)(eslint@9.31.0(jiti@2.4.2))(idb-keyval@6.2.1)(ioredis@5.6.1)(lightningcss@1.27.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.45.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.0): dependencies: '@nuxt/cli': 3.25.1(magicast@0.3.5) '@nuxt/devalue': 2.0.2 @@ -27941,7 +28109,7 @@ snapshots: mlly: 1.7.4 mocked-exports: 0.1.1 nanotar: 0.2.0 - nitropack: 2.11.13(@netlify/blobs@9.1.2) + nitropack: 2.11.13(@netlify/blobs@9.1.2)(idb-keyval@6.2.1) nypm: 0.6.0 ofetch: 1.4.1 ohash: 2.0.11 @@ -27963,7 +28131,7 @@ snapshots: unimport: 5.1.0 unplugin: 2.3.5 unplugin-vue-router: 0.14.0(@vue/compiler-sfc@3.5.19)(vue-router@4.5.1(vue@3.5.19(typescript@5.8.3)))(vue@3.5.19(typescript@5.8.3)) - unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.6.1) + unstorage: 1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(idb-keyval@6.2.1)(ioredis@5.6.1) untyped: 2.0.0 vue: 3.5.19(typescript@5.8.3) vue-bundle-renderer: 2.1.1 @@ -28215,6 +28383,35 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + ox@0.6.9(typescript@5.8.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.9.7 + '@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) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + + ox@0.8.6(typescript@5.8.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@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) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + oxc-parser@0.76.0: dependencies: '@oxc-project/types': 0.76.0 @@ -28818,6 +29015,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + preact@10.24.2: {} + preact@10.25.4: {} precinct@12.2.0: @@ -31250,7 +31449,7 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 - unstorage@1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.6.1): + unstorage@1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2)(idb-keyval@6.2.1)(ioredis@5.6.1): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -31263,6 +31462,7 @@ snapshots: optionalDependencies: '@netlify/blobs': 9.1.2 db0: 0.3.2 + idb-keyval: 6.2.1 ioredis: 5.6.1 untildify@4.0.0: {} @@ -31458,6 +31658,23 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + viem@2.33.3(typescript@5.8.3)(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) + ox: 0.8.6(typescript@5.8.3)(zod@3.25.76) + ws: 8.18.2 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + vite-dev-rpc@1.1.0(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(lightningcss@1.27.0)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)): dependencies: birpc: 2.4.0 @@ -32096,6 +32313,8 @@ snapshots: ws@8.17.1: {} + ws@8.18.2: {} + ws@8.18.3: {} xcode@3.0.1: @@ -32270,6 +32489,12 @@ snapshots: zod@3.25.76: {} + zustand@5.0.3(@types/react@18.3.23)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)): + optionalDependencies: + '@types/react': 18.3.23 + react: 18.3.1 + use-sync-external-store: 1.5.0(react@18.3.1) + zwitch@2.0.4: {} zx@8.8.1: {}