@coinbase/cdp-hooks 0.0.36 → 0.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -451,6 +451,49 @@ function SolanaTransactionSigner() {
451
451
  }
452
452
  ```
453
453
 
454
+ #### Sign a Solana Message
455
+
456
+ Use the `useSignSolanaMessage` hook to sign arbitrary messages with Solana accounts:
457
+
458
+ ```tsx lines
459
+ import { useSignSolanaMessage, useSolanaAddress } from "@coinbase/cdp-hooks";
460
+
461
+ function SolanaMessageSigner() {
462
+ const { signSolanaMessage } = useSignSolanaMessage();
463
+ const { solanaAddress } = useSolanaAddress();
464
+
465
+ const handleSignMessage = async () => {
466
+ if (!solanaAddress) return;
467
+
468
+ try {
469
+ const message = Buffer.from("Hello, Solana!", "utf8").toString("base64");
470
+ const result = await signSolanaMessage({
471
+ solanaAccount: solanaAddress,
472
+ message // Base64 encoded message to sign
473
+ });
474
+
475
+ console.log("Message Signature:", result.signature);
476
+ // The signature can be used for authentication or verification purposes
477
+ } catch (error) {
478
+ console.error("Failed to sign message:", error);
479
+ }
480
+ };
481
+
482
+ if (!solanaAddress) {
483
+ return <div>Please connect your Solana wallet first</div>;
484
+ }
485
+
486
+ return (
487
+ <div>
488
+ <h3>Sign Solana Message</h3>
489
+ <button onClick={handleSignMessage}>
490
+ Sign Message
491
+ </button>
492
+ </div>
493
+ );
494
+ }
495
+ ```
496
+
454
497
  #### Send a Solana Transaction
455
498
 
456
499
  Use the `useSendSolanaTransaction` hook to sign and send Solana transactions in a single action. This is supported on:
@@ -667,14 +710,16 @@ function SignData() {
667
710
  }
668
711
  ```
669
712
 
670
- ### Export Private Key
713
+ ### Export Private Keys
714
+
715
+ End users can export their private keys from their embedded wallet, allowing them to import them into compatible wallets of their choice.
671
716
 
672
- End users can export their private keys from their embedded wallet, allowing them to import it into an EVM-compatible wallet of their choice.
717
+ #### Export EVM Private Key
673
718
 
674
719
  ```tsx lines
675
720
  import { useExportEvmAccount, useEvmAddress } from "@coinbase/cdp-hooks";
676
721
 
677
- function ExportKey() {
722
+ function ExportEvmKey() {
678
723
  const { exportEvmAccount: exportAccount } = useExportEvmAccount();
679
724
  const { evmAddress } = useEvmAddress();
680
725
 
@@ -686,14 +731,48 @@ function ExportKey() {
686
731
  evmAccount: evmAddress
687
732
  });
688
733
 
689
- console.log("Private Key:", privateKey);
734
+ console.log("EVM Private Key:", privateKey);
735
+ // Warning: Handle private keys with extreme care!
736
+ } catch (error) {
737
+ console.error("Export failed:", error);
738
+ }
739
+ };
740
+
741
+ return <button onClick={handleExport}>Export EVM Private Key</button>;
742
+ }
743
+ ```
744
+
745
+ #### Export Solana Private Key
746
+
747
+ When your application is configured with `solana: { createOnLogin: true }`, you can export Solana private keys:
748
+
749
+ ```tsx lines
750
+ import { useExportSolanaAccount, useSolanaAddress } from "@coinbase/cdp-hooks";
751
+
752
+ function ExportSolanaKey() {
753
+ const { exportSolanaAccount: exportAccount } = useExportSolanaAccount();
754
+ const { solanaAddress } = useSolanaAddress();
755
+
756
+ const handleExport = async () => {
757
+ if (!solanaAddress) return;
758
+
759
+ try {
760
+ const { privateKey } = await exportAccount({
761
+ solanaAccount: solanaAddress
762
+ });
763
+
764
+ console.log("Solana Private Key:", privateKey);
690
765
  // Warning: Handle private keys with extreme care!
691
766
  } catch (error) {
692
767
  console.error("Export failed:", error);
693
768
  }
694
769
  };
695
770
 
696
- return <button onClick={handleExport}>Export Private Key</button>;
771
+ if (!solanaAddress) {
772
+ return <div>Please connect your Solana wallet first</div>;
773
+ }
774
+
775
+ return <button onClick={handleExport}>Export Solana Private Key</button>;
697
776
  }
698
777
  ```
