Skip to content

Commit c106fbc

Browse files
committed
feat(clerk-js,types,react): Support Coinbase Wallet web3 provider and authentication strategy
Coinbase Wallet is a new generic web3 provider and strategy that supports both Smart Wallets and Coinbase Wallet browser extension. Users can use it to authenticate themselves using their own web3 address as an identifier
1 parent 1dc1cb7 commit c106fbc

File tree

15 files changed

+238
-15
lines changed

15 files changed

+238
-15
lines changed

.changeset/chilly-shrimps-stare.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"@clerk/clerk-js": minor
3+
"@clerk/clerk-react": minor
4+
"@clerk/types": minor
5+
---
6+
7+
Add support for the Coinbase Wallet web3 provider and authentication strategy. The Coinbase Wallet provider handles both Coinbase Wallet extension and Smart Wallet

package-lock.json

Lines changed: 103 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/clerk-js/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"@clerk/localizations": "2.8.0",
5454
"@clerk/shared": "2.6.1",
5555
"@clerk/types": "4.18.0",
56+
"@coinbase/wallet-sdk": "4.0.4",
5657
"@emotion/cache": "11.11.0",
5758
"@emotion/react": "11.11.1",
5859
"@floating-ui/react": "0.25.4",

packages/clerk-js/src/core/clerk.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import type {
2121
__experimental_UserVerificationProps,
2222
ActiveSessionResource,
2323
AuthenticateWithCoinbaseParams,
24+
AuthenticateWithCoinbaseWalletParams,
2425
AuthenticateWithGoogleOneTapParams,
2526
AuthenticateWithMetamaskParams,
2627
Clerk as ClerkInterface,
@@ -75,6 +76,7 @@ import {
7576
disabledOrganizationsFeature,
7677
errorThrower,
7778
generateSignatureWithCoinbase,
79+
generateSignatureWithCoinbaseWallet,
7880
generateSignatureWithMetamask,
7981
getClerkQueryParam,
8082
getWeb3Identifier,
@@ -1403,6 +1405,10 @@ export class Clerk implements ClerkInterface {
14031405
await this.authenticateWithWeb3({ ...props, strategy: 'web3_coinbase_signature' });
14041406
};
14051407

1408+
public authenticateWithCoinbaseWallet = async (props: AuthenticateWithCoinbaseWalletParams = {}): Promise<void> => {
1409+
await this.authenticateWithWeb3({ ...props, strategy: 'web3_coinbase_wallet_signature' });
1410+
};
1411+
14061412
public authenticateWithWeb3 = async ({
14071413
redirectUrl,
14081414
signUpContinueUrl,
@@ -1415,7 +1421,12 @@ export class Clerk implements ClerkInterface {
14151421
}
14161422
const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider;
14171423
const identifier = await getWeb3Identifier({ provider });
1418-
const generateSignature = provider === 'metamask' ? generateSignatureWithMetamask : generateSignatureWithCoinbase;
1424+
const generateSignature =
1425+
provider === 'metamask'
1426+
? generateSignatureWithMetamask
1427+
: provider === 'coinbase'
1428+
? generateSignatureWithCoinbase
1429+
: generateSignatureWithCoinbaseWallet;
14191430
const navigate = (to: string) =>
14201431
customNavigate && typeof customNavigate === 'function' ? customNavigate(to) : this.navigate(to);
14211432

packages/clerk-js/src/core/resources/SignIn.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ import type {
3434

3535
import {
3636
generateSignatureWithCoinbase,
37+
generateSignatureWithCoinbaseWallet,
3738
generateSignatureWithMetamask,
3839
getCoinbaseIdentifier,
40+
getCoinbaseWalletIdentifier,
3941
getMetamaskIdentifier,
4042
windowNavigate,
4143
} from '../../utils';
@@ -117,6 +119,9 @@ export class SignIn extends BaseResource implements SignInResource {
117119
case 'web3_coinbase_signature':
118120
config = { web3WalletId: factor.web3WalletId } as Web3SignatureConfig;
119121
break;
122+
case 'web3_coinbase_wallet_signature':
123+
config = { web3WalletId: factor.web3WalletId } as Web3SignatureConfig;
124+
break;
120125
case 'reset_password_phone_code':
121126
config = { phoneNumberId: factor.phoneNumberId } as ResetPasswordPhoneCodeFactorConfig;
122127
break;
@@ -285,6 +290,15 @@ export class SignIn extends BaseResource implements SignInResource {
285290
});
286291
};
287292

293+
public authenticateWithCoinbaseWallet = async (): Promise<SignInResource> => {
294+
const identifier = await getCoinbaseWalletIdentifier();
295+
return this.authenticateWithWeb3({
296+
identifier,
297+
generateSignature: generateSignatureWithCoinbaseWallet,
298+
strategy: 'web3_coinbase_wallet_signature',
299+
});
300+
};
301+
288302
public authenticateWithPasskey = async (params?: AuthenticateWithPasskeyParams): Promise<SignInResource> => {
289303
const { flow } = params || {};
290304

packages/clerk-js/src/core/resources/SignUp.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ import type {
2525

2626
import {
2727
generateSignatureWithCoinbase,
28+
generateSignatureWithCoinbaseWallet,
2829
generateSignatureWithMetamask,
2930
getCoinbaseIdentifier,
31+
getCoinbaseWalletIdentifier,
3032
getMetamaskIdentifier,
3133
windowNavigate,
3234
} from '../../utils';
@@ -231,6 +233,18 @@ export class SignUp extends BaseResource implements SignUpResource {
231233
});
232234
};
233235

236+
public authenticateWithCoinbaseWallet = async (
237+
params?: SignUpAuthenticateWithWeb3Params,
238+
): Promise<SignUpResource> => {
239+
const identifier = await getCoinbaseWalletIdentifier();
240+
return this.authenticateWithWeb3({
241+
identifier,
242+
generateSignature: generateSignatureWithCoinbaseWallet,
243+
unsafeMetadata: params?.unsafeMetadata,
244+
strategy: 'web3_coinbase_wallet_signature',
245+
});
246+
};
247+
234248
public authenticateWithRedirect = async ({
235249
redirectUrl,
236250
redirectUrlComplete,

packages/clerk-js/src/ui/common/constants.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ export const WEB3_PROVIDERS: Web3Providers = Object.freeze({
9696
id: 'coinbase',
9797
name: 'Coinbase Wallet',
9898
},
99+
coinbase_wallet: {
100+
id: 'coinbase_wallet',
101+
name: 'Coinbase Wallet',
102+
},
99103
});
100104

101105
export function getWeb3ProviderData(name: Web3Provider): Web3ProviderData | undefined | null {

packages/clerk-js/src/utils/injectedWeb3Providers.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import type { Web3Provider } from '@clerk/types';
1+
import type { CoinbaseWeb3Provider, MetamaskWeb3Provider } from '@clerk/types';
2+
23
//https://eips.ethereum.org/EIPS/eip-6963
34

45
interface EIP6963ProviderInfo {
@@ -26,10 +27,11 @@ interface EIP6963ProviderDetail {
2627
}
2728

2829
type EIP6963AnnounceProviderEvent = CustomEvent;
30+
type InjectedWeb3Provider = MetamaskWeb3Provider | CoinbaseWeb3Provider;
2931

3032
class InjectedWeb3Providers {
3133
#providers: EIP6963ProviderDetail[] = [];
32-
#providerIdMap: Record<Web3Provider, string> = {
34+
#providerIdMap: Record<InjectedWeb3Provider, string> = {
3335
coinbase: 'Coinbase Wallet',
3436
metamask: 'MetaMask',
3537
} as const;
@@ -42,7 +44,7 @@ class InjectedWeb3Providers {
4244
window.dispatchEvent(new Event('eip6963:requestProvider'));
4345
}
4446

45-
get = (provider: Web3Provider) => {
47+
get = (provider: InjectedWeb3Provider) => {
4648
return this.#providers.find(p => p.info.name === this.#providerIdMap[provider])?.provider;
4749
};
4850

0 commit comments

Comments
 (0)