@coinbase/cdp-hooks 0.0.24 → 0.0.26

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.
Files changed (248) hide show
  1. package/README.md +206 -14
  2. package/dist/esm/index10.js +10 -33
  3. package/dist/esm/index100.js +24 -32
  4. package/dist/esm/index101.js +22 -182
  5. package/dist/esm/index102.js +32 -6
  6. package/dist/esm/index103.js +194 -2
  7. package/dist/esm/index104.js +6 -10
  8. package/dist/esm/index105.js +2 -19
  9. package/dist/esm/index106.js +10 -25
  10. package/dist/esm/index107.js +18 -8
  11. package/dist/esm/index108.js +24 -52
  12. package/dist/esm/index109.js +8 -45
  13. package/dist/esm/index11.js +8 -3
  14. package/dist/esm/index110.js +55 -8
  15. package/dist/esm/index111.js +45 -7
  16. package/dist/esm/index112.js +8 -16
  17. package/dist/esm/index113.js +7 -18
  18. package/dist/esm/index114.js +16 -24
  19. package/dist/esm/index115.js +18 -16
  20. package/dist/esm/index116.js +22 -52
  21. package/dist/esm/index117.js +16 -11
  22. package/dist/esm/index118.js +53 -159
  23. package/dist/esm/index119.js +11 -21
  24. package/dist/esm/index12.js +31 -8
  25. package/dist/esm/index120.js +157 -124
  26. package/dist/esm/index121.js +20 -37
  27. package/dist/esm/index122.js +127 -6
  28. package/dist/esm/index123.js +35 -24
  29. package/dist/esm/index124.js +6 -191
  30. package/dist/esm/index125.js +28 -4
  31. package/dist/esm/index126.js +184 -57
  32. package/dist/esm/index127.js +4 -3
  33. package/dist/esm/index128.js +60 -16
  34. package/dist/esm/index129.js +3 -17
  35. package/dist/esm/index13.js +3 -68
  36. package/dist/esm/index130.js +19 -22
  37. package/dist/esm/index131.js +16 -11
  38. package/dist/esm/index132.js +22 -33
  39. package/dist/esm/index133.js +12 -3
  40. package/dist/esm/index134.js +33 -17
  41. package/dist/esm/index135.js +3 -28
  42. package/dist/esm/index136.js +18 -35
  43. package/dist/esm/index137.js +27 -7
  44. package/dist/esm/index138.js +34 -24
  45. package/dist/esm/index139.js +7 -28
  46. package/dist/esm/index14.js +8 -8
  47. package/dist/esm/index140.js +24 -63
  48. package/dist/esm/index141.js +28 -9
  49. package/dist/esm/index142.js +62 -31
  50. package/dist/esm/index143.js +9 -27
  51. package/dist/esm/index144.js +32 -23
  52. package/dist/esm/index145.js +27 -3
  53. package/dist/esm/index146.js +24 -14
  54. package/dist/esm/index147.js +3 -103
  55. package/dist/esm/index148.js +14 -64
  56. package/dist/esm/index149.js +103 -5
  57. package/dist/esm/index15.js +67 -27
  58. package/dist/esm/index150.js +64 -6
  59. package/dist/esm/index151.js +5 -27
  60. package/dist/esm/index152.js +6 -39
  61. package/dist/esm/index153.js +27 -13
  62. package/dist/esm/index154.js +38 -41
  63. package/dist/esm/index155.js +13 -5
  64. package/dist/esm/index156.js +42 -11
  65. package/dist/esm/index157.js +5 -19
  66. package/dist/esm/index158.js +11 -78
  67. package/dist/esm/index159.js +20 -2
  68. package/dist/esm/index16.js +9 -70
  69. package/dist/esm/index160.js +74 -33
  70. package/dist/esm/index161.js +2 -111
  71. package/dist/esm/index162.js +27 -38
  72. package/dist/esm/index163.js +108 -30
  73. package/dist/esm/index164.js +48 -8
  74. package/dist/esm/index165.js +32 -6
  75. package/dist/esm/index166.js +8 -6
  76. package/dist/esm/index167.js +6 -11
  77. package/dist/esm/index168.js +6 -10
  78. package/dist/esm/index169.js +11 -13
  79. package/dist/esm/index17.js +26 -17
  80. package/dist/esm/index170.js +9 -31
  81. package/dist/esm/index171.js +14 -5
  82. package/dist/esm/index172.js +32 -8
  83. package/dist/esm/index173.js +5 -20
  84. package/dist/esm/index174.js +19 -31
  85. package/dist/esm/index175.js +31 -20
  86. package/dist/esm/index176.js +20 -3
  87. package/dist/esm/index177.js +3 -17
  88. package/dist/esm/index178.js +17 -10
  89. package/dist/esm/index179.js +10 -21
  90. package/dist/esm/index18.js +68 -108
  91. package/dist/esm/index180.js +21 -22
  92. package/dist/esm/index181.js +22 -5
  93. package/dist/esm/index182.js +5 -5
  94. package/dist/esm/index183.js +5 -8
  95. package/dist/esm/index184.js +8 -104
  96. package/dist/esm/index185.js +105 -3
  97. package/dist/esm/index186.js +3 -19
  98. package/dist/esm/index187.js +17 -170
  99. package/dist/esm/index188.js +170 -16
  100. package/dist/esm/index189.js +18 -10
  101. package/dist/esm/index19.js +19 -60
  102. package/dist/esm/index190.js +12 -40
  103. package/dist/esm/index191.js +36 -2
  104. package/dist/esm/index192.js +41 -4
  105. package/dist/esm/index193.js +39 -9
  106. package/dist/esm/index194.js +2 -20
  107. package/dist/esm/index195.js +4 -7
  108. package/dist/esm/index196.js +9 -10
  109. package/dist/esm/index197.js +19 -66
  110. package/dist/esm/index198.js +7 -65
  111. package/dist/esm/index199.js +10 -184
  112. package/dist/esm/index20.js +110 -24
  113. package/dist/esm/index200.js +66 -22
  114. package/dist/esm/index201.js +61 -38
  115. package/dist/esm/index202.js +178 -69
  116. package/dist/esm/index203.js +21 -39
  117. package/dist/esm/index204.js +35 -9
  118. package/dist/esm/index205.js +70 -7
  119. package/dist/esm/index206.js +40 -7
  120. package/dist/esm/index207.js +16 -6
  121. package/dist/esm/index208.js +13 -36
  122. package/dist/esm/index209.js +7 -15
  123. package/dist/esm/index21.js +51 -31
  124. package/dist/esm/index210.js +6 -8
  125. package/dist/esm/index211.js +35 -11
  126. package/dist/esm/index212.js +15 -9
  127. package/dist/esm/index213.js +8 -16
  128. package/dist/esm/index214.js +12 -22
  129. package/dist/esm/index215.js +9 -30
  130. package/dist/esm/index216.js +17 -2
  131. package/dist/esm/index217.js +21 -12
  132. package/dist/esm/index218.js +30 -12
  133. package/dist/esm/index219.js +2 -48
  134. package/dist/esm/index22.js +23 -36
  135. package/dist/esm/index220.js +12 -8
  136. package/dist/esm/index221.js +12 -13
  137. package/dist/esm/index222.js +46 -13
  138. package/dist/esm/index223.js +9 -8
  139. package/dist/esm/index224.js +13 -15
  140. package/dist/esm/index225.js +14 -24
  141. package/dist/esm/index226.js +8 -11
  142. package/dist/esm/index227.js +14 -23
  143. package/dist/esm/index228.js +24 -51
  144. package/dist/esm/index229.js +11 -17
  145. package/dist/esm/index23.js +28 -46
  146. package/dist/esm/index230.js +24 -14
  147. package/dist/esm/index231.js +51 -11
  148. package/dist/esm/index232.js +17 -103
  149. package/dist/esm/index233.js +14 -6
  150. package/dist/esm/index234.js +11 -224
  151. package/dist/esm/index235.js +103 -6
  152. package/dist/esm/index236.js +7 -7
  153. package/dist/esm/index237.js +223 -25
  154. package/dist/esm/index238.js +6 -19
  155. package/dist/esm/index239.js +7 -147
  156. package/dist/esm/index24.js +34 -160
  157. package/dist/esm/index240.js +26 -12
  158. package/dist/esm/index241.js +20 -36
  159. package/dist/esm/index242.js +146 -41
  160. package/dist/esm/index245.js +2 -2
  161. package/dist/esm/index248.js +5 -5
  162. package/dist/esm/index249.js +2 -2
  163. package/dist/esm/index25.js +55 -36
  164. package/dist/esm/index251.js +1 -1
  165. package/dist/esm/index253.js +2 -2
  166. package/dist/esm/index254.js +2 -2
  167. package/dist/esm/index255.js +1 -1
  168. package/dist/esm/index256.js +1 -1
  169. package/dist/esm/index26.js +162 -8
  170. package/dist/esm/index260.js +1 -1
  171. package/dist/esm/index27.js +39 -31
  172. package/dist/esm/index28.js +8 -35
  173. package/dist/esm/index29.js +30 -8
  174. package/dist/esm/index30.js +35 -28
  175. package/dist/esm/index31.js +9 -46
  176. package/dist/esm/index32.js +24 -83
  177. package/dist/esm/index33.js +43 -37
  178. package/dist/esm/index34.js +88 -8
  179. package/dist/esm/index35.js +40 -6
  180. package/dist/esm/index36.js +8 -16
  181. package/dist/esm/index37.js +6 -8
  182. package/dist/esm/index38.js +16 -13
  183. package/dist/esm/index39.js +8 -7
  184. package/dist/esm/index40.js +13 -9
  185. package/dist/esm/index41.js +7 -16
  186. package/dist/esm/index42.js +9 -46
  187. package/dist/esm/index43.js +16 -13
  188. package/dist/esm/index44.js +46 -16
  189. package/dist/esm/index45.js +13 -13
  190. package/dist/esm/index46.js +15 -5
  191. package/dist/esm/index47.js +13 -35
  192. package/dist/esm/index48.js +5 -8
  193. package/dist/esm/index49.js +34 -7
  194. package/dist/esm/index50.js +9 -25
  195. package/dist/esm/index51.js +8 -10
  196. package/dist/esm/index52.js +25 -14
  197. package/dist/esm/index53.js +10 -11
  198. package/dist/esm/index54.js +14 -116
  199. package/dist/esm/index55.js +11 -33
  200. package/dist/esm/index56.js +113 -76
  201. package/dist/esm/index57.js +30 -174
  202. package/dist/esm/index58.js +77 -42
  203. package/dist/esm/index59.js +177 -6
  204. package/dist/esm/index6.js +2 -2
  205. package/dist/esm/index60.js +44 -13
  206. package/dist/esm/index61.js +5 -12
  207. package/dist/esm/index62.js +13 -99
  208. package/dist/esm/index63.js +13 -72
  209. package/dist/esm/index64.js +95 -83
  210. package/dist/esm/index65.js +62 -138
  211. package/dist/esm/index66.js +71 -120
  212. package/dist/esm/index67.js +126 -46
  213. package/dist/esm/index68.js +136 -23
  214. package/dist/esm/index69.js +65 -102
  215. package/dist/esm/index7.js +2 -2
  216. package/dist/esm/index70.js +23 -6
  217. package/dist/esm/index71.js +102 -128
  218. package/dist/esm/index72.js +7 -276
  219. package/dist/esm/index73.js +132 -3
  220. package/dist/esm/index74.js +276 -4
  221. package/dist/esm/index75.js +3 -9
  222. package/dist/esm/index76.js +4 -2
  223. package/dist/esm/index77.js +9 -2
  224. package/dist/esm/index78.js +2 -3
  225. package/dist/esm/index79.js +2 -327
  226. package/dist/esm/index8.js +5 -5
  227. package/dist/esm/index80.js +3 -14
  228. package/dist/esm/index81.js +326 -4
  229. package/dist/esm/index82.js +12 -54
  230. package/dist/esm/index83.js +5 -2
  231. package/dist/esm/index84.js +54 -6
  232. package/dist/esm/index85.js +2 -215
  233. package/dist/esm/index86.js +8 -32
  234. package/dist/esm/index87.js +213 -20
  235. package/dist/esm/index88.js +32 -6
  236. package/dist/esm/index89.js +21 -73
  237. package/dist/esm/index9.js +2 -2
  238. package/dist/esm/index90.js +5 -5
  239. package/dist/esm/index91.js +73 -5
  240. package/dist/esm/index92.js +5 -35
  241. package/dist/esm/index93.js +5 -75
  242. package/dist/esm/index94.js +36 -3
  243. package/dist/esm/index95.js +67 -15
  244. package/dist/esm/index96.js +3 -452
  245. package/dist/esm/index97.js +15 -22
  246. package/dist/esm/index98.js +440 -15
  247. package/dist/esm/index99.js +21 -24
  248. package/package.json +3 -3
