@pepu-chain/sdk 0.2.0 → 0.2.2

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 (110) hide show
  1. package/README.md +26 -2
  2. package/dist/aa/kernel.cjs +11 -9
  3. package/dist/aa/kernel.guard.js +15 -0
  4. package/dist/aa/kernel.js +5 -4
  5. package/dist/aa/react-direct.cjs +14 -12
  6. package/dist/aa/react-direct.cjs.map +1 -1
  7. package/dist/aa/react-direct.guard.js +15 -0
  8. package/dist/aa/react-direct.js +7 -6
  9. package/dist/aa/react-direct.js.map +1 -1
  10. package/dist/aa/react.cjs +7 -5
  11. package/dist/aa/react.cjs.map +1 -1
  12. package/dist/aa/react.d.cts +1 -1
  13. package/dist/aa/react.d.ts +1 -1
  14. package/dist/aa/react.guard.js +15 -0
  15. package/dist/aa/react.js +4 -3
  16. package/dist/aa/react.js.map +1 -1
  17. package/dist/aa.cjs +19 -18
  18. package/dist/aa.d.cts +1 -1
  19. package/dist/aa.d.ts +1 -1
  20. package/dist/aa.js +6 -5
  21. package/dist/chunk-4GEC7GUU.cjs +283 -0
  22. package/dist/chunk-4GEC7GUU.cjs.map +1 -0
  23. package/dist/{chunk-PHM3ZORG.cjs → chunk-4L4CHIXE.cjs} +9 -9
  24. package/dist/{chunk-PHM3ZORG.cjs.map → chunk-4L4CHIXE.cjs.map} +1 -1
  25. package/dist/{chunk-A5LP2UCS.cjs → chunk-65Y5UCQ7.cjs} +2 -276
  26. package/dist/chunk-65Y5UCQ7.cjs.map +1 -0
  27. package/dist/{chunk-MBA4CLA5.js → chunk-7PVR7QSE.js} +3 -3
  28. package/dist/{chunk-MBA4CLA5.js.map → chunk-7PVR7QSE.js.map} +1 -1
  29. package/dist/{chunk-7MNJF2OB.cjs → chunk-DNWWZWUW.cjs} +4 -4
  30. package/dist/{chunk-7MNJF2OB.cjs.map → chunk-DNWWZWUW.cjs.map} +1 -1
  31. package/dist/{chunk-D52PADVY.js → chunk-GFKIM7HT.js} +25 -2
  32. package/dist/chunk-GFKIM7HT.js.map +1 -0
  33. package/dist/{chunk-IY3ALPUJ.js → chunk-GIZNH65Q.js} +5 -273
  34. package/dist/chunk-GIZNH65Q.js.map +1 -0
  35. package/dist/{chunk-WANILJZQ.cjs → chunk-HTCX46RJ.cjs} +25 -2
  36. package/dist/chunk-HTCX46RJ.cjs.map +1 -0
  37. package/dist/{chunk-TIEAZYHF.cjs → chunk-K7JSQPZO.cjs} +8 -2
  38. package/dist/chunk-K7JSQPZO.cjs.map +1 -0
  39. package/dist/{chunk-FCXSP2YF.js → chunk-KJYNF5KH.js} +8 -3
  40. package/dist/chunk-KJYNF5KH.js.map +1 -0
  41. package/dist/{chunk-KVG3AYYR.js → chunk-NHPWXIA2.js} +4 -4
  42. package/dist/{chunk-KVG3AYYR.js.map → chunk-NHPWXIA2.js.map} +1 -1
  43. package/dist/{chunk-ZB6SVBK4.js → chunk-QIDMFFAQ.js} +4 -4
  44. package/dist/{chunk-ZB6SVBK4.js.map → chunk-QIDMFFAQ.js.map} +1 -1
  45. package/dist/{chunk-IB2FSPMJ.js → chunk-QZKUPCUD.js} +3 -3
  46. package/dist/{chunk-IB2FSPMJ.js.map → chunk-QZKUPCUD.js.map} +1 -1
  47. package/dist/{chunk-ET3P6TX6.cjs → chunk-RCMKPJZO.cjs} +4 -4
  48. package/dist/{chunk-ET3P6TX6.cjs.map → chunk-RCMKPJZO.cjs.map} +1 -1
  49. package/dist/chunk-RSPAN44L.js +276 -0
  50. package/dist/chunk-RSPAN44L.js.map +1 -0
  51. package/dist/{chunk-NVOPDXTA.cjs → chunk-UQH4ZAXD.cjs} +10 -10
  52. package/dist/{chunk-NVOPDXTA.cjs.map → chunk-UQH4ZAXD.cjs.map} +1 -1
  53. package/dist/{chunk-SLW7FRTL.cjs → chunk-VYMAZVIK.cjs} +52 -22
  54. package/dist/chunk-VYMAZVIK.cjs.map +1 -0
  55. package/dist/{chunk-KIIFL4VM.js → chunk-XR5ONV2Y.js} +42 -12
  56. package/dist/chunk-XR5ONV2Y.js.map +1 -0
  57. package/dist/combo/react.cjs +62 -13
  58. package/dist/combo/react.cjs.map +1 -1
  59. package/dist/combo/react.d.cts +14 -2
  60. package/dist/combo/react.d.ts +14 -2
  61. package/dist/combo/react.guard.js +15 -0
  62. package/dist/combo/react.js +58 -11
  63. package/dist/combo/react.js.map +1 -1
  64. package/dist/combo.cjs +45 -29
  65. package/dist/combo.cjs.map +1 -1
  66. package/dist/combo.d.cts +11 -0
  67. package/dist/combo.d.ts +11 -0
  68. package/dist/combo.guard.js +15 -0
  69. package/dist/combo.js +33 -18
  70. package/dist/combo.js.map +1 -1
  71. package/dist/index.cjs +28 -23
  72. package/dist/index.cjs.map +1 -1
  73. package/dist/index.d.cts +2 -2
  74. package/dist/index.d.ts +2 -2
  75. package/dist/index.js +6 -5
  76. package/dist/index.js.map +1 -1
  77. package/dist/paymaster.cjs +39 -38
  78. package/dist/paymaster.cjs.map +1 -1
  79. package/dist/paymaster.js +4 -3
  80. package/dist/paymaster.js.map +1 -1
  81. package/dist/privy/react.cjs +1 -0
  82. package/dist/privy/react.guard.js +15 -0
  83. package/dist/privy/server.cjs +1 -0
  84. package/dist/privy/server.guard.js +15 -0
  85. package/dist/privy/wagmi.guard.js +15 -0
  86. package/dist/react.cjs +6 -4
  87. package/dist/react.cjs.map +1 -1
  88. package/dist/react.d.cts +1 -1
  89. package/dist/react.d.ts +1 -1
  90. package/dist/react.guard.js +15 -0
  91. package/dist/react.js +4 -3
  92. package/dist/react.js.map +1 -1
  93. package/dist/session/kernel.cjs +19 -17
  94. package/dist/session/kernel.guard.js +15 -0
  95. package/dist/session/kernel.js +6 -5
  96. package/dist/session/react.cjs +1 -0
  97. package/dist/session/react.guard.js +15 -0
  98. package/dist/session/server.cjs +1 -0
  99. package/dist/session/server.guard.js +15 -0
  100. package/dist/{status-DwkkOrGQ.d.ts → status-Dx9zAFo9.d.ts} +42 -10
  101. package/dist/{status-CmOsyPmO.d.cts → status-wgTM26V7.d.cts} +42 -10
  102. package/package.json +38 -2
  103. package/dist/chunk-A5LP2UCS.cjs.map +0 -1
  104. package/dist/chunk-D52PADVY.js.map +0 -1
  105. package/dist/chunk-FCXSP2YF.js.map +0 -1
  106. package/dist/chunk-IY3ALPUJ.js.map +0 -1
  107. package/dist/chunk-KIIFL4VM.js.map +0 -1
  108. package/dist/chunk-SLW7FRTL.cjs.map +0 -1
  109. package/dist/chunk-TIEAZYHF.cjs.map +0 -1
  110. package/dist/chunk-WANILJZQ.cjs.map +0 -1
package/README.md CHANGED
@@ -31,6 +31,31 @@ dependency, needed only if you import from `@pepu-chain/sdk/react` (see below);
31
31
  the main `@pepu-chain/sdk` entry point never touches React and works in a plain
32
32
  Node script.
33
33
 
34
+ ### Install: peers per subpath
35
+
36
+ Every subpath also needs `viem`. The entries below need extra peers, and **the recommended path is the CLI: `create-pepu-app` scaffolds an app with every peer already in its `package.json`**, so you never run these by hand. If you install by hand and a peer is missing, importing the subpath throws `PEPU_MISSING_PEER` naming the subpath and the exact command (under Node; bundlers report their own "module not found"). Subpaths not listed here (`.`, `/privy`, `/session`, `/aa`, `/paymaster`, `/paymaster/server`, `/server`, `/doctor`) need only `viem`.
37
+
38
+ | Subpath | Required peers | Install |
39
+ |---|---|---|
40
+ | `@pepu-chain/sdk/react` | `react` | `npm i react` |
41
+ | `@pepu-chain/sdk/privy/react` | `react`, `@privy-io/react-auth` | `npm i react @privy-io/react-auth` |
42
+ | `@pepu-chain/sdk/privy/wagmi` | `react`, `@privy-io/react-auth`, `@privy-io/wagmi`, `wagmi`, `@tanstack/react-query` | `npm i react @privy-io/react-auth @privy-io/wagmi wagmi @tanstack/react-query` |
43
+ | `@pepu-chain/sdk/privy/server` | `@privy-io/node` | `npm i @privy-io/node` |
44
+ | `@pepu-chain/sdk/session/server` | `@privy-io/node` | `npm i @privy-io/node` |
45
+ | `@pepu-chain/sdk/session/react` | `react`, `@privy-io/react-auth` | `npm i react @privy-io/react-auth` |
46
+ | `@pepu-chain/sdk/session/kernel` | `@zerodev/sdk`, `@zerodev/permissions`, `@zerodev/ecdsa-validator` | `npm i @zerodev/sdk @zerodev/permissions @zerodev/ecdsa-validator` |
47
+ | `@pepu-chain/sdk/aa/kernel` | `@zerodev/sdk`, `@zerodev/ecdsa-validator` | `npm i @zerodev/sdk @zerodev/ecdsa-validator` |
48
+ | `@pepu-chain/sdk/aa/react` | `react`, `@privy-io/react-auth`, `permissionless` | `npm i react @privy-io/react-auth permissionless` |
49
+ | `@pepu-chain/sdk/aa/react-direct` | `react`, `@privy-io/react-auth`, `@zerodev/sdk`, `@zerodev/ecdsa-validator` | `npm i react @privy-io/react-auth @zerodev/sdk @zerodev/ecdsa-validator` |
50
+ | `@pepu-chain/sdk/combo` | `@privy-io/node`, `@zerodev/sdk`, `@zerodev/permissions`, `@zerodev/ecdsa-validator` | `npm i @privy-io/node @zerodev/sdk @zerodev/permissions @zerodev/ecdsa-validator` |
51
+ | `@pepu-chain/sdk/combo/react` | `react`, `@privy-io/react-auth`, `@zerodev/sdk`, `@zerodev/permissions`, `@zerodev/ecdsa-validator` | `npm i react @privy-io/react-auth @zerodev/sdk @zerodev/permissions @zerodev/ecdsa-validator` |
52
+
53
+ **Bundle** for the common pillars (Google login + session keys + sponsored gas), client and server together:
54
+
55
+ ```sh
56
+ npm i viem react @privy-io/react-auth @privy-io/node @zerodev/sdk @zerodev/permissions @zerodev/ecdsa-validator permissionless
57
+ ```
58
+
34
59
  ## Quickstart