699
778
 
package/dist/esm/index.js CHANGED
@@ -1,32 +1,34 @@
1
1
  import { APIError as n } from "@coinbase/cdp-core";
2
- import { CDPContext as i, CDPHooksProvider as u } from "./index2.js";
3
- import { useConfig as o, useCurrentUser as t, useEnforceAuthenticated as S, useEnforceUnauthenticated as m, useEvmAddress as d, useExportEvmAccount as E, useGetAccessToken as c, useIsInitialized as g, useIsSignedIn as f, useSendEvmTransaction as v, useSendSolanaTransaction as T, useSendUserOperation as p, useSignEvmHash as I, useSignEvmMessage as l, useSignEvmTransaction as A, useSignEvmTypedData as P, useSignInWithEmail as h, useSignInWithSms as x, useSignOut as C, useSignSolanaTransaction as O, useSolanaAddress as U, useVerifyEmailOTP as y, useVerifySmsOTP as D, useWaitForUserOperation as W } from "./index3.js";
2
+ import { CDPContext as u, CDPHooksProvider as o } from "./index2.js";
3
+ import { useConfig as i, useCurrentUser as t, useEnforceAuthenticated as S, useEnforceUnauthenticated as c, useEvmAddress as m, useExportEvmAccount as E, useExportSolanaAccount as d, useGetAccessToken as g, useIsInitialized as f, useIsSignedIn as l, useSendEvmTransaction as p, useSendSolanaTransaction as v, useSendUserOperation as T, useSignEvmHash as A, useSignEvmMessage as I, useSignEvmTransaction as x, useSignEvmTypedData as P, useSignInWithEmail as h, useSignInWithSms as C, useSignOut as O, useSignSolanaMessage as U, useSignSolanaTransaction as y, useSolanaAddress as D, useVerifyEmailOTP as W, useVerifySmsOTP as k, useWaitForUserOperation as H } from "./index3.js";
4
4
  export {
5
5
  n as APIError,
6
- i as CDPContext,
7
- u as CDPHooksProvider,
8
- o as useConfig,
6
+ u as CDPContext,
7
+ o as CDPHooksProvider,
8
+ i as useConfig,
9
9
  t as useCurrentUser,
10
10
  S as useEnforceAuthenticated,
11
- m as useEnforceUnauthenticated,
12
- d as useEvmAddress,
11
+ c as useEnforceUnauthenticated,
12
+ m as useEvmAddress,
13
13
  E as useExportEvmAccount,
14
- c as useGetAccessToken,
15
- g as useIsInitialized,
16
- f as useIsSignedIn,
17
- v as useSendEvmTransaction,
18
- T as useSendSolanaTransaction,
19
- p as useSendUserOperation,
20
- I as useSignEvmHash,
21
- l as useSignEvmMessage,
22
- A as useSignEvmTransaction,
14
+ d as useExportSolanaAccount,
15
+ g as useGetAccessToken,
16
+ f as useIsInitialized,
17
+ l as useIsSignedIn,
18
+ p as useSendEvmTransaction,
19
+ v as useSendSolanaTransaction,
20
+ T as useSendUserOperation,
21
+ A as useSignEvmHash,
22
+ I as useSignEvmMessage,
23
+ x as useSignEvmTransaction,
23
24
  P as useSignEvmTypedData,
24
25
  h as useSignInWithEmail,
25
- x as useSignInWithSms,
26
- C as useSignOut,
27
- O as useSignSolanaTransaction,
28
- U as useSolanaAddress,
29
- y as useVerifyEmailOTP,
30
- D as useVerifySmsOTP,
31
- W as useWaitForUserOperation
26
+ C as useSignInWithSms,
27
+ O as useSignOut,
28
+ U as useSignSolanaMessage,
29
+ y as useSignSolanaTransaction,
30
+ D as useSolanaAddress,
31
+ W as useVerifyEmailOTP,
32
+ k as useVerifySmsOTP,
33
+ H as useWaitForUserOperation
32
34
  };
