UNPKG

@clerk/shared

Version:

Internal package utils used by the Clerk SDKs

1 lines 10.8 kB
{"version":3,"file":"web3.mjs","names":[],"sources":["../../../src/internal/clerk-js/web3.ts"],"sourcesContent":["import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard';\n\nimport { buildErrorThrower, ClerkRuntimeError } from '../../error';\nimport type { ModuleManager } from '../../moduleManager';\nimport type { GenerateSignature, Web3Provider } from '../../types';\nimport { clerkUnsupportedEnvironmentWarning } from './errors';\nimport { toHex } from './hex';\nimport { getInjectedWeb3EthProviders } from './injectedWeb3EthProviders';\nimport { getInjectedWeb3SolanaProviders } from './injectedWeb3SolanaProviders';\n\ntype GetWeb3IdentifierParams = {\n provider: Web3Provider;\n walletName?: string;\n};\n\n// '@solana/wallet-standard'\nconst StandardConnect = `standard:connect`;\nconst SolanaSignMessage = `solana:signMessage`;\n\ntype GenerateSignatureParams = {\n identifier: string;\n nonce: string;\n};\n\ntype GenerateSolanaSignatureParams = GenerateSignatureParams & {\n walletName: string;\n};\n\nexport function createWeb3(moduleManager: ModuleManager) {\n const errorThrower = buildErrorThrower({\n packageName: '@clerk/shared',\n });\n\n async function getWeb3Identifier(params: GetWeb3IdentifierParams): Promise<string> {\n const { provider, walletName } = params;\n const walletProvider = await getWeb3Wallet(provider, walletName);\n\n // TODO - core-3: Improve error handling for the case when the provider is not found\n if (!walletProvider) {\n // If a plugin for the requested provider is not found,\n // the flow will fail as it has been the expected behavior so far.\n return '';\n }\n\n if (provider === 'solana') {\n const identifiers = await walletProvider.features[StandardConnect].connect();\n return (identifiers && identifiers.accounts[0].address) || '';\n }\n\n // Ethereum providers\n const identifiers = await walletProvider.request({ method: 'eth_requestAccounts' });\n // @ts-ignore -- Provider SDKs may return unknown shape; use first address if present\n return (identifiers && identifiers[0]) || '';\n }\n\n const generateWeb3Signature: GenerateSignature = async (params): Promise<string> => {\n const { identifier, nonce, provider, walletName = '' } = params;\n const wallet = await getWeb3Wallet(provider, walletName);\n\n // TODO - core-3: Improve error handling for the case when the provider is not found\n if (!wallet) {\n // If a plugin for the requested provider is not found,\n // the flow will fail as it has been the expected behavior so far.\n return '';\n }\n\n if (provider === 'solana') {\n try {\n const solanaWallet = wallet as SolanaWalletAdapterWallet;\n const walletAccount = solanaWallet.accounts.find(a => a.address === identifier);\n if (!walletAccount) {\n console.warn(`Wallet account with address ${identifier} not found`);\n return '';\n }\n const signedMessages = await solanaWallet.features[SolanaSignMessage]?.signMessage({\n account: walletAccount,\n message: new TextEncoder().encode(nonce),\n });\n // Convert signature Uint8Array to base64 string\n return signedMessages?.[0]?.signature ? btoa(String.fromCharCode(...signedMessages[0].signature)) : '';\n } catch (err) {\n if (err instanceof Error && err.message.includes('User rejected the request.')) {\n throw new ClerkRuntimeError('Web3 signature request was rejected by the user.', {\n code: 'web3_signature_request_rejected',\n });\n }\n throw new ClerkRuntimeError('An error occurred while generating the Solana signature.', {\n code: 'web3_solana_signature_generation_failed',\n cause: err instanceof Error ? err : undefined,\n });\n }\n }\n\n return await wallet.request({\n method: 'personal_sign',\n params: [`0x${toHex(nonce)}`, identifier],\n });\n };\n\n async function getMetamaskIdentifier(): Promise<string> {\n return await getWeb3Identifier({ provider: 'metamask' });\n }\n\n async function getCoinbaseWalletIdentifier(): Promise<string> {\n return await getWeb3Identifier({ provider: 'coinbase_wallet' });\n }\n\n async function getOKXWalletIdentifier(): Promise<string> {\n return await getWeb3Identifier({ provider: 'okx_wallet' });\n }\n\n async function getBaseIdentifier(): Promise<string> {\n return await getWeb3Identifier({ provider: 'base' });\n }\n\n async function getSolanaIdentifier(walletName: string): Promise<string> {\n return await getWeb3Identifier({ provider: 'solana', walletName });\n }\n\n async function generateSignatureWithMetamask(params: GenerateSignatureParams): Promise<string> {\n return await generateWeb3Signature({ ...params, provider: 'metamask' });\n }\n\n async function generateSignatureWithCoinbaseWallet(params: GenerateSignatureParams): Promise<string> {\n return await generateWeb3Signature({ ...params, provider: 'coinbase_wallet' });\n }\n\n async function generateSignatureWithOKXWallet(params: GenerateSignatureParams): Promise<string> {\n return await generateWeb3Signature({ ...params, provider: 'okx_wallet' });\n }\n\n async function generateSignatureWithBase(params: GenerateSignatureParams): Promise<string> {\n return await generateWeb3Signature({ ...params, provider: 'base' });\n }\n async function generateSignatureWithSolana(params: GenerateSolanaSignatureParams): Promise<string> {\n return await generateWeb3Signature({ ...params, provider: 'solana' });\n }\n\n async function getWeb3Wallet(provider: Web3Provider, walletName?: string) {\n if (provider === 'coinbase_wallet') {\n if (__BUILD_DISABLE_RHC__) {\n clerkUnsupportedEnvironmentWarning('Coinbase Wallet');\n return null;\n }\n\n const coinbaseModule = await moduleManager.import('@coinbase/wallet-sdk');\n if (!coinbaseModule) {\n return null;\n }\n const sdk = coinbaseModule.createCoinbaseWalletSDK({\n appName:\n (typeof window !== 'undefined' &&\n // @ts-expect-error missing types\n (window.Clerk as any)?.__internal_environment?.displayConfig?.applicationName) ||\n (typeof document !== 'undefined' && document.title) ||\n 'Web3 Application',\n preference: {\n options: 'all',\n },\n });\n return sdk.getProvider();\n }\n\n if (provider === 'base') {\n if (__BUILD_DISABLE_RHC__) {\n clerkUnsupportedEnvironmentWarning('Base');\n return null;\n }\n\n try {\n const baseModule = await moduleManager.import('@base-org/account');\n if (!baseModule) {\n return null;\n }\n\n const sdk = baseModule.createBaseAccountSDK({\n appName:\n (typeof window !== 'undefined' &&\n // @ts-expect-error missing types\n (window.Clerk as any)?.__internal_environment?.displayConfig?.applicationName) ||\n (typeof document !== 'undefined' && document.title) ||\n 'Web3 Application',\n });\n return sdk.getProvider();\n } catch {\n return null;\n }\n }\n\n if (provider === 'solana') {\n if (!walletName || walletName.length === 0) {\n errorThrower.throw('Wallet name must be provided to get Solana wallet provider');\n return;\n }\n return await getInjectedWeb3SolanaProviders().get(walletName);\n }\n\n return getInjectedWeb3EthProviders().get(provider);\n }\n\n return {\n getWeb3Identifier,\n generateWeb3Signature,\n getMetamaskIdentifier,\n getCoinbaseWalletIdentifier,\n getOKXWalletIdentifier,\n getBaseIdentifier,\n getSolanaIdentifier,\n generateSignatureWithMetamask,\n generateSignatureWithCoinbaseWallet,\n generateSignatureWithOKXWallet,\n generateSignatureWithBase,\n generateSignatureWithSolana,\n };\n}\n"],"mappings":"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"}