Skip to content

Commit 8a3b9f0

Browse files
authored
feat(clerk-js,types,clerk-react): Support Coinbase Wallet web3 provider and authentication strategy (#4082)
1 parent 8c5d4ac commit 8a3b9f0

File tree

17 files changed

+237
-16
lines changed

17 files changed

+237
-16
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/bundlewatch.config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{ "path": "./dist/clerk.headless.js", "maxSize": "43kB" },
55
{ "path": "./dist/ui-common*.js", "maxSize": "85KB" },
66
{ "path": "./dist/vendors*.js", "maxSize": "70KB" },
7+
{ "path": "./dist/coinbase*.js", "maxSize": "58KB" },
78
{ "path": "./dist/createorganization*.js", "maxSize": "5KB" },
89
{ "path": "./dist/impersonationfab*.js", "maxSize": "5KB" },
910
{ "path": "./dist/organizationprofile*.js", "maxSize": "12KB" },

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)