35
60
 
36
61
  ```ts
@@ -312,8 +337,7 @@ only. The per-user free tier (100 PEPU/day and 50 PEPU/hour, TapScore only for
312
337
  now) needs a verified Privy token from PEPU's own Privy app, so third-party
313
338
  apps use a project. See [/paymaster](../../docs/sdk/paymaster.md) and
314
339
  [/aa](../../docs/sdk/aa.md). The Google login + Kernel session key +
315
- sponsorship combination is proven by script; the browser flow has not yet been
316
- run by a person.
340
+ sponsorship combination is proven live in a browser on mainnet (2026-10-14) against the hosted bundler and v2 paymaster.
317
341
 
318
342
  ```ts
319
343
  import {
@@ -1,10 +1,12 @@
1
1
  'use strict';
2
+ /* @pepu-chain/peer-guard */(function(){var p=["@zerodev/sdk","@zerodev/ecdsa-validator"];for(var i=0;i<p.length;i++){try{require.resolve(p[i])}catch(e){if(e&&e.code==="MODULE_NOT_FOUND"){var m="@pepu-chain/sdk/aa/kernel needs peer packages that are not installed: @zerodev/sdk @zerodev/ecdsa-validator. Install with: npm i @zerodev/sdk @zerodev/ecdsa-validator (or let create-pepu-app scaffold everything).";var x=new Error(m);x.code="PEPU_MISSING_PEER";throw x}}}})();
2
3
 
3
- var chunkNVOPDXTA_cjs = require('../chunk-NVOPDXTA.cjs');
4
- require('../chunk-7MNJF2OB.cjs');
4
+ var chunkUQH4ZAXD_cjs = require('../chunk-UQH4ZAXD.cjs');
5
+ require('../chunk-DNWWZWUW.cjs');
5
6
  var chunkAJS4UFQX_cjs = require('../chunk-AJS4UFQX.cjs');
6
- require('../chunk-A5LP2UCS.cjs');
7
- require('../chunk-WANILJZQ.cjs');
7
+ require('../chunk-4GEC7GUU.cjs');
8
+ require('../chunk-HTCX46RJ.cjs');
9
+ require('../chunk-65Y5UCQ7.cjs');
8
10
  require('../chunk-4GINFJO6.cjs');
9
11
  require('../chunk-VF3D6KLQ.cjs');
10
12
  require('../chunk-DPCZJLB3.cjs');
@@ -14,23 +16,23 @@ require('../chunk-YQL7NISX.cjs');
14
16
 
15
17
  Object.defineProperty(exports, "KERNEL_VERSION", {
16
18
  enumerable: true,
17
- get: function () { return chunkNVOPDXTA_cjs.KERNEL_VERSION; }
19
+ get: function () { return chunkUQH4ZAXD_cjs.KERNEL_VERSION; }
18
20
  });
19
21
  Object.defineProperty(exports, "createPepuSponsoredClient", {
20
22
  enumerable: true,
21
- get: function () { return chunkNVOPDXTA_cjs.createPepuSponsoredClient; }
23
+ get: function () { return chunkUQH4ZAXD_cjs.createPepuSponsoredClient; }
22
24
  });
23
25
  Object.defineProperty(exports, "getKernelAddress", {
24
26
  enumerable: true,
25
- get: function () { return chunkNVOPDXTA_cjs.getKernelAddress; }
27
+ get: function () { return chunkUQH4ZAXD_cjs.getKernelAddress; }
26
28
  });
27
29
  Object.defineProperty(exports, "sendSponsored", {
28
30
  enumerable: true,
29
- get: function () { return chunkNVOPDXTA_cjs.sendSponsored; }
31
+ get: function () { return chunkUQH4ZAXD_cjs.sendSponsored; }
30
32
  });
31
33
  Object.defineProperty(exports, "toPepuKernelAccount", {
32
34
  enumerable: true,
33
- get: function () { return chunkNVOPDXTA_cjs.toPepuKernelAccount; }
35
+ get: function () { return chunkUQH4ZAXD_cjs.toPepuKernelAccount; }
34
36
  });
35
37
  Object.defineProperty(exports, "encodeKernelExecute", {
36
38
  enumerable: true,
@@ -0,0 +1,15 @@
1
+ // Generated by scripts/guard-peers.mjs. Used only under the "node" export condition.
2
+ const peers = ["@zerodev/sdk","@zerodev/ecdsa-validator"];
3
+ for (const peer of peers) {
4
+ try {
5
+ import.meta.resolve?.(peer);
6
+ } catch (e) {
7
+ if (e && e.code === "ERR_MODULE_NOT_FOUND") {
8
+ const err = new Error("@pepu-chain/sdk/aa/kernel needs peer packages that are not installed: @zerodev/sdk @zerodev/ecdsa-validator. Install with: npm i @zerodev/sdk @zerodev/ecdsa-validator (or let create-pepu-app scaffold everything).");
9
+ err.code = "PEPU_MISSING_PEER";
10
+ throw err;
11
+ }
12
+ }
13
+ }
14
+ const mod = await import("./kernel.js");
15
+ export const { KERNEL_VERSION, createPepuSponsoredClient, getKernelAddress, sendSponsored, toPepuKernelAccount, encodeKernelExecute } = mod;
package/dist/aa/kernel.js CHANGED
@@ -1,8 +1,9 @@
1
- export { KERNEL_VERSION, createPepuSponsoredClient, getKernelAddress, sendSponsored, toPepuKernelAccount } from '../chunk-ZB6SVBK4.js';
2
- import '../chunk-IB2FSPMJ.js';
1
+ export { KERNEL_VERSION, createPepuSponsoredClient, getKernelAddress, sendSponsored, toPepuKernelAccount } from '../chunk-QIDMFFAQ.js';
2
+ import '../chunk-QZKUPCUD.js';
3
3
  export { encodeKernelExecute } from '../chunk-VBH3JLQ5.js';
4
- import '../chunk-IY3ALPUJ.js';
5
- import '../chunk-D52PADVY.js';
4
+ import '../chunk-RSPAN44L.js';
5
+ import '../chunk-GFKIM7HT.js';
6
+ import '../chunk-GIZNH65Q.js';
6
7
  import '../chunk-J6UXXHBE.js';
7
8
  import '../chunk-XC4IBCI2.js';
8
9
  import '../chunk-VTQIHMF3.js';
@@ -1,12 +1,14 @@
1
1
  'use strict';
2
+ /* @pepu-chain/peer-guard */(function(){var p=["react","@privy-io/react-auth","@zerodev/sdk","@zerodev/ecdsa-validator"];for(var i=0;i<p.length;i++){try{require.resolve(p[i])}catch(e){if(e&&e.code==="MODULE_NOT_FOUND"){var m="@pepu-chain/sdk/aa/react-direct needs peer packages that are not installed: react @privy-io/react-auth @zerodev/sdk @zerodev/ecdsa-validator. Install with: npm i react @privy-io/react-auth @zerodev/sdk @zerodev/ecdsa-validator (or let create-pepu-app scaffold everything).";var x=new Error(m);x.code="PEPU_MISSING_PEER";throw x}}}})();
2
3
 
3
- var chunkNVOPDXTA_cjs = require('../chunk-NVOPDXTA.cjs');
4
- require('../chunk-7MNJF2OB.cjs');
4
+ var chunkUQH4ZAXD_cjs = require('../chunk-UQH4ZAXD.cjs');
5
+ require('../chunk-DNWWZWUW.cjs');
5
6
  require('../chunk-AJS4UFQX.cjs');
6
- require('../chunk-A5LP2UCS.cjs');
7
- var chunkET3P6TX6_cjs = require('../chunk-ET3P6TX6.cjs');
8
- var chunkWANILJZQ_cjs = require('../chunk-WANILJZQ.cjs');
9
- require('../chunk-TIEAZYHF.cjs');
7
+ require('../chunk-4GEC7GUU.cjs');
8
+ var chunkRCMKPJZO_cjs = require('../chunk-RCMKPJZO.cjs');
9
+ var chunkHTCX46RJ_cjs = require('../chunk-HTCX46RJ.cjs');
10
+ require('../chunk-K7JSQPZO.cjs');
11
+ require('../chunk-65Y5UCQ7.cjs');
10
12
  var chunkC7IC36XS_cjs = require('../chunk-C7IC36XS.cjs');
11
13
  require('../chunk-4GINFJO6.cjs');
12
14
  require('../chunk-VF3D6KLQ.cjs');
@@ -32,7 +34,7 @@ function useDirectSmartAccount() {
32
34
  react.useEffect(() => {
33
35
  if (!owner) return;
34
36
  let cancelled = false;
35
- chunkNVOPDXTA_cjs.getKernelAddress(publicClient(), owner).then((address) => {
37
+ chunkUQH4ZAXD_cjs.getKernelAddress(publicClient(), owner).then((address) => {
36
38
  if (!cancelled) setDerived({ owner, address });
37
39
  }).catch(() => {
38
40
  });
@@ -77,21 +79,21 @@ function useDirectSponsoredSend(o = {}) {
77
79
  transport: viem.custom(provider)
78
80
  });
79
81
  const token = await getAccessToken();
80
- const account = await chunkNVOPDXTA_cjs.toPepuKernelAccount({ publicClient: pc, owner });
81
- const kernel = chunkNVOPDXTA_cjs.createPepuSponsoredClient({
82
+ const account = await chunkUQH4ZAXD_cjs.toPepuKernelAccount({ publicClient: pc, owner });
83
+ const kernel = chunkUQH4ZAXD_cjs.createPepuSponsoredClient({
82
84
  account,
83
85
  publicClient: pc,
84
86
  ...o.bundlerUrl !== void 0 ? { bundlerUrl: o.bundlerUrl } : {},
85
87
  ...o.paymasterUrl !== void 0 ? { paymasterUrl: o.paymasterUrl } : {},
86
- ...token ? { paymasterContext: chunkET3P6TX6_cjs.buildPaymasterContext({ privyAccessToken: token }) } : {}
88
+ ...token ? { paymasterContext: chunkRCMKPJZO_cjs.buildPaymasterContext({ privyAccessToken: token }) } : {}
87
89
  });
88
90
  setStatus("submitting");
89
- const out = await chunkNVOPDXTA_cjs.sendSponsored({ client: kernel, calls });
91
+ const out = await chunkUQH4ZAXD_cjs.sendSponsored({ client: kernel, calls });
90
92
  setResult(out);
91
93
  setStatus("confirmed");
92
94
  return out;
93
95
  } catch (caught) {
94
- const err = chunkYQL7NISX_cjs.toPepuError(caught) === caught ? caught : chunkWANILJZQ_cjs.describeUserOpFailure(caught);
96
+ const err = chunkYQL7NISX_cjs.toPepuError(caught) === caught ? caught : chunkHTCX46RJ_cjs.describeUserOpFailure(caught);
95
97
  setError(err);
96
98
  setStatus("error");
97
99
  throw err;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/aa/react-direct.ts"],"names":["getPublicClient","pepuMainnet","useWallets","useState","useEffect","getKernelAddress","usePrivy","useRef","useCallback","PepuConfigError","createWalletClient","custom","toPepuKernelAccount","createPepuSponsoredClient","buildPaymasterContext","sendSponsored","toPepuError","describeUserOpFailure"],"mappings":"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","file":"react-direct.cjs","sourcesContent":["/**\n * @pepu-chain/sdk/aa/react-direct: React hooks for sponsored transactions that\n * go through your own bundler and paymaster (no Privy Smart Wallets).\n *\n * Needs `react`, `@privy-io/react-auth` and the optional peers `@zerodev/sdk`\n * and `@zerodev/ecdsa-validator`. It builds a Kernel account for the Privy\n * embedded wallet and passes the Privy access token as paymaster context for\n * the free tier. Apps on Privy Smart Wallets use `@pepu-chain/sdk/aa/react`\n * instead, which never resolves ZeroDev.\n */\nimport { usePrivy, useWallets } from \"@privy-io/react-auth\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createWalletClient, custom } from \"viem\";\nimport type { Address, PublicClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { getPublicClient } from \"../client.js\";\nimport { PepuConfigError, toPepuError } from \"../errors.js\";\nimport type { PepuError } from \"../errors.js\";\nimport { buildPaymasterContext } from \"../erc7677.js\";\nimport { describeUserOpFailure } from \"./describe.js\";\nimport { getKernelAddress, createPepuSponsoredClient, sendSponsored, toPepuKernelAccount } from \"./kernel.js\";\nimport type { Call, SponsoredResult } from \"./types.js\";\n\nexport type { Call, SponsoredResult } from \"./types.js\";\n\nlet sharedClient: PublicClient | undefined;\nfunction publicClient(): PublicClient {\n sharedClient ??= getPublicClient(pepuMainnet) as unknown as PublicClient;\n return sharedClient;\n}\n\nfunction useEmbeddedWallet() {\n const { wallets } = useWallets();\n return wallets.find((w) => w.walletClientType === \"privy\");\n}\n\n/**\n * The two-address model for the direct transport: `owner` is the Privy\n * embedded wallet (an EOA that signs), `smartAccount` is the Kernel address\n * derived from it with {@link getKernelAddress} (a read).\n *\n * @example\n * const { owner, smartAccount, ready } = useDirectSmartAccount();\n */\nexport function useDirectSmartAccount(): { owner?: Address; smartAccount?: Address; ready: boolean } {\n const embedded = useEmbeddedWallet();\n const owner = embedded?.address as Address | undefined;\n const [derived, setDerived] = useState<{ owner: Address; address: Address } | undefined>();\n\n useEffect(() => {\n if (!owner) return;\n let cancelled = false;\n getKernelAddress(publicClient(), owner)\n .then((address) => {\n if (!cancelled) setDerived({ owner, address });\n })\n .catch(() => {\n // Derivation is best effort; `ready` stays false.\n });\n return () => {\n cancelled = true;\n };\n }, [owner]);\n\n const smartAccount = derived && derived.owner === owner ? derived.address : undefined;\n return {\n ...(owner ? { owner } : {}),\n ...(smartAccount ? { smartAccount } : {}),\n ready: owner !== undefined && smartAccount !== undefined,\n };\n}\n\n/** Status of a {@link useDirectSponsoredSend} send. */\nexport type DirectSponsoredSendStatus = \"idle\" | \"signing\" | \"submitting\" | \"confirmed\" | \"error\";\n\n/** Options for {@link useDirectSponsoredSend}. */\nexport interface UseDirectSponsoredSendOptions {\n bundlerUrl?: string;\n paymasterUrl?: string;\n}\n\n/**\n * Send calls with gas sponsored through your own bundler and paymaster. Builds\n * a Kernel account for the embedded wallet and passes the Privy access token\n * as paymaster context for the free tier. One send at a time: a second call\n * while one is in flight is ignored.\n *\n * @example\n * const { send, status, result, error } = useDirectSponsoredSend();\n * await send([{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function useDirectSponsoredSend(o: UseDirectSponsoredSendOptions = {}): {\n send: (calls: Call[]) => Promise<SponsoredResult>;\n status: DirectSponsoredSendStatus;\n result?: SponsoredResult;\n error?: PepuError;\n} {\n const { getAccessToken } = usePrivy();\n const embedded = useEmbeddedWallet();\n const [status, setStatus] = useState<DirectSponsoredSendStatus>(\"idle\");\n const [result, setResult] = useState<SponsoredResult | undefined>();\n const [error, setError] = useState<PepuError | undefined>();\n const inFlight = useRef(false);\n\n const send = useCallback(\n async (calls: Call[]): Promise<SponsoredResult> => {\n if (inFlight.current) {\n throw new PepuConfigError(\"UNKNOWN\", \"A sponsored send is already in progress.\", {\n hint: \"Wait for the current send to finish.\",\n });\n }\n inFlight.current = true;\n setStatus(\"signing\");\n setError(undefined);\n setResult(undefined);\n try {\n if (!embedded) {\n throw new PepuConfigError(\"WALLET_NOT_PROVISIONED\", \"No Privy embedded wallet to own the smart account.\");\n }\n const pc = publicClient();\n const provider = await embedded.getEthereumProvider();\n const owner = createWalletClient({\n account: embedded.address as Address,\n chain: pepuMainnet,\n transport: custom(provider),\n });\n const token = await getAccessToken();\n const account = await toPepuKernelAccount({ publicClient: pc, owner });\n const kernel = createPepuSponsoredClient({\n account,\n publicClient: pc,\n ...(o.bundlerUrl !== undefined ? { bundlerUrl: o.bundlerUrl } : {}),\n ...(o.paymasterUrl !== undefined ? { paymasterUrl: o.paymasterUrl } : {}),\n ...(token ? { paymasterContext: buildPaymasterContext({ privyAccessToken: token }) } : {}),\n });\n setStatus(\"submitting\");\n const out = await sendSponsored({ client: kernel, calls });\n setResult(out);\n setStatus(\"confirmed\");\n return out;\n } catch (caught) {\n const err = toPepuError(caught) === caught ? (caught as PepuError) : describeUserOpFailure(caught);\n setError(err);\n setStatus(\"error\");\n throw err;\n } finally {\n inFlight.current = false;\n }\n },\n [embedded, getAccessToken, o.bundlerUrl, o.paymasterUrl],\n );\n\n return { send, status, ...(result ? { result } : {}), ...(error ? { error } : {}) };\n}\n"]}
1
+ {"version":3,"sources":["../../src/aa/react-direct.ts"],"names":["getPublicClient","pepuMainnet","useWallets","useState","useEffect","getKernelAddress","usePrivy","useRef","useCallback","PepuConfigError","createWalletClient","custom","toPepuKernelAccount","createPepuSponsoredClient","buildPaymasterContext","sendSponsored","toPepuError","describeUserOpFailure"],"mappings":"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","file":"react-direct.cjs","sourcesContent":["/**\n * @pepu-chain/sdk/aa/react-direct: React hooks for sponsored transactions that\n * go through your own bundler and paymaster (no Privy Smart Wallets).\n *\n * Needs `react`, `@privy-io/react-auth` and the optional peers `@zerodev/sdk`\n * and `@zerodev/ecdsa-validator`. It builds a Kernel account for the Privy\n * embedded wallet and passes the Privy access token as paymaster context for\n * the free tier. Apps on Privy Smart Wallets use `@pepu-chain/sdk/aa/react`\n * instead, which never resolves ZeroDev.\n */\nimport { usePrivy, useWallets } from \"@privy-io/react-auth\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createWalletClient, custom } from \"viem\";\nimport type { Address, PublicClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { getPublicClient } from \"../client.js\";\nimport { PepuConfigError, toPepuError } from \"../errors.js\";\nimport type { PepuError } from \"../errors.js\";\nimport { buildPaymasterContext } from \"../erc7677.js\";\nimport { describeUserOpFailure } from \"./describe.js\";\nimport { getKernelAddress, createPepuSponsoredClient, sendSponsored, toPepuKernelAccount } from \"./kernel.js\";\nimport type { Call, SponsoredResult } from \"./types.js\";\n\nexport type { Call, SponsoredResult } from \"./types.js\";\n\nlet sharedClient: PublicClient | undefined;\nfunction publicClient(): PublicClient {\n sharedClient ??= getPublicClient(pepuMainnet) as unknown as PublicClient;\n return sharedClient;\n}\n\nfunction useEmbeddedWallet() {\n const { wallets } = useWallets();\n return wallets.find((w) => w.walletClientType === \"privy\");\n}\n\n/**\n * The two-address model for the direct transport: `owner` is the Privy\n * embedded wallet (an EOA that signs), `smartAccount` is the Kernel address\n * derived from it with {@link getKernelAddress} (a read).\n *\n * @example\n * const { owner, smartAccount, ready } = useDirectSmartAccount();\n */\nexport function useDirectSmartAccount(): { owner?: Address; smartAccount?: Address; ready: boolean } {\n const embedded = useEmbeddedWallet();\n const owner = embedded?.address as Address | undefined;\n const [derived, setDerived] = useState<{ owner: Address; address: Address } | undefined>();\n\n useEffect(() => {\n if (!owner) return;\n let cancelled = false;\n getKernelAddress(publicClient(), owner)\n .then((address) => {\n if (!cancelled) setDerived({ owner, address });\n })\n .catch(() => {\n // Derivation is best effort; `ready` stays false.\n });\n return () => {\n cancelled = true;\n };\n }, [owner]);\n\n const smartAccount = derived && derived.owner === owner ? derived.address : undefined;\n return {\n ...(owner ? { owner } : {}),\n ...(smartAccount ? { smartAccount } : {}),\n ready: owner !== undefined && smartAccount !== undefined,\n };\n}\n\n/** Status of a {@link useDirectSponsoredSend} send. */\nexport type DirectSponsoredSendStatus = \"idle\" | \"signing\" | \"submitting\" | \"confirmed\" | \"error\";\n\n/** Options for {@link useDirectSponsoredSend}. */\nexport interface UseDirectSponsoredSendOptions {\n bundlerUrl?: string;\n paymasterUrl?: string;\n}\n\n/**\n * Send calls with gas sponsored through your own bundler and paymaster. Builds\n * a Kernel account for the embedded wallet and passes the Privy access token\n * as paymaster context for the free tier. One send at a time: a second call\n * while one is in flight is ignored.\n *\n * @example\n * const { send, status, result, error } = useDirectSponsoredSend();\n * await send([{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function useDirectSponsoredSend(o: UseDirectSponsoredSendOptions = {}): {\n send: (calls: Call[]) => Promise<SponsoredResult>;\n status: DirectSponsoredSendStatus;\n result?: SponsoredResult;\n error?: PepuError;\n} {\n const { getAccessToken } = usePrivy();\n const embedded = useEmbeddedWallet();\n const [status, setStatus] = useState<DirectSponsoredSendStatus>(\"idle\");\n const [result, setResult] = useState<SponsoredResult | undefined>();\n const [error, setError] = useState<PepuError | undefined>();\n const inFlight = useRef(false);\n\n const send = useCallback(\n async (calls: Call[]): Promise<SponsoredResult> => {\n if (inFlight.current) {\n throw new PepuConfigError(\"UNKNOWN\", \"A sponsored send is already in progress.\", {\n hint: \"Wait for the current send to finish.\",\n });\n }\n inFlight.current = true;\n setStatus(\"signing\");\n setError(undefined);\n setResult(undefined);\n try {\n if (!embedded) {\n throw new PepuConfigError(\"WALLET_NOT_PROVISIONED\", \"No Privy embedded wallet to own the smart account.\");\n }\n const pc = publicClient();\n const provider = await embedded.getEthereumProvider();\n const owner = createWalletClient({\n account: embedded.address as Address,\n chain: pepuMainnet,\n transport: custom(provider),\n });\n const token = await getAccessToken();\n const account = await toPepuKernelAccount({ publicClient: pc, owner });\n const kernel = createPepuSponsoredClient({\n account,\n publicClient: pc,\n ...(o.bundlerUrl !== undefined ? { bundlerUrl: o.bundlerUrl } : {}),\n ...(o.paymasterUrl !== undefined ? { paymasterUrl: o.paymasterUrl } : {}),\n ...(token ? { paymasterContext: buildPaymasterContext({ privyAccessToken: token }) } : {}),\n });\n setStatus(\"submitting\");\n const out = await sendSponsored({ client: kernel, calls });\n setResult(out);\n setStatus(\"confirmed\");\n return out;\n } catch (caught) {\n const err = toPepuError(caught) === caught ? (caught as PepuError) : describeUserOpFailure(caught);\n setError(err);\n setStatus(\"error\");\n throw err;\n } finally {\n inFlight.current = false;\n }\n },\n [embedded, getAccessToken, o.bundlerUrl, o.paymasterUrl],\n );\n\n return { send, status, ...(result ? { result } : {}), ...(error ? { error } : {}) };\n}\n"]}
@@ -0,0 +1,15 @@
1
+ // Generated by scripts/guard-peers.mjs. Used only under the "node" export condition.
2
+ const peers = ["react","@privy-io/react-auth","@zerodev/sdk","@zerodev/ecdsa-validator"];
3
+ for (const peer of peers) {
4
+ try {
5
+ import.meta.resolve?.(peer);
6
+ } catch (e) {
7
+ if (e && e.code === "ERR_MODULE_NOT_FOUND") {
8
+ const err = new Error("@pepu-chain/sdk/aa/react-direct needs peer packages that are not installed: react @privy-io/react-auth @zerodev/sdk @zerodev/ecdsa-validator. Install with: npm i react @privy-io/react-auth @zerodev/sdk @zerodev/ecdsa-validator (or let create-pepu-app scaffold everything).");
9
+ err.code = "PEPU_MISSING_PEER";
10
+ throw err;
11
+ }
12
+ }
13
+ }
14
+ const mod = await import("./react-direct.js");
15
+ export const { useDirectSmartAccount, useDirectSponsoredSend } = mod;
@@ -1,10 +1,11 @@
1
- import { getKernelAddress, toPepuKernelAccount, createPepuSponsoredClient, sendSponsored } from '../chunk-ZB6SVBK4.js';
2
- import '../chunk-IB2FSPMJ.js';
1
+ import { getKernelAddress, toPepuKernelAccount, createPepuSponsoredClient, sendSponsored } from '../chunk-QIDMFFAQ.js';
2
+ import '../chunk-QZKUPCUD.js';
3
3
  import '../chunk-VBH3JLQ5.js';
4
- import '../chunk-IY3ALPUJ.js';
5
- import { buildPaymasterContext } from '../chunk-MBA4CLA5.js';
6
- import { describeUserOpFailure } from '../chunk-D52PADVY.js';
7
- import '../chunk-FCXSP2YF.js';
4
+ import '../chunk-RSPAN44L.js';
5
+ import { buildPaymasterContext } from '../chunk-7PVR7QSE.js';
6
+ import { describeUserOpFailure } from '../chunk-GFKIM7HT.js';
7
+ import '../chunk-KJYNF5KH.js';
8
+ import '../chunk-GIZNH65Q.js';
8
9
  import { getPublicClient } from '../chunk-OH3QMAIB.js';
9
10
  import '../chunk-J6UXXHBE.js';
10
11
  import '../chunk-XC4IBCI2.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/aa/react-direct.ts"],"names":[],"mappings":"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","file":"react-direct.js","sourcesContent":["/**\n * @pepu-chain/sdk/aa/react-direct: React hooks for sponsored transactions that\n * go through your own bundler and paymaster (no Privy Smart Wallets).\n *\n * Needs `react`, `@privy-io/react-auth` and the optional peers `@zerodev/sdk`\n * and `@zerodev/ecdsa-validator`. It builds a Kernel account for the Privy\n * embedded wallet and passes the Privy access token as paymaster context for\n * the free tier. Apps on Privy Smart Wallets use `@pepu-chain/sdk/aa/react`\n * instead, which never resolves ZeroDev.\n */\nimport { usePrivy, useWallets } from \"@privy-io/react-auth\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createWalletClient, custom } from \"viem\";\nimport type { Address, PublicClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { getPublicClient } from \"../client.js\";\nimport { PepuConfigError, toPepuError } from \"../errors.js\";\nimport type { PepuError } from \"../errors.js\";\nimport { buildPaymasterContext } from \"../erc7677.js\";\nimport { describeUserOpFailure } from \"./describe.js\";\nimport { getKernelAddress, createPepuSponsoredClient, sendSponsored, toPepuKernelAccount } from \"./kernel.js\";\nimport type { Call, SponsoredResult } from \"./types.js\";\n\nexport type { Call, SponsoredResult } from \"./types.js\";\n\nlet sharedClient: PublicClient | undefined;\nfunction publicClient(): PublicClient {\n sharedClient ??= getPublicClient(pepuMainnet) as unknown as PublicClient;\n return sharedClient;\n}\n\nfunction useEmbeddedWallet() {\n const { wallets } = useWallets();\n return wallets.find((w) => w.walletClientType === \"privy\");\n}\n\n/**\n * The two-address model for the direct transport: `owner` is the Privy\n * embedded wallet (an EOA that signs), `smartAccount` is the Kernel address\n * derived from it with {@link getKernelAddress} (a read).\n *\n * @example\n * const { owner, smartAccount, ready } = useDirectSmartAccount();\n */\nexport function useDirectSmartAccount(): { owner?: Address; smartAccount?: Address; ready: boolean } {\n const embedded = useEmbeddedWallet();\n const owner = embedded?.address as Address | undefined;\n const [derived, setDerived] = useState<{ owner: Address; address: Address } | undefined>();\n\n useEffect(() => {\n if (!owner) return;\n let cancelled = false;\n getKernelAddress(publicClient(), owner)\n .then((address) => {\n if (!cancelled) setDerived({ owner, address });\n })\n .catch(() => {\n // Derivation is best effort; `ready` stays false.\n });\n return () => {\n cancelled = true;\n };\n }, [owner]);\n\n const smartAccount = derived && derived.owner === owner ? derived.address : undefined;\n return {\n ...(owner ? { owner } : {}),\n ...(smartAccount ? { smartAccount } : {}),\n ready: owner !== undefined && smartAccount !== undefined,\n };\n}\n\n/** Status of a {@link useDirectSponsoredSend} send. */\nexport type DirectSponsoredSendStatus = \"idle\" | \"signing\" | \"submitting\" | \"confirmed\" | \"error\";\n\n/** Options for {@link useDirectSponsoredSend}. */\nexport interface UseDirectSponsoredSendOptions {\n bundlerUrl?: string;\n paymasterUrl?: string;\n}\n\n/**\n * Send calls with gas sponsored through your own bundler and paymaster. Builds\n * a Kernel account for the embedded wallet and passes the Privy access token\n * as paymaster context for the free tier. One send at a time: a second call\n * while one is in flight is ignored.\n *\n * @example\n * const { send, status, result, error } = useDirectSponsoredSend();\n * await send([{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function useDirectSponsoredSend(o: UseDirectSponsoredSendOptions = {}): {\n send: (calls: Call[]) => Promise<SponsoredResult>;\n status: DirectSponsoredSendStatus;\n result?: SponsoredResult;\n error?: PepuError;\n} {\n const { getAccessToken } = usePrivy();\n const embedded = useEmbeddedWallet();\n const [status, setStatus] = useState<DirectSponsoredSendStatus>(\"idle\");\n const [result, setResult] = useState<SponsoredResult | undefined>();\n const [error, setError] = useState<PepuError | undefined>();\n const inFlight = useRef(false);\n\n const send = useCallback(\n async (calls: Call[]): Promise<SponsoredResult> => {\n if (inFlight.current) {\n throw new PepuConfigError(\"UNKNOWN\", \"A sponsored send is already in progress.\", {\n hint: \"Wait for the current send to finish.\",\n });\n }\n inFlight.current = true;\n setStatus(\"signing\");\n setError(undefined);\n setResult(undefined);\n try {\n if (!embedded) {\n throw new PepuConfigError(\"WALLET_NOT_PROVISIONED\", \"No Privy embedded wallet to own the smart account.\");\n }\n const pc = publicClient();\n const provider = await embedded.getEthereumProvider();\n const owner = createWalletClient({\n account: embedded.address as Address,\n chain: pepuMainnet,\n transport: custom(provider),\n });\n const token = await getAccessToken();\n const account = await toPepuKernelAccount({ publicClient: pc, owner });\n const kernel = createPepuSponsoredClient({\n account,\n publicClient: pc,\n ...(o.bundlerUrl !== undefined ? { bundlerUrl: o.bundlerUrl } : {}),\n ...(o.paymasterUrl !== undefined ? { paymasterUrl: o.paymasterUrl } : {}),\n ...(token ? { paymasterContext: buildPaymasterContext({ privyAccessToken: token }) } : {}),\n });\n setStatus(\"submitting\");\n const out = await sendSponsored({ client: kernel, calls });\n setResult(out);\n setStatus(\"confirmed\");\n return out;\n } catch (caught) {\n const err = toPepuError(caught) === caught ? (caught as PepuError) : describeUserOpFailure(caught);\n setError(err);\n setStatus(\"error\");\n throw err;\n } finally {\n inFlight.current = false;\n }\n },\n [embedded, getAccessToken, o.bundlerUrl, o.paymasterUrl],\n );\n\n return { send, status, ...(result ? { result } : {}), ...(error ? { error } : {}) };\n}\n"]}
1
+ {"version":3,"sources":["../../src/aa/react-direct.ts"],"names":[],"mappings":"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","file":"react-direct.js","sourcesContent":["/**\n * @pepu-chain/sdk/aa/react-direct: React hooks for sponsored transactions that\n * go through your own bundler and paymaster (no Privy Smart Wallets).\n *\n * Needs `react`, `@privy-io/react-auth` and the optional peers `@zerodev/sdk`\n * and `@zerodev/ecdsa-validator`. It builds a Kernel account for the Privy\n * embedded wallet and passes the Privy access token as paymaster context for\n * the free tier. Apps on Privy Smart Wallets use `@pepu-chain/sdk/aa/react`\n * instead, which never resolves ZeroDev.\n */\nimport { usePrivy, useWallets } from \"@privy-io/react-auth\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createWalletClient, custom } from \"viem\";\nimport type { Address, PublicClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { getPublicClient } from \"../client.js\";\nimport { PepuConfigError, toPepuError } from \"../errors.js\";\nimport type { PepuError } from \"../errors.js\";\nimport { buildPaymasterContext } from \"../erc7677.js\";\nimport { describeUserOpFailure } from \"./describe.js\";\nimport { getKernelAddress, createPepuSponsoredClient, sendSponsored, toPepuKernelAccount } from \"./kernel.js\";\nimport type { Call, SponsoredResult } from \"./types.js\";\n\nexport type { Call, SponsoredResult } from \"./types.js\";\n\nlet sharedClient: PublicClient | undefined;\nfunction publicClient(): PublicClient {\n sharedClient ??= getPublicClient(pepuMainnet) as unknown as PublicClient;\n return sharedClient;\n}\n\nfunction useEmbeddedWallet() {\n const { wallets } = useWallets();\n return wallets.find((w) => w.walletClientType === \"privy\");\n}\n\n/**\n * The two-address model for the direct transport: `owner` is the Privy\n * embedded wallet (an EOA that signs), `smartAccount` is the Kernel address\n * derived from it with {@link getKernelAddress} (a read).\n *\n * @example\n * const { owner, smartAccount, ready } = useDirectSmartAccount();\n */\nexport function useDirectSmartAccount(): { owner?: Address; smartAccount?: Address; ready: boolean } {\n const embedded = useEmbeddedWallet();\n const owner = embedded?.address as Address | undefined;\n const [derived, setDerived] = useState<{ owner: Address; address: Address } | undefined>();\n\n useEffect(() => {\n if (!owner) return;\n let cancelled = false;\n getKernelAddress(publicClient(), owner)\n .then((address) => {\n if (!cancelled) setDerived({ owner, address });\n })\n .catch(() => {\n // Derivation is best effort; `ready` stays false.\n });\n return () => {\n cancelled = true;\n };\n }, [owner]);\n\n const smartAccount = derived && derived.owner === owner ? derived.address : undefined;\n return {\n ...(owner ? { owner } : {}),\n ...(smartAccount ? { smartAccount } : {}),\n ready: owner !== undefined && smartAccount !== undefined,\n };\n}\n\n/** Status of a {@link useDirectSponsoredSend} send. */\nexport type DirectSponsoredSendStatus = \"idle\" | \"signing\" | \"submitting\" | \"confirmed\" | \"error\";\n\n/** Options for {@link useDirectSponsoredSend}. */\nexport interface UseDirectSponsoredSendOptions {\n bundlerUrl?: string;\n paymasterUrl?: string;\n}\n\n/**\n * Send calls with gas sponsored through your own bundler and paymaster. Builds\n * a Kernel account for the embedded wallet and passes the Privy access token\n * as paymaster context for the free tier. One send at a time: a second call\n * while one is in flight is ignored.\n *\n * @example\n * const { send, status, result, error } = useDirectSponsoredSend();\n * await send([{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function useDirectSponsoredSend(o: UseDirectSponsoredSendOptions = {}): {\n send: (calls: Call[]) => Promise<SponsoredResult>;\n status: DirectSponsoredSendStatus;\n result?: SponsoredResult;\n error?: PepuError;\n} {\n const { getAccessToken } = usePrivy();\n const embedded = useEmbeddedWallet();\n const [status, setStatus] = useState<DirectSponsoredSendStatus>(\"idle\");\n const [result, setResult] = useState<SponsoredResult | undefined>();\n const [error, setError] = useState<PepuError | undefined>();\n const inFlight = useRef(false);\n\n const send = useCallback(\n async (calls: Call[]): Promise<SponsoredResult> => {\n if (inFlight.current) {\n throw new PepuConfigError(\"UNKNOWN\", \"A sponsored send is already in progress.\", {\n hint: \"Wait for the current send to finish.\",\n });\n }\n inFlight.current = true;\n setStatus(\"signing\");\n setError(undefined);\n setResult(undefined);\n try {\n if (!embedded) {\n throw new PepuConfigError(\"WALLET_NOT_PROVISIONED\", \"No Privy embedded wallet to own the smart account.\");\n }\n const pc = publicClient();\n const provider = await embedded.getEthereumProvider();\n const owner = createWalletClient({\n account: embedded.address as Address,\n chain: pepuMainnet,\n transport: custom(provider),\n });\n const token = await getAccessToken();\n const account = await toPepuKernelAccount({ publicClient: pc, owner });\n const kernel = createPepuSponsoredClient({\n account,\n publicClient: pc,\n ...(o.bundlerUrl !== undefined ? { bundlerUrl: o.bundlerUrl } : {}),\n ...(o.paymasterUrl !== undefined ? { paymasterUrl: o.paymasterUrl } : {}),\n ...(token ? { paymasterContext: buildPaymasterContext({ privyAccessToken: token }) } : {}),\n });\n setStatus(\"submitting\");\n const out = await sendSponsored({ client: kernel, calls });\n setResult(out);\n setStatus(\"confirmed\");\n return out;\n } catch (caught) {\n const err = toPepuError(caught) === caught ? (caught as PepuError) : describeUserOpFailure(caught);\n setError(err);\n setStatus(\"error\");\n throw err;\n } finally {\n inFlight.current = false;\n }\n },\n [embedded, getAccessToken, o.bundlerUrl, o.paymasterUrl],\n );\n\n return { send, status, ...(result ? { result } : {}), ...(error ? { error } : {}) };\n}\n"]}
package/dist/aa/react.cjs CHANGED
@@ -1,9 +1,11 @@
1
1
  'use strict';
2
+ /* @pepu-chain/peer-guard */(function(){var p=["react","@privy-io/react-auth","permissionless"];for(var i=0;i<p.length;i++){try{require.resolve(p[i])}catch(e){if(e&&e.code==="MODULE_NOT_FOUND"){var m="@pepu-chain/sdk/aa/react needs peer packages that are not installed: react @privy-io/react-auth permissionless. Install with: npm i react @privy-io/react-auth permissionless (or let create-pepu-app scaffold everything).";var x=new Error(m);x.code="PEPU_MISSING_PEER";throw x}}}})();
2
3
 
3
4
  var chunkAJS4UFQX_cjs = require('../chunk-AJS4UFQX.cjs');
4
- var chunkSLW7FRTL_cjs = require('../chunk-SLW7FRTL.cjs');
5
- var chunkWANILJZQ_cjs = require('../chunk-WANILJZQ.cjs');
6
- require('../chunk-TIEAZYHF.cjs');
5
+ var chunkVYMAZVIK_cjs = require('../chunk-VYMAZVIK.cjs');
6
+ var chunkHTCX46RJ_cjs = require('../chunk-HTCX46RJ.cjs');
7
+ require('../chunk-K7JSQPZO.cjs');
8
+ require('../chunk-65Y5UCQ7.cjs');
7
9
  var chunkC7IC36XS_cjs = require('../chunk-C7IC36XS.cjs');
8
10
  var chunk4GINFJO6_cjs = require('../chunk-4GINFJO6.cjs');
9
11
  require('../chunk-VF3D6KLQ.cjs');
@@ -93,7 +95,7 @@ function useSponsoredSend(_options = {}) {
93
95
  setStatus("confirmed");
94
96
  return out;
95
97
  } catch (caught) {
96
- const err = chunkYQL7NISX_cjs.toPepuError(caught) === caught ? caught : chunkWANILJZQ_cjs.describeUserOpFailure(caught);
98
+ const err = chunkYQL7NISX_cjs.toPepuError(caught) === caught ? caught : chunkHTCX46RJ_cjs.describeUserOpFailure(caught);
97
99
  setError(err);
98
100
  setStatus("error");
99
101
  throw err;
@@ -120,7 +122,7 @@ function usePepuSponsorship(o = {}) {
120
122
  let cancelled = false;
121
123
  const run = async () => {
122
124
  try {
123
- const r = await chunkSLW7FRTL_cjs.checkSponsorship({
125
+ const r = await chunkVYMAZVIK_cjs.checkSponsorship({
124
126
  publicClient: publicClient(),
125
127
  ...bundlerUrl !== void 0 ? { bundlerUrl } : {},
126
128
  ...paymasterUrl !== void 0 ? { paymasterUrl } : {}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/aa/react.ts"],"names":["getPublicClient","pepuMainnet","useWallets","useSmartWallets","useRef","useState","useEffect","useCallback","PepuConfigError","normalizeCalls","userOpEventFromReceipt","txUrl","toPepuError","describeUserOpFailure","checkSponsorship"],"mappings":"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","file":"react.cjs","sourcesContent":["/**\n * @pepu-chain/sdk/aa/react: React hooks for sponsored transactions with Privy\n * Smart Wallets.\n *\n * Needs `react`, `@privy-io/react-auth` and, because Privy's smart-wallets\n * module requires it, `permissionless`. It never references `@zerodev/*`,\n * statically or dynamically, so a bundler resolving it needs no ZeroDev. The\n * transport reads bundler and paymaster URLs from the Privy dashboard. To use\n * your own bundler and paymaster instead, see `@pepu-chain/sdk/aa/react-direct`.\n *\n * Flow ported from `templates/sponsored-demo/components/sponsored-tap-demo.tsx`\n * (smart-wallet client, in-flight guard, real error text via describeUserOpFailure).\n */\nimport { useWallets } from \"@privy-io/react-auth\";\nimport { useSmartWallets } from \"@privy-io/react-auth/smart-wallets\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Address, PublicClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { getPublicClient } from \"../client.js\";\nimport { PepuConfigError, toPepuError } from \"../errors.js\";\nimport type { PepuError } from \"../errors.js\";\nimport { txUrl } from \"../explorer.js\";\nimport { normalizeCalls, userOpEventFromReceipt } from \"./calls.js\";\nimport { describeUserOpFailure } from \"./describe.js\";\nimport { checkSponsorship } from \"./status.js\";\nimport type { SponsorshipReport } from \"./status.js\";\nimport type { Call, SponsoredResult } from \"./types.js\";\n\nexport type { Call, SponsoredResult } from \"./types.js\";\n\nlet sharedClient: PublicClient | undefined;\nfunction publicClient(): PublicClient {\n sharedClient ??= getPublicClient(pepuMainnet) as unknown as PublicClient;\n return sharedClient;\n}\n\n/** The Privy embedded wallet, the owner of the smart account. */\nfunction useEmbeddedWallet() {\n const { wallets } = useWallets();\n return wallets.find((w) => w.walletClientType === \"privy\");\n}\n\n/**\n * The two-address model made explicit: `owner` is the Privy embedded wallet\n * (an EOA that signs), `smartAccount` is the Kernel account that sends and\n * holds assets. With Privy Smart Wallets the smart account comes from the\n * provider: `useSmartWallets().client`, or, while that is still unset,\n * `getClientForChain({ id: 97741 })`. For an address derived without Privy\n * Smart Wallets, use `useDirectSmartAccount` from `@pepu-chain/sdk/aa/react-direct`.\n *\n * @example\n * const { owner, smartAccount, ready } = usePepuSmartAccount();\n */\nexport function usePepuSmartAccount(): { owner?: Address; smartAccount?: Address; ready: boolean } {\n const embedded = useEmbeddedWallet();\n const { client, getClientForChain } = useSmartWallets();\n const getClientRef = useRef(getClientForChain);\n getClientRef.current = getClientForChain;\n const owner = embedded?.address as Address | undefined;\n const fromProvider = client?.account?.address as Address | undefined;\n const [resolved, setResolved] = useState<{ owner: Address; address: Address } | undefined>();\n\n useEffect(() => {\n if (!owner || fromProvider) return;\n let cancelled = false;\n // Privy's per-chain client may populate after `client`.\n Promise.resolve(getClientRef.current?.({ id: pepuMainnet.id }))\n .then((c) => {\n const address = c?.account?.address as Address | undefined;\n if (!cancelled && address) setResolved({ owner, address });\n })\n .catch(() => {\n // Smart Wallets not configured for this chain: `ready` stays false.\n });\n return () => {\n cancelled = true;\n };\n }, [owner, fromProvider]);\n\n const smartAccount = fromProvider ?? (resolved && resolved.owner === owner ? resolved.address : undefined);\n return {\n ...(owner ? { owner } : {}),\n ...(smartAccount ? { smartAccount } : {}),\n ready: owner !== undefined && smartAccount !== undefined,\n };\n}\n\n/** Status of a {@link useSponsoredSend} send. */\nexport type SponsoredSendStatus = \"idle\" | \"signing\" | \"submitting\" | \"confirmed\" | \"error\";\n\n/** Options for {@link useSponsoredSend}. */\nexport interface UseSponsoredSendOptions {\n /** The only transport here. Your own bundler and paymaster: `useDirectSponsoredSend` in `@pepu-chain/sdk/aa/react-direct`. */\n transport?: \"privy-smart-wallets\";\n}\n\n/**\n * Send calls with gas sponsored through Privy's smart-wallet client (bundler\n * and paymaster URLs come from the Privy dashboard). One send at a time: a\n * second call while one is in flight is ignored. For your own bundler and\n * paymaster, use `useDirectSponsoredSend` from `@pepu-chain/sdk/aa/react-direct`.\n *\n * @example\n * const { send, status, result, error } = useSponsoredSend({ transport: \"privy-smart-wallets\" });\n * await send([{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function useSponsoredSend(_options: UseSponsoredSendOptions = {}): {\n send: (calls: Call[]) => Promise<SponsoredResult>;\n status: SponsoredSendStatus;\n result?: SponsoredResult;\n error?: PepuError;\n} {\n const { client, getClientForChain } = useSmartWallets();\n const [status, setStatus] = useState<SponsoredSendStatus>(\"idle\");\n const [result, setResult] = useState<SponsoredResult | undefined>();\n const [error, setError] = useState<PepuError | undefined>();\n const inFlight = useRef(false);\n\n const send = useCallback(\n async (calls: Call[]): Promise<SponsoredResult> => {\n if (inFlight.current) {\n throw new PepuConfigError(\"UNKNOWN\", \"A sponsored send is already in progress.\", {\n hint: \"Wait for the current send to finish.\",\n });\n }\n inFlight.current = true;\n setStatus(\"signing\");\n setError(undefined);\n setResult(undefined);\n try {\n const encoded = normalizeCalls(calls);\n const pc = publicClient();\n\n\n const sw = client ?? (await getClientForChain({ id: pepuMainnet.id }));\n if (!sw) {\n throw new PepuConfigError(\n \"CONFIG_PRIVY_DASHBOARD\",\n \"No Privy smart-wallet client is available.\",\n { hint: 'Enable \"Smart Wallets\" for chain 97741 in the Privy dashboard and wrap the app in SmartWalletsProvider.' },\n );\n }\n setStatus(\"submitting\");\n const hash =\n encoded.length === 1 && encoded[0]\n ? await sw.sendTransaction({ to: encoded[0].to, data: encoded[0].data, value: encoded[0].value })\n : await sw.sendTransaction({ calls: encoded });\n const receipt = await pc.waitForTransactionReceipt({ hash });\n const paid = userOpEventFromReceipt(receipt, sw.account.address as Address);\n const out: SponsoredResult = {\n userOpHash: paid?.userOpHash ?? null,\n transactionHash: hash,\n success: paid?.success ?? receipt.status === \"success\",\n paymaster: paid?.paymaster ?? null,\n actualGasCostWei: paid?.actualGasCost ?? 0n,\n explorerUrl: txUrl(pepuMainnet, hash),\n };\n setResult(out);\n setStatus(\"confirmed\");\n return out;\n } catch (caught) {\n const err = toPepuError(caught) === caught ? (caught as PepuError) : describeUserOpFailure(caught);\n setError(err);\n setStatus(\"error\");\n throw err;\n } finally {\n inFlight.current = false;\n }\n },\n [client, getClientForChain],\n );\n\n return { send, status, ...(result ? { result } : {}), ...(error ? { error } : {}) };\n}\n\n/**\n * Live sponsorship status, polled. The live replacement for the deprecated\n * `useSponsorshipStatus` (which always said unavailable).\n *\n * @example\n * const s = usePepuSponsorship({ pollMs: 15000 });\n * if (!s.loading && !s.available) console.log(s.reason, s.fixes);\n */\nexport function usePepuSponsorship(\n o: { pollMs?: number; bundlerUrl?: string; paymasterUrl?: string } = {},\n): SponsorshipReport & { loading: boolean } {\n const [report, setReport] = useState<SponsorshipReport>({\n available: false,\n transport: \"none\",\n bundler: { configured: false },\n paymaster: { configured: false },\n reason: \"Checking sponsorship status.\",\n fixes: [],\n });\n const [loading, setLoading] = useState(true);\n const { pollMs = 30_000, bundlerUrl, paymasterUrl } = o;\n\n useEffect(() => {\n let cancelled = false;\n const run = async (): Promise<void> => {\n try {\n const r = await checkSponsorship({\n publicClient: publicClient(),\n ...(bundlerUrl !== undefined ? { bundlerUrl } : {}),\n ...(paymasterUrl !== undefined ? { paymasterUrl } : {}),\n });\n if (!cancelled) setReport(r);\n } catch (e) {\n if (!cancelled) {\n setReport((prev) => ({ ...prev, available: false, reason: toPepuError(e).message, fixes: [toPepuError(e).hint] }));\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n void run();\n const id = pollMs > 0 ? setInterval(() => void run(), pollMs) : undefined;\n return () => {\n cancelled = true;\n if (id !== undefined) clearInterval(id);\n };\n }, [pollMs, bundlerUrl, paymasterUrl]);\n\n return { ...report, loading };\n}\n"]}
1
+ {"version":3,"sources":["../../src/aa/react.ts"],"names":["getPublicClient","pepuMainnet","useWallets","useSmartWallets","useRef","useState","useEffect","useCallback","PepuConfigError","normalizeCalls","userOpEventFromReceipt","txUrl","toPepuError","describeUserOpFailure","checkSponsorship"],"mappings":"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","file":"react.cjs","sourcesContent":["/**\n * @pepu-chain/sdk/aa/react: React hooks for sponsored transactions with Privy\n * Smart Wallets.\n *\n * Needs `react`, `@privy-io/react-auth` and, because Privy's smart-wallets\n * module requires it, `permissionless`. It never references `@zerodev/*`,\n * statically or dynamically, so a bundler resolving it needs no ZeroDev. The\n * transport reads bundler and paymaster URLs from the Privy dashboard. To use\n * your own bundler and paymaster instead, see `@pepu-chain/sdk/aa/react-direct`.\n *\n * Flow ported from `templates/sponsored-demo/components/sponsored-tap-demo.tsx`\n * (smart-wallet client, in-flight guard, real error text via describeUserOpFailure).\n */\nimport { useWallets } from \"@privy-io/react-auth\";\nimport { useSmartWallets } from \"@privy-io/react-auth/smart-wallets\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Address, PublicClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { getPublicClient } from \"../client.js\";\nimport { PepuConfigError, toPepuError } from \"../errors.js\";\nimport type { PepuError } from \"../errors.js\";\nimport { txUrl } from \"../explorer.js\";\nimport { normalizeCalls, userOpEventFromReceipt } from \"./calls.js\";\nimport { describeUserOpFailure } from \"./describe.js\";\nimport { checkSponsorship } from \"./status.js\";\nimport type { SponsorshipReport } from \"./status.js\";\nimport type { Call, SponsoredResult } from \"./types.js\";\n\nexport type { Call, SponsoredResult } from \"./types.js\";\n\nlet sharedClient: PublicClient | undefined;\nfunction publicClient(): PublicClient {\n sharedClient ??= getPublicClient(pepuMainnet) as unknown as PublicClient;\n return sharedClient;\n}\n\n/** The Privy embedded wallet, the owner of the smart account. */\nfunction useEmbeddedWallet() {\n const { wallets } = useWallets();\n return wallets.find((w) => w.walletClientType === \"privy\");\n}\n\n/**\n * The two-address model made explicit: `owner` is the Privy embedded wallet\n * (an EOA that signs), `smartAccount` is the Kernel account that sends and\n * holds assets. With Privy Smart Wallets the smart account comes from the\n * provider: `useSmartWallets().client`, or, while that is still unset,\n * `getClientForChain({ id: 97741 })`. For an address derived without Privy\n * Smart Wallets, use `useDirectSmartAccount` from `@pepu-chain/sdk/aa/react-direct`.\n *\n * @example\n * const { owner, smartAccount, ready } = usePepuSmartAccount();\n */\nexport function usePepuSmartAccount(): { owner?: Address; smartAccount?: Address; ready: boolean } {\n const embedded = useEmbeddedWallet();\n const { client, getClientForChain } = useSmartWallets();\n const getClientRef = useRef(getClientForChain);\n getClientRef.current = getClientForChain;\n const owner = embedded?.address as Address | undefined;\n const fromProvider = client?.account?.address as Address | undefined;\n const [resolved, setResolved] = useState<{ owner: Address; address: Address } | undefined>();\n\n useEffect(() => {\n if (!owner || fromProvider) return;\n let cancelled = false;\n // Privy's per-chain client may populate after `client`.\n Promise.resolve(getClientRef.current?.({ id: pepuMainnet.id }))\n .then((c) => {\n const address = c?.account?.address as Address | undefined;\n if (!cancelled && address) setResolved({ owner, address });\n })\n .catch(() => {\n // Smart Wallets not configured for this chain: `ready` stays false.\n });\n return () => {\n cancelled = true;\n };\n }, [owner, fromProvider]);\n\n const smartAccount = fromProvider ?? (resolved && resolved.owner === owner ? resolved.address : undefined);\n return {\n ...(owner ? { owner } : {}),\n ...(smartAccount ? { smartAccount } : {}),\n ready: owner !== undefined && smartAccount !== undefined,\n };\n}\n\n/** Status of a {@link useSponsoredSend} send. */\nexport type SponsoredSendStatus = \"idle\" | \"signing\" | \"submitting\" | \"confirmed\" | \"error\";\n\n/** Options for {@link useSponsoredSend}. */\nexport interface UseSponsoredSendOptions {\n /** The only transport here. Your own bundler and paymaster: `useDirectSponsoredSend` in `@pepu-chain/sdk/aa/react-direct`. */\n transport?: \"privy-smart-wallets\";\n}\n\n/**\n * Send calls with gas sponsored through Privy's smart-wallet client (bundler\n * and paymaster URLs come from the Privy dashboard). One send at a time: a\n * second call while one is in flight is ignored. For your own bundler and\n * paymaster, use `useDirectSponsoredSend` from `@pepu-chain/sdk/aa/react-direct`.\n *\n * @example\n * const { send, status, result, error } = useSponsoredSend({ transport: \"privy-smart-wallets\" });\n * await send([{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function useSponsoredSend(_options: UseSponsoredSendOptions = {}): {\n send: (calls: Call[]) => Promise<SponsoredResult>;\n status: SponsoredSendStatus;\n result?: SponsoredResult;\n error?: PepuError;\n} {\n const { client, getClientForChain } = useSmartWallets();\n const [status, setStatus] = useState<SponsoredSendStatus>(\"idle\");\n const [result, setResult] = useState<SponsoredResult | undefined>();\n const [error, setError] = useState<PepuError | undefined>();\n const inFlight = useRef(false);\n\n const send = useCallback(\n async (calls: Call[]): Promise<SponsoredResult> => {\n if (inFlight.current) {\n throw new PepuConfigError(\"UNKNOWN\", \"A sponsored send is already in progress.\", {\n hint: \"Wait for the current send to finish.\",\n });\n }\n inFlight.current = true;\n setStatus(\"signing\");\n setError(undefined);\n setResult(undefined);\n try {\n const encoded = normalizeCalls(calls);\n const pc = publicClient();\n\n\n const sw = client ?? (await getClientForChain({ id: pepuMainnet.id }));\n if (!sw) {\n throw new PepuConfigError(\n \"CONFIG_PRIVY_DASHBOARD\",\n \"No Privy smart-wallet client is available.\",\n { hint: 'Enable \"Smart Wallets\" for chain 97741 in the Privy dashboard and wrap the app in SmartWalletsProvider.' },\n );\n }\n setStatus(\"submitting\");\n const hash =\n encoded.length === 1 && encoded[0]\n ? await sw.sendTransaction({ to: encoded[0].to, data: encoded[0].data, value: encoded[0].value })\n : await sw.sendTransaction({ calls: encoded });\n const receipt = await pc.waitForTransactionReceipt({ hash });\n const paid = userOpEventFromReceipt(receipt, sw.account.address as Address);\n const out: SponsoredResult = {\n userOpHash: paid?.userOpHash ?? null,\n transactionHash: hash,\n success: paid?.success ?? receipt.status === \"success\",\n paymaster: paid?.paymaster ?? null,\n actualGasCostWei: paid?.actualGasCost ?? 0n,\n explorerUrl: txUrl(pepuMainnet, hash),\n };\n setResult(out);\n setStatus(\"confirmed\");\n return out;\n } catch (caught) {\n const err = toPepuError(caught) === caught ? (caught as PepuError) : describeUserOpFailure(caught);\n setError(err);\n setStatus(\"error\");\n throw err;\n } finally {\n inFlight.current = false;\n }\n },\n [client, getClientForChain],\n );\n\n return { send, status, ...(result ? { result } : {}), ...(error ? { error } : {}) };\n}\n\n/**\n * Live sponsorship status, polled. The live replacement for the deprecated\n * `useSponsorshipStatus` (which always said unavailable).\n *\n * @example\n * const s = usePepuSponsorship({ pollMs: 15000 });\n * if (!s.loading && !s.available) console.log(s.reason, s.fixes);\n */\nexport function usePepuSponsorship(\n o: { pollMs?: number; bundlerUrl?: string; paymasterUrl?: string } = {},\n): SponsorshipReport & { loading: boolean } {\n const [report, setReport] = useState<SponsorshipReport>({\n available: false,\n transport: \"none\",\n bundler: { configured: false },\n paymaster: { configured: false },\n reason: \"Checking sponsorship status.\",\n fixes: [],\n });\n const [loading, setLoading] = useState(true);\n const { pollMs = 30_000, bundlerUrl, paymasterUrl } = o;\n\n useEffect(() => {\n let cancelled = false;\n const run = async (): Promise<void> => {\n try {\n const r = await checkSponsorship({\n publicClient: publicClient(),\n ...(bundlerUrl !== undefined ? { bundlerUrl } : {}),\n ...(paymasterUrl !== undefined ? { paymasterUrl } : {}),\n });\n if (!cancelled) setReport(r);\n } catch (e) {\n if (!cancelled) {\n setReport((prev) => ({ ...prev, available: false, reason: toPepuError(e).message, fixes: [toPepuError(e).hint] }));\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n void run();\n const id = pollMs > 0 ? setInterval(() => void run(), pollMs) : undefined;\n return () => {\n cancelled = true;\n if (id !== undefined) clearInterval(id);\n };\n }, [pollMs, bundlerUrl, paymasterUrl]);\n\n return { ...report, loading };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Address } from 'viem';
2
2
  import { P as PepuError } from '../errors-CgX1vNj7.cjs';
3
- import { S as SponsorshipReport } from '../status-CmOsyPmO.cjs';
3
+ import { S as SponsorshipReport } from '../status-wgTM26V7.cjs';
4
4
  import { C as Call, S as SponsoredResult } from '../types-BilBTDqK.cjs';
5
5
  import '../chains-DK13zGIp.cjs';
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { Address } from 'viem';
2
2
  import { P as PepuError } from '../errors-CgX1vNj7.js';
3
- import { S as SponsorshipReport } from '../status-DwkkOrGQ.js';
3
+ import { S as SponsorshipReport } from '../status-Dx9zAFo9.js';
4
4
  import { C as Call, S as SponsoredResult } from '../types-BilBTDqK.js';
5
5
  import '../chains-DK13zGIp.js';
6
6
 
@@ -0,0 +1,15 @@
1
+ // Generated by scripts/guard-peers.mjs. Used only under the "node" export condition.
2
+ const peers = ["react","@privy-io/react-auth","permissionless"];
3
+ for (const peer of peers) {
4
+ try {
5
+ import.meta.resolve?.(peer);
6
+ } catch (e) {
7
+ if (e && e.code === "ERR_MODULE_NOT_FOUND") {
8
+ const err = new Error("@pepu-chain/sdk/aa/react needs peer packages that are not installed: react @privy-io/react-auth permissionless. Install with: npm i react @privy-io/react-auth permissionless (or let create-pepu-app scaffold everything).");
9
+ err.code = "PEPU_MISSING_PEER";
10
+ throw err;
11
+ }
12
+ }
13
+ }
14
+ const mod = await import("./react.js");
15
+ export const { usePepuSmartAccount, usePepuSponsorship, useSponsoredSend } = mod;
package/dist/aa/react.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { normalizeCalls, userOpEventFromReceipt } from '../chunk-VBH3JLQ5.js';
2
- import { checkSponsorship } from '../chunk-KIIFL4VM.js';
3
- import { describeUserOpFailure } from '../chunk-D52PADVY.js';
4
- import '../chunk-FCXSP2YF.js';
2
+ import { checkSponsorship } from '../chunk-XR5ONV2Y.js';
3
+ import { describeUserOpFailure } from '../chunk-GFKIM7HT.js';
4
+ import '../chunk-KJYNF5KH.js';
5
+ import '../chunk-GIZNH65Q.js';
5
6
  import { getPublicClient } from '../chunk-OH3QMAIB.js';
6
7
  import { txUrl } from '../chunk-J6UXXHBE.js';
7
8
  import '../chunk-XC4IBCI2.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/aa/react.ts"],"names":[],"mappings":"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","file":"react.js","sourcesContent":["/**\n * @pepu-chain/sdk/aa/react: React hooks for sponsored transactions with Privy\n * Smart Wallets.\n *\n * Needs `react`, `@privy-io/react-auth` and, because Privy's smart-wallets\n * module requires it, `permissionless`. It never references `@zerodev/*`,\n * statically or dynamically, so a bundler resolving it needs no ZeroDev. The\n * transport reads bundler and paymaster URLs from the Privy dashboard. To use\n * your own bundler and paymaster instead, see `@pepu-chain/sdk/aa/react-direct`.\n *\n * Flow ported from `templates/sponsored-demo/components/sponsored-tap-demo.tsx`\n * (smart-wallet client, in-flight guard, real error text via describeUserOpFailure).\n */\nimport { useWallets } from \"@privy-io/react-auth\";\nimport { useSmartWallets } from \"@privy-io/react-auth/smart-wallets\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Address, PublicClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { getPublicClient } from \"../client.js\";\nimport { PepuConfigError, toPepuError } from \"../errors.js\";\nimport type { PepuError } from \"../errors.js\";\nimport { txUrl } from \"../explorer.js\";\nimport { normalizeCalls, userOpEventFromReceipt } from \"./calls.js\";\nimport { describeUserOpFailure } from \"./describe.js\";\nimport { checkSponsorship } from \"./status.js\";\nimport type { SponsorshipReport } from \"./status.js\";\nimport type { Call, SponsoredResult } from \"./types.js\";\n\nexport type { Call, SponsoredResult } from \"./types.js\";\n\nlet sharedClient: PublicClient | undefined;\nfunction publicClient(): PublicClient {\n sharedClient ??= getPublicClient(pepuMainnet) as unknown as PublicClient;\n return sharedClient;\n}\n\n/** The Privy embedded wallet, the owner of the smart account. */\nfunction useEmbeddedWallet() {\n const { wallets } = useWallets();\n return wallets.find((w) => w.walletClientType === \"privy\");\n}\n\n/**\n * The two-address model made explicit: `owner` is the Privy embedded wallet\n * (an EOA that signs), `smartAccount` is the Kernel account that sends and\n * holds assets. With Privy Smart Wallets the smart account comes from the\n * provider: `useSmartWallets().client`, or, while that is still unset,\n * `getClientForChain({ id: 97741 })`. For an address derived without Privy\n * Smart Wallets, use `useDirectSmartAccount` from `@pepu-chain/sdk/aa/react-direct`.\n *\n * @example\n * const { owner, smartAccount, ready } = usePepuSmartAccount();\n */\nexport function usePepuSmartAccount(): { owner?: Address; smartAccount?: Address; ready: boolean } {\n const embedded = useEmbeddedWallet();\n const { client, getClientForChain } = useSmartWallets();\n const getClientRef = useRef(getClientForChain);\n getClientRef.current = getClientForChain;\n const owner = embedded?.address as Address | undefined;\n const fromProvider = client?.account?.address as Address | undefined;\n const [resolved, setResolved] = useState<{ owner: Address; address: Address } | undefined>();\n\n useEffect(() => {\n if (!owner || fromProvider) return;\n let cancelled = false;\n // Privy's per-chain client may populate after `client`.\n Promise.resolve(getClientRef.current?.({ id: pepuMainnet.id }))\n .then((c) => {\n const address = c?.account?.address as Address | undefined;\n if (!cancelled && address) setResolved({ owner, address });\n })\n .catch(() => {\n // Smart Wallets not configured for this chain: `ready` stays false.\n });\n return () => {\n cancelled = true;\n };\n }, [owner, fromProvider]);\n\n const smartAccount = fromProvider ?? (resolved && resolved.owner === owner ? resolved.address : undefined);\n return {\n ...(owner ? { owner } : {}),\n ...(smartAccount ? { smartAccount } : {}),\n ready: owner !== undefined && smartAccount !== undefined,\n };\n}\n\n/** Status of a {@link useSponsoredSend} send. */\nexport type SponsoredSendStatus = \"idle\" | \"signing\" | \"submitting\" | \"confirmed\" | \"error\";\n\n/** Options for {@link useSponsoredSend}. */\nexport interface UseSponsoredSendOptions {\n /** The only transport here. Your own bundler and paymaster: `useDirectSponsoredSend` in `@pepu-chain/sdk/aa/react-direct`. */\n transport?: \"privy-smart-wallets\";\n}\n\n/**\n * Send calls with gas sponsored through Privy's smart-wallet client (bundler\n * and paymaster URLs come from the Privy dashboard). One send at a time: a\n * second call while one is in flight is ignored. For your own bundler and\n * paymaster, use `useDirectSponsoredSend` from `@pepu-chain/sdk/aa/react-direct`.\n *\n * @example\n * const { send, status, result, error } = useSponsoredSend({ transport: \"privy-smart-wallets\" });\n * await send([{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function useSponsoredSend(_options: UseSponsoredSendOptions = {}): {\n send: (calls: Call[]) => Promise<SponsoredResult>;\n status: SponsoredSendStatus;\n result?: SponsoredResult;\n error?: PepuError;\n} {\n const { client, getClientForChain } = useSmartWallets();\n const [status, setStatus] = useState<SponsoredSendStatus>(\"idle\");\n const [result, setResult] = useState<SponsoredResult | undefined>();\n const [error, setError] = useState<PepuError | undefined>();\n const inFlight = useRef(false);\n\n const send = useCallback(\n async (calls: Call[]): Promise<SponsoredResult> => {\n if (inFlight.current) {\n throw new PepuConfigError(\"UNKNOWN\", \"A sponsored send is already in progress.\", {\n hint: \"Wait for the current send to finish.\",\n });\n }\n inFlight.current = true;\n setStatus(\"signing\");\n setError(undefined);\n setResult(undefined);\n try {\n const encoded = normalizeCalls(calls);\n const pc = publicClient();\n\n\n const sw = client ?? (await getClientForChain({ id: pepuMainnet.id }));\n if (!sw) {\n throw new PepuConfigError(\n \"CONFIG_PRIVY_DASHBOARD\",\n \"No Privy smart-wallet client is available.\",\n { hint: 'Enable \"Smart Wallets\" for chain 97741 in the Privy dashboard and wrap the app in SmartWalletsProvider.' },\n );\n }\n setStatus(\"submitting\");\n const hash =\n encoded.length === 1 && encoded[0]\n ? await sw.sendTransaction({ to: encoded[0].to, data: encoded[0].data, value: encoded[0].value })\n : await sw.sendTransaction({ calls: encoded });\n const receipt = await pc.waitForTransactionReceipt({ hash });\n const paid = userOpEventFromReceipt(receipt, sw.account.address as Address);\n const out: SponsoredResult = {\n userOpHash: paid?.userOpHash ?? null,\n transactionHash: hash,\n success: paid?.success ?? receipt.status === \"success\",\n paymaster: paid?.paymaster ?? null,\n actualGasCostWei: paid?.actualGasCost ?? 0n,\n explorerUrl: txUrl(pepuMainnet, hash),\n };\n setResult(out);\n setStatus(\"confirmed\");\n return out;\n } catch (caught) {\n const err = toPepuError(caught) === caught ? (caught as PepuError) : describeUserOpFailure(caught);\n setError(err);\n setStatus(\"error\");\n throw err;\n } finally {\n inFlight.current = false;\n }\n },\n [client, getClientForChain],\n );\n\n return { send, status, ...(result ? { result } : {}), ...(error ? { error } : {}) };\n}\n\n/**\n * Live sponsorship status, polled. The live replacement for the deprecated\n * `useSponsorshipStatus` (which always said unavailable).\n *\n * @example\n * const s = usePepuSponsorship({ pollMs: 15000 });\n * if (!s.loading && !s.available) console.log(s.reason, s.fixes);\n */\nexport function usePepuSponsorship(\n o: { pollMs?: number; bundlerUrl?: string; paymasterUrl?: string } = {},\n): SponsorshipReport & { loading: boolean } {\n const [report, setReport] = useState<SponsorshipReport>({\n available: false,\n transport: \"none\",\n bundler: { configured: false },\n paymaster: { configured: false },\n reason: \"Checking sponsorship status.\",\n fixes: [],\n });\n const [loading, setLoading] = useState(true);\n const { pollMs = 30_000, bundlerUrl, paymasterUrl } = o;\n\n useEffect(() => {\n let cancelled = false;\n const run = async (): Promise<void> => {\n try {\n const r = await checkSponsorship({\n publicClient: publicClient(),\n ...(bundlerUrl !== undefined ? { bundlerUrl } : {}),\n ...(paymasterUrl !== undefined ? { paymasterUrl } : {}),\n });\n if (!cancelled) setReport(r);\n } catch (e) {\n if (!cancelled) {\n setReport((prev) => ({ ...prev, available: false, reason: toPepuError(e).message, fixes: [toPepuError(e).hint] }));\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n void run();\n const id = pollMs > 0 ? setInterval(() => void run(), pollMs) : undefined;\n return () => {\n cancelled = true;\n if (id !== undefined) clearInterval(id);\n };\n }, [pollMs, bundlerUrl, paymasterUrl]);\n\n return { ...report, loading };\n}\n"]}
1
+ {"version":3,"sources":["../../src/aa/react.ts"],"names":[],"mappings":"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","file":"react.js","sourcesContent":["/**\n * @pepu-chain/sdk/aa/react: React hooks for sponsored transactions with Privy\n * Smart Wallets.\n *\n * Needs `react`, `@privy-io/react-auth` and, because Privy's smart-wallets\n * module requires it, `permissionless`. It never references `@zerodev/*`,\n * statically or dynamically, so a bundler resolving it needs no ZeroDev. The\n * transport reads bundler and paymaster URLs from the Privy dashboard. To use\n * your own bundler and paymaster instead, see `@pepu-chain/sdk/aa/react-direct`.\n *\n * Flow ported from `templates/sponsored-demo/components/sponsored-tap-demo.tsx`\n * (smart-wallet client, in-flight guard, real error text via describeUserOpFailure).\n */\nimport { useWallets } from \"@privy-io/react-auth\";\nimport { useSmartWallets } from \"@privy-io/react-auth/smart-wallets\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Address, PublicClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { getPublicClient } from \"../client.js\";\nimport { PepuConfigError, toPepuError } from \"../errors.js\";\nimport type { PepuError } from \"../errors.js\";\nimport { txUrl } from \"../explorer.js\";\nimport { normalizeCalls, userOpEventFromReceipt } from \"./calls.js\";\nimport { describeUserOpFailure } from \"./describe.js\";\nimport { checkSponsorship } from \"./status.js\";\nimport type { SponsorshipReport } from \"./status.js\";\nimport type { Call, SponsoredResult } from \"./types.js\";\n\nexport type { Call, SponsoredResult } from \"./types.js\";\n\nlet sharedClient: PublicClient | undefined;\nfunction publicClient(): PublicClient {\n sharedClient ??= getPublicClient(pepuMainnet) as unknown as PublicClient;\n return sharedClient;\n}\n\n/** The Privy embedded wallet, the owner of the smart account. */\nfunction useEmbeddedWallet() {\n const { wallets } = useWallets();\n return wallets.find((w) => w.walletClientType === \"privy\");\n}\n\n/**\n * The two-address model made explicit: `owner` is the Privy embedded wallet\n * (an EOA that signs), `smartAccount` is the Kernel account that sends and\n * holds assets. With Privy Smart Wallets the smart account comes from the\n * provider: `useSmartWallets().client`, or, while that is still unset,\n * `getClientForChain({ id: 97741 })`. For an address derived without Privy\n * Smart Wallets, use `useDirectSmartAccount` from `@pepu-chain/sdk/aa/react-direct`.\n *\n * @example\n * const { owner, smartAccount, ready } = usePepuSmartAccount();\n */\nexport function usePepuSmartAccount(): { owner?: Address; smartAccount?: Address; ready: boolean } {\n const embedded = useEmbeddedWallet();\n const { client, getClientForChain } = useSmartWallets();\n const getClientRef = useRef(getClientForChain);\n getClientRef.current = getClientForChain;\n const owner = embedded?.address as Address | undefined;\n const fromProvider = client?.account?.address as Address | undefined;\n const [resolved, setResolved] = useState<{ owner: Address; address: Address } | undefined>();\n\n useEffect(() => {\n if (!owner || fromProvider) return;\n let cancelled = false;\n // Privy's per-chain client may populate after `client`.\n Promise.resolve(getClientRef.current?.({ id: pepuMainnet.id }))\n .then((c) => {\n const address = c?.account?.address as Address | undefined;\n if (!cancelled && address) setResolved({ owner, address });\n })\n .catch(() => {\n // Smart Wallets not configured for this chain: `ready` stays false.\n });\n return () => {\n cancelled = true;\n };\n }, [owner, fromProvider]);\n\n const smartAccount = fromProvider ?? (resolved && resolved.owner === owner ? resolved.address : undefined);\n return {\n ...(owner ? { owner } : {}),\n ...(smartAccount ? { smartAccount } : {}),\n ready: owner !== undefined && smartAccount !== undefined,\n };\n}\n\n/** Status of a {@link useSponsoredSend} send. */\nexport type SponsoredSendStatus = \"idle\" | \"signing\" | \"submitting\" | \"confirmed\" | \"error\";\n\n/** Options for {@link useSponsoredSend}. */\nexport interface UseSponsoredSendOptions {\n /** The only transport here. Your own bundler and paymaster: `useDirectSponsoredSend` in `@pepu-chain/sdk/aa/react-direct`. */\n transport?: \"privy-smart-wallets\";\n}\n\n/**\n * Send calls with gas sponsored through Privy's smart-wallet client (bundler\n * and paymaster URLs come from the Privy dashboard). One send at a time: a\n * second call while one is in flight is ignored. For your own bundler and\n * paymaster, use `useDirectSponsoredSend` from `@pepu-chain/sdk/aa/react-direct`.\n *\n * @example\n * const { send, status, result, error } = useSponsoredSend({ transport: \"privy-smart-wallets\" });\n * await send([{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function useSponsoredSend(_options: UseSponsoredSendOptions = {}): {\n send: (calls: Call[]) => Promise<SponsoredResult>;\n status: SponsoredSendStatus;\n result?: SponsoredResult;\n error?: PepuError;\n} {\n const { client, getClientForChain } = useSmartWallets();\n const [status, setStatus] = useState<SponsoredSendStatus>(\"idle\");\n const [result, setResult] = useState<SponsoredResult | undefined>();\n const [error, setError] = useState<PepuError | undefined>();\n const inFlight = useRef(false);\n\n const send = useCallback(\n async (calls: Call[]): Promise<SponsoredResult> => {\n if (inFlight.current) {\n throw new PepuConfigError(\"UNKNOWN\", \"A sponsored send is already in progress.\", {\n hint: \"Wait for the current send to finish.\",\n });\n }\n inFlight.current = true;\n setStatus(\"signing\");\n setError(undefined);\n setResult(undefined);\n try {\n const encoded = normalizeCalls(calls);\n const pc = publicClient();\n\n\n const sw = client ?? (await getClientForChain({ id: pepuMainnet.id }));\n if (!sw) {\n throw new PepuConfigError(\n \"CONFIG_PRIVY_DASHBOARD\",\n \"No Privy smart-wallet client is available.\",\n { hint: 'Enable \"Smart Wallets\" for chain 97741 in the Privy dashboard and wrap the app in SmartWalletsProvider.' },\n );\n }\n setStatus(\"submitting\");\n const hash =\n encoded.length === 1 && encoded[0]\n ? await sw.sendTransaction({ to: encoded[0].to, data: encoded[0].data, value: encoded[0].value })\n : await sw.sendTransaction({ calls: encoded });\n const receipt = await pc.waitForTransactionReceipt({ hash });\n const paid = userOpEventFromReceipt(receipt, sw.account.address as Address);\n const out: SponsoredResult = {\n userOpHash: paid?.userOpHash ?? null,\n transactionHash: hash,\n success: paid?.success ?? receipt.status === \"success\",\n paymaster: paid?.paymaster ?? null,\n actualGasCostWei: paid?.actualGasCost ?? 0n,\n explorerUrl: txUrl(pepuMainnet, hash),\n };\n setResult(out);\n setStatus(\"confirmed\");\n return out;\n } catch (caught) {\n const err = toPepuError(caught) === caught ? (caught as PepuError) : describeUserOpFailure(caught);\n setError(err);\n setStatus(\"error\");\n throw err;\n } finally {\n inFlight.current = false;\n }\n },\n [client, getClientForChain],\n );\n\n return { send, status, ...(result ? { result } : {}), ...(error ? { error } : {}) };\n}\n\n/**\n * Live sponsorship status, polled. The live replacement for the deprecated\n * `useSponsorshipStatus` (which always said unavailable).\n *\n * @example\n * const s = usePepuSponsorship({ pollMs: 15000 });\n * if (!s.loading && !s.available) console.log(s.reason, s.fixes);\n */\nexport function usePepuSponsorship(\n o: { pollMs?: number; bundlerUrl?: string; paymasterUrl?: string } = {},\n): SponsorshipReport & { loading: boolean } {\n const [report, setReport] = useState<SponsorshipReport>({\n available: false,\n transport: \"none\",\n bundler: { configured: false },\n paymaster: { configured: false },\n reason: \"Checking sponsorship status.\",\n fixes: [],\n });\n const [loading, setLoading] = useState(true);\n const { pollMs = 30_000, bundlerUrl, paymasterUrl } = o;\n\n useEffect(() => {\n let cancelled = false;\n const run = async (): Promise<void> => {\n try {\n const r = await checkSponsorship({\n publicClient: publicClient(),\n ...(bundlerUrl !== undefined ? { bundlerUrl } : {}),\n ...(paymasterUrl !== undefined ? { paymasterUrl } : {}),\n });\n if (!cancelled) setReport(r);\n } catch (e) {\n if (!cancelled) {\n setReport((prev) => ({ ...prev, available: false, reason: toPepuError(e).message, fixes: [toPepuError(e).hint] }));\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n void run();\n const id = pollMs > 0 ? setInterval(() => void run(), pollMs) : undefined;\n return () => {\n cancelled = true;\n if (id !== undefined) clearInterval(id);\n };\n }, [pollMs, bundlerUrl, paymasterUrl]);\n\n return { ...report, loading };\n}\n"]}