package/README.md CHANGED
@@ -3,11 +3,13 @@ Built on top of `@coinbase/cdp-core`, it offers a React-friendly interface for e
3
3
  and embedded wallet operations.
4
4
 
5
5
  ## Quickstart
6
- This guide will help you get started with @coinbase/cdp-hooks. You'll learn how to install the package, set up the provider, and use the hooks in a variety of ways.
6
+ This guide will help you get started with @coinbase/cdp-hooks. You'll learn how to install the package, set up the provider, and use the hooks in both web and React Native applications.
7
7
 
8
8
  ### Installation
9
9
 
10
- First, add the package to your project using your preferred package manager.
10
+ #### Web Applications
11
+
12
+ For web applications, add the package to your project using your preferred package manager:
11
13
 
12
14
  ```bash
13
15
  # With npm
@@ -20,6 +22,55 @@ pnpm add @coinbase/cdp-core @coinbase/cdp-hooks
20
22
  yarn add @coinbase/cdp-core @coinbase/cdp-hooks
21
23
  ```
22
24
 
25
+ #### React Native Applications
26
+
27
+ For React Native applications, you'll need additional crypto polyfills and dependencies:
28
+
29
+ ```bash
30
+ # Core packages
31
+ npm install @coinbase/cdp-core @coinbase/cdp-hooks
32
+
33
+ # Install this polyfill with expo for better compatibility
34
+ npx expo install react-native-quick-crypto
35
+
36
+ # Required crypto polyfills for React Native
37
+ npm install react-native-get-random-values @ungap/structured-clone
38
+
39
+ # AsyncStorage for React Native storage
40
+ npm install @react-native-async-storage/async-storage
41
+ ```
42
+
43
+ **React Native Setup Code**
44
+
45
+ You'll need to initialize the crypto polyfills before importing your app. Create or update your entry point file (typically `index.js` or `index.ts`):
46
+
47
+ ```typescript
48
+ import structuredClone from "@ungap/structured-clone";
49
+ import { install } from "react-native-quick-crypto";
50
+ import "react-native-get-random-values";
51
+
52
+ // Install crypto polyfills
53
+ if (!("structuredClone" in globalThis)) {
54
+ globalThis.structuredClone = structuredClone as any;
55
+ }
56
+
57
+ install(); // Install react-native-quick-crypto
58
+
59
+ // Import your app after polyfills are installed
60
+ import App from "./App";
61
+
62
+ // Register your app component
63
+ import { registerRootComponent } from "expo"; // For Expo apps
64
+ registerRootComponent(App);
65
+ ```
66
+
67
+ **Why these dependencies?**
68
+
69
+ - `react-native-quick-crypto`: Provides Web Crypto API compatibility for asymmetric key generation (ECDSA, RSA) required for JWT signing and encryption
70
+ - `react-native-get-random-values`: Provides secure random number generation via `crypto.getRandomValues()`
71
+ - `@ungap/structured-clone`: Polyfills `structuredClone` for object cloning compatibility
72
+ - `@react-native-async-storage/async-storage`: Provides persistent storage for auth tokens and secrets
73
+
23
74
  ### Gather your CDP Project Information
