@@ -2,6 +2,7 @@ import type { GenerateSignature, Web3Provider } from '@clerk/shared/types';
22import type { SolanaWalletAdapterWallet } from '@solana/wallet-standard' ;
33
44import { clerkUnsupportedEnvironmentWarning } from '@/core/errors' ;
5+ import { ClerkRuntimeError } from '@/index.headless' ;
56import { errorThrower } from '@/utils/errorThrower' ;
67import { getInjectedWeb3SolanaProviders } from '@/utils/injectedWeb3SolanaProviders' ;
78
@@ -51,21 +52,32 @@ export const generateWeb3Signature: GenerateSignature = async (params): Promise<
5152 }
5253
5354 if ( provider === 'solana' ) {
54- const bs58 = await import ( 'bs58' ) . then ( mod => mod . default ) ;
55- const walletAccount = ( wallet as SolanaWalletAdapterWallet ) . accounts . find ( a => a . address === identifier ) ;
56- if ( ! walletAccount ) {
57- console . warn ( `Wallet account with address ${ identifier } not found` ) ;
58- return '' ;
59- }
60- const signedMessages = await ( wallet as SolanaWalletAdapterWallet ) . features [ SolanaSignMessage ] ?. signMessage ( {
61- account : walletAccount ,
62- message : new TextEncoder ( ) . encode ( nonce ) ,
63- } ) ;
64- if ( ! signedMessages || signedMessages . length === 0 ) {
65- console . warn ( 'No signed messages returned from wallet' ) ;
66- return '' ;
55+ try {
56+ const walletAccount = ( wallet as SolanaWalletAdapterWallet ) . accounts . find ( a => a . address === identifier ) ;
57+ if ( ! walletAccount ) {
58+ console . warn ( `Wallet account with address ${ identifier } not found` ) ;
59+ return '' ;
60+ }
61+ const signedMessages = await ( wallet as SolanaWalletAdapterWallet ) . features [ SolanaSignMessage ] ?. signMessage ( {
62+ account : walletAccount ,
63+ message : new TextEncoder ( ) . encode ( nonce ) ,
64+ } ) ;
65+ if ( ! signedMessages || signedMessages . length === 0 ) {
66+ console . warn ( 'No signed messages returned from wallet' ) ;
67+ return '' ;
68+ }
69+ return Array . from ( signedMessages [ 0 ] . signature ) . toString ( ) ;
70+ } catch ( err ) {
71+ if ( err instanceof Error && err . message . includes ( 'User rejected the request.' ) ) {
72+ throw new ClerkRuntimeError ( 'Web3 signature request was rejected by the user.' , {
73+ code : 'web3_signature_request_rejected' ,
74+ } ) ;
75+ }
76+ throw new ClerkRuntimeError ( 'An error occurred while generating the Solana signature.' , {
77+ code : 'web3_solana_signature_error' ,
78+ cause : err ,
79+ } ) ;
6780 }
68- return bs58 . encode ( signedMessages [ 0 ] . signature ) ;
6981 }
7082
7183 return await wallet . request ( {
@@ -90,7 +102,10 @@ export async function getBaseIdentifier(): Promise<string> {
90102 return await getWeb3Identifier ( { provider : 'base' } ) ;
91103}
92104
93- export async function getSolanaIdentifier ( walletName : string ) : Promise < string > {
105+ export async function getSolanaIdentifier ( walletName ?: string ) : Promise < string > {
106+ if ( ! walletName ) {
107+ throw new Error ( 'walletName is required for solana web3 authentication' ) ;
108+ }
94109 return await getWeb3Identifier ( { provider : 'solana' , walletName } ) ;
95110}
96111
0 commit comments