@@ -15,6 +15,7 @@ import type {
1515 EmailLinkConfig ,
1616 EmailLinkFactor ,
1717 EnterpriseSSOConfig ,
18+ GenerateSignature ,
1819 PassKeyConfig ,
1920 PasskeyFactor ,
2021 PhoneCodeConfig ,
@@ -25,6 +26,7 @@ import type {
2526 ResetPasswordParams ,
2627 ResetPasswordPhoneCodeFactorConfig ,
2728 SamlConfig ,
29+ SignInAuthenticateWithSolanaParams ,
2830 SignInCreateParams ,
2931 SignInFirstFactor ,
3032 SignInFutureBackupCodeVerifyParams ,
@@ -69,12 +71,14 @@ import {
6971 generateSignatureWithCoinbaseWallet ,
7072 generateSignatureWithMetamask ,
7173 generateSignatureWithOKXWallet ,
74+ generateSignatureWithSolana ,
7275 getBaseIdentifier ,
7376 getBrowserLocale ,
7477 getClerkQueryParam ,
7578 getCoinbaseWalletIdentifier ,
7679 getMetamaskIdentifier ,
7780 getOKXWalletIdentifier ,
81+ getSolanaIdentifier ,
7882 windowNavigate ,
7983} from '../../utils' ;
8084import {
@@ -212,6 +216,7 @@ export class SignIn extends BaseResource implements SignInResource {
212216 case 'web3_base_signature' :
213217 case 'web3_coinbase_wallet_signature' :
214218 case 'web3_okx_wallet_signature' :
219+ case 'web3_solana_signature' :
215220 config = { web3WalletId : params . web3WalletId } as Web3SignatureConfig ;
216221 break ;
217222 case 'reset_password_phone_code' :
@@ -379,13 +384,17 @@ export class SignIn extends BaseResource implements SignInResource {
379384 } ;
380385
381386 public authenticateWithWeb3 = async ( params : AuthenticateWithWeb3Params ) : Promise < SignInResource > => {
382- const { identifier, generateSignature, strategy = 'web3_metamask_signature' } = params || { } ;
387+ const { identifier, generateSignature, strategy = 'web3_metamask_signature' , walletName } = params || { } ;
383388 const provider = strategy . replace ( 'web3_' , '' ) . replace ( '_signature' , '' ) as Web3Provider ;
384389
385390 if ( ! ( typeof generateSignature === 'function' ) ) {
386391 clerkMissingOptionError ( 'generateSignature' ) ;
387392 }
388393
394+ if ( provider === 'solana' && ! walletName ) {
395+ clerkMissingOptionError ( 'walletName' ) ;
396+ }
397+
389398 await this . create ( { identifier } ) ;
390399
391400 const web3FirstFactor = this . supportedFirstFactors ?. find ( f => f . strategy === strategy ) as Web3SignatureFactor ;
@@ -403,7 +412,7 @@ export class SignIn extends BaseResource implements SignInResource {
403412
404413 let signature : string ;
405414 try {
406- signature = await generateSignature ( { identifier, nonce : message , provider } ) ;
415+ signature = await generateSignature ( { identifier, nonce : message , walletName , provider } ) ;
407416 } catch ( err ) {
408417 // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing
409418 // Passkey in order to authenticate, the initial generate signature request to be rejected. For this
@@ -412,7 +421,7 @@ export class SignIn extends BaseResource implements SignInResource {
412421 // error code 4001 means the user rejected the request
413422 // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors
414423 if ( provider === 'coinbase_wallet' && err . code === 4001 ) {
415- signature = await generateSignature ( { identifier, nonce : message , provider } ) ;
424+ signature = await generateSignature ( { identifier, nonce : message , provider, walletName } ) ;
416425 } else {
417426 throw err ;
418427 }
@@ -460,6 +469,16 @@ export class SignIn extends BaseResource implements SignInResource {
460469 } ) ;
461470 } ;
462471
472+ public authenticateWithSolana = async ( params : SignInAuthenticateWithSolanaParams ) : Promise < SignInResource > => {
473+ const identifier = await getSolanaIdentifier ( params . walletName ) ;
474+ return this . authenticateWithWeb3 ( {
475+ identifier,
476+ generateSignature : p => generateSignatureWithSolana ( { ...p , walletName : params . walletName } ) ,
477+ strategy : 'web3_solana_signature' ,
478+ walletName : params . walletName ,
479+ } ) ;
480+ } ;
481+
463482 public authenticateWithPasskey = async ( params ?: AuthenticateWithPasskeyParams ) : Promise < SignInResource > => {
464483 const { flow } = params || { } ;
465484
@@ -972,7 +991,7 @@ class SignInFuture implements SignInFutureResource {
972991
973992 return runAsyncResourceTask ( this . #resource, async ( ) => {
974993 let identifier ;
975- let generateSignature ;
994+ let generateSignature : GenerateSignature ;
976995 switch ( provider ) {
977996 case 'metamask' :
978997 identifier = await getMetamaskIdentifier ( ) ;
@@ -990,6 +1009,15 @@ class SignInFuture implements SignInFutureResource {
9901009 identifier = await getOKXWalletIdentifier ( ) ;
9911010 generateSignature = generateSignatureWithOKXWallet ;
9921011 break ;
1012+ case 'solana' :
1013+ if ( ! params . walletName ) {
1014+ throw new ClerkRuntimeError ( 'Wallet name is required for Solana authentication.' , {
1015+ code : 'web3_solana_wallet_name_required' ,
1016+ } ) ;
1017+ }
1018+ identifier = await getSolanaIdentifier ( params . walletName ) ;
1019+ generateSignature = p => generateSignatureWithSolana ( { ...p , walletName : params . walletName as string } ) ;
1020+ break ;
9931021 default :
9941022 throw new Error ( `Unsupported Web3 provider: ${ provider } ` ) ;
9951023 }
@@ -1015,7 +1043,12 @@ class SignInFuture implements SignInFutureResource {
10151043
10161044 let signature : string ;
10171045 try {
1018- signature = await generateSignature ( { identifier, nonce : message } ) ;
1046+ signature = await generateSignature ( {
1047+ identifier,
1048+ nonce : message ,
1049+ walletName : params ?. walletName ,
1050+ provider,
1051+ } ) ;
10191052 } catch ( err ) {
10201053 // There is a chance that as a user when you try to setup and use the Coinbase Wallet with an existing
10211054 // Passkey in order to authenticate, the initial generate signature request to be rejected. For this
@@ -1024,7 +1057,11 @@ class SignInFuture implements SignInFutureResource {
10241057 // error code 4001 means the user rejected the request
10251058 // Reference: https://docs.cdp.coinbase.com/wallet-sdk/docs/errors
10261059 if ( provider === 'coinbase_wallet' && err . code === 4001 ) {
1027- signature = await generateSignature ( { identifier, nonce : message } ) ;
1060+ signature = await generateSignature ( {
1061+ identifier,
1062+ nonce : message ,
1063+ provider,
1064+ } ) ;
10281065 } else {
10291066 throw err ;
10301067 }
0 commit comments