24
75
 
25
76
  1. Sign in or create an account on the [CDP Portal](https://portal.cdp.coinbase.com)
@@ -38,9 +89,12 @@ in CDP Portal, and click Add origin to include your local app
38
89
  Next, you need to wrap your application with the CDPHooksProvider, which provides the necessary context for
39
90
  hooks to work correctly.
40
91
 
92
+ #### Web Applications
93
+
41
94
  Update your main application file (e.g., main.tsx) to include the provider:
42
95
 
43
- ```tsx
96
+ ```tsx lines
97
+ import React from "react";
44
98
  import { CDPHooksProvider } from "@coinbase/cdp-hooks";
45
99
  import { App } from './App'; // Your main App component
46
100
 
@@ -58,11 +112,31 @@ function App() {
58
112
  }
59
113
  ```
60
114
 
115
+ #### React Native Applications
116
+
117
+ For React Native, the setup is identical.
118
+
119
+ ```tsx lines
120
+ import React from "react";
121
+ import { CDPHooksProvider } from "@coinbase/cdp-hooks";
122
+ import { App } from "./App";
123
+
124
+ export default function App() {
125
+ return (
126
+ <CDPHooksProvider config={{
127
+ projectId: "your-project-id",
128
+ }}>
129
+ <App />
130
+ </CDPHooksProvider>
131
+ );
132
+ }
133
+ ```
134
+
61
135
  #### Smart Account Configuration
62
136
 
63
137
  You can configure the provider to automatically create Smart Accounts for new users:
64
138
 
65
- ```tsx
139
+ ```tsx lines
66
140
  function App() {
67
141
  return (
68
142
  <CDPHooksProvider
@@ -85,9 +159,9 @@ End user authentication proceeds in two steps:
85
159
  1. The user inputs their email address to initiate the authentication flow, which will send the user a One Time Password (OTP) and return a `flowId`
86
160
  2. The user submits the six-digit OTP and `flowId`, after which the user will be authenticated, returning a User object.
87
161
 
88
- The following code demonstrates this flow:
162
+ #### Web Applications
89
163
 
90
- ```tsx
164
+ ```tsx lines
91
165
  import { useSignInWithEmail, useVerifyEmailOTP } from "@coinbase/cdp-hooks";
92
166
 
93
167
  function SignIn() {
@@ -121,11 +195,129 @@ function SignIn() {
121
195
  }
122
196
  ```
123
197
 
198
+ #### React Native Applications
199
+
200
+ For React Native, you'll use native UI components and handle the sign-in flow similarly:
201
+
202
+ ```tsx lines
203
+ import React, { useState } from "react";
204
+ import { View, Text, TextInput, TouchableOpacity, Alert } from "react-native";
205
+ import { useSignInWithEmail, useVerifyEmailOTP } from "@coinbase/cdp-hooks";
206
+
207
+ function SignInScreen() {
208
+ const { signInWithEmail } = useSignInWithEmail();
209
+ const { verifyEmailOTP } = useVerifyEmailOTP();
210
+ const [email, setEmail] = useState("");
211
+ const [otp, setOtp] = useState("");
212
+ const [flowId, setFlowId] = useState("");
213
+ const [isLoading, setIsLoading] = useState(false);
214
+
215
+ const handleSignIn = async () => {
216
+ if (!email) {
217
+ Alert.alert("Error", "Please enter an email address");
218
+ return;
219
+ }
220
+
221
+ setIsLoading(true);
222
+ try {
223
+ const result = await signInWithEmail({ email });
224
+ setFlowId(result.flowId);
225
+ Alert.alert("Success", "OTP sent to your email!");
226
+ } catch (error) {
227
+ Alert.alert("Error", error instanceof Error ? error.message : "Failed to sign in");
228
+ } finally {
229
+ setIsLoading(false);
230
+ }
231
+ };
232
+
233
+ const handleVerifyOTP = async () => {
234
+ if (!otp || !flowId) {
235
+ Alert.alert("Error", "Please enter the OTP");
236
+ return;
237
+ }
238
+
239
+ setIsLoading(true);
240
+ try {
241
+ const { user } = await verifyEmailOTP({ flowId, otp });
242
+ Alert.alert("Success", "Successfully signed in!");
243
+ console.log("Signed in user:", user);
244
+ } catch (error) {
245
+ Alert.alert("Error", error instanceof Error ? error.message : "Failed to verify OTP");
246
+ } finally {
247
+ setIsLoading(false);
248
+ }
249
+ };
250
+
251
+ return (
252
+ <View style={{ padding: 20 }}>
253
+ <Text>Email:</Text>
254
+ <TextInput
255
+ value={email}
256
+ onChangeText={setEmail}
257
+ placeholder="Enter your email"
258
+ keyboardType="email-address"
259
+ autoCapitalize="none"
260
+ editable={!isLoading}
261
+ style={{ borderWidth: 1, borderColor: "#ddd", padding: 12, marginBottom: 16 }}
262
+ />
263
+
264
+ <TouchableOpacity
265
+ onPress={handleSignIn}
266
+ disabled={isLoading}
267
+ style={{
268
+ backgroundColor: "#007AFF",
269
+ padding: 15,
270
+ borderRadius: 8,
271
+ alignItems: "center",
272
+ marginBottom: 12,
273
+ opacity: isLoading ? 0.6 : 1,
274
+ }}
275
+ >
276
+ <Text style={{ color: "white", fontSize: 16, fontWeight: "600" }}>
277
+ {isLoading ? "Sending..." : "Sign In with Email"}
278
+ </Text>
279
+ </TouchableOpacity>
280
+
281
+ {flowId && (
282
+ <>
283
+ <Text>Enter OTP from email:</Text>
284
+ <TextInput
285
+ value={otp}
286
+ onChangeText={setOtp}
287
+ placeholder="Enter 6-digit OTP"
288
+ keyboardType="number-pad"
289
+ maxLength={6}
290
+ editable={!isLoading}
291
+ style={{ borderWidth: 1, borderColor: "#ddd", padding: 12, marginBottom: 16 }}
292
+ />
293
+
294
+ <TouchableOpacity
295
+ onPress={handleVerifyOTP}
296
+ disabled={isLoading}
297
+ style={{
298
+ backgroundColor: "#007AFF",
299
+ padding: 15,
300
+ borderRadius: 8,
301
+ alignItems: "center",
302
+ opacity: isLoading ? 0.6 : 1,
303
+ }}
304
+ >
305
+ <Text style={{ color: "white", fontSize: 16, fontWeight: "600" }}>
306
+ {isLoading ? "Verifying..." : "Verify OTP"}
307
+ </Text>
308
+ </TouchableOpacity>
309
+ </>
310
+ )}
311
+ </View>
312
+ );
313
+ }
314
+ ```
315
+
124
316
  ### View User Information
125
317
 
126
318
  Once the end user has signed in, you can display their information in your application:
127
319
 
128
- ```tsx
320
+ ```tsx lines
129
321
  import { useCurrentUser, useEvmAddress } from "@coinbase/cdp-hooks";
130
322
 
131
323
  function UserInformation() {
@@ -164,7 +356,7 @@ We support signing and sending a Blockchain transaction in a single action on th
164
356
  - Optimism
165
357
  - Polygon
166
358
 
167
- ```tsx
359
+ ```tsx lines
168
360
  import { useSendEvmTransaction, useEvmAddress } from "@coinbase/cdp-hooks";
169
361
 
170
362
  function SendTransaction() {
@@ -202,7 +394,7 @@ function SendTransaction() {
202
394
  For networks other than those supported by the CDP APIs, your end user must sign the transaction, and then
203
395
  you must broadcast the transaction yourself. This example uses the public client from `viem` to broadcast the transaction.
204
396
 
205
- ```tsx
397
+ ```tsx lines
206
398
  import { useSignEvmTransaction, useEvmAddress } from "@coinbase/cdp-hooks";
207
399
  import { http, createPublicClient } from "viem";
208
400
  import { tron } from "viem/chains";
@@ -254,7 +446,7 @@ function CrossChainTransaction() {
254
446
 
255
447
  End users can sign EVM messages, hashes, and typed data to generate signatures for various onchain applications.
256
448
 
257
- ```tsx
449
+ ```tsx lines
258
450
  import { useSignEvmMessage, useSignEvmTypedData, useEvmAddress } from "@coinbase/cdp-hooks";
259
451
 
260
452
  function SignData() {
@@ -327,7 +519,7 @@ function SignData() {
327
519
 
328
520
  End users can export their private keys from their embedded wallet, allowing them to import it into an EVM-compatible wallet of their choice.
329
521
 
330
- ```tsx
522
+ ```tsx lines
331
523
  import { useExportEvmAccount, useEvmAddress } from "@coinbase/cdp-hooks";
332
524
 
333
525
  function ExportKey() {
@@ -361,7 +553,7 @@ Smart Accounts provide advanced account abstraction features with React hooks.
361
553
 
362
554
  Send user operations from Smart Accounts with support for multiple calls and paymaster sponsorship. The hook returns a method to execute the user operation and `status`, `data`, and `error` properties to read the result of the user operation:
363
555
 
364
- ```tsx
556
+ ```tsx lines
365
557
  import { useSendUserOperation, useCurrentUser } from "@coinbase/cdp-hooks";
366
558
 
367
559
  function SendUserOperation() {
@@ -428,7 +620,7 @@ function SendUserOperation() {
428
620
 
429
621
  Use the `useWaitForUserOperation` hook to poll for user operation status and provide real-time updates. This hook immediately fires off a query to get the result of the user operation:
430
622
 
431
- ```tsx
623
+ ```tsx lines
432
624
  import { useWaitForUserOperation, useState } from "react";
433
625
 
434
626
  function WaitForUserOperation() {
@@ -472,7 +664,7 @@ function WaitForUserOperation() {
472
664
 
473
665
  You can control when the `useWaitForUserOperation` hook should start polling using the `enabled` parameter:
474
666
 
475
- ```tsx
667
+ ```tsx lines
476
668
  function ConditionalWaitForUserOperation() {
477
669
  const [shouldPoll, setShouldPoll] = useState(false);
478
670
 
@@ -1,35 +1,12 @@
1
- import { parseAccount as I } from "./index11.js";
2
- import { uid as M } from "./index12.js";
3
- function O(n) {
4
- const { batch: s, chain: e, ccipRead: u, key: d = "base", name: f = "Base Client", type: m = "base" } = n, o = n.experimental_blockTag ?? (typeof e?.experimental_preconfirmationTime == "number" ? "pending" : void 0), b = e?.blockTime ?? 12e3, p = Math.min(Math.max(Math.floor(b / 2), 500), 4e3), t = n.pollingInterval ?? p, g = n.cacheTime ?? t, x = n.account ? I(n.account) : void 0, { config: h, request: T, value: k } = n.transport({
5
- chain: e,
6
- pollingInterval: t
7
- }), _ = { ...h, ...k }, c = {
8
- account: x,
9
- batch: s,
10
- cacheTime: g,
11
- ccipRead: u,
12
- chain: e,
13
- key: d,
14
- name: f,
15
- pollingInterval: t,
16
- request: T,
17
- transport: _,
18
- type: m,
19
- uid: M(),
20
- ...o ? { experimental_blockTag: o } : {}
21
- };
22
- function i(l) {
23
- return (v) => {
24
- const a = v(l);
25
- for (const y in c)
26
- delete a[y];
27
- const r = { ...l, ...a };
28
- return Object.assign(r, { extend: i(r) });
29
- };
30
- }
31
- return Object.assign(c, { extend: i(c) });
32
- }
1
+ import { contracts as o } from "./index190.js";
2
+ import { formatters as r } from "./index191.js";
3
+ import { serializers as t } from "./index192.js";
4
+ const e = {
5
+ blockTime: 2e3,
6
+ contracts: o,
7
+ formatters: r,
8
+ serializers: t
9
+ };
33
10
  export {
34
- O as createClient
11
+ e as chainConfig
35
12
  };
@@ -1,37 +1,29 @@
1
- import { formatEther as E } from "./index90.js";
2
- import { formatGwei as t } from "./index91.js";
3
- import { BaseError as y } from "./index82.js";
4
- import { prettyPrint as l } from "./index93.js";
5
- class x extends y {
6
- constructor(e, { account: a, docsPath: n, chain: m, data: f, gas: u, gasPrice: r, maxFeePerGas: o, maxPriorityFeePerGas: s, nonce: d, to: p, value: i }) {
7
- const g = l({
8
- from: a?.address,
9
- to: p,
10
- value: typeof i < "u" && `${E(i)} ${m?.nativeCurrency?.symbol || "ETH"}`,
11
- data: f,
12
- gas: u,
13
- gasPrice: typeof r < "u" && `${t(r)} gwei`,
14
- maxFeePerGas: typeof o < "u" && `${t(o)} gwei`,
15
- maxPriorityFeePerGas: typeof s < "u" && `${t(s)} gwei`,
16
- nonce: d
1
+ import { BaseError as o } from "./index84.js";
2
+ class i extends o {
3
+ constructor({ max: e, min: r, signed: s, size: a, value: t }) {
4
+ super(`Number "${t}" is not in safe ${a ? `${a * 8}-bit ${s ? "signed" : "unsigned"} ` : ""}integer range ${e ? `(${r} to ${e})` : `(above ${r})`}`, { name: "IntegerOutOfRangeError" });
5
+ }
6
+ }
7
+ class u extends o {
8
+ constructor(e) {
9
+ super(`Bytes value "${e}" is not a valid boolean. The bytes array must contain a single byte of either a 0 or 1 value.`, {
10
+ name: "InvalidBytesBooleanError"
17
11
  });
18
- super(e.shortMessage, {
19
- cause: e,
20
- docsPath: n,
21
- metaMessages: [
22
- ...e.metaMessages ? [...e.metaMessages, " "] : [],
23
- "Estimate Gas Arguments:",
24
- g
25
- ].filter(Boolean),
26
- name: "EstimateGasExecutionError"
27
- }), Object.defineProperty(this, "cause", {
28
- enumerable: !0,
29
- configurable: !0,
30
- writable: !0,
31
- value: void 0
32
- }), this.cause = e;
12
+ }
13
+ }
14
+ class c extends o {
15
+ constructor(e) {
16
+ super(`Hex value "${e}" is not a valid boolean. The hex value must be "0x0" (false) or "0x1" (true).`, { name: "InvalidHexBooleanError" });
17
+ }
18
+ }
19
+ class v extends o {
20
+ constructor({ givenSize: e, maxSize: r }) {
21
+ super(`Size cannot exceed ${r} bytes. Given size: ${e} bytes.`, { name: "SizeOverflowError" });
33
22
  }
34
23
  }
35
24
  export {
36
- x as EstimateGasExecutionError
25
+ i as IntegerOutOfRangeError,
26
+ u as InvalidBytesBooleanError,
27
+ c as InvalidHexBooleanError,
28
+ v as SizeOverflowError
37
29
  };
@@ -1,196 +1,36 @@
1
- import { formatGwei as a } from "./index91.js";
2
- import { BaseError as t } from "./index82.js";
3
- class s extends t {
4
- constructor({ cause: r, message: e } = {}) {
5
- const n = e?.replace("execution reverted: ", "")?.replace("execution reverted", "");
6
- super(`Execution reverted ${n ? `with reason: ${n}` : "for an unknown reason"}.`, {
7
- cause: r,
8
- name: "ExecutionRevertedError"
9
- });
10
- }
11
- }
12
- Object.defineProperty(s, "code", {
13
- enumerable: !0,
14
- configurable: !0,
15
- writable: !0,
16
- value: 3
17
- });
18
- Object.defineProperty(s, "nodeMessage", {
19
- enumerable: !0,
20
- configurable: !0,
21
- writable: !0,
22
- value: /execution reverted/
23
- });
24
- class c extends t {
25
- constructor({ cause: r, maxFeePerGas: e } = {}) {
26
- super(`The fee cap (\`maxFeePerGas\`${e ? ` = ${a(e)} gwei` : ""}) cannot be higher than the maximum allowed value (2^256-1).`, {
27
- cause: r,
28
- name: "FeeCapTooHighError"
29
- });
30
- }
31
- }
32
- Object.defineProperty(c, "nodeMessage", {
33
- enumerable: !0,
34
- configurable: !0,
35
- writable: !0,
36
- value: /max fee per gas higher than 2\^256-1|fee cap higher than 2\^256-1/
37
- });
38
- class i extends t {
39
- constructor({ cause: r, maxFeePerGas: e } = {}) {
40
- super(`The fee cap (\`maxFeePerGas\`${e ? ` = ${a(e)}` : ""} gwei) cannot be lower than the block base fee.`, {
41
- cause: r,
42
- name: "FeeCapTooLowError"
43
- });
44
- }
45
- }
46
- Object.defineProperty(i, "nodeMessage", {
47
- enumerable: !0,
48
- configurable: !0,
49
- writable: !0,
50
- value: /max fee per gas less than block base fee|fee cap less than block base fee|transaction is outdated/
51
- });
52
- class u extends t {
53
- constructor({ cause: r, nonce: e } = {}) {
54
- super(`Nonce provided for the transaction ${e ? `(${e}) ` : ""}is higher than the next one expected.`, { cause: r, name: "NonceTooHighError" });
55
- }
56
- }
57
- Object.defineProperty(u, "nodeMessage", {
58
- enumerable: !0,
59
- configurable: !0,
60
- writable: !0,
61
- value: /nonce too high/
62
- });
63
- class l extends t {
64
- constructor({ cause: r, nonce: e } = {}) {
65
- super([
66
- `Nonce provided for the transaction ${e ? `(${e}) ` : ""}is lower than the current nonce of the account.`,
67
- "Try increasing the nonce or find the latest nonce with `getTransactionCount`."
68
- ].join(`
69
- `), { cause: r, name: "NonceTooLowError" });
70
- }
71
- }
72
- Object.defineProperty(l, "nodeMessage", {
73
- enumerable: !0,
74
- configurable: !0,
75
- writable: !0,
76
- value: /nonce too low|transaction already imported|already known/
77
- });
78
- class d extends t {
79
- constructor({ cause: r, nonce: e } = {}) {
80
- super(`Nonce provided for the transaction ${e ? `(${e}) ` : ""}exceeds the maximum allowed nonce.`, { cause: r, name: "NonceMaxValueError" });
81
- }
82
- }
83
- Object.defineProperty(d, "nodeMessage", {
84
- enumerable: !0,
85
- configurable: !0,
86
- writable: !0,
87
- value: /nonce has max value/
88
- });
89
- class h extends t {
90
- constructor({ cause: r } = {}) {
91
- super([
92
- "The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account."
93
- ].join(`
94
- `), {
95
- cause: r,
1
+ import { BaseError as r } from "./index84.js";
2
+ class s extends r {
3
+ constructor({ data: a }) {
4
+ super("Unable to extract image from metadata. The metadata may be malformed or invalid.", {
96
5
  metaMessages: [
97
- "This error could arise when the account does not have enough funds to:",
98
- " - pay for the total gas fee,",
99
- " - pay for the value to send.",
100
- " ",
101
- "The cost of the transaction is calculated as `gas * gas fee + value`, where:",
102
- " - `gas` is the amount of gas needed for transaction to execute,",
103
- " - `gas fee` is the gas fee,",
104
- " - `value` is the amount of ether to send to the recipient."
6
+ "- Metadata must be a JSON object with at least an `image`, `image_url` or `image_data` property.",
7
+ "",
8
+ `Provided data: ${JSON.stringify(a)}`
105
9
  ],
106
- name: "InsufficientFundsError"
10
+ name: "EnsAvatarInvalidMetadataError"
107
11
  });
108
12
  }
109
13
  }
110
- Object.defineProperty(h, "nodeMessage", {
111
- enumerable: !0,
112
- configurable: !0,
113
- writable: !0,
114
- value: /insufficient funds|exceeds transaction sender account balance/
115
- });
116
- class f extends t {
117
- constructor({ cause: r, gas: e } = {}) {
118
- super(`The amount of gas ${e ? `(${e}) ` : ""}provided for the transaction exceeds the limit allowed for the block.`, {
119
- cause: r,
120
- name: "IntrinsicGasTooHighError"
14
+ class o extends r {
15
+ constructor({ reason: a }) {
16
+ super(`ENS NFT avatar URI is invalid. ${a}`, {
17
+ name: "EnsAvatarInvalidNftUriError"
121
18
  });
122
19
  }
123
20
  }
124
- Object.defineProperty(f, "nodeMessage", {
125
- enumerable: !0,
126
- configurable: !0,
127
- writable: !0,
128
- value: /intrinsic gas too high|gas limit reached/
129
- });
130
- class p extends t {
131
- constructor({ cause: r, gas: e } = {}) {
132
- super(`The amount of gas ${e ? `(${e}) ` : ""}provided for the transaction is too low.`, {
133
- cause: r,
134
- name: "IntrinsicGasTooLowError"
135
- });
21
+ class n extends r {
22
+ constructor({ uri: a }) {
23
+ super(`Unable to resolve ENS avatar URI "${a}". The URI may be malformed, invalid, or does not respond with a valid image.`, { name: "EnsAvatarUriResolutionError" });
136
24
  }
137
25
  }
138
- Object.defineProperty(p, "nodeMessage", {
139
- enumerable: !0,
140
- configurable: !0,
141
- writable: !0,
142
- value: /intrinsic gas too low/
143
- });
144
- class g extends t {
145
- constructor({ cause: r }) {
146
- super("The transaction type is not supported for this chain.", {
147
- cause: r,
148
- name: "TransactionTypeNotSupportedError"
149
- });
150
- }
151
- }
152
- Object.defineProperty(g, "nodeMessage", {
153
- enumerable: !0,
154
- configurable: !0,
155
- writable: !0,
156
- value: /transaction type not valid/
157
- });
158
- class b extends t {
159
- constructor({ cause: r, maxPriorityFeePerGas: e, maxFeePerGas: n } = {}) {
160
- super([
161
- `The provided tip (\`maxPriorityFeePerGas\`${e ? ` = ${a(e)} gwei` : ""}) cannot be higher than the fee cap (\`maxFeePerGas\`${n ? ` = ${a(n)} gwei` : ""}).`
162
- ].join(`
163
- `), {
164
- cause: r,
165
- name: "TipAboveFeeCapError"
166
- });
167
- }
168
- }
169
- Object.defineProperty(b, "nodeMessage", {
170
- enumerable: !0,
171
- configurable: !0,
172
- writable: !0,
173
- value: /max priority fee per gas higher than max fee per gas|tip higher than fee cap/
174
- });
175
- class x extends t {
176
- constructor({ cause: r }) {
177
- super(`An error occurred while executing: ${r?.shortMessage}`, {
178
- cause: r,
179
- name: "UnknownNodeError"
180
- });
26
+ class i extends r {
27
+ constructor({ namespace: a }) {
28
+ super(`ENS NFT avatar namespace "${a}" is not supported. Must be "erc721" or "erc1155".`, { name: "EnsAvatarUnsupportedNamespaceError" });
181
29
  }
182
30
  }
183
31
  export {
184
- s as ExecutionRevertedError,
185
- c as FeeCapTooHighError,
186
- i as FeeCapTooLowError,
187
- h as InsufficientFundsError,
188
- f as IntrinsicGasTooHighError,
189
- p as IntrinsicGasTooLowError,
190
- d as NonceMaxValueError,
191
- u as NonceTooHighError,
192
- l as NonceTooLowError,
193
- b as TipAboveFeeCapError,
194
- g as TransactionTypeNotSupportedError,
195
- x as UnknownNodeError
32
+ s as EnsAvatarInvalidMetadataError,
33
+ o as EnsAvatarInvalidNftUriError,
34
+ i as EnsAvatarUnsupportedNamespaceError,
35
+ n as EnsAvatarUriResolutionError
196
36
  };