@absol-labs/agent 0.5.0 → 0.7.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 (76) hide show
  1. package/README.md +49 -10
  2. package/dist/discovery/registry.d.ts +260 -15
  3. package/dist/discovery/registry.d.ts.map +1 -1
  4. package/dist/discovery/registry.js +174 -31
  5. package/dist/discovery/registry.js.map +1 -1
  6. package/dist/frameworks/agentkit.js +1 -1
  7. package/dist/frameworks/agentkit.js.map +1 -1
  8. package/dist/frameworks/crewai.js +1 -1
  9. package/dist/frameworks/crewai.js.map +1 -1
  10. package/dist/gateway/caller-auth-gateway.d.ts +3 -1
  11. package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
  12. package/dist/gateway/caller-auth-gateway.js +9 -7
  13. package/dist/gateway/caller-auth-gateway.js.map +1 -1
  14. package/dist/gateway/http-server.d.ts +3 -1
  15. package/dist/gateway/http-server.d.ts.map +1 -1
  16. package/dist/gateway/http-server.js +15 -1
  17. package/dist/gateway/http-server.js.map +1 -1
  18. package/dist/index.d.ts +8 -3
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +8 -3
  21. package/dist/index.js.map +1 -1
  22. package/dist/mcp/server.js +2 -0
  23. package/dist/mcp/server.js.map +1 -1
  24. package/dist/sdk/invoke.d.ts +16 -2
  25. package/dist/sdk/invoke.d.ts.map +1 -1
  26. package/dist/sdk/invoke.js +117 -1
  27. package/dist/sdk/invoke.js.map +1 -1
  28. package/dist/wallet/autonomous-wallet-broker.d.ts +97 -0
  29. package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -0
  30. package/dist/wallet/autonomous-wallet-broker.js +468 -0
  31. package/dist/wallet/autonomous-wallet-broker.js.map +1 -0
  32. package/dist/wallet/autonomous-wallet-protocol.d.ts +56 -0
  33. package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -0
  34. package/dist/wallet/autonomous-wallet-protocol.js +15 -0
  35. package/dist/wallet/autonomous-wallet-protocol.js.map +1 -0
  36. package/dist/wallet/autonomous-wallet.d.ts +106 -0
  37. package/dist/wallet/autonomous-wallet.d.ts.map +1 -0
  38. package/dist/wallet/autonomous-wallet.js +494 -0
  39. package/dist/wallet/autonomous-wallet.js.map +1 -0
  40. package/dist/wallet/privy-broker-server-entry.d.ts +2 -0
  41. package/dist/wallet/privy-broker-server-entry.d.ts.map +1 -0
  42. package/dist/wallet/privy-broker-server-entry.js +8 -0
  43. package/dist/wallet/privy-broker-server-entry.js.map +1 -0
  44. package/dist/wallet/privy-broker-server.d.ts +29 -0
  45. package/dist/wallet/privy-broker-server.d.ts.map +1 -0
  46. package/dist/wallet/privy-broker-server.js +480 -0
  47. package/dist/wallet/privy-broker-server.js.map +1 -0
  48. package/dist/wallet/privy-session-broker.d.ts +109 -0
  49. package/dist/wallet/privy-session-broker.d.ts.map +1 -0
  50. package/dist/wallet/privy-session-broker.js +372 -0
  51. package/dist/wallet/privy-session-broker.js.map +1 -0
  52. package/dist/wallet/privy-session-provider.d.ts +21 -0
  53. package/dist/wallet/privy-session-provider.d.ts.map +1 -0
  54. package/dist/wallet/privy-session-provider.js +94 -0
  55. package/dist/wallet/privy-session-provider.js.map +1 -0
  56. package/dist/wallet/provider.d.ts +51 -2
  57. package/dist/wallet/provider.d.ts.map +1 -1
  58. package/dist/wallet/provider.js +138 -1
  59. package/dist/wallet/provider.js.map +1 -1
  60. package/package.json +4 -2
  61. package/src/discovery/registry.ts +213 -35
  62. package/src/frameworks/agentkit.ts +1 -1
  63. package/src/frameworks/crewai.ts +1 -1
  64. package/src/gateway/caller-auth-gateway.ts +13 -9
  65. package/src/gateway/http-server.ts +18 -1
  66. package/src/index.ts +78 -0
  67. package/src/mcp/server.ts +2 -0
  68. package/src/sdk/invoke.ts +186 -4
  69. package/src/wallet/autonomous-wallet-broker.ts +764 -0
  70. package/src/wallet/autonomous-wallet-protocol.ts +71 -0
  71. package/src/wallet/autonomous-wallet.ts +779 -0
  72. package/src/wallet/privy-broker-server-entry.ts +9 -0
  73. package/src/wallet/privy-broker-server.ts +573 -0
  74. package/src/wallet/privy-session-broker.ts +634 -0
  75. package/src/wallet/privy-session-provider.ts +129 -0
  76. package/src/wallet/provider.ts +260 -3