@@ -1,58 +1,58 @@
1
- import { getAccessToken as y, sendUserOperation as O, signInWithEmail as A, signInWithSms as I, verifyEmailOTP as U, verifySmsOTP as P, signOut as k, signEvmHash as C, signEvmTransaction as W, sendEvmTransaction as H, signEvmMessage as x, signEvmTypedData as b, exportEvmAccount as D, signSolanaTransaction as M, sendSolanaTransaction as V, getUserOperation as F } from "@coinbase/cdp-core";
2
- import { useState as u, useEffect as f, useMemo as z, useCallback as h } from "react";
1
+ import { getAccessToken as A, sendUserOperation as y, signInWithEmail as O, signInWithSms as I, verifyEmailOTP as U, verifySmsOTP as P, signOut as x, signEvmHash as M, signEvmTransaction as k, sendEvmTransaction as C, signEvmMessage as W, signSolanaMessage as H, signEvmTypedData as b, exportEvmAccount as D, exportSolanaAccount as V, signSolanaTransaction as F, sendSolanaTransaction as z, getUserOperation as G } from "@coinbase/cdp-core";
2
+ import { useState as u, useEffect as f, useMemo as j, useCallback as h } from "react";
3
3
  import { useCDP as p } from "./index2.js";
4
- import { useAutoPolling as G } from "./index4.js";
5
- import { getPublicClient as j } from "./index5.js";
6
- const Q = () => {
4
+ import { useAutoPolling as q } from "./index4.js";
5
+ import { getPublicClient as B } from "./index5.js";
6
+ const Y = () => {
7
7
  const { config: n } = p();
8
8
  return { config: n };
9
- }, X = () => {
9
+ }, Z = () => {
10
10
  const { isInitialized: n } = p();
11
11
  return { isInitialized: n };
12
- }, Y = () => ({ signInWithEmail: S(A) }), Z = () => ({ signInWithSms: S(I) }), _ = () => ({ verifyEmailOTP: S(U) }), $ = () => ({ verifySmsOTP: S(P) }), R = () => {
12
+ }, _ = () => ({ signInWithEmail: g(O) }), $ = () => ({ signInWithSms: g(I) }), R = () => ({ verifyEmailOTP: g(U) }), nn = () => ({ verifySmsOTP: g(P) }), en = () => {
13
13
  const { isSignedIn: n } = p();
14
14
  return { isSignedIn: n };
15
15
  }, w = () => {
16
16
  const { currentUser: n } = p();
17
17
  return { currentUser: n };
18
- }, nn = () => ({ signOut: i(k) }), en = () => ({ getAccessToken: y }), tn = () => {
18
+ }, tn = () => ({ signOut: o(x) }), sn = () => ({ getAccessToken: A }), rn = () => {
19
19
  const { currentUser: n } = w();
20
20
  return {
21
21
  evmAddress: n?.evmSmartAccounts?.[0] ?? n?.evmAccounts?.[0] ?? null
22
22
  };
23
- }, rn = () => {
23
+ }, an = () => {
24
24
  const { currentUser: n } = w();
25
25
  return {
26
26
  solanaAddress: n?.solanaAccounts?.[0] ?? null
27
27
  };
28
- }, sn = () => ({ signEvmHash: i(C) }), an = () => ({ signEvmTransaction: i(W) }), on = () => {
29
- const [n, e] = u(null), [s, t] = u(null), [c, l] = u(null), { config: a } = p(), d = i(
30
- async (g) => {
31
- const o = await H(g);
32
- return e({ hash: o.transactionHash, network: g.network }), l(null), t(null), o;
28
+ }, on = () => ({ signEvmHash: o(M) }), cn = () => ({ signEvmTransaction: o(k) }), un = () => {
29
+ const [n, e] = u(null), [r, t] = u(null), [c, S] = u(null), { config: a } = p(), d = o(
30
+ async (m) => {
31
+ const i = await C(m);
32
+ return e({ hash: i.transactionHash, network: m.network }), S(null), t(null), i;
33
33
  }
34
34
  );
35
35
  f(() => {
36
36
  if (!n) return;
37
37
  (async () => {
38
38
  try {
39
- const E = await j(n.network, a).waitForTransactionReceipt({
39
+ const E = await B(n.network, a).waitForTransactionReceipt({
40
40
  hash: n.hash
41
41
  });
42
42
  t(E);
43
- } catch (o) {
44
- l(o instanceof Error ? o : new Error(String(o)));
43
+ } catch (i) {
44
+ S(i instanceof Error ? i : new Error(String(i)));
45
45
  }
46
46
  })();
47
47
  }, [n]);
48
- const m = z(() => n ? s ? { status: "success", receipt: s } : c ? { status: "error", error: c } : { status: "pending", hash: n.hash } : { status: "idle" }, [n, s, c]);
48
+ const l = j(() => n ? r ? { status: "success", receipt: r } : c ? { status: "error", error: c } : { status: "pending", hash: n.hash } : { status: "idle" }, [n, r, c]);
49
49
  return {
50
50
  sendEvmTransaction: d,
51
- data: m
51
+ data: l
52
52
  };
53
- }, cn = () => ({ signEvmMessage: i(x) }), un = () => ({ signEvmTypedData: i(b) }), pn = () => ({ exportEvmAccount: i(D) }), dn = () => ({ signSolanaTransaction: i(M) }), mn = () => ({
54
- sendSolanaTransaction: i(V)
55
- }), i = (n) => {
53
+ }, pn = () => ({ signEvmMessage: o(W) }), dn = () => ({ signSolanaMessage: o(H) }), ln = () => ({ signEvmTypedData: o(b) }), Sn = () => ({ exportEvmAccount: o(D) }), mn = () => ({ exportSolanaAccount: o(V) }), gn = () => ({ signSolanaTransaction: o(F) }), En = () => ({
54
+ sendSolanaTransaction: o(z)
55
+ }), o = (n) => {
56
56
  const { isSignedIn: e } = p();
57
57
  return h(
58
58
  async (...t) => {
@@ -62,7 +62,7 @@ const Q = () => {
62
62
  },
63
63
  [e, n]
64
64
  );
65
- }, S = (n) => {
65
+ }, g = (n) => {
66
66
  const { isSignedIn: e } = p();
67
67
  return h(
68
68
  async (...t) => {
@@ -72,12 +72,12 @@ const Q = () => {
72
72
  },
73
73
  [e, n]
74
74
  );
75
- }, ln = () => {
76
- const [n, e] = u(void 0), { status: s, data: t, error: c } = q(n);
75
+ }, wn = () => {
76
+ const [n, e] = u(void 0), { status: r, data: t, error: c } = J(n);
77
77
  return {
78
- sendUserOperation: i(
78
+ sendUserOperation: o(
79
79
  async (a) => {
80
- const d = await O(a);
80
+ const d = await y(a);
81
81
  return e({
82
82
  userOperationHash: d.userOperationHash,
83
83
  evmSmartAccount: a.evmSmartAccount,
@@ -87,69 +87,71 @@ const Q = () => {
87
87
  ),
88
88
  data: t,
89
89
  error: c,
90
- status: s
90
+ status: r
91
91
  };
92
- }, q = (n = {}) => {
93
- const { userOperationHash: e, evmSmartAccount: s, network: t, enabled: c } = n, [l, a] = u("idle"), [d, m] = u(void 0), [g, o] = u(void 0), { currentUser: E } = w();
92
+ }, J = (n = {}) => {
93
+ const { userOperationHash: e, evmSmartAccount: r, network: t, enabled: c } = n, [S, a] = u("idle"), [d, l] = u(void 0), [m, i] = u(void 0), { currentUser: E } = w();
94
94
  f(() => {
95
- e && s && t && (a(c !== !1 ? "pending" : "idle"), m(void 0), o(void 0));
96
- }, [e, s, t, c]);
97
- const v = c !== !1 && !!(e && s && t && E);
98
- return G(
95
+ e && r && t && (a(c !== !1 ? "pending" : "idle"), l(void 0), i(void 0));
96
+ }, [e, r, t, c]);
97
+ const v = c !== !1 && !!(e && r && t && E);
98
+ return q(
99
99
  {
100
100
  pollFn: async () => {
101
- const r = await F({
101
+ const s = await G({
102
102
  userOperationHash: e,
103
- evmSmartAccount: s,
103
+ evmSmartAccount: r,
104
104
  network: t
105
105
  });
106
- return m(r), r;
106
+ return l(s), s;
107
107
  },
108
- shouldStop: (r) => r.status === "complete" || r.status === "dropped" || r.status === "failed",
108
+ shouldStop: (s) => s.status === "complete" || s.status === "dropped" || s.status === "failed",
109
109
  enabled: v,
110
- onSuccess: (r) => {
111
- if (r.status === "complete")
112
- m(r), a("success");
113
- else if (r.status === "failed") {
114
- const T = r.receipts?.[0]?.revert?.message || "User operation failed";
115
- o(new Error(T)), a("error");
110
+ onSuccess: (s) => {
111
+ if (s.status === "complete")
112
+ l(s), a("success");
113
+ else if (s.status === "failed") {
114
+ const T = s.receipts?.[0]?.revert?.message || "User operation failed";
115
+ i(new Error(T)), a("error");
116
116
  } else
117
- m(r), a("error");
117
+ l(s), a("error");
118
118
  },
119
- onError: (r) => {
120
- o(r), a("error");
119
+ onError: (s) => {
120
+ i(s), a("error");
121
121
  }
122
122
  },
123
- [e, s, t, v]
123
+ [e, r, t, v]
124
124
  ), {
125
- status: l,
125
+ status: S,
126
126
  data: d,
127
- error: g
127
+ error: m
128
128
  };
129
129
  };
130
130
  export {
131
- Q as useConfig,
131
+ Y as useConfig,
132
132
  w as useCurrentUser,
133
- i as useEnforceAuthenticated,
134
- S as useEnforceUnauthenticated,
135
- tn as useEvmAddress,
136
- pn as useExportEvmAccount,
137
- en as useGetAccessToken,
138
- X as useIsInitialized,
139
- R as useIsSignedIn,
140
- on as useSendEvmTransaction,
141
- mn as useSendSolanaTransaction,
142
- ln as useSendUserOperation,
143
- sn as useSignEvmHash,
144
- cn as useSignEvmMessage,
145
- an as useSignEvmTransaction,
146
- un as useSignEvmTypedData,
147
- Y as useSignInWithEmail,
148
- Z as useSignInWithSms,
149
- nn as useSignOut,
150
- dn as useSignSolanaTransaction,
151
- rn as useSolanaAddress,
152
- _ as useVerifyEmailOTP,
153
- $ as useVerifySmsOTP,
154
- q as useWaitForUserOperation
133
+ o as useEnforceAuthenticated,
134
+ g as useEnforceUnauthenticated,
135
+ rn as useEvmAddress,
136
+ Sn as useExportEvmAccount,
137
+ mn as useExportSolanaAccount,
138
+ sn as useGetAccessToken,
139
+ Z as useIsInitialized,
140
+ en as useIsSignedIn,
141
+ un as useSendEvmTransaction,
142
+ En as useSendSolanaTransaction,
143
+ wn as useSendUserOperation,
144
+ on as useSignEvmHash,
145
+ pn as useSignEvmMessage,
146
+ cn as useSignEvmTransaction,
147
+ ln as useSignEvmTypedData,
148
+ _ as useSignInWithEmail,
149
+ $ as useSignInWithSms,
150
+ tn as useSignOut,
151
+ dn as useSignSolanaMessage,
152
+ gn as useSignSolanaTransaction,
153
+ an as useSolanaAddress,
154
+ R as useVerifyEmailOTP,
155
+ nn as useVerifySmsOTP,
156
+ J as useWaitForUserOperation
155
157
  };
@@ -9,6 +9,8 @@ import { EIP712TypedData } from '@coinbase/cdp-core';
9
9
  import { EvmAddress } from '@coinbase/cdp-core';
10
10
  import { ExportEvmAccountOptions } from '@coinbase/cdp-core';
11
11
  import { ExportEvmAccountResult } from '@coinbase/cdp-core';
12
+ import { ExportSolanaAccountOptions } from '@coinbase/cdp-core';
13
+ import { ExportSolanaAccountResult } from '@coinbase/cdp-core';
12
14
  import { GetUserOperationResult } from '@coinbase/cdp-core';
13
15
  import { Hex } from '@coinbase/cdp-core';
14
16
  import { JSX } from 'react/jsx-runtime';
@@ -32,6 +34,8 @@ import { SignInWithEmailOptions } from '@coinbase/cdp-core';
32
34
  import { SignInWithEmailResult } from '@coinbase/cdp-core';
33
35
  import { SignInWithSmsOptions } from '@coinbase/cdp-core';
34
36
  import { SignInWithSmsResult } from '@coinbase/cdp-core';
37
+ import { SignSolanaMessageOptions } from '@coinbase/cdp-core';
38
+ import { SignSolanaMessageResult } from '@coinbase/cdp-core';
35
39
  import { SignSolanaTransactionOptions } from '@coinbase/cdp-core';
36
40
  import { SignSolanaTransactionResult } from '@coinbase/cdp-core';
37
41
  import { SolanaAddress } from '@coinbase/cdp-core';
@@ -77,6 +81,10 @@ export { ExportEvmAccountOptions }
77
81
 
78
82
  export { ExportEvmAccountResult }
79
83
 
84
+ export { ExportSolanaAccountOptions }
85
+
86
+ export { ExportSolanaAccountResult }
87
+
80
88
  export { GetUserOperationResult }
81
89
 
82
90
  export { Hex }
@@ -140,6 +148,10 @@ export declare const useExportEvmAccount: () => {
140
148
  exportEvmAccount: (options: ExportEvmAccountOptions) => Promise<ExportEvmAccountResult>;
141
149
  };
142
150
 
151
+ export declare const useExportSolanaAccount: () => {
152
+ exportSolanaAccount: (options: ExportSolanaAccountOptions) => Promise<ExportSolanaAccountResult>;
153
+ };
154
+
143
155
  export declare const useGetAccessToken: () => {
144
156
  getAccessToken: () => Promise<string | null>;
145
157
  };
@@ -200,6 +212,10 @@ export declare const useSignOut: () => {
200
212
  signOut: () => Promise<void>;
201
213
  };
202
214
 
215
+ export declare const useSignSolanaMessage: () => {
216
+ signSolanaMessage: (options: SignSolanaMessageOptions) => Promise<SignSolanaMessageResult>;
217
+ };
218
+
203
219
  export declare const useSignSolanaTransaction: () => {
204
220
  signSolanaTransaction: (options: SignSolanaTransactionOptions) => Promise<SignSolanaTransactionResult>;
205
221
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cdp-hooks",
3
- "version": "0.0.36",
3
+ "version": "0.0.38",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**",
@@ -14,7 +14,7 @@
14
14
  },
15
15
  "peerDependencies": {
16
16
  "react": ">=18.2.0",
17
- "@coinbase/cdp-core": "^0.0.36"
17
+ "@coinbase/cdp-core": "^0.0.38"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@testing-library/jest-dom": "^6.6.3",
@@ -29,7 +29,7 @@
29
29
  "@size-limit/webpack": "^11.2.0",
30
30
  "@size-limit/webpack-why": "^11.2.0",
31
31
  "size-limit": "^11.2.0",
32
- "@coinbase/cdp-core": "^0.0.36"
32
+ "@coinbase/cdp-core": "^0.0.38"
33
33
  },
34
34
  "size-limit": [
35
35
  {