@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.
- package/bin/arc402-daemon +3 -0
- package/dist/abis.d.ts +20 -0
- package/dist/abis.d.ts.map +1 -0
- package/dist/abis.js +214 -0
- package/dist/abis.js.map +1 -0
- package/dist/api.d.ts +32 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +430 -0
- package/dist/api.js.map +1 -0
- package/dist/auth-server.d.ts +50 -0
- package/dist/auth-server.d.ts.map +1 -0
- package/dist/auth-server.js +266 -0
- package/dist/auth-server.js.map +1 -0
- package/dist/bundler.d.ts +68 -0
- package/dist/bundler.d.ts.map +1 -0
- package/dist/bundler.js +181 -0
- package/dist/bundler.js.map +1 -0
- package/dist/capabilities.d.ts +17 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +57 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/compute-metering.d.ts +61 -0
- package/dist/compute-metering.d.ts.map +1 -0
- package/dist/compute-metering.js +299 -0
- package/dist/compute-metering.js.map +1 -0
- package/dist/compute-session.d.ts +100 -0
- package/dist/compute-session.d.ts.map +1 -0
- package/dist/compute-session.js +231 -0
- package/dist/compute-session.js.map +1 -0
- package/dist/config.d.ts +121 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +397 -0
- package/dist/config.js.map +1 -0
- package/dist/context-manager.d.ts +17 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +123 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/credentials.d.ts +24 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +80 -0
- package/dist/credentials.js.map +1 -0
- package/dist/delivery-client.d.ts +35 -0
- package/dist/delivery-client.d.ts.map +1 -0
- package/dist/delivery-client.js +231 -0
- package/dist/delivery-client.js.map +1 -0
- package/dist/endpoint-policy.d.ts +11 -0
- package/dist/endpoint-policy.d.ts.map +1 -0
- package/dist/endpoint-policy.js +107 -0
- package/dist/endpoint-policy.js.map +1 -0
- package/dist/event-watchers.d.ts +11 -0
- package/dist/event-watchers.d.ts.map +1 -0
- package/dist/event-watchers.js +24 -0
- package/dist/event-watchers.js.map +1 -0
- package/dist/exec-state.d.ts +37 -0
- package/dist/exec-state.d.ts.map +1 -0
- package/dist/exec-state.js +53 -0
- package/dist/exec-state.js.map +1 -0
- package/dist/file-delivery.d.ts +98 -0
- package/dist/file-delivery.d.ts.map +1 -0
- package/dist/file-delivery.js +473 -0
- package/dist/file-delivery.js.map +1 -0
- package/dist/handshake-watcher.d.ts +31 -0
- package/dist/handshake-watcher.d.ts.map +1 -0
- package/dist/handshake-watcher.js +157 -0
- package/dist/handshake-watcher.js.map +1 -0
- package/dist/hire-listener.d.ts +32 -0
- package/dist/hire-listener.d.ts.map +1 -0
- package/dist/hire-listener.js +237 -0
- package/dist/hire-listener.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/job-lifecycle.d.ts +62 -0
- package/dist/job-lifecycle.d.ts.map +1 -0
- package/dist/job-lifecycle.js +201 -0
- package/dist/job-lifecycle.js.map +1 -0
- package/dist/notify.d.ts +51 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +276 -0
- package/dist/notify.js.map +1 -0
- package/dist/permission-gate.d.ts +30 -0
- package/dist/permission-gate.d.ts.map +1 -0
- package/dist/permission-gate.js +180 -0
- package/dist/permission-gate.js.map +1 -0
- package/dist/prompt-guard.d.ts +18 -0
- package/dist/prompt-guard.d.ts.map +1 -0
- package/dist/prompt-guard.js +70 -0
- package/dist/prompt-guard.js.map +1 -0
- package/dist/server.d.ts +27 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1956 -0
- package/dist/server.js.map +1 -0
- package/dist/session-manager.d.ts +55 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +139 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/signer.d.ts +19 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +195 -0
- package/dist/signer.js.map +1 -0
- package/dist/token-metering.d.ts +42 -0
- package/dist/token-metering.d.ts.map +1 -0
- package/dist/token-metering.js +178 -0
- package/dist/token-metering.js.map +1 -0
- package/dist/userops.d.ts +24 -0
- package/dist/userops.d.ts.map +1 -0
- package/dist/userops.js +156 -0
- package/dist/userops.js.map +1 -0
- package/dist/wallet-monitor.d.ts +16 -0
- package/dist/wallet-monitor.d.ts.map +1 -0
- package/dist/wallet-monitor.js +57 -0
- package/dist/wallet-monitor.js.map +1 -0
- package/dist/worker-executor.d.ts +81 -0
- package/dist/worker-executor.d.ts.map +1 -0
- package/dist/worker-executor.js +527 -0
- package/dist/worker-executor.js.map +1 -0
- package/dist/worker-router.d.ts +63 -0
- package/dist/worker-router.d.ts.map +1 -0
- package/dist/worker-router.js +263 -0
- package/dist/worker-router.js.map +1 -0
- 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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"}
|
package/dist/bundler.js
ADDED
|
@@ -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"}
|