@pepu-chain/sdk 0.0.0-stage → 0.2.0
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/LICENSE +21 -0
- package/README.md +565 -2
- package/dist/aa/kernel.cjs +40 -0
- package/dist/aa/kernel.cjs.map +1 -0
- package/dist/aa/kernel.d.cts +88 -0
- package/dist/aa/kernel.d.ts +88 -0
- package/dist/aa/kernel.js +11 -0
- package/dist/aa/kernel.js.map +1 -0
- package/dist/aa/react-direct.cjs +110 -0
- package/dist/aa/react-direct.cjs.map +1 -0
- package/dist/aa/react-direct.d.cts +42 -0
- package/dist/aa/react-direct.d.ts +42 -0
- package/dist/aa/react-direct.js +107 -0
- package/dist/aa/react-direct.js.map +1 -0
- package/dist/aa/react.cjs +151 -0
- package/dist/aa/react.cjs.map +1 -0
- package/dist/aa/react.d.cts +62 -0
- package/dist/aa/react.d.ts +62 -0
- package/dist/aa/react.js +147 -0
- package/dist/aa/react.js.map +1 -0
- package/dist/aa.cjs +84 -0
- package/dist/aa.cjs.map +1 -0
- package/dist/aa.d.cts +85 -0
- package/dist/aa.d.ts +85 -0
- package/dist/aa.js +11 -0
- package/dist/aa.js.map +1 -0
- package/dist/api-Dz4sCHH_.d.cts +654 -0
- package/dist/api-Dz4sCHH_.d.ts +654 -0
- package/dist/calls-BRPjKgjl.d.cts +70 -0
- package/dist/calls-z_EQOtFb.d.ts +70 -0
- package/dist/chains-DK13zGIp.d.cts +235 -0
- package/dist/chains-DK13zGIp.d.ts +235 -0
- package/dist/chunk-3XUGQODR.js +194 -0
- package/dist/chunk-3XUGQODR.js.map +1 -0
- package/dist/chunk-45KSZH26.cjs +145 -0
- package/dist/chunk-45KSZH26.cjs.map +1 -0
- package/dist/chunk-4GINFJO6.cjs +44 -0
- package/dist/chunk-4GINFJO6.cjs.map +1 -0
- package/dist/chunk-62M2LKQW.js +136 -0
- package/dist/chunk-62M2LKQW.js.map +1 -0
- package/dist/chunk-6DSZ4Z2N.js +498 -0
- package/dist/chunk-6DSZ4Z2N.js.map +1 -0
- package/dist/chunk-7MNJF2OB.cjs +72 -0
- package/dist/chunk-7MNJF2OB.cjs.map +1 -0
- package/dist/chunk-A5LP2UCS.cjs +2729 -0
- package/dist/chunk-A5LP2UCS.cjs.map +1 -0
- package/dist/chunk-AJS4UFQX.cjs +121 -0
- package/dist/chunk-AJS4UFQX.cjs.map +1 -0
- package/dist/chunk-C2XW44FI.cjs +200 -0
- package/dist/chunk-C2XW44FI.cjs.map +1 -0
- package/dist/chunk-C7IC36XS.cjs +13 -0
- package/dist/chunk-C7IC36XS.cjs.map +1 -0
- package/dist/chunk-D52PADVY.js +84 -0
- package/dist/chunk-D52PADVY.js.map +1 -0
- package/dist/chunk-DH6BFNVJ.cjs +272 -0
- package/dist/chunk-DH6BFNVJ.cjs.map +1 -0
- package/dist/chunk-DPCZJLB3.cjs +87 -0
- package/dist/chunk-DPCZJLB3.cjs.map +1 -0
- package/dist/chunk-EHBPIYY4.js +262 -0
- package/dist/chunk-EHBPIYY4.js.map +1 -0
- package/dist/chunk-ESMNAXUI.js +86 -0
- package/dist/chunk-ESMNAXUI.js.map +1 -0
- package/dist/chunk-ET3P6TX6.cjs +49 -0
- package/dist/chunk-ET3P6TX6.cjs.map +1 -0
- package/dist/chunk-FCXSP2YF.js +219 -0
- package/dist/chunk-FCXSP2YF.js.map +1 -0
- package/dist/chunk-IB2FSPMJ.js +66 -0
- package/dist/chunk-IB2FSPMJ.js.map +1 -0
- package/dist/chunk-IG7RSL2Y.cjs +178 -0
- package/dist/chunk-IG7RSL2Y.cjs.map +1 -0
- package/dist/chunk-IY3ALPUJ.js +2716 -0
- package/dist/chunk-IY3ALPUJ.js.map +1 -0
- package/dist/chunk-J3O2ZGG3.cjs +93 -0
- package/dist/chunk-J3O2ZGG3.cjs.map +1 -0
- package/dist/chunk-J6UXXHBE.js +37 -0
- package/dist/chunk-J6UXXHBE.js.map +1 -0
- package/dist/chunk-JLZ4LZ4Z.js +22 -0
- package/dist/chunk-JLZ4LZ4Z.js.map +1 -0
- package/dist/chunk-KIIFL4VM.js +274 -0
- package/dist/chunk-KIIFL4VM.js.map +1 -0
- package/dist/chunk-KVG3AYYR.js +99 -0
- package/dist/chunk-KVG3AYYR.js.map +1 -0
- package/dist/chunk-MBA4CLA5.js +45 -0
- package/dist/chunk-MBA4CLA5.js.map +1 -0
- package/dist/chunk-NE3QKDOB.cjs +24 -0
- package/dist/chunk-NE3QKDOB.cjs.map +1 -0
- package/dist/chunk-NVOPDXTA.cjs +95 -0
- package/dist/chunk-NVOPDXTA.cjs.map +1 -0
- package/dist/chunk-OH3QMAIB.js +11 -0
- package/dist/chunk-OH3QMAIB.js.map +1 -0
- package/dist/chunk-PHM3ZORG.cjs +110 -0
- package/dist/chunk-PHM3ZORG.cjs.map +1 -0
- package/dist/chunk-R5PXQNO3.cjs +209 -0
- package/dist/chunk-R5PXQNO3.cjs.map +1 -0
- package/dist/chunk-SLW7FRTL.cjs +285 -0
- package/dist/chunk-SLW7FRTL.cjs.map +1 -0
- package/dist/chunk-SVWRRALU.cjs +17 -0
- package/dist/chunk-SVWRRALU.cjs.map +1 -0
- package/dist/chunk-T43PQXJD.js +202 -0
- package/dist/chunk-T43PQXJD.js.map +1 -0
- package/dist/chunk-TIEAZYHF.cjs +225 -0
- package/dist/chunk-TIEAZYHF.cjs.map +1 -0
- package/dist/chunk-VBH3JLQ5.js +116 -0
- package/dist/chunk-VBH3JLQ5.js.map +1 -0
- package/dist/chunk-VF3D6KLQ.cjs +94 -0
- package/dist/chunk-VF3D6KLQ.cjs.map +1 -0
- package/dist/chunk-VTQIHMF3.js +82 -0
- package/dist/chunk-VTQIHMF3.js.map +1 -0
- package/dist/chunk-W3JN3YIW.js +15 -0
- package/dist/chunk-W3JN3YIW.js.map +1 -0
- package/dist/chunk-WANILJZQ.cjs +87 -0
- package/dist/chunk-WANILJZQ.cjs.map +1 -0
- package/dist/chunk-XC4IBCI2.js +86 -0
- package/dist/chunk-XC4IBCI2.js.map +1 -0
- package/dist/chunk-YKEWWQEJ.js +165 -0
- package/dist/chunk-YKEWWQEJ.js.map +1 -0
- package/dist/chunk-YQL7NISX.cjs +515 -0
- package/dist/chunk-YQL7NISX.cjs.map +1 -0
- package/dist/chunk-ZB6SVBK4.js +89 -0
- package/dist/chunk-ZB6SVBK4.js.map +1 -0
- package/dist/combo/react.cjs +235 -0
- package/dist/combo/react.cjs.map +1 -0
- package/dist/combo/react.d.cts +148 -0
- package/dist/combo/react.d.ts +148 -0
- package/dist/combo/react.js +230 -0
- package/dist/combo/react.js.map +1 -0
- package/dist/combo.cjs +262 -0
- package/dist/combo.cjs.map +1 -0
- package/dist/combo.d.cts +139 -0
- package/dist/combo.d.ts +139 -0
- package/dist/combo.js +249 -0
- package/dist/combo.js.map +1 -0
- package/dist/config-CHjz7ZjZ.d.cts +57 -0
- package/dist/config-COjhIZTh.d.ts +57 -0
- package/dist/doctor.cjs +354 -0
- package/dist/doctor.cjs.map +1 -0
- package/dist/doctor.d.cts +177 -0
- package/dist/doctor.d.ts +177 -0
- package/dist/doctor.js +345 -0
- package/dist/doctor.js.map +1 -0
- package/dist/erc7677-DOW58QBE.d.cts +111 -0
- package/dist/erc7677-DOW58QBE.d.ts +111 -0
- package/dist/errors-CgX1vNj7.d.cts +100 -0
- package/dist/errors-CgX1vNj7.d.ts +100 -0
- package/dist/index.cjs +802 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2398 -0
- package/dist/index.d.ts +2398 -0
- package/dist/index.js +559 -0
- package/dist/index.js.map +1 -0
- package/dist/paymaster/server.cjs +38 -0
- package/dist/paymaster/server.cjs.map +1 -0
- package/dist/paymaster/server.d.cts +57 -0
- package/dist/paymaster/server.d.ts +57 -0
- package/dist/paymaster/server.js +36 -0
- package/dist/paymaster/server.js.map +1 -0
- package/dist/paymaster.cjs +356 -0
- package/dist/paymaster.cjs.map +1 -0
- package/dist/paymaster.d.cts +1851 -0
- package/dist/paymaster.d.ts +1851 -0
- package/dist/paymaster.js +289 -0
- package/dist/paymaster.js.map +1 -0
- package/dist/privy/react.cjs +48 -0
- package/dist/privy/react.cjs.map +1 -0
- package/dist/privy/react.d.cts +194 -0
- package/dist/privy/react.d.ts +194 -0
- package/dist/privy/react.js +7 -0
- package/dist/privy/react.js.map +1 -0
- package/dist/privy/server.cjs +43 -0
- package/dist/privy/server.cjs.map +1 -0
- package/dist/privy/server.d.cts +192 -0
- package/dist/privy/server.d.ts +192 -0
- package/dist/privy/server.js +6 -0
- package/dist/privy/server.js.map +1 -0
- package/dist/privy/wagmi.d.ts +90 -0
- package/dist/privy/wagmi.js +55 -0
- package/dist/privy/wagmi.js.map +1 -0
- package/dist/privy.cjs +34 -0
- package/dist/privy.cjs.map +1 -0
- package/dist/privy.d.cts +4 -0
- package/dist/privy.d.ts +4 -0
- package/dist/privy.js +5 -0
- package/dist/privy.js.map +1 -0
- package/dist/react.cjs +72 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +66 -0
- package/dist/react.d.ts +66 -0
- package/dist/react.js +68 -0
- package/dist/react.js.map +1 -0
- package/dist/requirements-C-QiJkL9.d.cts +134 -0
- package/dist/requirements-C-QiJkL9.d.ts +134 -0
- package/dist/scope-DBRkN7bR.d.cts +94 -0
- package/dist/scope-DBRkN7bR.d.ts +94 -0
- package/dist/server.cjs +59 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +208 -0
- package/dist/server.d.ts +208 -0
- package/dist/server.js +8 -0
- package/dist/server.js.map +1 -0
- package/dist/session/kernel.cjs +82 -0
- package/dist/session/kernel.cjs.map +1 -0
- package/dist/session/kernel.d.cts +131 -0
- package/dist/session/kernel.d.ts +131 -0
- package/dist/session/kernel.js +13 -0
- package/dist/session/kernel.js.map +1 -0
- package/dist/session/react.cjs +37 -0
- package/dist/session/react.cjs.map +1 -0
- package/dist/session/react.d.cts +119 -0
- package/dist/session/react.d.ts +119 -0
- package/dist/session/react.js +8 -0
- package/dist/session/react.js.map +1 -0
- package/dist/session/server.cjs +267 -0
- package/dist/session/server.cjs.map +1 -0
- package/dist/session/server.d.cts +151 -0
- package/dist/session/server.d.ts +151 -0
- package/dist/session/server.js +252 -0
- package/dist/session/server.js.map +1 -0
- package/dist/session.cjs +74 -0
- package/dist/session.cjs.map +1 -0
- package/dist/session.d.cts +3 -0
- package/dist/session.d.ts +3 -0
- package/dist/session.js +5 -0
- package/dist/session.js.map +1 -0
- package/dist/status-CmOsyPmO.d.cts +295 -0
- package/dist/status-DwkkOrGQ.d.ts +295 -0
- package/dist/store-CjmLgp9g.d.cts +64 -0
- package/dist/store-CjmLgp9g.d.ts +64 -0
- package/dist/types-BEEM7WdG.d.cts +25 -0
- package/dist/types-BEEM7WdG.d.ts +25 -0
- package/dist/types-BilBTDqK.d.cts +27 -0
- package/dist/types-BilBTDqK.d.ts +27 -0
- package/package.json +209 -3
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/privy/requirements.ts
|
|
4
|
+
var PRIVY_ENV = {
|
|
5
|
+
appId: "NEXT_PUBLIC_PRIVY_APP_ID",
|
|
6
|
+
appSecret: "PRIVY_APP_SECRET",
|
|
7
|
+
authorizationKey: "PRIVY_AUTHORIZATION_KEY",
|
|
8
|
+
keyQuorumId: "NEXT_PUBLIC_PRIVY_KEY_QUORUM_ID"
|
|
9
|
+
};
|
|
10
|
+
var PRIVY_ENV_ALIASES = {
|
|
11
|
+
appId: ["PRIVY_APP_ID"],
|
|
12
|
+
appSecret: [],
|
|
13
|
+
authorizationKey: [],
|
|
14
|
+
keyQuorumId: ["PRIVY_KEY_QUORUM_ID"]
|
|
15
|
+
};
|
|
16
|
+
var PRIVY_DOCS = "https://guide.pepeunchained.com/privy";
|
|
17
|
+
var normOrigin = (o) => o.trim().replace(/\/+$/, "").toLowerCase();
|
|
18
|
+
var PEPU_PRIVY_REQUIREMENTS = [
|
|
19
|
+
{
|
|
20
|
+
id: "app-id",
|
|
21
|
+
where: "env",
|
|
22
|
+
label: `${PRIVY_ENV.appId} is set`,
|
|
23
|
+
required: true,
|
|
24
|
+
pillars: ["login", "session", "sponsor"],
|
|
25
|
+
fix: `Copy the App ID from the Privy dashboard (Settings, Basics) into ${PRIVY_ENV.appId}.`,
|
|
26
|
+
docsUrl: `${PRIVY_DOCS}#app-id`
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "app-secret",
|
|
30
|
+
where: "env",
|
|
31
|
+
label: `${PRIVY_ENV.appSecret} is set (server only)`,
|
|
32
|
+
required: true,
|
|
33
|
+
pillars: ["login", "session", "sponsor"],
|
|
34
|
+
fix: `Create an app secret in the Privy dashboard and put it in ${PRIVY_ENV.appSecret}. Never prefix it with NEXT_PUBLIC_.`,
|
|
35
|
+
docsUrl: `${PRIVY_DOCS}#app-secret`
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "allowed-origins",
|
|
39
|
+
where: "dashboard",
|
|
40
|
+
label: "The page origin (including the port) is in Allowed origins",
|
|
41
|
+
required: true,
|
|
42
|
+
pillars: ["login", "session", "sponsor"],
|
|
43
|
+
check: (cfg, ctx) => {
|
|
44
|
+
if (!ctx.origin) return { ok: "unknown", detail: "No origin was given to check." };
|
|
45
|
+
if (!Array.isArray(cfg.allowed_domains)) {
|
|
46
|
+
return { ok: "unknown", detail: "Privy did not report allowed origins." };
|
|
47
|
+
}
|
|
48
|
+
const want = normOrigin(ctx.origin);
|
|
49
|
+
const hit = cfg.allowed_domains.some((d) => normOrigin(d) === want || normOrigin(d) === "*");
|
|
50
|
+
return hit ? { ok: true, detail: `${ctx.origin} is allowed.` } : { ok: false, detail: `${ctx.origin} is not in Allowed origins.` };
|
|
51
|
+
},
|
|
52
|
+
fix: "Add the exact origin, scheme, host and port, to Privy dashboard, Configuration, App settings, Allowed origins. A different dev port counts as a different origin.",
|
|
53
|
+
docsUrl: `${PRIVY_DOCS}#allowed-origins`
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "login-methods",
|
|
57
|
+
where: "dashboard",
|
|
58
|
+
label: "At least one login method is enabled",
|
|
59
|
+
required: true,
|
|
60
|
+
pillars: ["login"],
|
|
61
|
+
check: (cfg) => {
|
|
62
|
+
if (!Array.isArray(cfg.login_methods)) {
|
|
63
|
+
return { ok: "unknown", detail: "Privy did not report login methods." };
|
|
64
|
+
}
|
|
65
|
+
return cfg.login_methods.length > 0 ? { ok: true, detail: `Enabled: ${cfg.login_methods.join(", ")}.` } : { ok: false, detail: "No login methods are enabled." };
|
|
66
|
+
},
|
|
67
|
+
fix: "Enable the methods you list in loginMethods under Privy dashboard, User management, Authentication. Methods not enabled there are hidden even if listed in code.",
|
|
68
|
+
docsUrl: `${PRIVY_DOCS}#login-methods`
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "login-methods.google",
|
|
72
|
+
where: "dashboard",
|
|
73
|
+
label: "Google login is enabled",
|
|
74
|
+
required: false,
|
|
75
|
+
pillars: ["login"],
|
|
76
|
+
check: (cfg) => {
|
|
77
|
+
if (!Array.isArray(cfg.login_methods)) {
|
|
78
|
+
return { ok: "unknown", detail: "Privy did not report login methods." };
|
|
79
|
+
}
|
|
80
|
+
return cfg.login_methods.some((m) => m === "google" || m === "google_oauth") ? { ok: true, detail: "Google login is enabled." } : { ok: false, detail: "Google login is not enabled." };
|
|
81
|
+
},
|
|
82
|
+
fix: "Enable Google under Privy dashboard, User management, Authentication, Socials.",
|
|
83
|
+
docsUrl: `${PRIVY_DOCS}#google`
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "embedded-wallets",
|
|
87
|
+
where: "dashboard",
|
|
88
|
+
label: "Embedded wallets are enabled for Ethereum",
|
|
89
|
+
required: true,
|
|
90
|
+
pillars: ["login", "session", "sponsor"],
|
|
91
|
+
check: (cfg) => {
|
|
92
|
+
const eth = cfg.embedded_wallet_config?.ethereum;
|
|
93
|
+
if (!eth) return { ok: "unknown", detail: "Privy did not report the Ethereum embedded wallet config." };
|
|
94
|
+
const mode = eth.create_on_login;
|
|
95
|
+
return {
|
|
96
|
+
ok: true,
|
|
97
|
+
detail: typeof mode === "string" ? `Dashboard create-on-login is "${mode}". The SDK provisions wallets server-side either way (WalletGate).` : "Ethereum embedded wallets are configured."
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
fix: "Turn on embedded wallets for Ethereum in Privy dashboard, Wallets. Wallet creation itself is handled server-side by createEnsureWalletRoute().",
|
|
101
|
+
docsUrl: `${PRIVY_DOCS}#embedded-wallets`
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "coinbase-eoa-only",
|
|
105
|
+
where: "code",
|
|
106
|
+
label: "Coinbase Wallet is pinned to eoaOnly",
|
|
107
|
+
required: true,
|
|
108
|
+
pillars: ["login"],
|
|
109
|
+
fix: "Build the Privy config with createPepuPrivyConfig() (or use PepuPrivyProvider). Coinbase Smart Wallet does not support chain 97741.",
|
|
110
|
+
docsUrl: `${PRIVY_DOCS}#coinbase`
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: "authorization-key-quorum",
|
|
114
|
+
where: "env",
|
|
115
|
+
label: `${PRIVY_ENV.authorizationKey} is set and ${PRIVY_ENV.keyQuorumId} is its key quorum id`,
|
|
116
|
+
required: false,
|
|
117
|
+
pillars: ["session"],
|
|
118
|
+
fix: `Create an authorization key in the Privy dashboard, put the private half in ${PRIVY_ENV.authorizationKey} and its key quorum id in ${PRIVY_ENV.keyQuorumId}. A mismatch gives "No valid authorization keys or user signing keys available".`,
|
|
119
|
+
docsUrl: `${PRIVY_DOCS}#key-quorum`
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: "smart-wallets",
|
|
123
|
+
where: "dashboard",
|
|
124
|
+
label: "Smart wallets are enabled with the PEPU bundler and paymaster URLs (Privy transport only)",
|
|
125
|
+
required: false,
|
|
126
|
+
pillars: ["sponsor"],
|
|
127
|
+
check: (cfg) => cfg.smart_wallet_config === void 0 ? { ok: "unknown", detail: "Privy did not report smart wallet settings." } : { ok: true, detail: "Smart wallet settings are present." },
|
|
128
|
+
fix: "Only needed for the Privy Smart Wallets transport: add the PEPU chain with bundler and paymaster URLs under Privy dashboard, Wallets, Smart wallets. The direct transport does not need this.",
|
|
129
|
+
docsUrl: `${PRIVY_DOCS}#smart-wallets`
|
|
130
|
+
}
|
|
131
|
+
];
|
|
132
|
+
var PRIVY_APP_CONFIG_URL = "https://auth.privy.io/api/v1/apps/";
|
|
133
|
+
async function checkPrivyDashboardConfig(o) {
|
|
134
|
+
const rows = PEPU_PRIVY_REQUIREMENTS.filter((r) => r.where === "dashboard");
|
|
135
|
+
const unknownAll = (detail) => ({
|
|
136
|
+
ok: true,
|
|
137
|
+
items: rows.map((r) => ({ id: r.id, ok: "unknown", detail, fix: r.fix }))
|
|
138
|
+
});
|
|
139
|
+
const appId = o.appId?.trim() ?? "";
|
|
140
|
+
if (!appId) return unknownAll(`${PRIVY_ENV.appId} is empty, so nothing could be checked.`);
|
|
141
|
+
let cfg;
|
|
142
|
+
try {
|
|
143
|
+
const doFetch = o.fetch ?? globalThis.fetch;
|
|
144
|
+
const res = await doFetch(`${PRIVY_APP_CONFIG_URL}${encodeURIComponent(appId)}`, {
|
|
145
|
+
headers: {
|
|
146
|
+
"privy-app-id": appId,
|
|
147
|
+
...o.origin ? { origin: o.origin } : {}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
if (!res.ok) return unknownAll(`Privy's public app config returned HTTP ${res.status}.`);
|
|
151
|
+
const json = await res.json();
|
|
152
|
+
if (typeof json !== "object" || json === null) return unknownAll("Privy's public app config was not an object.");
|
|
153
|
+
cfg = json;
|
|
154
|
+
} catch {
|
|
155
|
+
return unknownAll("Could not reach Privy's public app config (network error).");
|
|
156
|
+
}
|
|
157
|
+
const items = rows.map((r) => {
|
|
158
|
+
let result = { ok: "unknown", detail: "No automatic check." };
|
|
159
|
+
if (r.check) {
|
|
160
|
+
try {
|
|
161
|
+
result = r.check(cfg, o.origin !== void 0 ? { origin: o.origin } : {});
|
|
162
|
+
} catch {
|
|
163
|
+
result = { ok: "unknown", detail: "The check could not read Privy's response." };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return result.ok === true ? { id: r.id, ok: true, detail: result.detail } : { id: r.id, ok: result.ok, detail: result.detail, fix: r.fix };
|
|
167
|
+
});
|
|
168
|
+
const ok = !items.some((i) => i.ok === false && rows.find((r) => r.id === i.id)?.required);
|
|
169
|
+
return { ok, items };
|
|
170
|
+
}
|
|
171
|
+
async function privyDashboardChecker(input) {
|
|
172
|
+
const report = await checkPrivyDashboardConfig({
|
|
173
|
+
appId: input.appId,
|
|
174
|
+
fetch: input.fetch,
|
|
175
|
+
...input.origin !== void 0 ? { origin: input.origin } : {}
|
|
176
|
+
});
|
|
177
|
+
return input.requirementKeys.map((key) => {
|
|
178
|
+
const id = `privy.${key}`;
|
|
179
|
+
const row = PEPU_PRIVY_REQUIREMENTS.find((r) => r.id === key);
|
|
180
|
+
if (!row) {
|
|
181
|
+
return { id, status: "fail", message: `Unknown Privy requirement key "${key}".`, fix: "Use a key from PEPU_PRIVY_REQUIREMENTS." };
|
|
182
|
+
}
|
|
183
|
+
if (row.where !== "dashboard") {
|
|
184
|
+
return { id, status: "skip", message: `${row.label}: checked by the env/code checks, not the dashboard.` };
|
|
185
|
+
}
|
|
186
|
+
const item = report.items.find((i) => i.id === key);
|
|
187
|
+
if (!item || item.ok === "unknown") {
|
|
188
|
+
return { id, status: "warn", message: `${row.label}: could not be verified. ${item?.detail ?? ""}`.trim(), fix: row.fix };
|
|
189
|
+
}
|
|
190
|
+
return item.ok ? { id, status: "pass", message: `${row.label}: ${item.detail}` } : { id, status: "fail", message: `${row.label}: ${item.detail}`, fix: row.fix };
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
exports.PEPU_PRIVY_REQUIREMENTS = PEPU_PRIVY_REQUIREMENTS;
|
|
195
|
+
exports.PRIVY_ENV = PRIVY_ENV;
|
|
196
|
+
exports.PRIVY_ENV_ALIASES = PRIVY_ENV_ALIASES;
|
|
197
|
+
exports.checkPrivyDashboardConfig = checkPrivyDashboardConfig;
|
|
198
|
+
exports.privyDashboardChecker = privyDashboardChecker;
|
|
199
|
+
//# sourceMappingURL=chunk-C2XW44FI.cjs.map
|
|
200
|
+
//# sourceMappingURL=chunk-C2XW44FI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/privy/requirements.ts"],"names":[],"mappings":"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","file":"chunk-C2XW44FI.cjs","sourcesContent":["/**\n * Privy requirements table and dashboard check (`@pepu-chain/sdk/privy`).\n * Client-safe: no secrets, no Privy packages. Re-exported from `config.ts`.\n */\n\n/** Environment variable names the Privy layer reads. Names only, never values. */\nexport const PRIVY_ENV = {\n appId: \"NEXT_PUBLIC_PRIVY_APP_ID\",\n appSecret: \"PRIVY_APP_SECRET\",\n authorizationKey: \"PRIVY_AUTHORIZATION_KEY\",\n keyQuorumId: \"NEXT_PUBLIC_PRIVY_KEY_QUORUM_ID\",\n} as const;\n\n/**\n * Accepted fallback names, read only when the canonical {@link PRIVY_ENV} name\n * is empty. The canonical name is what docs, the doctor and error messages use.\n */\nexport const PRIVY_ENV_ALIASES = {\n appId: [\"PRIVY_APP_ID\"],\n appSecret: [],\n authorizationKey: [],\n keyQuorumId: [\"PRIVY_KEY_QUORUM_ID\"],\n} as const satisfies Record<keyof typeof PRIVY_ENV, readonly string[]>;\n\n/**\n * The subset of Privy's public app-config response this SDK looks at. Every\n * field is optional: the endpoint is undocumented, so a missing field means\n * \"unknown\", never \"wrong\".\n */\nexport interface PrivyPublicAppConfig {\n /** Origins the dashboard allows (scheme, host and port). */\n allowed_domains?: string[];\n /** Enabled login methods, e.g. `\"google_oauth\"`, `\"email\"`, `\"wallet\"`. */\n login_methods?: string[];\n embedded_wallet_config?: {\n ethereum?: { create_on_login?: string };\n [key: string]: unknown;\n };\n smart_wallet_config?: unknown;\n [key: string]: unknown;\n}\n\n/** Result of one requirement check. `\"unknown\"` means it could not be verified. */\nexport interface PrivyRequirementResult {\n ok: boolean | \"unknown\";\n detail: string;\n}\n\n/** One row of {@link PEPU_PRIVY_REQUIREMENTS}. */\nexport interface PrivyRequirement {\n id: string;\n where: \"dashboard\" | \"env\" | \"code\";\n label: string;\n required: boolean;\n pillars: (\"login\" | \"session\" | \"sponsor\")[];\n /** Only dashboard rows have a check, and it only sees Privy's public app config. */\n check?: (cfg: PrivyPublicAppConfig, ctx: { origin?: string }) => PrivyRequirementResult;\n fix: string;\n docsUrl: string;\n}\n\nconst PRIVY_DOCS = \"https://guide.pepeunchained.com/privy\";\n\nconst normOrigin = (o: string): string => o.trim().replace(/\\/+$/, \"\").toLowerCase();\n\n/**\n * Everything a PEPU app needs from Privy, as one data table. It feeds the docs,\n * the MCP `pepu_check_privy_config` tool, the CLI `doctor` and in-app notices.\n *\n * @example\n * ```ts\n * import { PEPU_PRIVY_REQUIREMENTS } from \"@pepu-chain/sdk/privy\";\n * const forSessions = PEPU_PRIVY_REQUIREMENTS.filter((r) => r.pillars.includes(\"session\"));\n * ```\n */\nexport const PEPU_PRIVY_REQUIREMENTS: readonly PrivyRequirement[] = [\n {\n id: \"app-id\",\n where: \"env\",\n label: `${PRIVY_ENV.appId} is set`,\n required: true,\n pillars: [\"login\", \"session\", \"sponsor\"],\n fix: `Copy the App ID from the Privy dashboard (Settings, Basics) into ${PRIVY_ENV.appId}.`,\n docsUrl: `${PRIVY_DOCS}#app-id`,\n },\n {\n id: \"app-secret\",\n where: \"env\",\n label: `${PRIVY_ENV.appSecret} is set (server only)`,\n required: true,\n pillars: [\"login\", \"session\", \"sponsor\"],\n fix: `Create an app secret in the Privy dashboard and put it in ${PRIVY_ENV.appSecret}. Never prefix it with NEXT_PUBLIC_.`,\n docsUrl: `${PRIVY_DOCS}#app-secret`,\n },\n {\n id: \"allowed-origins\",\n where: \"dashboard\",\n label: \"The page origin (including the port) is in Allowed origins\",\n required: true,\n pillars: [\"login\", \"session\", \"sponsor\"],\n check: (cfg, ctx) => {\n if (!ctx.origin) return { ok: \"unknown\", detail: \"No origin was given to check.\" };\n if (!Array.isArray(cfg.allowed_domains)) {\n return { ok: \"unknown\", detail: \"Privy did not report allowed origins.\" };\n }\n const want = normOrigin(ctx.origin);\n const hit = cfg.allowed_domains.some((d) => normOrigin(d) === want || normOrigin(d) === \"*\");\n return hit\n ? { ok: true, detail: `${ctx.origin} is allowed.` }\n : { ok: false, detail: `${ctx.origin} is not in Allowed origins.` };\n },\n fix: \"Add the exact origin, scheme, host and port, to Privy dashboard, Configuration, App settings, Allowed origins. A different dev port counts as a different origin.\",\n docsUrl: `${PRIVY_DOCS}#allowed-origins`,\n },\n {\n id: \"login-methods\",\n where: \"dashboard\",\n label: \"At least one login method is enabled\",\n required: true,\n pillars: [\"login\"],\n check: (cfg) => {\n if (!Array.isArray(cfg.login_methods)) {\n return { ok: \"unknown\", detail: \"Privy did not report login methods.\" };\n }\n return cfg.login_methods.length > 0\n ? { ok: true, detail: `Enabled: ${cfg.login_methods.join(\", \")}.` }\n : { ok: false, detail: \"No login methods are enabled.\" };\n },\n fix: \"Enable the methods you list in loginMethods under Privy dashboard, User management, Authentication. Methods not enabled there are hidden even if listed in code.\",\n docsUrl: `${PRIVY_DOCS}#login-methods`,\n },\n {\n id: \"login-methods.google\",\n where: \"dashboard\",\n label: \"Google login is enabled\",\n required: false,\n pillars: [\"login\"],\n check: (cfg) => {\n if (!Array.isArray(cfg.login_methods)) {\n return { ok: \"unknown\", detail: \"Privy did not report login methods.\" };\n }\n return cfg.login_methods.some((m) => m === \"google\" || m === \"google_oauth\")\n ? { ok: true, detail: \"Google login is enabled.\" }\n : { ok: false, detail: \"Google login is not enabled.\" };\n },\n fix: \"Enable Google under Privy dashboard, User management, Authentication, Socials.\",\n docsUrl: `${PRIVY_DOCS}#google`,\n },\n {\n id: \"embedded-wallets\",\n where: \"dashboard\",\n label: \"Embedded wallets are enabled for Ethereum\",\n required: true,\n pillars: [\"login\", \"session\", \"sponsor\"],\n check: (cfg) => {\n const eth = cfg.embedded_wallet_config?.ethereum;\n if (!eth) return { ok: \"unknown\", detail: \"Privy did not report the Ethereum embedded wallet config.\" };\n const mode = eth.create_on_login;\n return {\n ok: true,\n detail:\n typeof mode === \"string\"\n ? `Dashboard create-on-login is \"${mode}\". The SDK provisions wallets server-side either way (WalletGate).`\n : \"Ethereum embedded wallets are configured.\",\n };\n },\n fix: \"Turn on embedded wallets for Ethereum in Privy dashboard, Wallets. Wallet creation itself is handled server-side by createEnsureWalletRoute().\",\n docsUrl: `${PRIVY_DOCS}#embedded-wallets`,\n },\n {\n id: \"coinbase-eoa-only\",\n where: \"code\",\n label: \"Coinbase Wallet is pinned to eoaOnly\",\n required: true,\n pillars: [\"login\"],\n fix: \"Build the Privy config with createPepuPrivyConfig() (or use PepuPrivyProvider). Coinbase Smart Wallet does not support chain 97741.\",\n docsUrl: `${PRIVY_DOCS}#coinbase`,\n },\n {\n id: \"authorization-key-quorum\",\n where: \"env\",\n label: `${PRIVY_ENV.authorizationKey} is set and ${PRIVY_ENV.keyQuorumId} is its key quorum id`,\n required: false,\n pillars: [\"session\"],\n fix: `Create an authorization key in the Privy dashboard, put the private half in ${PRIVY_ENV.authorizationKey} and its key quorum id in ${PRIVY_ENV.keyQuorumId}. A mismatch gives \"No valid authorization keys or user signing keys available\".`,\n docsUrl: `${PRIVY_DOCS}#key-quorum`,\n },\n {\n id: \"smart-wallets\",\n where: \"dashboard\",\n label: \"Smart wallets are enabled with the PEPU bundler and paymaster URLs (Privy transport only)\",\n required: false,\n pillars: [\"sponsor\"],\n check: (cfg) =>\n cfg.smart_wallet_config === undefined\n ? { ok: \"unknown\", detail: \"Privy did not report smart wallet settings.\" }\n : { ok: true, detail: \"Smart wallet settings are present.\" },\n fix: \"Only needed for the Privy Smart Wallets transport: add the PEPU chain with bundler and paymaster URLs under Privy dashboard, Wallets, Smart wallets. The direct transport does not need this.\",\n docsUrl: `${PRIVY_DOCS}#smart-wallets`,\n },\n];\n\n/**\n * Privy's public app-config endpoint, the one the browser SDK calls itself.\n * Confirmed live: an unknown app id returns HTTP 400\n * `missing_or_invalid_privy_app_id`. The response fields below are NOT\n * verified against a real app (no app id was available when this was written),\n * so every field is treated as optional and maps to \"unknown\" when absent.\n */\nconst PRIVY_APP_CONFIG_URL = \"https://auth.privy.io/api/v1/apps/\";\n\n/** One row of a {@link checkPrivyDashboardConfig} result. */\nexport interface PrivyDashboardCheckItem {\n id: string;\n ok: boolean | \"unknown\";\n detail: string;\n fix?: string;\n}\n\n/**\n * Check the Privy dashboard settings that can be read without a secret, by\n * calling the public app-config endpoint the browser SDK itself uses. Best\n * effort and never throws: anything that cannot be verified (network error,\n * non-200, field missing) is reported as `\"unknown\"`, not as a failure.\n *\n * Only `where: \"dashboard\"` requirements are returned. Env and code\n * requirements cannot be checked from here.\n *\n * @example\n * ```ts\n * import { checkPrivyDashboardConfig } from \"@pepu-chain/sdk/privy\";\n * const r = await checkPrivyDashboardConfig({ appId: \"cl...\", origin: \"http://localhost:3001\" });\n * for (const i of r.items.filter((i) => i.ok === false)) console.log(i.id, i.fix);\n * ```\n */\nexport async function checkPrivyDashboardConfig(o: {\n appId: string;\n origin?: string;\n fetch?: typeof fetch;\n}): Promise<{ ok: boolean; items: PrivyDashboardCheckItem[] }> {\n const rows = PEPU_PRIVY_REQUIREMENTS.filter((r) => r.where === \"dashboard\");\n const unknownAll = (detail: string): { ok: boolean; items: PrivyDashboardCheckItem[] } => ({\n ok: true,\n items: rows.map((r) => ({ id: r.id, ok: \"unknown\", detail, fix: r.fix })),\n });\n\n const appId = o.appId?.trim() ?? \"\";\n if (!appId) return unknownAll(`${PRIVY_ENV.appId} is empty, so nothing could be checked.`);\n\n let cfg: PrivyPublicAppConfig;\n try {\n const doFetch = o.fetch ?? globalThis.fetch;\n const res = await doFetch(`${PRIVY_APP_CONFIG_URL}${encodeURIComponent(appId)}`, {\n headers: {\n \"privy-app-id\": appId,\n ...(o.origin ? { origin: o.origin } : {}),\n },\n });\n if (!res.ok) return unknownAll(`Privy's public app config returned HTTP ${res.status}.`);\n const json: unknown = await res.json();\n if (typeof json !== \"object\" || json === null) return unknownAll(\"Privy's public app config was not an object.\");\n cfg = json as PrivyPublicAppConfig;\n } catch {\n return unknownAll(\"Could not reach Privy's public app config (network error).\");\n }\n\n const items = rows.map((r): PrivyDashboardCheckItem => {\n let result: PrivyRequirementResult = { ok: \"unknown\", detail: \"No automatic check.\" };\n if (r.check) {\n try {\n result = r.check(cfg, o.origin !== undefined ? { origin: o.origin } : {});\n } catch {\n result = { ok: \"unknown\", detail: \"The check could not read Privy's response.\" };\n }\n }\n return result.ok === true\n ? { id: r.id, ok: true, detail: result.detail }\n : { id: r.id, ok: result.ok, detail: result.detail, fix: r.fix };\n });\n // Only a definite failure of a required row fails the report.\n const ok = !items.some((i) => i.ok === false && rows.find((r) => r.id === i.id)?.required);\n return { ok, items };\n}\n\n/**\n * Structurally identical to `DoctorCheck` in `@pepu-chain/sdk/doctor`\n * (defined locally so `/privy` does not import `/doctor`).\n */\nexport interface PrivyDoctorCheck {\n id: string;\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n fix?: string;\n}\n\n/**\n * Adapter matching `PrivyDashboardChecker` from `@pepu-chain/sdk/doctor`, so the\n * doctor can run the Privy dashboard checks: pass it as the doctor's injected\n * checker. Unknown keys fail, env and code rows are skipped (the doctor's env\n * check covers them), and anything Privy did not report is a warning, not a\n * failure. `appSecret` is accepted for signature compatibility and never used\n * or logged. Messages contain no URLs or values.\n *\n * @example\n * ```ts\n * import { privyDashboardChecker } from \"@pepu-chain/sdk/privy\";\n * const checks = await privyDashboardChecker({ appId, requirementKeys: [\"login-methods\"], fetch });\n * ```\n */\nexport async function privyDashboardChecker(input: {\n appId: string;\n requirementKeys: string[];\n appSecret?: string;\n fetch: typeof fetch;\n origin?: string;\n}): Promise<PrivyDoctorCheck[]> {\n const report = await checkPrivyDashboardConfig({\n appId: input.appId,\n fetch: input.fetch,\n ...(input.origin !== undefined ? { origin: input.origin } : {}),\n });\n return input.requirementKeys.map((key): PrivyDoctorCheck => {\n const id = `privy.${key}`;\n const row = PEPU_PRIVY_REQUIREMENTS.find((r) => r.id === key);\n if (!row) {\n return { id, status: \"fail\", message: `Unknown Privy requirement key \"${key}\".`, fix: \"Use a key from PEPU_PRIVY_REQUIREMENTS.\" };\n }\n if (row.where !== \"dashboard\") {\n return { id, status: \"skip\", message: `${row.label}: checked by the env/code checks, not the dashboard.` };\n }\n const item = report.items.find((i) => i.id === key);\n if (!item || item.ok === \"unknown\") {\n return { id, status: \"warn\", message: `${row.label}: could not be verified. ${item?.detail ?? \"\"}`.trim(), fix: row.fix };\n }\n return item.ok\n ? { id, status: \"pass\", message: `${row.label}: ${item.detail}` }\n : { id, status: \"fail\", message: `${row.label}: ${item.detail}`, fix: row.fix };\n });\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var viem = require('viem');
|
|
4
|
+
|
|
5
|
+
// src/client.ts
|
|
6
|
+
function getPublicClient(chain, options) {
|
|
7
|
+
const transport = options?.transport ?? viem.http();
|
|
8
|
+
return viem.createPublicClient({ chain, transport });
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
exports.getPublicClient = getPublicClient;
|
|
12
|
+
//# sourceMappingURL=chunk-C7IC36XS.cjs.map
|
|
13
|
+
//# sourceMappingURL=chunk-C7IC36XS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"names":["http","createPublicClient"],"mappings":";;;;;AAWO,SAAS,eAAA,CACd,OACA,OAAA,EACoC;AAIpC,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAaA,SAAA,EAAK;AAC7C,EAAA,OAAOC,uBAAA,CAAmB,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAChD","file":"chunk-C7IC36XS.cjs","sourcesContent":["import { type PublicClient, type Transport, createPublicClient, http } from \"viem\";\n\nimport type { PepuChain } from \"./chains.js\";\n\n/**\n * Create a viem `PublicClient` for a Pepe Unchained V2 chain, defaulting\n * its transport to the chain's first `rpcUrls.default.http` entry.\n *\n * Pass `transport` to use a different RPC endpoint (e.g. an authenticated\n * provider URL) while keeping the rest of the chain definition.\n */\nexport function getPublicClient(\n chain: PepuChain,\n options?: { transport?: Transport },\n): PublicClient<Transport, PepuChain> {\n // `http()` with no URL falls back to `chain.rpcUrls.default.http[0]`\n // internally (see viem's `http` transport), so the chain definition\n // stays the single source of truth for the default RPC endpoint.\n const transport = options?.transport ?? http();\n return createPublicClient({ chain, transport });\n}\n"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { PepuPaymasterError, PepuBundlerError, explainError, toPepuError, getErrorEntry } from './chunk-6DSZ4Z2N.js';
|
|
2
|
+
|
|
3
|
+
// src/aa/describe.ts
|
|
4
|
+
var AA_HINTS = {
|
|
5
|
+
AA10: { code: "BUNDLER_AA_FAILED", hint: "The sender is already deployed but initCode was sent. Drop the factory fields." },
|
|
6
|
+
AA13: { code: "BUNDLER_AA_FAILED", hint: "initCode (account factory) reverted. Check the Kernel factory address and the owner." },
|
|
7
|
+
AA14: { code: "BUNDLER_AA_FAILED", hint: "initCode deployed a different address than the sender. Rebuild the account with the same owner and index." },
|
|
8
|
+
AA20: { code: "BUNDLER_AA_FAILED", hint: "The account is not deployed and no initCode was sent. Use a fresh account object so the factory fields are included." },
|
|
9
|
+
AA21: { code: "BUNDLER_AA_FAILED", hint: "The account cannot pay its prefund. Use the paymaster, or fund the account." },
|
|
10
|
+
AA22: { code: "BUNDLER_AA_FAILED", hint: "The UserOperation's validity window expired. Resend a fresh one." },
|
|
11
|
+
AA23: { code: "BUNDLER_AA_FAILED", hint: "Account validation reverted: wrong signer, wrong signature format, or a session policy rejected the call." },
|
|
12
|
+
AA24: { code: "BUNDLER_AA_FAILED", hint: "Signature rejected by the account. Sign with the owner the account was built for." },
|
|
13
|
+
AA25: { code: "BUNDLER_AA_FAILED", hint: "Invalid nonce: another UserOperation from this account is pending. Wait for it, then retry." },
|
|
14
|
+
AA26: { code: "BUNDLER_AA_FAILED", hint: "verificationGasLimit too low. Re-estimate gas." },
|
|
15
|
+
AA31: { code: "PAYMASTER_NO_BALANCE", paymaster: true, hint: "The paymaster's EntryPoint deposit is too low. Deposit more PEPU to the paymaster." },
|
|
16
|
+
AA32: { code: "PAYMASTER_DENIED", paymaster: true, hint: "The paymaster signature expired. Request paymaster data again." },
|
|
17
|
+
AA33: { code: "PAYMASTER_DENIED", paymaster: true, hint: "Paymaster validation reverted. Check the paymaster contract and that its signer matches the policy service." },
|
|
18
|
+
AA34: { code: "PAYMASTER_DENIED", paymaster: true, hint: "Paymaster signature rejected. The policy service signer does not match the paymaster contract." },
|
|
19
|
+
AA36: { code: "BUNDLER_AA_FAILED", paymaster: true, hint: "Paymaster gas limits too low. Re-estimate with the paymaster stub data." },
|
|
20
|
+
AA40: { code: "BUNDLER_AA_FAILED", hint: "Verification used more gas than verificationGasLimit. Re-estimate gas." },
|
|
21
|
+
AA41: { code: "BUNDLER_AA_FAILED", hint: "Paymaster verification used more gas than its limit. Re-estimate gas." },
|
|
22
|
+
AA50: { code: "BUNDLER_AA_FAILED", hint: "The postOp reverted. Check the paymaster's postOp path." },
|
|
23
|
+
AA51: { code: "BUNDLER_AA_FAILED", hint: "Prefund below actualGasCost. Re-estimate fees; PEPU needs fee headroom (the SDK applies 20%)." },
|
|
24
|
+
AA90: { code: "BUNDLER_AA_FAILED", hint: "Invalid beneficiary on handleOps. This is a bundler configuration problem." },
|
|
25
|
+
AA91: { code: "BUNDLER_AA_FAILED", hint: "Failed to send funds to the beneficiary. This is a bundler configuration problem." },
|
|
26
|
+
AA95: { code: "BUNDLER_AA_FAILED", hint: "Out of gas in handleOps. Raise the gas limits." }
|
|
27
|
+
};
|
|
28
|
+
function redactSecrets(text) {
|
|
29
|
+
return text.replace(/\/paymaster\/[^\s/"'`)\]?#]+/gi, "/paymaster/[redacted]").replace(/(bearer\s+)[A-Za-z0-9._~+/=-]+/gi, "$1[redacted]").replace(/(x-api-key["']?\s*[:=]\s*["']?)[^\s"',}]+/gi, "$1[redacted]").replace(/(privyAccessToken["']?\s*[:=]\s*["']?)[^\s"',}]+/gi, "$1[redacted]").replace(/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]*/g, "[redacted-jwt]").replace(/(https?:\/\/)[^\s/@]+:[^\s/@]+@/gi, "$1[redacted]@");
|
|
30
|
+
}
|
|
31
|
+
function collect(e) {
|
|
32
|
+
const seen = /* @__PURE__ */ new Set();
|
|
33
|
+
const parts = [];
|
|
34
|
+
let cur = e;
|
|
35
|
+
for (let d = 0; d < 8 && cur !== void 0 && cur !== null && !seen.has(cur); d++) {
|
|
36
|
+
seen.add(cur);
|
|
37
|
+
if (typeof cur === "object") {
|
|
38
|
+
const o = cur;
|
|
39
|
+
for (const k of ["shortMessage", "message", "details", "reason"]) {
|
|
40
|
+
const v = o[k];
|
|
41
|
+
if (typeof v === "string" && v.length > 0 && !parts.includes(v)) parts.push(v);
|
|
42
|
+
}
|
|
43
|
+
const data = o["data"];
|
|
44
|
+
if (data && typeof data === "object") {
|
|
45
|
+
const r = data["reason"];
|
|
46
|
+
if (typeof r === "string") parts.push(r);
|
|
47
|
+
}
|
|
48
|
+
cur = o["cause"];
|
|
49
|
+
} else {
|
|
50
|
+
parts.push(String(cur));
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return parts.join("\n");
|
|
55
|
+
}
|
|
56
|
+
function describeUserOpFailure(e) {
|
|
57
|
+
const text = redactSecrets(collect(e));
|
|
58
|
+
const headline = text.split("\n")[0]?.trim() || "UserOperation failed";
|
|
59
|
+
const opts = (hint) => ({ ...hint ? { hint } : {}, cause: e });
|
|
60
|
+
const aa = /\bAA(\d{2})\b/.exec(text);
|
|
61
|
+
if (aa) {
|
|
62
|
+
const key = `AA${aa[1]}`;
|
|
63
|
+
const info = AA_HINTS[key];
|
|
64
|
+
if (info) {
|
|
65
|
+
const msg = `${key}: ${headline}`;
|
|
66
|
+
return info.paymaster && info.code !== "BUNDLER_AA_FAILED" ? new PepuPaymasterError(info.code, msg, opts(info.hint)) : new PepuBundlerError(info.code, msg, opts(info.hint));
|
|
67
|
+
}
|
|
68
|
+
return new PepuBundlerError("BUNDLER_AA_FAILED", `${key}: ${headline}`, opts());
|
|
69
|
+
}
|
|
70
|
+
const explained = explainError(text);
|
|
71
|
+
if (explained.code.startsWith("PAYMASTER_")) {
|
|
72
|
+
return new PepuPaymasterError(explained.code, headline, opts(explained.fix));
|
|
73
|
+
}
|
|
74
|
+
if (explained.code !== "UNKNOWN") {
|
|
75
|
+
return new PepuBundlerError(explained.code, headline, opts(explained.fix));
|
|
76
|
+
}
|
|
77
|
+
const pe = toPepuError(e);
|
|
78
|
+
if (pe.code !== "UNKNOWN") return new PepuBundlerError(pe.code, redactSecrets(pe.message), opts(pe.hint));
|
|
79
|
+
return new PepuBundlerError("UNKNOWN", headline, opts(getErrorEntry("UNKNOWN").fix));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export { describeUserOpFailure, redactSecrets };
|
|
83
|
+
//# sourceMappingURL=chunk-D52PADVY.js.map
|
|
84
|
+
//# sourceMappingURL=chunk-D52PADVY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/aa/describe.ts"],"names":[],"mappings":"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","file":"chunk-D52PADVY.js","sourcesContent":["import { PepuBundlerError, PepuPaymasterError, explainError, getErrorEntry, toPepuError } from \"../errors.js\";\nimport type { PepuErrorCode } from \"../errors.js\";\n\ninterface AaInfo {\n code: PepuErrorCode;\n paymaster?: boolean;\n hint: string;\n}\n\n/**\n * AAxx meaning, per the EntryPoint v0.7 revert reasons, with the PEPU-specific\n * fix. Ported from the sponsored-demo and sponsored-session-app runs.\n */\nconst AA_HINTS: Readonly<Record<string, AaInfo>> = {\n AA10: { code: \"BUNDLER_AA_FAILED\", hint: \"The sender is already deployed but initCode was sent. Drop the factory fields.\" },\n AA13: { code: \"BUNDLER_AA_FAILED\", hint: \"initCode (account factory) reverted. Check the Kernel factory address and the owner.\" },\n AA14: { code: \"BUNDLER_AA_FAILED\", hint: \"initCode deployed a different address than the sender. Rebuild the account with the same owner and index.\" },\n AA20: { code: \"BUNDLER_AA_FAILED\", hint: \"The account is not deployed and no initCode was sent. Use a fresh account object so the factory fields are included.\" },\n AA21: { code: \"BUNDLER_AA_FAILED\", hint: \"The account cannot pay its prefund. Use the paymaster, or fund the account.\" },\n AA22: { code: \"BUNDLER_AA_FAILED\", hint: \"The UserOperation's validity window expired. Resend a fresh one.\" },\n AA23: { code: \"BUNDLER_AA_FAILED\", hint: \"Account validation reverted: wrong signer, wrong signature format, or a session policy rejected the call.\" },\n AA24: { code: \"BUNDLER_AA_FAILED\", hint: \"Signature rejected by the account. Sign with the owner the account was built for.\" },\n AA25: { code: \"BUNDLER_AA_FAILED\", hint: \"Invalid nonce: another UserOperation from this account is pending. Wait for it, then retry.\" },\n AA26: { code: \"BUNDLER_AA_FAILED\", hint: \"verificationGasLimit too low. Re-estimate gas.\" },\n AA31: { code: \"PAYMASTER_NO_BALANCE\", paymaster: true, hint: \"The paymaster's EntryPoint deposit is too low. Deposit more PEPU to the paymaster.\" },\n AA32: { code: \"PAYMASTER_DENIED\", paymaster: true, hint: \"The paymaster signature expired. Request paymaster data again.\" },\n AA33: { code: \"PAYMASTER_DENIED\", paymaster: true, hint: \"Paymaster validation reverted. Check the paymaster contract and that its signer matches the policy service.\" },\n AA34: { code: \"PAYMASTER_DENIED\", paymaster: true, hint: \"Paymaster signature rejected. The policy service signer does not match the paymaster contract.\" },\n AA36: { code: \"BUNDLER_AA_FAILED\", paymaster: true, hint: \"Paymaster gas limits too low. Re-estimate with the paymaster stub data.\" },\n AA40: { code: \"BUNDLER_AA_FAILED\", hint: \"Verification used more gas than verificationGasLimit. Re-estimate gas.\" },\n AA41: { code: \"BUNDLER_AA_FAILED\", hint: \"Paymaster verification used more gas than its limit. Re-estimate gas.\" },\n AA50: { code: \"BUNDLER_AA_FAILED\", hint: \"The postOp reverted. Check the paymaster's postOp path.\" },\n AA51: { code: \"BUNDLER_AA_FAILED\", hint: \"Prefund below actualGasCost. Re-estimate fees; PEPU needs fee headroom (the SDK applies 20%).\" },\n AA90: { code: \"BUNDLER_AA_FAILED\", hint: \"Invalid beneficiary on handleOps. This is a bundler configuration problem.\" },\n AA91: { code: \"BUNDLER_AA_FAILED\", hint: \"Failed to send funds to the beneficiary. This is a bundler configuration problem.\" },\n AA95: { code: \"BUNDLER_AA_FAILED\", hint: \"Out of gas in handleOps. Raise the gas limits.\" },\n};\n\n/**\n * Remove anything credential-shaped from text that may reach a message:\n * `/paymaster/<token>` URL paths, bearer tokens, API keys, JWTs and URL\n * credentials.\n *\n * @example\n * redactSecrets(\"POST https://pm.example/paymaster/sk_live_123 failed\");\n * // \"POST https://pm.example/paymaster/[redacted] failed\"\n */\nexport function redactSecrets(text: string): string {\n return text\n .replace(/\\/paymaster\\/[^\\s/\"'`)\\]?#]+/gi, \"/paymaster/[redacted]\")\n .replace(/(bearer\\s+)[A-Za-z0-9._~+/=-]+/gi, \"$1[redacted]\")\n .replace(/(x-api-key[\"']?\\s*[:=]\\s*[\"']?)[^\\s\"',}]+/gi, \"$1[redacted]\")\n .replace(/(privyAccessToken[\"']?\\s*[:=]\\s*[\"']?)[^\\s\"',}]+/gi, \"$1[redacted]\")\n .replace(/\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]*/g, \"[redacted-jwt]\")\n .replace(/(https?:\\/\\/)[^\\s/@]+:[^\\s/@]+@/gi, \"$1[redacted]@\");\n}\n\nfunction collect(e: unknown): string {\n const seen = new Set<unknown>();\n const parts: string[] = [];\n let cur: unknown = e;\n for (let d = 0; d < 8 && cur !== undefined && cur !== null && !seen.has(cur); d++) {\n seen.add(cur);\n if (typeof cur === \"object\") {\n const o = cur as Record<string, unknown>;\n for (const k of [\"shortMessage\", \"message\", \"details\", \"reason\"]) {\n const v = o[k];\n if (typeof v === \"string\" && v.length > 0 && !parts.includes(v)) parts.push(v);\n }\n const data = o[\"data\"];\n if (data && typeof data === \"object\") {\n const r = (data as Record<string, unknown>)[\"reason\"];\n if (typeof r === \"string\") parts.push(r);\n }\n cur = o[\"cause\"];\n } else {\n parts.push(String(cur));\n break;\n }\n }\n return parts.join(\"\\n\");\n}\n\n/**\n * Turn anything thrown by the bundler, paymaster or viem/Privy stack into a\n * typed PepuError. Walks the `cause` chain (viem's `details` is where the\n * paymaster's real denial reason lives; Privy's own log prints\n * `[object Error]`), maps `AA10`..`AA9x` to a fix, maps paymaster reason codes\n * through the error catalog, and redacts tokens and URL credentials.\n * Port of `templates/sponsored-demo/lib/describe-error.ts`.\n *\n * @example\n * try { await sendSponsored({ client, calls }); }\n * catch (e) { const err = describeUserOpFailure(e); console.log(err.code, err.hint); }\n */\nexport function describeUserOpFailure(e: unknown): PepuBundlerError | PepuPaymasterError {\n const text = redactSecrets(collect(e));\n const headline = text.split(\"\\n\")[0]?.trim() || \"UserOperation failed\";\n const opts = (hint?: string) => ({ ...(hint ? { hint } : {}), cause: e });\n\n const aa = /\\bAA(\\d{2})\\b/.exec(text);\n if (aa) {\n const key = `AA${aa[1]}`;\n const info = AA_HINTS[key];\n if (info) {\n const msg = `${key}: ${headline}`;\n return info.paymaster && info.code !== \"BUNDLER_AA_FAILED\"\n ? new PepuPaymasterError(info.code, msg, opts(info.hint))\n : new PepuBundlerError(info.code, msg, opts(info.hint));\n }\n return new PepuBundlerError(\"BUNDLER_AA_FAILED\", `${key}: ${headline}`, opts());\n }\n\n const explained = explainError(text);\n if (explained.code.startsWith(\"PAYMASTER_\")) {\n return new PepuPaymasterError(explained.code, headline, opts(explained.fix));\n }\n if (explained.code !== \"UNKNOWN\") {\n return new PepuBundlerError(explained.code, headline, opts(explained.fix));\n }\n const pe = toPepuError(e);\n if (pe.code !== \"UNKNOWN\") return new PepuBundlerError(pe.code, redactSecrets(pe.message), opts(pe.hint));\n return new PepuBundlerError(\"UNKNOWN\", headline, opts(getErrorEntry(\"UNKNOWN\").fix));\n}\n"]}
|