@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.
- package/README.md +206 -14
- package/dist/esm/index10.js +10 -33
- package/dist/esm/index100.js +24 -32
- package/dist/esm/index101.js +22 -182
- package/dist/esm/index102.js +32 -6
- package/dist/esm/index103.js +194 -2
- package/dist/esm/index104.js +6 -10
- package/dist/esm/index105.js +2 -19
- package/dist/esm/index106.js +10 -25
- package/dist/esm/index107.js +18 -8
- package/dist/esm/index108.js +24 -52
- package/dist/esm/index109.js +8 -45
- package/dist/esm/index11.js +8 -3
- package/dist/esm/index110.js +55 -8
- package/dist/esm/index111.js +45 -7
- package/dist/esm/index112.js +8 -16
- package/dist/esm/index113.js +7 -18
- package/dist/esm/index114.js +16 -24
- package/dist/esm/index115.js +18 -16
- package/dist/esm/index116.js +22 -52
- package/dist/esm/index117.js +16 -11
- package/dist/esm/index118.js +53 -159
- package/dist/esm/index119.js +11 -21
- package/dist/esm/index12.js +31 -8
- package/dist/esm/index120.js +157 -124
- package/dist/esm/index121.js +20 -37
- package/dist/esm/index122.js +127 -6
- package/dist/esm/index123.js +35 -24
- package/dist/esm/index124.js +6 -191
- package/dist/esm/index125.js +28 -4
- package/dist/esm/index126.js +184 -57
- package/dist/esm/index127.js +4 -3
- package/dist/esm/index128.js +60 -16
- package/dist/esm/index129.js +3 -17
- package/dist/esm/index13.js +3 -68
- package/dist/esm/index130.js +19 -22
- package/dist/esm/index131.js +16 -11
- package/dist/esm/index132.js +22 -33
- package/dist/esm/index133.js +12 -3
- package/dist/esm/index134.js +33 -17
- package/dist/esm/index135.js +3 -28
- package/dist/esm/index136.js +18 -35
- package/dist/esm/index137.js +27 -7
- package/dist/esm/index138.js +34 -24
- package/dist/esm/index139.js +7 -28
- package/dist/esm/index14.js +8 -8
- package/dist/esm/index140.js +24 -63
- package/dist/esm/index141.js +28 -9
- package/dist/esm/index142.js +62 -31
- package/dist/esm/index143.js +9 -27
- package/dist/esm/index144.js +32 -23
- package/dist/esm/index145.js +27 -3
- package/dist/esm/index146.js +24 -14
- package/dist/esm/index147.js +3 -103
- package/dist/esm/index148.js +14 -64
- package/dist/esm/index149.js +103 -5
- package/dist/esm/index15.js +67 -27
- package/dist/esm/index150.js +64 -6
- package/dist/esm/index151.js +5 -27
- package/dist/esm/index152.js +6 -39
- package/dist/esm/index153.js +27 -13
- package/dist/esm/index154.js +38 -41
- package/dist/esm/index155.js +13 -5
- package/dist/esm/index156.js +42 -11
- package/dist/esm/index157.js +5 -19
- package/dist/esm/index158.js +11 -78
- package/dist/esm/index159.js +20 -2
- package/dist/esm/index16.js +9 -70
- package/dist/esm/index160.js +74 -33
- package/dist/esm/index161.js +2 -111
- package/dist/esm/index162.js +27 -38
- package/dist/esm/index163.js +108 -30
- package/dist/esm/index164.js +48 -8
- package/dist/esm/index165.js +32 -6
- package/dist/esm/index166.js +8 -6
- package/dist/esm/index167.js +6 -11
- package/dist/esm/index168.js +6 -10
- package/dist/esm/index169.js +11 -13
- package/dist/esm/index17.js +26 -17
- package/dist/esm/index170.js +9 -31
- package/dist/esm/index171.js +14 -5
- package/dist/esm/index172.js +32 -8
- package/dist/esm/index173.js +5 -20
- package/dist/esm/index174.js +19 -31
- package/dist/esm/index175.js +31 -20
- package/dist/esm/index176.js +20 -3
- package/dist/esm/index177.js +3 -17
- package/dist/esm/index178.js +17 -10
- package/dist/esm/index179.js +10 -21
- package/dist/esm/index18.js +68 -108
- package/dist/esm/index180.js +21 -22
- package/dist/esm/index181.js +22 -5
- package/dist/esm/index182.js +5 -5
- package/dist/esm/index183.js +5 -8
- package/dist/esm/index184.js +8 -104
- package/dist/esm/index185.js +105 -3
- package/dist/esm/index186.js +3 -19
- package/dist/esm/index187.js +17 -170
- package/dist/esm/index188.js +170 -16
- package/dist/esm/index189.js +18 -10
- package/dist/esm/index19.js +19 -60
- package/dist/esm/index190.js +12 -40
- package/dist/esm/index191.js +36 -2
- package/dist/esm/index192.js +41 -4
- package/dist/esm/index193.js +39 -9
- package/dist/esm/index194.js +2 -20
- package/dist/esm/index195.js +4 -7
- package/dist/esm/index196.js +9 -10
- package/dist/esm/index197.js +19 -66
- package/dist/esm/index198.js +7 -65
- package/dist/esm/index199.js +10 -184
- package/dist/esm/index20.js +110 -24
- package/dist/esm/index200.js +66 -22
- package/dist/esm/index201.js +61 -38
- package/dist/esm/index202.js +178 -69
- package/dist/esm/index203.js +21 -39
- package/dist/esm/index204.js +35 -9
- package/dist/esm/index205.js +70 -7
- package/dist/esm/index206.js +40 -7
- package/dist/esm/index207.js +16 -6
- package/dist/esm/index208.js +13 -36
- package/dist/esm/index209.js +7 -15
- package/dist/esm/index21.js +51 -31
- package/dist/esm/index210.js +6 -8
- package/dist/esm/index211.js +35 -11
- package/dist/esm/index212.js +15 -9
- package/dist/esm/index213.js +8 -16
- package/dist/esm/index214.js +12 -22
- package/dist/esm/index215.js +9 -30
- package/dist/esm/index216.js +17 -2
- package/dist/esm/index217.js +21 -12
- package/dist/esm/index218.js +30 -12
- package/dist/esm/index219.js +2 -48
- package/dist/esm/index22.js +23 -36
- package/dist/esm/index220.js +12 -8
- package/dist/esm/index221.js +12 -13
- package/dist/esm/index222.js +46 -13
- package/dist/esm/index223.js +9 -8
- package/dist/esm/index224.js +13 -15
- package/dist/esm/index225.js +14 -24
- package/dist/esm/index226.js +8 -11
- package/dist/esm/index227.js +14 -23
- package/dist/esm/index228.js +24 -51
- package/dist/esm/index229.js +11 -17
- package/dist/esm/index23.js +28 -46
- package/dist/esm/index230.js +24 -14
- package/dist/esm/index231.js +51 -11
- package/dist/esm/index232.js +17 -103
- package/dist/esm/index233.js +14 -6
- package/dist/esm/index234.js +11 -224
- package/dist/esm/index235.js +103 -6
- package/dist/esm/index236.js +7 -7
- package/dist/esm/index237.js +223 -25
- package/dist/esm/index238.js +6 -19
- package/dist/esm/index239.js +7 -147
- package/dist/esm/index24.js +34 -160
- package/dist/esm/index240.js +26 -12
- package/dist/esm/index241.js +20 -36
- package/dist/esm/index242.js +146 -41
- package/dist/esm/index245.js +2 -2
- package/dist/esm/index248.js +5 -5
- package/dist/esm/index249.js +2 -2
- package/dist/esm/index25.js +55 -36
- package/dist/esm/index251.js +1 -1
- package/dist/esm/index253.js +2 -2
- package/dist/esm/index254.js +2 -2
- package/dist/esm/index255.js +1 -1
- package/dist/esm/index256.js +1 -1
- package/dist/esm/index26.js +162 -8
- package/dist/esm/index260.js +1 -1
- package/dist/esm/index27.js +39 -31
- package/dist/esm/index28.js +8 -35
- package/dist/esm/index29.js +30 -8
- package/dist/esm/index30.js +35 -28
- package/dist/esm/index31.js +9 -46
- package/dist/esm/index32.js +24 -83
- package/dist/esm/index33.js +43 -37
- package/dist/esm/index34.js +88 -8
- package/dist/esm/index35.js +40 -6
- package/dist/esm/index36.js +8 -16
- package/dist/esm/index37.js +6 -8
- package/dist/esm/index38.js +16 -13
- package/dist/esm/index39.js +8 -7
- package/dist/esm/index40.js +13 -9
- package/dist/esm/index41.js +7 -16
- package/dist/esm/index42.js +9 -46
- package/dist/esm/index43.js +16 -13
- package/dist/esm/index44.js +46 -16
- package/dist/esm/index45.js +13 -13
- package/dist/esm/index46.js +15 -5
- package/dist/esm/index47.js +13 -35
- package/dist/esm/index48.js +5 -8
- package/dist/esm/index49.js +34 -7
- package/dist/esm/index50.js +9 -25
- package/dist/esm/index51.js +8 -10
- package/dist/esm/index52.js +25 -14
- package/dist/esm/index53.js +10 -11
- package/dist/esm/index54.js +14 -116
- package/dist/esm/index55.js +11 -33
- package/dist/esm/index56.js +113 -76
- package/dist/esm/index57.js +30 -174
- package/dist/esm/index58.js +77 -42
- package/dist/esm/index59.js +177 -6
- package/dist/esm/index6.js +2 -2
- package/dist/esm/index60.js +44 -13
- package/dist/esm/index61.js +5 -12
- package/dist/esm/index62.js +13 -99
- package/dist/esm/index63.js +13 -72
- package/dist/esm/index64.js +95 -83
- package/dist/esm/index65.js +62 -138
- package/dist/esm/index66.js +71 -120
- package/dist/esm/index67.js +126 -46
- package/dist/esm/index68.js +136 -23
- package/dist/esm/index69.js +65 -102
- package/dist/esm/index7.js +2 -2
- package/dist/esm/index70.js +23 -6
- package/dist/esm/index71.js +102 -128
- package/dist/esm/index72.js +7 -276
- package/dist/esm/index73.js +132 -3
- package/dist/esm/index74.js +276 -4
- package/dist/esm/index75.js +3 -9
- package/dist/esm/index76.js +4 -2
- package/dist/esm/index77.js +9 -2
- package/dist/esm/index78.js +2 -3
- package/dist/esm/index79.js +2 -327
- package/dist/esm/index8.js +5 -5
- package/dist/esm/index80.js +3 -14
- package/dist/esm/index81.js +326 -4
- package/dist/esm/index82.js +12 -54
- package/dist/esm/index83.js +5 -2
- package/dist/esm/index84.js +54 -6
- package/dist/esm/index85.js +2 -215
- package/dist/esm/index86.js +8 -32
- package/dist/esm/index87.js +213 -20
- package/dist/esm/index88.js +32 -6
- package/dist/esm/index89.js +21 -73
- package/dist/esm/index9.js +2 -2
- package/dist/esm/index90.js +5 -5
- package/dist/esm/index91.js +73 -5
- package/dist/esm/index92.js +5 -35
- package/dist/esm/index93.js +5 -75
- package/dist/esm/index94.js +36 -3
- package/dist/esm/index95.js +67 -15
- package/dist/esm/index96.js +3 -452
- package/dist/esm/index97.js +15 -22
- package/dist/esm/index98.js +440 -15
- package/dist/esm/index99.js +21 -24
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/dist/esm/index10.js
CHANGED
|
@@ -1,35 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
11
|
+
e as chainConfig
|
|
35
12
|
};
|
package/dist/esm/index100.js
CHANGED
|
@@ -1,37 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
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
|
-
|
|
25
|
+
i as IntegerOutOfRangeError,
|
|
26
|
+
u as InvalidBytesBooleanError,
|
|
27
|
+
c as InvalidHexBooleanError,
|
|
28
|
+
v as SizeOverflowError
|
|
37
29
|
};
|
package/dist/esm/index101.js
CHANGED
|
@@ -1,196 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
"
|
|
98
|
-
"
|
|
99
|
-
|
|
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: "
|
|
10
|
+
name: "EnsAvatarInvalidMetadataError"
|
|
107
11
|
});
|
|
108
12
|
}
|
|
109
13
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
|
185
|
-
|
|
186
|
-
i as
|
|
187
|
-
|
|
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
|
};
|