@@ -0,0 +1,109 @@
1
+ import { type Address, type Hex } from "viem";
2
+ import { type SignedSpendMandate } from "../mandates/mandate.js";
3
+ export declare const PRIVY_BROKER_CHAIN_ID = 84532;
4
+ export declare const PRIVY_BROKER_CAIP2: "eip155:84532";
5
+ export declare const PRIVY_BROKER_ESCROW: "0x0f09f36Ccc05A7c9882F438721C08De314dFd46C";
6
+ export declare const PRIVY_BROKER_USDC: "0x036CbD53842c5426634e7929541eC2318f3dCF7e";
7
+ export declare const PRIVY_POLICY_MAX_TOTAL_USDC = 1000000n;
8
+ export declare const PRIVY_POLICY_MAX_RATE_USDC = 1000n;
9
+ export declare const PRIVY_POLICY_MAX_DURATION_SECONDS = 3600;
10
+ export declare const PRIVY_MAX_SESSION_SECONDS = 86400;
11
+ export interface PrivyLinkedWallet {
12
+ readonly id: string | null;
13
+ readonly address: string;
14
+ readonly chain_type: string;
15
+ readonly connector_type?: string;
16
+ readonly wallet_client_type?: string;
17
+ }
18
+ export interface PrivyBrokerProvider {
19
+ verifyAccessToken(token: string): Promise<{
20
+ readonly userId: string;
21
+ }>;
22
+ getUserWallets(userId: string): Promise<readonly PrivyLinkedWallet[]>;
23
+ sendTransaction(input: {
24
+ readonly walletId: string;
25
+ readonly transaction: Record<string, unknown>;
26
+ readonly authorizationPrivateKey: string;
27
+ readonly sponsor: boolean;
28
+ }): Promise<Hex>;
29
+ signTypedData(input: {
30
+ readonly walletId: string;
31
+ readonly typedData: Record<string, unknown>;
32
+ readonly authorizationPrivateKey: string;
33
+ }): Promise<Hex>;
34
+ }
35
+ export interface BrokerStreamReader {
36
+ getStream(streamId: Hex): Promise<{
37
+ readonly buyer: Address;
38
+ readonly serviceRef: Hex;
39
+ readonly status: "active" | "closed";
40
+ }>;
41
+ }
42
+ export interface PrivyBrokerSession {
43
+ readonly id: string;
44
+ readonly tokenHash: string;
45
+ readonly userId: string;
46
+ readonly walletId: string;
47
+ readonly address: Address;
48
+ readonly signedMandate: SignedSpendMandate;
49
+ readonly expiresAt: number;
50
+ readonly createdAt: number;
51
+ readonly revokedAt?: number;
52
+ readonly spentSoFarUsdc: bigint;
53
+ /** True after the broker has requested gas sponsorship for one write. */
54
+ readonly sponsorshipUsed?: boolean;
55
+ }
56
+ export interface PrivyBrokerSessionStore {
57
+ findByTokenHash(tokenHash: string): Promise<PrivyBrokerSession | null>;
58
+ get(id: string): Promise<PrivyBrokerSession | null>;
59
+ put(session: PrivyBrokerSession): Promise<void>;
60
+ }
61
+ export interface CreatePrivyBrokerSessionInput {
62
+ readonly accessToken: string;
63
+ readonly walletId: string;
64
+ readonly address: Address;
65
+ readonly signedMandate: unknown;
66
+ }
67
+ export interface PrivyBrokerRpcInput {
68
+ readonly token: string;
69
+ readonly method: "eth_sendTransaction" | "eth_signTypedData_v4";
70
+ readonly params: readonly unknown[];
71
+ }
72
+ export declare class PrivySessionBrokerError extends Error {
73
+ readonly code: "unauthorized" | "invalid-request" | "expired" | "revoked" | "policy-denied" | "provider-error";
74
+ constructor(code: "unauthorized" | "invalid-request" | "expired" | "revoked" | "policy-denied" | "provider-error", message: string, options?: {
75
+ readonly cause?: unknown;
76
+ });
77
+ }
78
+ export declare class PrivySessionBroker {
79
+ private readonly dependencies;
80
+ private readonly locks;
81
+ constructor(dependencies: {
82
+ readonly provider: PrivyBrokerProvider;
83
+ readonly store: PrivyBrokerSessionStore;
84
+ readonly streamReader: BrokerStreamReader;
85
+ readonly authorizationPrivateKey: string;
86
+ readonly nowSeconds?: () => number;
87
+ });
88
+ createSession(input: CreatePrivyBrokerSessionInput): Promise<{
89
+ readonly sessionId: string;
90
+ readonly token: string;
91
+ readonly address: Address;
92
+ readonly expiresAt: number;
93
+ }>;
94
+ revokeSession(accessToken: string, sessionId: string): Promise<void>;
95
+ rpc(input: PrivyBrokerRpcInput): Promise<Hex>;
96
+ private sendTransaction;
97
+ private signTypedData;
98
+ private providerSend;
99
+ private requireSession;
100
+ private withSessionLock;
101
+ private now;
102
+ }
103
+ export declare class InMemoryPrivyBrokerSessionStore implements PrivyBrokerSessionStore {
104
+ private readonly sessions;
105
+ findByTokenHash(tokenHash: string): Promise<PrivyBrokerSession | null>;
106
+ get(id: string): Promise<PrivyBrokerSession | null>;
107
+ put(session: PrivyBrokerSession): Promise<void>;
108
+ }
109
+ //# sourceMappingURL=privy-session-broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privy-session-broker.d.ts","sourceRoot":"","sources":["../../src/wallet/privy-session-broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,372 @@
1
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { streamEscrowV2Abi } from "@absol-labs/shared";
3
+ import { decodeFunctionData, getAddress, isAddress, } from "viem";
4
+ import { z } from "zod";
5
+ import { checkMandate, signedSpendMandateSchema, verifyMandateOwnerSignature, verifySignedMandate, } from "../mandates/mandate.js";
6
+ import { invocationCapabilityDomainName, invocationCapabilityDomainVersion, invocationCapabilitySchema, } from "../capability/invocation-capability.js";
7
+ export const PRIVY_BROKER_CHAIN_ID = 84532;
8
+ export const PRIVY_BROKER_CAIP2 = "eip155:84532";
9
+ export const PRIVY_BROKER_ESCROW = "0x0f09f36Ccc05A7c9882F438721C08De314dFd46C";
10
+ export const PRIVY_BROKER_USDC = "0x036CbD53842c5426634e7929541eC2318f3dCF7e";
11
+ export const PRIVY_POLICY_MAX_TOTAL_USDC = 1000000n;
12
+ export const PRIVY_POLICY_MAX_RATE_USDC = 1000n;
13
+ export const PRIVY_POLICY_MAX_DURATION_SECONDS = 3_600;
14
+ export const PRIVY_MAX_SESSION_SECONDS = 86_400;
15
+ const wireMandateSchema = z.object({
16
+ mandateId: z.string(),
17
+ owner: z.string(),
18
+ chainId: z.number().int(),
19
+ issuedAt: z.number().int(),
20
+ mandate: z.object({
21
+ maxPerStreamUsdc: z.coerce.bigint(),
22
+ maxTotalUsdc: z.coerce.bigint(),
23
+ maxRatePerSecondUsdc: z.coerce.bigint(),
24
+ maxDurationSeconds: z.number().int(),
25
+ allowedOperators: z.array(z.string()).optional(),
26
+ expiresAt: z.number().int(),
27
+ }),
28
+ signature: z.string(),
29
+ });
30
+ const transactionSchema = z.object({
31
+ from: z.string().refine(isAddress),
32
+ to: z.string().refine(isAddress),
33
+ data: z.string().regex(/^0x[0-9a-fA-F]*$/),
34
+ value: z.union([z.string(), z.number(), z.bigint()]).optional(),
35
+ chainId: z.union([z.string(), z.number()]).optional(),
36
+ });
37
+ export class PrivySessionBrokerError extends Error {
38
+ code;
39
+ constructor(code, message, options) {
40
+ super(message, options);
41
+ this.code = code;
42
+ this.name = "PrivySessionBrokerError";
43
+ }
44
+ }
45
+ export class PrivySessionBroker {
46
+ dependencies;
47
+ locks = new Map();
48
+ constructor(dependencies) {
49
+ this.dependencies = dependencies;
50
+ }
51
+ async createSession(input) {
52
+ const now = this.now();
53
+ const auth = await this.dependencies.provider
54
+ .verifyAccessToken(input.accessToken)
55
+ .catch((error) => {
56
+ throw new PrivySessionBrokerError("unauthorized", "Privy access token is invalid", { cause: error });
57
+ });
58
+ const address = requireAddress(input.address);
59
+ const wallets = await this.dependencies.provider.getUserWallets(auth.userId);
60
+ const wallet = wallets.find((candidate) => candidate.id === input.walletId &&
61
+ candidate.address.toLowerCase() === address.toLowerCase() &&
62
+ candidate.chain_type === "ethereum" &&
63
+ candidate.connector_type === "embedded" &&
64
+ candidate.wallet_client_type === "privy");
65
+ if (!wallet?.id) {
66
+ throw new PrivySessionBrokerError("unauthorized", "wallet is not a user-owned Privy embedded Ethereum wallet");
67
+ }
68
+ const signedMandate = parseWireMandate(input.signedMandate);
69
+ if (signedMandate.owner.toLowerCase() !== address.toLowerCase() ||
70
+ signedMandate.chainId !== PRIVY_BROKER_CHAIN_ID) {
71
+ throw new PrivySessionBrokerError("policy-denied", "mandate owner or chain does not match the embedded wallet");
72
+ }
73
+ const verified = await verifySignedMandate(signedMandate, {
74
+ nowSeconds: now,
75
+ });
76
+ if (!verified.allowed) {
77
+ throw new PrivySessionBrokerError("policy-denied", `mandate denied: ${verified.reason}`);
78
+ }
79
+ assertMandateWithinPrivyPolicy(signedMandate);
80
+ const expiresAt = Math.min(signedMandate.mandate.expiresAt, now + PRIVY_MAX_SESSION_SECONDS);
81
+ const token = randomBytes(32).toString("base64url");
82
+ const session = {
83
+ id: randomBytes(16).toString("hex"),
84
+ tokenHash: hashToken(token),
85
+ userId: auth.userId,
86
+ walletId: wallet.id,
87
+ address,
88
+ signedMandate,
89
+ expiresAt,
90
+ createdAt: now,
91
+ spentSoFarUsdc: 0n,
92
+ };
93
+ await this.dependencies.store.put(session);
94
+ return { sessionId: session.id, token, address, expiresAt };
95
+ }
96
+ async revokeSession(accessToken, sessionId) {
97
+ const auth = await this.dependencies.provider
98
+ .verifyAccessToken(accessToken)
99
+ .catch(() => {
100
+ throw new PrivySessionBrokerError("unauthorized", "Privy access token is invalid");
101
+ });
102
+ const session = await this.dependencies.store.get(sessionId);
103
+ if (session === null || session.userId !== auth.userId) {
104
+ throw new PrivySessionBrokerError("unauthorized", "session not found");
105
+ }
106
+ await this.dependencies.store.put({
107
+ ...session,
108
+ revokedAt: this.now(),
109
+ });
110
+ }
111
+ async rpc(input) {
112
+ const session = await this.requireSession(input.token);
113
+ return this.withSessionLock(session.id, async () => {
114
+ const current = await this.requireSession(input.token);
115
+ if (input.method === "eth_sendTransaction") {
116
+ return this.sendTransaction(current, input.params);
117
+ }
118
+ return this.signTypedData(current, input.params);
119
+ });
120
+ }
121
+ async sendTransaction(session, params) {
122
+ const transaction = transactionSchema.parse(params[0]);
123
+ if (transaction.from.toLowerCase() !== session.address.toLowerCase()) {
124
+ throw new PrivySessionBrokerError("policy-denied", "transaction sender does not match session wallet");
125
+ }
126
+ assertChainId(transaction.chainId);
127
+ assertZeroValue(transaction.value);
128
+ const to = getAddress(transaction.to);
129
+ const data = transaction.data;
130
+ if (to.toLowerCase() === PRIVY_BROKER_USDC.toLowerCase()) {
131
+ assertBoundedApproval(data, session.signedMandate);
132
+ }
133
+ else if (to.toLowerCase() === PRIVY_BROKER_ESCROW.toLowerCase()) {
134
+ const decoded = decodeFunctionData({ abi: streamEscrowV2Abi, data });
135
+ if (decoded.functionName === "openStream") {
136
+ const [operator, , deposit, rate, duration] = decoded.args;
137
+ const decision = await checkMandate(session.signedMandate, {
138
+ operator,
139
+ budgetUsdc: deposit,
140
+ ratePerSecondUsdc: rate,
141
+ maxDurationSeconds: Number(duration),
142
+ }, session.spentSoFarUsdc, { nowSeconds: this.now() });
143
+ if (!decision.allowed) {
144
+ throw new PrivySessionBrokerError("policy-denied", `mandate denied: ${decision.reason}`);
145
+ }
146
+ const hash = await this.providerSend(session, transaction);
147
+ await this.dependencies.store.put({
148
+ ...session,
149
+ sponsorshipUsed: true,
150
+ spentSoFarUsdc: session.spentSoFarUsdc + deposit,
151
+ });
152
+ return hash;
153
+ }
154
+ if (decoded.functionName !== "close" &&
155
+ decoded.functionName !== "reclaim" &&
156
+ decoded.functionName !== "reclaimUnverified") {
157
+ throw new PrivySessionBrokerError("policy-denied", "escrow method is not allowed for an agent session");
158
+ }
159
+ const owner = await verifyMandateOwnerSignature(session.signedMandate);
160
+ if (!owner.allowed) {
161
+ throw new PrivySessionBrokerError("policy-denied", "mandate owner signature is invalid");
162
+ }
163
+ const streamId = decoded.args[0];
164
+ const stream = await this.dependencies.streamReader.getStream(streamId);
165
+ if (stream.buyer.toLowerCase() !== session.address.toLowerCase()) {
166
+ throw new PrivySessionBrokerError("policy-denied", "session wallet is not the stream buyer");
167
+ }
168
+ }
169
+ else {
170
+ throw new PrivySessionBrokerError("policy-denied", "transaction target is not allowlisted");
171
+ }
172
+ return this.providerSend(session, transaction);
173
+ }
174
+ async signTypedData(session, params) {
175
+ const raw = params[1];
176
+ const typedData = typeof raw === "string"
177
+ ? JSON.parse(raw)
178
+ : raw;
179
+ if (typedData === null || typeof typedData !== "object") {
180
+ throw new PrivySessionBrokerError("invalid-request", "typed data must be an object");
181
+ }
182
+ const typedDataRecord = typedData;
183
+ if (typeof params[0] !== "string" ||
184
+ params[0].toLowerCase() !== session.address.toLowerCase()) {
185
+ throw new PrivySessionBrokerError("policy-denied", "typed-data signer does not match the session wallet");
186
+ }
187
+ const domain = typedDataRecord.domain;
188
+ if (domain?.name !== invocationCapabilityDomainName ||
189
+ domain.version !== invocationCapabilityDomainVersion ||
190
+ Number(domain.chainId) !== PRIVY_BROKER_CHAIN_ID ||
191
+ typeof domain.verifyingContract !== "string" ||
192
+ domain.verifyingContract.toLowerCase() !==
193
+ PRIVY_BROKER_ESCROW.toLowerCase() ||
194
+ typedDataRecord.primaryType !== "InvocationCapability") {
195
+ throw new PrivySessionBrokerError("policy-denied", "only Metrik invocation capabilities may be signed");
196
+ }
197
+ const rawMessage = typedDataRecord.message;
198
+ const capability = invocationCapabilitySchema.parse({
199
+ ...rawMessage,
200
+ expiry: typeof rawMessage?.expiry === "string"
201
+ ? Number(rawMessage.expiry)
202
+ : rawMessage?.expiry,
203
+ });
204
+ if (capability.buyer.toLowerCase() !== session.address.toLowerCase() ||
205
+ capability.expiry <= this.now() ||
206
+ capability.expiry > Math.min(session.expiresAt, this.now() + 120)) {
207
+ throw new PrivySessionBrokerError("policy-denied", "capability buyer or expiry is outside the session");
208
+ }
209
+ const stream = await this.dependencies.streamReader.getStream(capability.streamId);
210
+ if (stream.status !== "active" ||
211
+ stream.buyer.toLowerCase() !== session.address.toLowerCase() ||
212
+ stream.serviceRef.toLowerCase() !== capability.serviceRef.toLowerCase()) {
213
+ throw new PrivySessionBrokerError("policy-denied", "capability does not match an active buyer stream");
214
+ }
215
+ try {
216
+ return await this.dependencies.provider.signTypedData({
217
+ walletId: session.walletId,
218
+ typedData: typedDataRecord,
219
+ authorizationPrivateKey: this.dependencies.authorizationPrivateKey,
220
+ });
221
+ }
222
+ catch (error) {
223
+ throw new PrivySessionBrokerError("provider-error", "Privy rejected the typed-data signature request", { cause: error });
224
+ }
225
+ }
226
+ async providerSend(session, transaction) {
227
+ const { chainId: _chainId, ...privyTransaction } = transaction;
228
+ const sponsor = session.sponsorshipUsed !== true;
229
+ let hash;
230
+ try {
231
+ hash = await this.dependencies.provider.sendTransaction({
232
+ walletId: session.walletId,
233
+ transaction: privyTransaction,
234
+ authorizationPrivateKey: this.dependencies.authorizationPrivateKey,
235
+ sponsor,
236
+ });
237
+ }
238
+ catch (error) {
239
+ throw new PrivySessionBrokerError("provider-error", "Privy rejected the transaction request", { cause: error });
240
+ }
241
+ if (sponsor) {
242
+ await this.dependencies.store.put({
243
+ ...session,
244
+ sponsorshipUsed: true,
245
+ });
246
+ }
247
+ return hash;
248
+ }
249
+ async requireSession(token) {
250
+ if (token.length < 32) {
251
+ throw new PrivySessionBrokerError("unauthorized", "invalid session token");
252
+ }
253
+ const session = await this.dependencies.store.findByTokenHash(hashToken(token));
254
+ if (session === null ||
255
+ !safeTokenHashEqual(session.tokenHash, hashToken(token))) {
256
+ throw new PrivySessionBrokerError("unauthorized", "invalid session token");
257
+ }
258
+ if (session.revokedAt !== undefined) {
259
+ throw new PrivySessionBrokerError("revoked", "session is revoked");
260
+ }
261
+ if (this.now() >= session.expiresAt) {
262
+ throw new PrivySessionBrokerError("expired", "session is expired");
263
+ }
264
+ return session;
265
+ }
266
+ async withSessionLock(id, operation) {
267
+ const previous = this.locks.get(id) ?? Promise.resolve();
268
+ let release;
269
+ const next = new Promise((resolve) => {
270
+ release = resolve;
271
+ });
272
+ const queued = previous.then(() => next);
273
+ this.locks.set(id, queued);
274
+ await previous;
275
+ try {
276
+ return await operation();
277
+ }
278
+ finally {
279
+ release();
280
+ if (this.locks.get(id) === queued)
281
+ this.locks.delete(id);
282
+ }
283
+ }
284
+ now() {
285
+ return this.dependencies.nowSeconds?.() ?? Math.floor(Date.now() / 1_000);
286
+ }
287
+ }
288
+ export class InMemoryPrivyBrokerSessionStore {
289
+ sessions = new Map();
290
+ async findByTokenHash(tokenHash) {
291
+ return ([...this.sessions.values()].find((session) => safeTokenHashEqual(session.tokenHash, tokenHash)) ?? null);
292
+ }
293
+ async get(id) {
294
+ return this.sessions.get(id) ?? null;
295
+ }
296
+ async put(session) {
297
+ this.sessions.set(session.id, session);
298
+ }
299
+ }
300
+ function parseWireMandate(value) {
301
+ return signedSpendMandateSchema.parse(wireMandateSchema.parse(value));
302
+ }
303
+ function requireAddress(value) {
304
+ if (!isAddress(value)) {
305
+ throw new PrivySessionBrokerError("invalid-request", "invalid wallet address");
306
+ }
307
+ return getAddress(value);
308
+ }
309
+ function assertMandateWithinPrivyPolicy(signed) {
310
+ const mandate = signed.mandate;
311
+ if (mandate.maxPerStreamUsdc > PRIVY_POLICY_MAX_TOTAL_USDC ||
312
+ mandate.maxTotalUsdc > PRIVY_POLICY_MAX_TOTAL_USDC ||
313
+ mandate.maxRatePerSecondUsdc > PRIVY_POLICY_MAX_RATE_USDC ||
314
+ mandate.maxDurationSeconds > PRIVY_POLICY_MAX_DURATION_SECONDS) {
315
+ throw new PrivySessionBrokerError("policy-denied", "mandate exceeds the installed Privy signer policy");
316
+ }
317
+ }
318
+ function assertBoundedApproval(data, signed) {
319
+ const decoded = decodeFunctionData({
320
+ abi: [
321
+ {
322
+ type: "function",
323
+ name: "approve",
324
+ stateMutability: "nonpayable",
325
+ inputs: [
326
+ { name: "spender", type: "address" },
327
+ { name: "amount", type: "uint256" },
328
+ ],
329
+ outputs: [{ name: "", type: "bool" }],
330
+ },
331
+ ],
332
+ data,
333
+ });
334
+ const [spender, amount] = decoded.args;
335
+ if (spender.toLowerCase() !== PRIVY_BROKER_ESCROW.toLowerCase() ||
336
+ amount > signed.mandate.maxPerStreamUsdc) {
337
+ throw new PrivySessionBrokerError("policy-denied", "USDC approval exceeds the mandate or targets another spender");
338
+ }
339
+ }
340
+ function assertChainId(value) {
341
+ if (value === undefined)
342
+ return;
343
+ const parsed = typeof value === "number"
344
+ ? value
345
+ : value.startsWith("0x")
346
+ ? Number.parseInt(value.slice(2), 16)
347
+ : Number(value);
348
+ if (parsed !== PRIVY_BROKER_CHAIN_ID) {
349
+ throw new PrivySessionBrokerError("policy-denied", "transaction is not for Base Sepolia");
350
+ }
351
+ }
352
+ function assertZeroValue(value) {
353
+ if (value === undefined)
354
+ return;
355
+ const parsed = typeof value === "bigint"
356
+ ? value
357
+ : typeof value === "number"
358
+ ? BigInt(value)
359
+ : BigInt(value);
360
+ if (parsed !== 0n) {
361
+ throw new PrivySessionBrokerError("policy-denied", "native-token transfers are not allowed");
362
+ }
363
+ }
364
+ function hashToken(token) {
365
+ return createHash("sha256").update(token).digest("hex");
366
+ }
367
+ function safeTokenHashEqual(left, right) {
368
+ const a = Buffer.from(left, "hex");
369
+ const b = Buffer.from(right, "hex");
370
+ return a.length === b.length && timingSafeEqual(a, b);
371
+ }
372
+ //# sourceMappingURL=privy-session-broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privy-session-broker.js","sourceRoot":"","sources":["../../src/wallet/privy-session-broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type Address } from "viem";
2
+ import type { PrivyEip1193Provider } from "./provider.js";
3
+ export interface PrivySessionProviderConfig {
4
+ readonly brokerUrl: string;
5
+ readonly sessionToken: string;
6
+ readonly address: Address;
7
+ readonly rpcUrl?: string;
8
+ readonly fetchImpl?: typeof fetch;
9
+ }
10
+ export declare class PrivySessionProviderError extends Error {
11
+ constructor(message: string, options?: {
12
+ readonly cause?: unknown;
13
+ });
14
+ }
15
+ /**
16
+ * EIP-1193 provider for a policy-bound Metrik/Privy headless session.
17
+ * Signing and writes go only to the broker; public read RPCs go directly to
18
+ * Base Sepolia and never receive the session token.
19
+ */
20
+ export declare function createPrivySessionProvider(config: PrivySessionProviderConfig): PrivyEip1193Provider;
21
+ //# sourceMappingURL=privy-session-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privy-session-provider.d.ts","sourceRoot":"","sources":["../../src/wallet/privy-session-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAY,MAAM,MAAM,CAAC;AAG1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAe1D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACnC;AAED,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAIpE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,0BAA0B,GACjC,oBAAoB,CA0EtB"}
@@ -0,0 +1,94 @@
1
+ import { getAddress } from "viem";
2
+ import { z } from "zod";
3
+ const jsonRpcResponseSchema = z.object({
4
+ jsonrpc: z.literal("2.0"),
5
+ id: z.union([z.string(), z.number(), z.null()]),
6
+ result: z.unknown().optional(),
7
+ error: z
8
+ .object({
9
+ code: z.number(),
10
+ message: z.string(),
11
+ data: z.unknown().optional(),
12
+ })
13
+ .optional(),
14
+ });
15
+ export class PrivySessionProviderError extends Error {
16
+ constructor(message, options) {
17
+ super(message, options);
18
+ this.name = "PrivySessionProviderError";
19
+ }
20
+ }
21
+ /**
22
+ * EIP-1193 provider for a policy-bound Metrik/Privy headless session.
23
+ * Signing and writes go only to the broker; public read RPCs go directly to
24
+ * Base Sepolia and never receive the session token.
25
+ */
26
+ export function createPrivySessionProvider(config) {
27
+ const fetchImpl = config.fetchImpl ?? fetch;
28
+ const address = getAddress(config.address);
29
+ const brokerUrl = new URL("/v1/rpc", requireHttpsBase(config.brokerUrl));
30
+ const rpcUrl = config.rpcUrl ?? "https://base-sepolia-rpc.publicnode.com";
31
+ let rpcId = 0;
32
+ return {
33
+ async request({ method, params = [] }) {
34
+ if (method === "eth_chainId")
35
+ return "0x14a34";
36
+ if (method === "eth_accounts" || method === "eth_requestAccounts") {
37
+ return [address];
38
+ }
39
+ if (method === "eth_sendTransaction" ||
40
+ method === "eth_signTypedData_v4") {
41
+ const response = await fetchImpl(brokerUrl, {
42
+ method: "POST",
43
+ headers: {
44
+ authorization: `Bearer ${config.sessionToken}`,
45
+ "content-type": "application/json",
46
+ },
47
+ body: JSON.stringify({ method, params }, bigintJson),
48
+ }).catch((error) => {
49
+ throw new PrivySessionProviderError("session broker is unreachable", {
50
+ cause: error,
51
+ });
52
+ });
53
+ const body = (await response.json().catch(() => null));
54
+ if (!response.ok || body?.result === undefined) {
55
+ throw new PrivySessionProviderError(body?.error ??
56
+ `session broker rejected ${method} (${response.status})`);
57
+ }
58
+ return body.result;
59
+ }
60
+ if (method === "personal_sign" ||
61
+ method === "eth_sign" ||
62
+ method === "eth_signTransaction" ||
63
+ method === "wallet_sendCalls") {
64
+ throw new PrivySessionProviderError(`${method} is outside the Metrik agent-session policy`);
65
+ }
66
+ const id = ++rpcId;
67
+ const response = await fetchImpl(rpcUrl, {
68
+ method: "POST",
69
+ headers: { "content-type": "application/json" },
70
+ body: JSON.stringify({ jsonrpc: "2.0", id, method, params }, bigintJson),
71
+ }).catch((error) => {
72
+ throw new PrivySessionProviderError("Base Sepolia RPC is unreachable", {
73
+ cause: error,
74
+ });
75
+ });
76
+ const body = jsonRpcResponseSchema.parse(await response.json());
77
+ if (!response.ok || body.error !== undefined) {
78
+ throw new PrivySessionProviderError(body.error?.message ?? `Base Sepolia RPC rejected ${method}`);
79
+ }
80
+ return body.result;
81
+ },
82
+ };
83
+ }
84
+ function requireHttpsBase(value) {
85
+ const url = new URL(value);
86
+ if (url.protocol !== "https:" && url.hostname !== "localhost") {
87
+ throw new PrivySessionProviderError("session broker URL must use HTTPS (except localhost development)");
88
+ }
89
+ return url;
90
+ }
91
+ function bigintJson(_key, value) {
92
+ return typeof value === "bigint" ? `0x${value.toString(16)}` : value;
93
+ }
94
+ //# sourceMappingURL=privy-session-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privy-session-provider.js","sourceRoot":"","sources":["../../src/wallet/privy-session-provider.ts"],"names":[],"mappings":"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"}