@coinbase/cdp-wagmi 0.0.23 → 0.0.25

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 (2) hide show
  1. package/README.md +161 -2
  2. package/package.json +3 -3
package/README.md CHANGED
@@ -45,7 +45,7 @@ the CDP Frontend SDK. The `providerConfig` must be provided and is responsible f
45
45
  configuring the EIP-1193 provider's transports which are used to broadcast non-Base
46
46
  transactions.
47
47
 
48
- ```tsx
48
+ ```tsx lines
49
49
  import React from 'react';
50
50
  import ReactDOM from 'react-dom/client';
51
51
  import { App } from './App'; // Your main App component
@@ -107,7 +107,7 @@ After using any of these methods, the CDP embedded wallet's connector should aut
107
107
 
108
108
  Now, your application should be able to successfully call Wagmi hooks. For example:
109
109
 
110
- ```tsx
110
+ ```tsx lines
111
111
  import { useState } from "react";
112
112
  import { parseEther } from "viem";
113
113
  import { useAccount, useSendTransaction, useWaitForTransactionReceipt } from "wagmi";
@@ -234,4 +234,163 @@ export default function WagmiTransaction() {
234
234
  </div>
235
235
  );
236
236
  }
237
+ ```
238
+
239
+ ### Smart Accounts
240
+
241
+ This package has Smart Account support for the Wagmi `useSendCalls`, `useCallsStatus` and `useCapabilities` hooks. It requires a different CDP Config than for EOA wallets:
242
+
243
+ ```tsx lines
244
+ const cdpConfig: Config = {
245
+ projectId: "your-project-id", // Copy your Project ID here.
246
+ createAccountOnLogin: "evm-smart" // Create a smart account by default when a user logs in and does not yet have one
247
+ }
248
+ ```
249
+
250
+ After signing in, you can send a User Operation using Wagmi hooks:
251
+
252
+ ```tsx lines
253
+ import { useState } from "react";
254
+ import { parseEther } from "viem";
255
+ import { useAccount, useSendCalls, useSendCalls, useCallsStatus, useCapabilities } from "wagmi";
256
+
257
+ /**
258
+ * The burn address (0x0000000000000000000000000000000000000000)
259
+ */
260
+ const BURN_ADDRESS = "0x0000000000000000000000000000000000000000" as const;
261
+
262
+ /**
263
+ * The amount to send in ETH (0.00001 ETH)
264
+ */
265
+ const AMOUNT_TO_SEND = "0.00001";
266
+
267
+ /**
268
+ * SendCalls component that allows users with Smart Accounts to send ETH to the burn address
269
+ *
270
+ * @returns JSX element with transaction sending functionality
271
+ */
272
+ export function WagmiSendCalls() {
273
+ const { address, isConnected } = useAccount();
274
+ const { data: userOpHash, sendCalls, isPending, error } = useSendCalls();
275
+ // Check the status of a sent user operation
276
+ const { isLoading: isConfirming, isSuccess } = useCallsStatus({
277
+ id: userOpHash as Hex,
278
+ query: {
279
+ enabled: !!userOpHash,
280
+ },
281
+ });
282
+ const chainId = useChainId();
283
+ const { data: walletCapabilities } = useCapabilities({
284
+ chainId,
285
+ });
286
+
287
+ // Check the capabilities of the wallet to determine if you can use user operations
288
+ const isSendCallsSupported = useMemo(() => {
289
+ return walletCapabilities?.atomic?.status === "supported";
290
+ }, [walletCapabilities]);
291
+
292
+ const handleSendCalls = async () => {
293
+ if (!isConnected || !address) return;
294
+
295
+ try {
296
+ sendCalls(
297
+ {
298
+ calls: [
299
+ {
300
+ to: BURN_ADDRESS,
301
+ value: parseEther(AMOUNT_TO_SEND),
302
+ },
303
+ ],
304
+ }
305
+ );
306
+ } catch (err) {
307
+ console.log("Failed to send user operation: ", err)
308
+ }
309
+ };
310
+
311
+ if (!isSendCallsSupported) {
312
+ return (
313
+ <div>
314
+ <p>
315
+ This wallet does not support sending calls on chain {chainId}. Ensure your wallet has a
316
+ smart account, and is on a supported chain.
317
+ </p>
318
+ </div>
319
+ );
320
+ }
321
+
322
+ return (
323
+ <div>
324
+ <div>
325
+ <p>
326
+ ⚠️ Warning: This will send {AMOUNT_TO_SEND} ETH to the burn address (0x0000...0000).
327
+ This operation cannot be reversed and the ETH will be permanently lost.
328
+ </p>
329
+ </div>
330
+
331
+ <div>
332
+ <div>
333
+ <div>Amount: {AMOUNT_TO_SEND} ETH</div>
334
+ <div>To (Burn Address): {BURN_ADDRESS.slice(0, 6)}...{BURN_ADDRESS.slice(-4)}</div>
335
+ <div>From: {address?.slice(0, 6)}...{address?.slice(-4)}</div>
336
+ </div>
337
+ </div>
338
+
339
+ {error && (
340
+ <div>
341
+ <strong>Error:</strong> {error.message}
342
+ </div>
343
+ )}
344
+
345
+ {!userOpHash && !isPending && (
346
+ <button disabled={!address} onClick={handleSendCalls}>
347
+ Send {AMOUNT_TO_SEND} ETH to Burn Address
348
+ </button>
349
+ )}
350
+
351
+ {(isPending || isConfirming) && (
352
+ <div>
353
+ <div>Sending transaction...</div>
354
+ {hash && (
355
+ <div>
356
+ Hash: {hash.slice(0, 10)}...{hash.slice(-8)}
357
+ </div>
358
+ )}
359
+ </div>
360
+ )}
361
+
362
+ {isSuccess && userOpHash && (
363
+ <div>
364
+ <div>
365
+ <div>✅</div>
366
+ </div>
367
+
368
+ <div>
369
+ <div>Operation Sent!</div>
370
+ <div>Your operation has been successfully sent to the burn address</div>
371
+ </div>
372
+
373
+ <div>
374
+ <div>Amount: {AMOUNT_TO_SEND} ETH</div>
375
+ <div>To: {BURN_ADDRESS.slice(0, 6)}...{BURN_ADDRESS.slice(-4)}</div>
376
+ <div>
377
+ Block Explorer:{" "}
378
+ <a
379
+ href={`https://sepolia.basescan.org/tx/${userOpHash}`}
380
+ target="_blank"
381
+ rel="noopener noreferrer"
382
+ >
383
+ {hash.slice(0, 10)}...{hash.slice(-8)}
384
+ </a>
385
+ </div>
386
+ </div>
387
+
388
+ <button onClick={handleReset}>
389
+ Send Another Operation →
390
+ </button>
391
+ </div>
392
+ )}
393
+ </div>
394
+ );
395
+ }
237
396
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cdp-wagmi",
3
- "version": "0.0.23",
3
+ "version": "0.0.25",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**",
@@ -18,7 +18,7 @@
18
18
  "react": ">=18.2.0",
19
19
  "viem": "^2.33.0",
20
20
  "wagmi": "^2.16.0",
21
- "@coinbase/cdp-core": "^0.0.23"
21
+ "@coinbase/cdp-core": "^0.0.25"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@tanstack/react-query": "^5.0.0",
@@ -34,7 +34,7 @@
34
34
  "@size-limit/webpack": "^11.2.0",
35
35
  "@size-limit/webpack-why": "^11.2.0",
36
36
  "size-limit": "^11.2.0",
37
- "@coinbase/cdp-core": "^0.0.23"
37
+ "@coinbase/cdp-core": "^0.0.25"
38
38
  },
39
39
  "size-limit": [
40
40
  {