@arc402/daemon 1.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.
Files changed (122) hide show
  1. package/bin/arc402-daemon +3 -0
  2. package/dist/abis.d.ts +20 -0
  3. package/dist/abis.d.ts.map +1 -0
  4. package/dist/abis.js +214 -0
  5. package/dist/abis.js.map +1 -0
  6. package/dist/api.d.ts +32 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +430 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/auth-server.d.ts +50 -0
  11. package/dist/auth-server.d.ts.map +1 -0
  12. package/dist/auth-server.js +266 -0
  13. package/dist/auth-server.js.map +1 -0
  14. package/dist/bundler.d.ts +68 -0
  15. package/dist/bundler.d.ts.map +1 -0
  16. package/dist/bundler.js +181 -0
  17. package/dist/bundler.js.map +1 -0
  18. package/dist/capabilities.d.ts +17 -0
  19. package/dist/capabilities.d.ts.map +1 -0
  20. package/dist/capabilities.js +57 -0
  21. package/dist/capabilities.js.map +1 -0
  22. package/dist/compute-metering.d.ts +61 -0
  23. package/dist/compute-metering.d.ts.map +1 -0
  24. package/dist/compute-metering.js +299 -0
  25. package/dist/compute-metering.js.map +1 -0
  26. package/dist/compute-session.d.ts +100 -0
  27. package/dist/compute-session.d.ts.map +1 -0
  28. package/dist/compute-session.js +231 -0
  29. package/dist/compute-session.js.map +1 -0
  30. package/dist/config.d.ts +121 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +397 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/context-manager.d.ts +17 -0
  35. package/dist/context-manager.d.ts.map +1 -0
  36. package/dist/context-manager.js +123 -0
  37. package/dist/context-manager.js.map +1 -0
  38. package/dist/credentials.d.ts +24 -0
  39. package/dist/credentials.d.ts.map +1 -0
  40. package/dist/credentials.js +80 -0
  41. package/dist/credentials.js.map +1 -0
  42. package/dist/delivery-client.d.ts +35 -0
  43. package/dist/delivery-client.d.ts.map +1 -0
  44. package/dist/delivery-client.js +231 -0
  45. package/dist/delivery-client.js.map +1 -0
  46. package/dist/endpoint-policy.d.ts +11 -0
  47. package/dist/endpoint-policy.d.ts.map +1 -0
  48. package/dist/endpoint-policy.js +107 -0
  49. package/dist/endpoint-policy.js.map +1 -0
  50. package/dist/event-watchers.d.ts +11 -0
  51. package/dist/event-watchers.d.ts.map +1 -0
  52. package/dist/event-watchers.js +24 -0
  53. package/dist/event-watchers.js.map +1 -0
  54. package/dist/exec-state.d.ts +37 -0
  55. package/dist/exec-state.d.ts.map +1 -0
  56. package/dist/exec-state.js +53 -0
  57. package/dist/exec-state.js.map +1 -0
  58. package/dist/file-delivery.d.ts +98 -0
  59. package/dist/file-delivery.d.ts.map +1 -0
  60. package/dist/file-delivery.js +473 -0
  61. package/dist/file-delivery.js.map +1 -0
  62. package/dist/handshake-watcher.d.ts +31 -0
  63. package/dist/handshake-watcher.d.ts.map +1 -0
  64. package/dist/handshake-watcher.js +157 -0
  65. package/dist/handshake-watcher.js.map +1 -0
  66. package/dist/hire-listener.d.ts +32 -0
  67. package/dist/hire-listener.d.ts.map +1 -0
  68. package/dist/hire-listener.js +237 -0
  69. package/dist/hire-listener.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +182 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/job-lifecycle.d.ts +62 -0
  75. package/dist/job-lifecycle.d.ts.map +1 -0
  76. package/dist/job-lifecycle.js +201 -0
  77. package/dist/job-lifecycle.js.map +1 -0
  78. package/dist/notify.d.ts +51 -0
  79. package/dist/notify.d.ts.map +1 -0
  80. package/dist/notify.js +276 -0
  81. package/dist/notify.js.map +1 -0
  82. package/dist/permission-gate.d.ts +30 -0
  83. package/dist/permission-gate.d.ts.map +1 -0
  84. package/dist/permission-gate.js +180 -0
  85. package/dist/permission-gate.js.map +1 -0
  86. package/dist/prompt-guard.d.ts +18 -0
  87. package/dist/prompt-guard.d.ts.map +1 -0
  88. package/dist/prompt-guard.js +70 -0
  89. package/dist/prompt-guard.js.map +1 -0
  90. package/dist/server.d.ts +27 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +1956 -0
  93. package/dist/server.js.map +1 -0
  94. package/dist/session-manager.d.ts +55 -0
  95. package/dist/session-manager.d.ts.map +1 -0
  96. package/dist/session-manager.js +139 -0
  97. package/dist/session-manager.js.map +1 -0
  98. package/dist/signer.d.ts +19 -0
  99. package/dist/signer.d.ts.map +1 -0
  100. package/dist/signer.js +195 -0
  101. package/dist/signer.js.map +1 -0
  102. package/dist/token-metering.d.ts +42 -0
  103. package/dist/token-metering.d.ts.map +1 -0
  104. package/dist/token-metering.js +178 -0
  105. package/dist/token-metering.js.map +1 -0
  106. package/dist/userops.d.ts +24 -0
  107. package/dist/userops.d.ts.map +1 -0
  108. package/dist/userops.js +156 -0
  109. package/dist/userops.js.map +1 -0
  110. package/dist/wallet-monitor.d.ts +16 -0
  111. package/dist/wallet-monitor.d.ts.map +1 -0
  112. package/dist/wallet-monitor.js +57 -0
  113. package/dist/wallet-monitor.js.map +1 -0
  114. package/dist/worker-executor.d.ts +81 -0
  115. package/dist/worker-executor.d.ts.map +1 -0
  116. package/dist/worker-executor.js +527 -0
  117. package/dist/worker-executor.js.map +1 -0
  118. package/dist/worker-router.d.ts +63 -0
  119. package/dist/worker-router.d.ts.map +1 -0
  120. package/dist/worker-router.js +263 -0
  121. package/dist/worker-router.js.map +1 -0
  122. package/package.json +30 -0
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildChallengeMessage = buildChallengeMessage;
37
+ exports.issueAuthChallenge = issueAuthChallenge;
38
+ exports.consumeAuthChallenge = consumeAuthChallenge;
39
+ exports.registerAuthRoutes = registerAuthRoutes;
40
+ /**
41
+ * RemoteAuth — owner key challenge-response (Spec 46 §11/§16).
42
+ *
43
+ * Implements the three auth endpoints:
44
+ * POST /auth/challenge — issue context-bound challenge for owner to sign
45
+ * POST /auth/session — verify EIP-191 signature, issue 24h session token
46
+ * POST /auth/revoke — self-revoke all sessions for this wallet
47
+ *
48
+ * Security properties:
49
+ * - Challenge is single-use and expires in 300s
50
+ * - Challenge binds to: challengeId + daemonId + wallet + chainId + scope + expiresAt
51
+ * - Recovered signer must equal wallet.owner() (on-chain check)
52
+ * - Session token stored as sha256(token) only
53
+ * - Session scoped to one wallet address
54
+ */
55
+ const crypto = __importStar(require("crypto"));
56
+ const ethers_1 = require("ethers");
57
+ const session_manager_1 = require("./session-manager");
58
+ const abis_1 = require("./abis");
59
+ const ARC402_WALLET_OWNER_CHECK_ABI = [
60
+ "function owner() external view returns (address)",
61
+ ];
62
+ const CHALLENGE_TTL_MS = 300000; // 5 minutes
63
+ /**
64
+ * Build the EIP-191 message that the owner must sign.
65
+ *
66
+ * "ARC-402 Remote Auth\nChallenge: " + keccak256(abi.encodePacked(
67
+ * challengeId, daemonId, wallet, chainId, requestedScope, expiresAt
68
+ * ))
69
+ */
70
+ function buildChallengeMessage(challengeId, daemonId, wallet, chainId, scope, expiresAt) {
71
+ const packed = ethers_1.ethers.solidityPacked(["bytes32", "address", "address", "uint256", "string", "uint256"], [
72
+ ethers_1.ethers.zeroPadBytes(`0x${challengeId}`, 32),
73
+ daemonId,
74
+ wallet,
75
+ chainId,
76
+ scope,
77
+ expiresAt,
78
+ ]);
79
+ const hash = ethers_1.ethers.keccak256(packed);
80
+ return `ARC-402 Remote Auth\nChallenge: ${hash}`;
81
+ }
82
+ function issueAuthChallenge(sessions, cfg, wallet, requestedScope) {
83
+ const scope = requestedScope ?? "operator";
84
+ const challengeId = crypto.randomBytes(32).toString("hex");
85
+ const now = Date.now();
86
+ const expiresAt = now + CHALLENGE_TTL_MS;
87
+ sessions.storeChallenge({
88
+ challengeId,
89
+ daemonId: cfg.daemonId,
90
+ wallet,
91
+ chainId: cfg.chainId,
92
+ scope,
93
+ expiresAt,
94
+ });
95
+ return {
96
+ challengeId,
97
+ challenge: buildChallengeMessage(challengeId, cfg.daemonId, wallet, cfg.chainId, scope, expiresAt),
98
+ daemonId: cfg.daemonId,
99
+ wallet,
100
+ chainId: cfg.chainId,
101
+ scope,
102
+ expiresAt,
103
+ issuedAt: now,
104
+ };
105
+ }
106
+ async function consumeAuthChallenge(sessions, cfg, deps, provider, challengeId, signature) {
107
+ const challenge = sessions.getChallenge(challengeId);
108
+ if (!challenge) {
109
+ return { ok: false, status: 401, error: "challenge_not_found" };
110
+ }
111
+ if (challenge.used) {
112
+ return { ok: false, status: 401, error: "challenge_already_used" };
113
+ }
114
+ if (Date.now() > challenge.expires_at) {
115
+ return { ok: false, status: 401, error: "challenge_expired" };
116
+ }
117
+ const message = buildChallengeMessage(challenge.challenge_id ?? challengeId, challenge.daemon_id, challenge.wallet, challenge.chain_id, challenge.scope, challenge.expires_at);
118
+ let recoveredSigner;
119
+ try {
120
+ recoveredSigner = deps.recoverSigner?.(message, signature) ?? ethers_1.ethers.verifyMessage(message, signature);
121
+ }
122
+ catch {
123
+ return { ok: false, status: 401, error: "invalid_signature" };
124
+ }
125
+ let onChainOwner;
126
+ try {
127
+ onChainOwner = deps.getWalletOwner
128
+ ? await deps.getWalletOwner(challenge.wallet, provider)
129
+ : await new ethers_1.ethers.Contract(challenge.wallet, ARC402_WALLET_OWNER_CHECK_ABI, provider).owner();
130
+ }
131
+ catch {
132
+ return { ok: false, status: 503, error: "rpc_unavailable" };
133
+ }
134
+ if (recoveredSigner.toLowerCase() !== onChainOwner.toLowerCase()) {
135
+ return { ok: false, status: 401, error: "signer_not_owner" };
136
+ }
137
+ let ownedWallets = [];
138
+ try {
139
+ ownedWallets = deps.getWalletsForOwner
140
+ ? await deps.getWalletsForOwner(recoveredSigner, provider, cfg.chainId)
141
+ : await getWalletsForOwner(recoveredSigner, provider, cfg.chainId);
142
+ }
143
+ catch {
144
+ // Non-fatal — continue with empty wallet list
145
+ }
146
+ if (!ownedWallets.some((wallet) => wallet.toLowerCase() === challenge.wallet.toLowerCase())) {
147
+ ownedWallets = [challenge.wallet, ...ownedWallets];
148
+ }
149
+ sessions.markChallengeUsed(challengeId);
150
+ const rawToken = sessions.createSession(challenge.wallet, challenge.scope);
151
+ const SESSION_TTL_MS = 24 * 60 * 60 * 1000;
152
+ return {
153
+ ok: true,
154
+ token: rawToken,
155
+ wallets: ownedWallets,
156
+ wallet: challenge.wallet,
157
+ scope: challenge.scope,
158
+ expiresAt: Date.now() + SESSION_TTL_MS,
159
+ };
160
+ }
161
+ /**
162
+ * Query WalletFactory WalletDeployed events to find all wallets owned by a given EOA.
163
+ * Uses eth_getLogs with the WalletFactory addresses known to the daemon.
164
+ */
165
+ async function getWalletsForOwner(ownerAddress, provider, chainId) {
166
+ // WalletFactory addresses on Base mainnet (8453)
167
+ // Canonical addresses from the RegistryV3 — hardcoded for Base mainnet fallback
168
+ const WALLET_FACTORY_ADDRESSES_BASE = [
169
+ "0x9406Cc6185a346906296840746125a0E449764545", // WalletFactoryV6 (Base mainnet)
170
+ ];
171
+ if (chainId !== 8453) {
172
+ // Non-mainnet: skip factory query, return empty (caller handles gracefully)
173
+ return [];
174
+ }
175
+ const wallets = [];
176
+ const factoryIface = new ethers_1.ethers.Interface(abis_1.WALLET_FACTORY_ABI);
177
+ const deployedTopic = factoryIface.getEvent("WalletDeployed")?.topicHash;
178
+ const createdTopic = factoryIface.getEvent("WalletCreated")?.topicHash;
179
+ // Pad owner address to 32 bytes for topic filter
180
+ const ownerTopic = ethers_1.ethers.zeroPadValue(ownerAddress.toLowerCase(), 32);
181
+ for (const factoryAddr of WALLET_FACTORY_ADDRESSES_BASE) {
182
+ try {
183
+ // Try WalletDeployed(wallet indexed, owner indexed)
184
+ if (deployedTopic) {
185
+ const logs = await provider.getLogs({
186
+ address: factoryAddr,
187
+ topics: [deployedTopic, null, ownerTopic],
188
+ fromBlock: 0,
189
+ toBlock: "latest",
190
+ });
191
+ for (const log of logs) {
192
+ const parsed = factoryIface.parseLog(log);
193
+ if (parsed?.args.wallet)
194
+ wallets.push(parsed.args.wallet);
195
+ }
196
+ }
197
+ // Try WalletCreated(owner indexed, walletAddress indexed)
198
+ if (createdTopic) {
199
+ const logs = await provider.getLogs({
200
+ address: factoryAddr,
201
+ topics: [createdTopic, ownerTopic],
202
+ fromBlock: 0,
203
+ toBlock: "latest",
204
+ });
205
+ for (const log of logs) {
206
+ const parsed = factoryIface.parseLog(log);
207
+ if (parsed?.args.walletAddress)
208
+ wallets.push(parsed.args.walletAddress);
209
+ }
210
+ }
211
+ }
212
+ catch {
213
+ // Factory query failed — continue with other factories
214
+ }
215
+ }
216
+ return [...new Set(wallets)];
217
+ }
218
+ function registerAuthRoutes(app, db, cfg, deps = {}) {
219
+ const sessions = new session_manager_1.SessionManager(db);
220
+ const provider = deps.createProvider?.(cfg.rpcUrl) ?? new ethers_1.ethers.JsonRpcProvider(cfg.rpcUrl);
221
+ // ─── POST /auth/challenge ─────────────────────────────────────────────────────
222
+ // { wallet, requestedScope } → { challengeId, challenge, expiresAt }
223
+ app.post("/auth/challenge", (req, res) => {
224
+ const { wallet, requestedScope } = req.body;
225
+ if (!wallet || !ethers_1.ethers.isAddress(wallet)) {
226
+ res.status(400).json({ error: "valid wallet address required" });
227
+ return;
228
+ }
229
+ res.json(issueAuthChallenge(sessions, cfg, wallet, requestedScope));
230
+ });
231
+ // ─── POST /auth/session ───────────────────────────────────────────────────────
232
+ // { challengeId, signature } → { token, wallets, expiresAt }
233
+ app.post("/auth/session", (req, res) => {
234
+ void (async () => {
235
+ const { challengeId, signature } = req.body;
236
+ if (!challengeId || !signature) {
237
+ res.status(400).json({ error: "challengeId and signature required" });
238
+ return;
239
+ }
240
+ const result = await consumeAuthChallenge(sessions, cfg, deps, provider, challengeId, signature);
241
+ if (!result.ok) {
242
+ res.status(result.status).json({ error: result.error });
243
+ return;
244
+ }
245
+ res.json(result);
246
+ })();
247
+ });
248
+ // ─── POST /auth/revoke ────────────────────────────────────────────────────────
249
+ // Invalidate all sessions for this wallet. Requires valid session token.
250
+ app.post("/auth/revoke", (req, res) => {
251
+ const authHeader = req.headers["authorization"];
252
+ const token = authHeader?.replace("Bearer ", "");
253
+ if (!token) {
254
+ res.status(401).json({ error: "no_session" });
255
+ return;
256
+ }
257
+ const session = sessions.validateSession(token);
258
+ if (!session) {
259
+ res.status(401).json({ error: "invalid_session" });
260
+ return;
261
+ }
262
+ sessions.revokeByWallet(session.wallet);
263
+ res.json({ ok: true, revoked: session.wallet });
264
+ });
265
+ }
266
+ //# sourceMappingURL=auth-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-server.js","sourceRoot":"","sources":["../src/auth-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ type Arc402Config = {
2
+ rpcUrl: string;
3
+ };
4
+ export declare const DEFAULT_ENTRY_POINT = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
5
+ export declare const DEFAULT_BUNDLER_URL = "https://api.pimlico.io/v2/base/rpc";
6
+ export type UserOperation = {
7
+ sender: string;
8
+ nonce: string;
9
+ callData: string;
10
+ callGasLimit: string;
11
+ verificationGasLimit: string;
12
+ preVerificationGas: string;
13
+ maxFeePerGas: string;
14
+ maxPriorityFeePerGas: string;
15
+ signature: string;
16
+ factory?: string;
17
+ factoryData?: string;
18
+ paymaster?: string;
19
+ paymasterData?: string;
20
+ paymasterVerificationGasLimit?: string;
21
+ paymasterPostOpGasLimit?: string;
22
+ };
23
+ export type GasEstimate = {
24
+ callGasLimit: string;
25
+ verificationGasLimit: string;
26
+ preVerificationGas: string;
27
+ paymasterVerificationGasLimit?: string;
28
+ paymasterPostOpGasLimit?: string;
29
+ };
30
+ export type UserOpReceipt = {
31
+ userOpHash: string;
32
+ entryPoint: string;
33
+ sender: string;
34
+ nonce: string;
35
+ success: boolean;
36
+ actualGasCost: string;
37
+ actualGasUsed: string;
38
+ logs: unknown[];
39
+ receipt: {
40
+ transactionHash: string;
41
+ blockNumber: string;
42
+ blockHash: string;
43
+ [key: string]: unknown;
44
+ };
45
+ };
46
+ export declare class BundlerClient {
47
+ private bundlerUrl;
48
+ private entryPointAddress;
49
+ private chainId;
50
+ constructor(bundlerUrl: string, entryPointAddress: string, chainId: number);
51
+ private rpc;
52
+ sendUserOperation(userOp: UserOperation): Promise<string>;
53
+ getUserOperationReceipt(userOpHash: string): Promise<UserOpReceipt>;
54
+ estimateUserOperationGas(userOp: Partial<UserOperation>): Promise<GasEstimate>;
55
+ }
56
+ export declare class PaymasterClient {
57
+ private paymasterUrl;
58
+ private cdpKeyName?;
59
+ private cdpPrivateKey?;
60
+ constructor(paymasterUrl: string, cdpKeyName?: string, cdpPrivateKey?: string);
61
+ private buildJwt;
62
+ private rpc;
63
+ sponsorUserOperation(userOp: Partial<UserOperation>, entryPoint: string): Promise<UserOperation>;
64
+ }
65
+ export declare function buildUserOp(callData: string, sender: string, nonce: bigint, config: Arc402Config): Promise<UserOperation>;
66
+ export declare function buildSponsoredUserOp(callData: string, sender: string, nonce: bigint, config: Arc402Config, paymasterClient: PaymasterClient): Promise<UserOperation>;
67
+ export {};
68
+ //# sourceMappingURL=bundler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../src/bundler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PaymasterClient = exports.BundlerClient = exports.DEFAULT_BUNDLER_URL = exports.DEFAULT_ENTRY_POINT = void 0;
37
+ exports.buildUserOp = buildUserOp;
38
+ exports.buildSponsoredUserOp = buildSponsoredUserOp;
39
+ const ethers_1 = require("ethers");
40
+ const crypto_1 = require("crypto");
41
+ exports.DEFAULT_ENTRY_POINT = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
42
+ exports.DEFAULT_BUNDLER_URL = "https://api.pimlico.io/v2/base/rpc";
43
+ class BundlerClient {
44
+ constructor(bundlerUrl, entryPointAddress, chainId) {
45
+ this.bundlerUrl = bundlerUrl;
46
+ this.entryPointAddress = entryPointAddress;
47
+ this.chainId = chainId;
48
+ }
49
+ async rpc(method, params) {
50
+ const response = await fetch(this.bundlerUrl, {
51
+ method: "POST",
52
+ headers: { "Content-Type": "application/json" },
53
+ body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
54
+ });
55
+ if (!response.ok) {
56
+ throw new Error(`Bundler HTTP ${response.status}: ${response.statusText}`);
57
+ }
58
+ const json = (await response.json());
59
+ if (json.error) {
60
+ throw new Error(`Bundler RPC error [${json.error.code}]: ${json.error.message}`);
61
+ }
62
+ return json.result;
63
+ }
64
+ async sendUserOperation(userOp) {
65
+ const hash = await this.rpc("eth_sendUserOperation", [userOp, this.entryPointAddress]);
66
+ return hash;
67
+ }
68
+ async getUserOperationReceipt(userOpHash) {
69
+ const POLL_INTERVAL_MS = 2000;
70
+ const MAX_ATTEMPTS = 30;
71
+ for (let i = 0; i < MAX_ATTEMPTS; i++) {
72
+ const receipt = await this.rpc("eth_getUserOperationReceipt", [userOpHash]);
73
+ if (receipt !== null && receipt !== undefined) {
74
+ return receipt;
75
+ }
76
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
77
+ }
78
+ throw new Error(`UserOperation ${userOpHash} not confirmed after ${(MAX_ATTEMPTS * POLL_INTERVAL_MS) / 1000}s`);
79
+ }
80
+ async estimateUserOperationGas(userOp) {
81
+ const estimate = await this.rpc("eth_estimateUserOperationGas", [
82
+ userOp,
83
+ this.entryPointAddress,
84
+ ]);
85
+ return estimate;
86
+ }
87
+ }
88
+ exports.BundlerClient = BundlerClient;
89
+ // ─── PaymasterClient ──────────────────────────────────────────────────────────
90
+ class PaymasterClient {
91
+ constructor(paymasterUrl, cdpKeyName, cdpPrivateKey) {
92
+ this.paymasterUrl = paymasterUrl;
93
+ this.cdpKeyName = cdpKeyName;
94
+ this.cdpPrivateKey = cdpPrivateKey;
95
+ }
96
+ async buildJwt() {
97
+ if (!this.cdpKeyName || !this.cdpPrivateKey)
98
+ return null;
99
+ const { SignJWT, importPKCS8 } = await Promise.resolve().then(() => __importStar(require("jose")));
100
+ // Convert SEC1 base64 DER or SEC1 PEM → PKCS8 PEM using Node's crypto module
101
+ let pkcs8Pem;
102
+ if (this.cdpPrivateKey.includes("-----BEGIN")) {
103
+ if (this.cdpPrivateKey.includes("EC PRIVATE KEY")) {
104
+ const key = (0, crypto_1.createPrivateKey)({ key: this.cdpPrivateKey, format: "pem", type: "sec1" });
105
+ pkcs8Pem = key.export({ format: "pem", type: "pkcs8" });
106
+ }
107
+ else {
108
+ pkcs8Pem = this.cdpPrivateKey;
109
+ }
110
+ }
111
+ else {
112
+ const der = Buffer.from(this.cdpPrivateKey, "base64");
113
+ const key = (0, crypto_1.createPrivateKey)({ key: der, format: "der", type: "sec1" });
114
+ pkcs8Pem = key.export({ format: "pem", type: "pkcs8" });
115
+ }
116
+ const privateKey = await importPKCS8(pkcs8Pem, "ES256");
117
+ const now = Math.floor(Date.now() / 1000);
118
+ return new SignJWT({ sub: this.cdpKeyName })
119
+ .setProtectedHeader({ alg: "ES256", kid: this.cdpKeyName })
120
+ .setIssuer(this.cdpKeyName)
121
+ .setNotBefore(now)
122
+ .setExpirationTime(now + 120)
123
+ .sign(privateKey);
124
+ }
125
+ async rpc(method, params) {
126
+ const jwt = await this.buildJwt();
127
+ const headers = { "Content-Type": "application/json" };
128
+ if (jwt)
129
+ headers["Authorization"] = `Bearer ${jwt}`;
130
+ const response = await fetch(this.paymasterUrl, {
131
+ method: "POST",
132
+ headers,
133
+ body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
134
+ });
135
+ if (!response.ok) {
136
+ throw new Error(`Paymaster HTTP ${response.status}: ${response.statusText}`);
137
+ }
138
+ const json = (await response.json());
139
+ if (json.error) {
140
+ throw new Error(`Paymaster RPC error [${json.error.code}]: ${json.error.message}`);
141
+ }
142
+ return json.result;
143
+ }
144
+ async sponsorUserOperation(userOp, entryPoint) {
145
+ const result = (await this.rpc("pm_sponsorUserOperation", [userOp, entryPoint, {}]));
146
+ return {
147
+ ...userOp,
148
+ paymaster: result.paymaster,
149
+ paymasterData: result.paymasterData,
150
+ paymasterVerificationGasLimit: result.paymasterVerificationGasLimit,
151
+ paymasterPostOpGasLimit: result.paymasterPostOpGasLimit,
152
+ ...(result.callGasLimit && { callGasLimit: result.callGasLimit }),
153
+ ...(result.verificationGasLimit && { verificationGasLimit: result.verificationGasLimit }),
154
+ ...(result.preVerificationGas && { preVerificationGas: result.preVerificationGas }),
155
+ };
156
+ }
157
+ }
158
+ exports.PaymasterClient = PaymasterClient;
159
+ // ─── buildUserOp / buildSponsoredUserOp ───────────────────────────────────────
160
+ async function buildUserOp(callData, sender, nonce, config) {
161
+ const provider = new ethers_1.ethers.JsonRpcProvider(config.rpcUrl);
162
+ const feeData = await provider.getFeeData();
163
+ const maxFeePerGas = feeData.maxFeePerGas ?? BigInt(1000000000);
164
+ const maxPriorityFeePerGas = feeData.maxPriorityFeePerGas ?? BigInt(100000000);
165
+ return {
166
+ sender,
167
+ nonce: ethers_1.ethers.toBeHex(nonce),
168
+ callData,
169
+ callGasLimit: ethers_1.ethers.toBeHex(300000),
170
+ verificationGasLimit: ethers_1.ethers.toBeHex(150000),
171
+ preVerificationGas: ethers_1.ethers.toBeHex(50000),
172
+ maxFeePerGas: ethers_1.ethers.toBeHex(maxFeePerGas),
173
+ maxPriorityFeePerGas: ethers_1.ethers.toBeHex(maxPriorityFeePerGas),
174
+ signature: "0x",
175
+ };
176
+ }
177
+ async function buildSponsoredUserOp(callData, sender, nonce, config, paymasterClient) {
178
+ const userOp = await buildUserOp(callData, sender, nonce, config);
179
+ return paymasterClient.sponsorUserOperation(userOp, exports.DEFAULT_ENTRY_POINT);
180
+ }
181
+ //# sourceMappingURL=bundler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundler.js","sourceRoot":"","sources":["../src/bundler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Capability maps — session token access control.
3
+ * Spec 46 §16 Pattern 3.
4
+ *
5
+ * SESSION_CAPABILITIES: what a session token MAY trigger.
6
+ * SESSION_FORBIDDEN: never executes via session token, ever.
7
+ *
8
+ * Hardcoded — not configurable at runtime. Policy changes require daemon rebuild.
9
+ */
10
+ export declare const SESSION_CAPABILITIES: Set<string>;
11
+ export declare const SESSION_FORBIDDEN: Set<string>;
12
+ /**
13
+ * Check whether a capability is permitted for session token use.
14
+ * Returns true if allowed, false if forbidden or not in the capability set.
15
+ */
16
+ export declare function isCapabilityAllowed(capability: string): boolean;
17
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,eAAO,MAAM,oBAAoB,aAe/B,CAAC;AAGH,eAAO,MAAM,iBAAiB,aAU5B,CAAC;AAEH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAM/D"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * Capability maps — session token access control.
4
+ * Spec 46 §16 Pattern 3.
5
+ *
6
+ * SESSION_CAPABILITIES: what a session token MAY trigger.
7
+ * SESSION_FORBIDDEN: never executes via session token, ever.
8
+ *
9
+ * Hardcoded — not configurable at runtime. Policy changes require daemon rebuild.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SESSION_FORBIDDEN = exports.SESSION_CAPABILITIES = void 0;
13
+ exports.isCapabilityAllowed = isCapabilityAllowed;
14
+ // Capabilities a session token MAY trigger
15
+ exports.SESSION_CAPABILITIES = new Set([
16
+ "wallet.read",
17
+ "agreement.read",
18
+ "agreement.propose",
19
+ "agreement.accept",
20
+ "agreement.deliver",
21
+ "agreement.verify",
22
+ "compute.propose",
23
+ "compute.end",
24
+ "subscribe",
25
+ "arena.*",
26
+ "workroom.status",
27
+ "userop.simulate",
28
+ "userop.execute", // routes to signer; PolicyEngine bounds apply
29
+ "session.revoke:self",
30
+ ]);
31
+ // These NEVER execute via session token — ever
32
+ exports.SESSION_FORBIDDEN = new Set([
33
+ "wallet.setGuardian",
34
+ "wallet.setMachineKey",
35
+ "wallet.authorizeMachineKey",
36
+ "policy.setSpendLimit",
37
+ "daemon.exportKey",
38
+ "daemon.readSecrets",
39
+ "daemon.shell",
40
+ "daemon.restart", // local admin only
41
+ "daemon.config.write",
42
+ ]);
43
+ /**
44
+ * Check whether a capability is permitted for session token use.
45
+ * Returns true if allowed, false if forbidden or not in the capability set.
46
+ */
47
+ function isCapabilityAllowed(capability) {
48
+ if (exports.SESSION_FORBIDDEN.has(capability))
49
+ return false;
50
+ if (exports.SESSION_CAPABILITIES.has(capability))
51
+ return true;
52
+ // arena.* wildcard: allow any capability starting with "arena."
53
+ if (capability.startsWith("arena."))
54
+ return true;
55
+ return false;
56
+ }
57
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAqCH,kDAMC;AAzCD,2CAA2C;AAC9B,QAAA,oBAAoB,GAAG,IAAI,GAAG,CAAC;IAC1C,aAAa;IACb,gBAAgB;IAChB,mBAAmB;IACnB,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,iBAAiB;IACjB,aAAa;IACb,WAAW;IACX,SAAS;IACT,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB,EAAW,8CAA8C;IACzE,qBAAqB;CACtB,CAAC,CAAC;AAEH,+CAA+C;AAClC,QAAA,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,oBAAoB;IACpB,sBAAsB;IACtB,4BAA4B;IAC5B,sBAAsB;IACtB,kBAAkB;IAClB,oBAAoB;IACpB,cAAc;IACd,gBAAgB,EAAW,mBAAmB;IAC9C,qBAAqB;CACtB,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,UAAkB;IACpD,IAAI,yBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,4BAAoB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,gEAAgE;IAChE,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC"}