@absol-labs/agent 0.6.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.
- package/README.md +21 -5
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/wallet/autonomous-wallet-broker.d.ts +97 -0
- package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -0
- package/dist/wallet/autonomous-wallet-broker.js +468 -0
- package/dist/wallet/autonomous-wallet-broker.js.map +1 -0
- package/dist/wallet/autonomous-wallet-protocol.d.ts +56 -0
- package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -0
- package/dist/wallet/autonomous-wallet-protocol.js +15 -0
- package/dist/wallet/autonomous-wallet-protocol.js.map +1 -0
- package/dist/wallet/autonomous-wallet.d.ts +106 -0
- package/dist/wallet/autonomous-wallet.d.ts.map +1 -0
- package/dist/wallet/autonomous-wallet.js +494 -0
- package/dist/wallet/autonomous-wallet.js.map +1 -0
- package/dist/wallet/privy-broker-server-entry.d.ts +2 -0
- package/dist/wallet/privy-broker-server-entry.d.ts.map +1 -0
- package/dist/wallet/privy-broker-server-entry.js +8 -0
- package/dist/wallet/privy-broker-server-entry.js.map +1 -0
- package/dist/wallet/privy-broker-server.d.ts +29 -0
- package/dist/wallet/privy-broker-server.d.ts.map +1 -0
- package/dist/wallet/privy-broker-server.js +480 -0
- package/dist/wallet/privy-broker-server.js.map +1 -0
- package/dist/wallet/privy-session-broker.d.ts +109 -0
- package/dist/wallet/privy-session-broker.d.ts.map +1 -0
- package/dist/wallet/privy-session-broker.js +372 -0
- package/dist/wallet/privy-session-broker.js.map +1 -0
- package/dist/wallet/privy-session-provider.d.ts +21 -0
- package/dist/wallet/privy-session-provider.d.ts.map +1 -0
- package/dist/wallet/privy-session-provider.js +94 -0
- package/dist/wallet/privy-session-provider.js.map +1 -0
- package/dist/wallet/provider.d.ts +51 -2
- package/dist/wallet/provider.d.ts.map +1 -1
- package/dist/wallet/provider.js +138 -1
- package/dist/wallet/provider.js.map +1 -1
- package/package.json +3 -1
- package/src/index.ts +73 -0
- package/src/wallet/autonomous-wallet-broker.ts +764 -0
- package/src/wallet/autonomous-wallet-protocol.ts +71 -0
- package/src/wallet/autonomous-wallet.ts +779 -0
- package/src/wallet/privy-broker-server-entry.ts +9 -0
- package/src/wallet/privy-broker-server.ts +573 -0
- package/src/wallet/privy-session-broker.ts +634 -0
- package/src/wallet/privy-session-provider.ts +129 -0
- package/src/wallet/provider.ts +260 -3
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import { createPublicKey, randomUUID, verify } from "node:crypto";
|
|
2
|
+
import { formatRequestForAuthorizationSignature, } from "@privy-io/node";
|
|
3
|
+
import { streamEscrowV2Abi } from "@absol-labs/shared";
|
|
4
|
+
import { decodeFunctionData, getAddress, isAddress, } from "viem";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { autonomousProofBytes, AUTONOMOUS_WALLET_CHAIN_ID, AUTONOMOUS_WALLET_VERSION, } from "./autonomous-wallet-protocol.js";
|
|
7
|
+
import { invocationCapabilitySchema } from "../capability/invocation-capability.js";
|
|
8
|
+
import { invocationCapabilityDomainName, invocationCapabilityDomainVersion, } from "../capability/invocation-capability.js";
|
|
9
|
+
import { PRIVY_POLICY_MAX_DURATION_SECONDS, PRIVY_POLICY_MAX_RATE_USDC, PRIVY_POLICY_MAX_TOTAL_USDC, PRIVY_BROKER_ESCROW, PRIVY_BROKER_USDC, } from "./privy-session-broker.js";
|
|
10
|
+
const transactionSchema = z.object({
|
|
11
|
+
from: z.string().refine(isAddress),
|
|
12
|
+
to: z.string().refine(isAddress),
|
|
13
|
+
data: z.string().regex(/^0x[0-9a-fA-F]*$/),
|
|
14
|
+
value: z.union([z.string(), z.number(), z.bigint()]).optional(),
|
|
15
|
+
chainId: z.union([z.string(), z.number()]).optional(),
|
|
16
|
+
});
|
|
17
|
+
const typedDataSchema = z.object({
|
|
18
|
+
domain: z.object({
|
|
19
|
+
name: z.string(),
|
|
20
|
+
version: z.string(),
|
|
21
|
+
chainId: z.union([z.string(), z.number()]),
|
|
22
|
+
verifyingContract: z.string().refine(isAddress),
|
|
23
|
+
}),
|
|
24
|
+
primaryType: z.literal("InvocationCapability"),
|
|
25
|
+
types: z.record(z.array(z.object({ name: z.string(), type: z.string() }))),
|
|
26
|
+
message: z.record(z.unknown()),
|
|
27
|
+
});
|
|
28
|
+
export class AutonomousWalletBrokerError extends Error {
|
|
29
|
+
code;
|
|
30
|
+
constructor(code, message, options) {
|
|
31
|
+
super(message, options);
|
|
32
|
+
this.code = code;
|
|
33
|
+
this.name = "AutonomousWalletBrokerError";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Broker for the agent-owned path. The server knows the wallet ID and Privy
|
|
38
|
+
* app credentials, but never receives or stores the agent's private key. Every
|
|
39
|
+
* RPC is frozen into a short-lived request; the agent signs those exact bytes,
|
|
40
|
+
* then the broker forwards that signature as Privy's authorization context.
|
|
41
|
+
*/
|
|
42
|
+
export class AutonomousWalletBroker {
|
|
43
|
+
options;
|
|
44
|
+
locks = new Map();
|
|
45
|
+
nowSeconds;
|
|
46
|
+
proofMaxAge;
|
|
47
|
+
requestTtl;
|
|
48
|
+
privyApiBaseUrl;
|
|
49
|
+
constructor(options) {
|
|
50
|
+
this.options = options;
|
|
51
|
+
if (options.appId.trim() === "" || options.policyId.trim() === "") {
|
|
52
|
+
throw new AutonomousWalletBrokerError("invalid-request", "Privy app id and fixed policy id are required");
|
|
53
|
+
}
|
|
54
|
+
this.nowSeconds =
|
|
55
|
+
options.nowSeconds ?? (() => Math.floor(Date.now() / 1_000));
|
|
56
|
+
this.proofMaxAge = options.proofMaxAgeSeconds ?? 300;
|
|
57
|
+
this.requestTtl = options.requestTtlSeconds ?? 60;
|
|
58
|
+
if (!Number.isInteger(this.proofMaxAge) ||
|
|
59
|
+
this.proofMaxAge < 1 ||
|
|
60
|
+
!Number.isInteger(this.requestTtl) ||
|
|
61
|
+
this.requestTtl < 1) {
|
|
62
|
+
throw new AutonomousWalletBrokerError("invalid-request", "proof and request TTLs must be positive integers");
|
|
63
|
+
}
|
|
64
|
+
const base = options.privyApiBaseUrl ?? "https://api.privy.io";
|
|
65
|
+
const url = new URL(base);
|
|
66
|
+
if (url.protocol !== "https:")
|
|
67
|
+
throw new AutonomousWalletBrokerError("invalid-request", "Privy API URL must use HTTPS");
|
|
68
|
+
url.search = "";
|
|
69
|
+
url.hash = "";
|
|
70
|
+
this.privyApiBaseUrl = url.toString().replace(/\/$/, "");
|
|
71
|
+
}
|
|
72
|
+
async provision(input) {
|
|
73
|
+
// A single provisioning lock closes both the public-key and nonce races.
|
|
74
|
+
// Provisioning is rare and Privy is the dominant latency, so serializing it
|
|
75
|
+
// is preferable to creating two wallets for concurrent conflicting proofs.
|
|
76
|
+
return this.withLock("provision", () => this.provisionUnlocked(input));
|
|
77
|
+
}
|
|
78
|
+
async provisionUnlocked(input) {
|
|
79
|
+
if (input.appId !== this.options.appId ||
|
|
80
|
+
input.chainId !== AUTONOMOUS_WALLET_CHAIN_ID) {
|
|
81
|
+
throw new AutonomousWalletBrokerError("invalid-request", "autonomous wallet request is for an unsupported app or chain");
|
|
82
|
+
}
|
|
83
|
+
if (input.proof.nonce !== input.idempotencyKey) {
|
|
84
|
+
throw new AutonomousWalletBrokerError("unauthorized", "proof nonce does not match idempotency key");
|
|
85
|
+
}
|
|
86
|
+
verifyProof(input.proof, input.publicKey, this.options.appId, this.nowSeconds(), this.proofMaxAge);
|
|
87
|
+
const byNonce = await this.options.store.findProvisionByNonce(input.idempotencyKey);
|
|
88
|
+
if (byNonce !== null) {
|
|
89
|
+
if (byNonce.publicKey !== input.publicKey)
|
|
90
|
+
throw new AutonomousWalletBrokerError("replay", "provisioning nonce is already bound to another key");
|
|
91
|
+
return byNonce;
|
|
92
|
+
}
|
|
93
|
+
const existing = await this.options.store.findProvisionByPublicKey(input.publicKey);
|
|
94
|
+
if (existing !== null) {
|
|
95
|
+
if (existing.nonce !== input.idempotencyKey)
|
|
96
|
+
throw new AutonomousWalletBrokerError("replay", "public key is already bound to another provisioning nonce");
|
|
97
|
+
return existing;
|
|
98
|
+
}
|
|
99
|
+
let created;
|
|
100
|
+
try {
|
|
101
|
+
created = await this.options.provider.createWallet({
|
|
102
|
+
publicKey: input.publicKey,
|
|
103
|
+
policyId: this.options.policyId,
|
|
104
|
+
idempotencyKey: input.idempotencyKey,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
throw new AutonomousWalletBrokerError("provider-error", "Privy rejected autonomous wallet creation", { cause: error });
|
|
109
|
+
}
|
|
110
|
+
if (created.policyId !== this.options.policyId) {
|
|
111
|
+
throw new AutonomousWalletBrokerError("provider-error", "Privy returned a wallet without the approved Metrik policy");
|
|
112
|
+
}
|
|
113
|
+
const result = {
|
|
114
|
+
...created,
|
|
115
|
+
publicKey: input.publicKey,
|
|
116
|
+
nonce: input.idempotencyKey,
|
|
117
|
+
};
|
|
118
|
+
await this.options.store.putProvision(result);
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
async prepare(input) {
|
|
122
|
+
const provision = await this.options.store.findProvisionByPublicKey(input.publicKey);
|
|
123
|
+
if (provision === null || provision.walletId !== input.walletId)
|
|
124
|
+
throw new AutonomousWalletBrokerError("unauthorized", "wallet is not bound to this public key");
|
|
125
|
+
const body = await buildRpcBody(input.method, input.params, provision.address, this.options.streamReader, this.nowSeconds());
|
|
126
|
+
const requestExpiryMs = (this.nowSeconds() + this.requestTtl) * 1_000;
|
|
127
|
+
const idempotencyKey = randomUUID();
|
|
128
|
+
const requestId = randomUUID();
|
|
129
|
+
const payload = formatRequestForAuthorizationSignature({
|
|
130
|
+
version: 1,
|
|
131
|
+
method: "POST",
|
|
132
|
+
url: `${this.privyApiBaseUrl}/v1/wallets/${input.walletId}/rpc`,
|
|
133
|
+
body,
|
|
134
|
+
headers: {
|
|
135
|
+
"privy-app-id": this.options.appId,
|
|
136
|
+
"privy-idempotency-key": idempotencyKey,
|
|
137
|
+
"privy-request-expiry": String(requestExpiryMs),
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
const prepared = {
|
|
141
|
+
requestId,
|
|
142
|
+
walletId: input.walletId,
|
|
143
|
+
publicKey: input.publicKey,
|
|
144
|
+
method: input.method,
|
|
145
|
+
payload: Buffer.from(payload).toString("base64"),
|
|
146
|
+
expiresAt: Math.floor(requestExpiryMs / 1_000),
|
|
147
|
+
requestExpiryMs,
|
|
148
|
+
idempotencyKey,
|
|
149
|
+
body,
|
|
150
|
+
};
|
|
151
|
+
await this.options.store.putPrepared(prepared);
|
|
152
|
+
return prepared;
|
|
153
|
+
}
|
|
154
|
+
async execute(input) {
|
|
155
|
+
return this.withLock(input.requestId, async () => {
|
|
156
|
+
const prepared = await this.options.store.getPrepared(input.requestId);
|
|
157
|
+
if (prepared === null)
|
|
158
|
+
throw new AutonomousWalletBrokerError("replay", "prepared request was already consumed or does not exist");
|
|
159
|
+
if (prepared.publicKey !== input.publicKey)
|
|
160
|
+
throw new AutonomousWalletBrokerError("unauthorized", "request signer does not match the prepared public key");
|
|
161
|
+
if (prepared.result !== undefined)
|
|
162
|
+
return prepared.result;
|
|
163
|
+
if (prepared.consumedAt !== undefined)
|
|
164
|
+
throw new AutonomousWalletBrokerError("replay", "prepared request was already consumed");
|
|
165
|
+
if (this.nowSeconds() >= prepared.expiresAt)
|
|
166
|
+
throw new AutonomousWalletBrokerError("replay", "prepared request has expired");
|
|
167
|
+
verifyP256Signature(prepared.publicKey, Buffer.from(prepared.payload, "base64"), input.signature);
|
|
168
|
+
let result;
|
|
169
|
+
try {
|
|
170
|
+
result = await this.options.provider.executeRpc({
|
|
171
|
+
walletId: prepared.walletId,
|
|
172
|
+
body: prepared.body,
|
|
173
|
+
idempotencyKey: prepared.idempotencyKey,
|
|
174
|
+
requestExpiryMs: prepared.requestExpiryMs,
|
|
175
|
+
signature: input.signature,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
throw new AutonomousWalletBrokerError("provider-error", "Privy rejected the agent authorization signature", { cause: error });
|
|
180
|
+
}
|
|
181
|
+
const completed = await this.options.store.completePrepared(input.requestId, result, this.nowSeconds());
|
|
182
|
+
if (completed === null)
|
|
183
|
+
throw new AutonomousWalletBrokerError("replay", "prepared request disappeared before completion");
|
|
184
|
+
return result;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async withLock(id, operation) {
|
|
188
|
+
const previous = this.locks.get(id) ?? Promise.resolve();
|
|
189
|
+
let release;
|
|
190
|
+
const next = new Promise((resolve) => {
|
|
191
|
+
release = resolve;
|
|
192
|
+
});
|
|
193
|
+
const queued = previous.then(() => next);
|
|
194
|
+
this.locks.set(id, queued);
|
|
195
|
+
await previous;
|
|
196
|
+
try {
|
|
197
|
+
return await operation();
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
release();
|
|
201
|
+
if (this.locks.get(id) === queued)
|
|
202
|
+
this.locks.delete(id);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/** Adapts the installed @privy-io/node client without giving it an agent key. */
|
|
207
|
+
export function createPrivyAutonomousProvider(client) {
|
|
208
|
+
return {
|
|
209
|
+
async createWallet(input) {
|
|
210
|
+
const wallet = await client.wallets().create({
|
|
211
|
+
chain_type: "ethereum",
|
|
212
|
+
owner: { public_key: input.publicKey },
|
|
213
|
+
policy_ids: [input.policyId],
|
|
214
|
+
idempotency_key: input.idempotencyKey,
|
|
215
|
+
});
|
|
216
|
+
return {
|
|
217
|
+
walletId: wallet.id,
|
|
218
|
+
address: getAddress(wallet.address),
|
|
219
|
+
policyId: wallet.policy_ids[0] ?? "",
|
|
220
|
+
};
|
|
221
|
+
},
|
|
222
|
+
async executeRpc(input) {
|
|
223
|
+
const response = await client.wallets().rpc(input.walletId, {
|
|
224
|
+
...input.body,
|
|
225
|
+
authorization_context: { signatures: [input.signature] },
|
|
226
|
+
idempotency_key: input.idempotencyKey,
|
|
227
|
+
request_expiry: input.requestExpiryMs,
|
|
228
|
+
});
|
|
229
|
+
const data = response.data;
|
|
230
|
+
if (data === null || typeof data !== "object")
|
|
231
|
+
throw new Error("Privy returned an invalid RPC response");
|
|
232
|
+
const record = data;
|
|
233
|
+
const result = record.hash ?? record.signature;
|
|
234
|
+
if (typeof result !== "string" || !/^0x[0-9a-fA-F]+$/.test(result))
|
|
235
|
+
throw new Error("Privy returned no transaction/signature result");
|
|
236
|
+
return result;
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
export class InMemoryAutonomousWalletBrokerStore {
|
|
241
|
+
provisions = new Map();
|
|
242
|
+
prepared = new Map();
|
|
243
|
+
async findProvisionByPublicKey(key) {
|
|
244
|
+
return this.provisions.get(key) ?? null;
|
|
245
|
+
}
|
|
246
|
+
async findProvisionByNonce(nonce) {
|
|
247
|
+
return [...this.provisions.values()].find((p) => p.nonce === nonce) ?? null;
|
|
248
|
+
}
|
|
249
|
+
async putProvision(value) {
|
|
250
|
+
this.provisions.set(value.publicKey, value);
|
|
251
|
+
}
|
|
252
|
+
async getPrepared(id) {
|
|
253
|
+
return this.prepared.get(id) ?? null;
|
|
254
|
+
}
|
|
255
|
+
async putPrepared(value) {
|
|
256
|
+
this.prepared.set(value.requestId, value);
|
|
257
|
+
}
|
|
258
|
+
async completePrepared(id, result, consumedAt) {
|
|
259
|
+
const value = this.prepared.get(id);
|
|
260
|
+
if (value === undefined)
|
|
261
|
+
return null;
|
|
262
|
+
if (value.result !== undefined)
|
|
263
|
+
return value;
|
|
264
|
+
const consumed = { ...value, consumedAt, result };
|
|
265
|
+
this.prepared.set(id, consumed);
|
|
266
|
+
return consumed;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function verifyProof(proof, publicKey, appId, now, maxAge) {
|
|
270
|
+
if (proof.version !== AUTONOMOUS_WALLET_VERSION ||
|
|
271
|
+
proof.appId !== appId ||
|
|
272
|
+
proof.chainId !== AUTONOMOUS_WALLET_CHAIN_ID ||
|
|
273
|
+
proof.publicKey !== publicKey ||
|
|
274
|
+
!Number.isSafeInteger(proof.issuedAt) ||
|
|
275
|
+
proof.issuedAt > now + 30 ||
|
|
276
|
+
proof.issuedAt < now - maxAge ||
|
|
277
|
+
!/^[A-Za-z0-9+/]+={0,2}$/.test(proof.signature))
|
|
278
|
+
throw new AutonomousWalletBrokerError("unauthorized", "invalid autonomous wallet proof");
|
|
279
|
+
try {
|
|
280
|
+
const key = parseP256PublicKey(publicKey);
|
|
281
|
+
if (!verify("sha256", autonomousProofBytes(proof), key, Buffer.from(proof.signature, "base64")))
|
|
282
|
+
throw new Error("signature mismatch");
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
throw new AutonomousWalletBrokerError("unauthorized", "invalid autonomous wallet proof signature", { cause: error });
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function verifyP256Signature(publicKey, payload, signature) {
|
|
289
|
+
try {
|
|
290
|
+
const key = parseP256PublicKey(publicKey);
|
|
291
|
+
if (!isStrictBase64(signature) ||
|
|
292
|
+
!verify("sha256", payload, key, Buffer.from(signature, "base64"))) {
|
|
293
|
+
throw new Error("signature mismatch");
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
throw new AutonomousWalletBrokerError("unauthorized", "invalid prepared-request signature", { cause: error });
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
function parseP256PublicKey(value) {
|
|
301
|
+
if (!isStrictBase64(value))
|
|
302
|
+
throw new Error("public key is not strict base64");
|
|
303
|
+
const key = createPublicKey({
|
|
304
|
+
key: Buffer.from(value, "base64"),
|
|
305
|
+
format: "der",
|
|
306
|
+
type: "spki",
|
|
307
|
+
});
|
|
308
|
+
if (key.asymmetricKeyType !== "ec" ||
|
|
309
|
+
key.asymmetricKeyDetails?.namedCurve !== "prime256v1") {
|
|
310
|
+
throw new Error("public key is not a P-256 key");
|
|
311
|
+
}
|
|
312
|
+
return key;
|
|
313
|
+
}
|
|
314
|
+
function isStrictBase64(value) {
|
|
315
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(value) || value.length % 4 === 1)
|
|
316
|
+
return false;
|
|
317
|
+
const decoded = Buffer.from(value, "base64");
|
|
318
|
+
return decoded.length > 0 && decoded.toString("base64") === value;
|
|
319
|
+
}
|
|
320
|
+
async function buildRpcBody(method, params, address, streamReader, now) {
|
|
321
|
+
if (method === "eth_sendTransaction") {
|
|
322
|
+
const tx = transactionSchema.parse(params[0]);
|
|
323
|
+
if (tx.from.toLowerCase() !== address.toLowerCase())
|
|
324
|
+
throw new AutonomousWalletBrokerError("policy-denied", "transaction sender does not match wallet");
|
|
325
|
+
assertChain(tx.chainId);
|
|
326
|
+
assertZeroValue(tx.value);
|
|
327
|
+
const target = getAddress(tx.to).toLowerCase();
|
|
328
|
+
if (target === PRIVY_BROKER_USDC.toLowerCase()) {
|
|
329
|
+
assertUsdcApproval(tx.data);
|
|
330
|
+
}
|
|
331
|
+
else if (target === PRIVY_BROKER_ESCROW.toLowerCase()) {
|
|
332
|
+
await assertEscrowMethod(tx.data, address, streamReader);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
throw new AutonomousWalletBrokerError("policy-denied", "transaction target is not allowlisted");
|
|
336
|
+
}
|
|
337
|
+
const { chainId: _chainId, ...transaction } = tx;
|
|
338
|
+
return {
|
|
339
|
+
method,
|
|
340
|
+
chain_type: "ethereum",
|
|
341
|
+
caip2: "eip155:84532",
|
|
342
|
+
params: { transaction: normalizeJson(transaction) },
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
const signer = params[0];
|
|
346
|
+
const typed = typeof params[1] === "string"
|
|
347
|
+
? JSON.parse(params[1])
|
|
348
|
+
: params[1];
|
|
349
|
+
if (typeof signer !== "string" ||
|
|
350
|
+
signer.toLowerCase() !== address.toLowerCase())
|
|
351
|
+
throw new AutonomousWalletBrokerError("policy-denied", "typed-data signer does not match wallet");
|
|
352
|
+
const parsed = typedDataSchema.parse(typed);
|
|
353
|
+
if (parsed.domain.chainId !== AUTONOMOUS_WALLET_CHAIN_ID &&
|
|
354
|
+
Number(parsed.domain.chainId) !== AUTONOMOUS_WALLET_CHAIN_ID)
|
|
355
|
+
throw new AutonomousWalletBrokerError("policy-denied", "typed data is not for Base Sepolia");
|
|
356
|
+
if (parsed.domain.name !== invocationCapabilityDomainName ||
|
|
357
|
+
parsed.domain.version !== invocationCapabilityDomainVersion ||
|
|
358
|
+
parsed.domain.verifyingContract.toLowerCase() !==
|
|
359
|
+
PRIVY_BROKER_ESCROW.toLowerCase())
|
|
360
|
+
throw new AutonomousWalletBrokerError("policy-denied", "only Metrik invocation capabilities may be signed");
|
|
361
|
+
const capability = invocationCapabilitySchema.parse({
|
|
362
|
+
...parsed.message,
|
|
363
|
+
expiry: typeof parsed.message.expiry === "string"
|
|
364
|
+
? Number(parsed.message.expiry)
|
|
365
|
+
: parsed.message.expiry,
|
|
366
|
+
});
|
|
367
|
+
if (capability.buyer.toLowerCase() !== address.toLowerCase() ||
|
|
368
|
+
capability.expiry <= now ||
|
|
369
|
+
capability.expiry > now + 120) {
|
|
370
|
+
throw new AutonomousWalletBrokerError("policy-denied", "capability buyer or expiry is outside the autonomous wallet policy");
|
|
371
|
+
}
|
|
372
|
+
const stream = await streamReader.getStream(capability.streamId);
|
|
373
|
+
if (stream.status !== "active" ||
|
|
374
|
+
stream.buyer.toLowerCase() !== address.toLowerCase() ||
|
|
375
|
+
stream.serviceRef.toLowerCase() !== capability.serviceRef.toLowerCase()) {
|
|
376
|
+
throw new AutonomousWalletBrokerError("policy-denied", "capability does not match an active buyer stream");
|
|
377
|
+
}
|
|
378
|
+
return {
|
|
379
|
+
method,
|
|
380
|
+
chain_type: "ethereum",
|
|
381
|
+
caip2: "eip155:84532",
|
|
382
|
+
params: { typed_data: normalizeJson(parsed) },
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
function normalizeJson(value) {
|
|
386
|
+
if (typeof value === "bigint")
|
|
387
|
+
return `0x${value.toString(16)}`;
|
|
388
|
+
if (Array.isArray(value))
|
|
389
|
+
return value.map(normalizeJson);
|
|
390
|
+
if (value !== null && typeof value === "object") {
|
|
391
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, normalizeJson(item)]));
|
|
392
|
+
}
|
|
393
|
+
return value;
|
|
394
|
+
}
|
|
395
|
+
function assertChain(value) {
|
|
396
|
+
if (value === undefined)
|
|
397
|
+
return;
|
|
398
|
+
const parsed = typeof value === "number"
|
|
399
|
+
? value
|
|
400
|
+
: value.startsWith("0x")
|
|
401
|
+
? Number.parseInt(value.slice(2), 16)
|
|
402
|
+
: Number(value);
|
|
403
|
+
if (parsed !== AUTONOMOUS_WALLET_CHAIN_ID)
|
|
404
|
+
throw new AutonomousWalletBrokerError("policy-denied", "transaction is not for Base Sepolia");
|
|
405
|
+
}
|
|
406
|
+
function assertZeroValue(value) {
|
|
407
|
+
if (value === undefined)
|
|
408
|
+
return;
|
|
409
|
+
try {
|
|
410
|
+
if (BigInt(value) !== 0n)
|
|
411
|
+
throw new Error("nonzero");
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
throw new AutonomousWalletBrokerError("policy-denied", "native-token transfers are not allowed", { cause: error });
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
function assertUsdcApproval(data) {
|
|
418
|
+
try {
|
|
419
|
+
const decoded = decodeFunctionData({
|
|
420
|
+
abi: [
|
|
421
|
+
{
|
|
422
|
+
type: "function",
|
|
423
|
+
name: "approve",
|
|
424
|
+
stateMutability: "nonpayable",
|
|
425
|
+
inputs: [
|
|
426
|
+
{ name: "spender", type: "address" },
|
|
427
|
+
{ name: "amount", type: "uint256" },
|
|
428
|
+
],
|
|
429
|
+
outputs: [{ name: "", type: "bool" }],
|
|
430
|
+
},
|
|
431
|
+
],
|
|
432
|
+
data,
|
|
433
|
+
});
|
|
434
|
+
const [spender, amount] = decoded.args;
|
|
435
|
+
if (spender.toLowerCase() !== PRIVY_BROKER_ESCROW.toLowerCase() ||
|
|
436
|
+
amount > 1000000n)
|
|
437
|
+
throw new Error("approval outside Metrik policy");
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
throw new AutonomousWalletBrokerError("policy-denied", "USDC approval is not an allowlisted escrow approval", { cause: error });
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
async function assertEscrowMethod(data, address, streamReader) {
|
|
444
|
+
try {
|
|
445
|
+
const decoded = decodeFunctionData({ abi: streamEscrowV2Abi, data });
|
|
446
|
+
if (decoded.functionName === "openStream") {
|
|
447
|
+
const [, , deposit, rate, duration] = decoded.args;
|
|
448
|
+
if (deposit > PRIVY_POLICY_MAX_TOTAL_USDC ||
|
|
449
|
+
rate > PRIVY_POLICY_MAX_RATE_USDC ||
|
|
450
|
+
duration > BigInt(PRIVY_POLICY_MAX_DURATION_SECONDS)) {
|
|
451
|
+
throw new Error("openStream exceeds the fixed Metrik policy");
|
|
452
|
+
}
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
if (decoded.functionName !== "close" &&
|
|
456
|
+
decoded.functionName !== "reclaim" &&
|
|
457
|
+
decoded.functionName !== "reclaimUnverified") {
|
|
458
|
+
throw new Error("escrow method is not allowlisted");
|
|
459
|
+
}
|
|
460
|
+
const stream = await streamReader.getStream(decoded.args[0]);
|
|
461
|
+
if (stream.buyer.toLowerCase() !== address.toLowerCase())
|
|
462
|
+
throw new Error("autonomous wallet is not the stream buyer");
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
throw new AutonomousWalletBrokerError("policy-denied", "escrow call is outside the fixed Metrik policy", { cause: error });
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=autonomous-wallet-broker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autonomous-wallet-broker.js","sourceRoot":"","sources":["../../src/wallet/autonomous-wallet-broker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Address, Hex } from "viem";
|
|
2
|
+
export declare const AUTONOMOUS_WALLET_VERSION: 1;
|
|
3
|
+
export declare const AUTONOMOUS_WALLET_CHAIN_ID: 84532;
|
|
4
|
+
export declare const AUTONOMOUS_WALLET_CAIP2: "eip155:84532";
|
|
5
|
+
export interface PreparedPrivyRequest {
|
|
6
|
+
readonly requestId: string;
|
|
7
|
+
readonly walletId: string;
|
|
8
|
+
readonly method: "eth_sendTransaction" | "eth_signTypedData_v4";
|
|
9
|
+
/** Base64 of the exact canonical Privy authorization payload. */
|
|
10
|
+
readonly payload: string;
|
|
11
|
+
readonly expiresAt: number;
|
|
12
|
+
}
|
|
13
|
+
export interface AutonomousWalletProof {
|
|
14
|
+
readonly version: typeof AUTONOMOUS_WALLET_VERSION;
|
|
15
|
+
readonly appId: string;
|
|
16
|
+
readonly chainId: typeof AUTONOMOUS_WALLET_CHAIN_ID;
|
|
17
|
+
readonly publicKey: string;
|
|
18
|
+
readonly nonce: string;
|
|
19
|
+
readonly issuedAt: number;
|
|
20
|
+
/** Base64 DER ECDSA P-256 signature over {@link autonomousProofBytes}. */
|
|
21
|
+
readonly signature: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AutonomousWalletBroker {
|
|
24
|
+
provision(input: {
|
|
25
|
+
readonly appId: string;
|
|
26
|
+
readonly chainId: typeof AUTONOMOUS_WALLET_CHAIN_ID;
|
|
27
|
+
readonly publicKey: string;
|
|
28
|
+
readonly proof: AutonomousWalletProof;
|
|
29
|
+
readonly idempotencyKey: string;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
readonly walletId: string;
|
|
32
|
+
readonly address: Address;
|
|
33
|
+
readonly policyId: string;
|
|
34
|
+
}>;
|
|
35
|
+
prepare(input: {
|
|
36
|
+
readonly walletId: string;
|
|
37
|
+
readonly publicKey: string;
|
|
38
|
+
readonly method: "eth_sendTransaction" | "eth_signTypedData_v4";
|
|
39
|
+
readonly params: readonly unknown[];
|
|
40
|
+
}): Promise<PreparedPrivyRequest>;
|
|
41
|
+
execute(input: {
|
|
42
|
+
readonly requestId: string;
|
|
43
|
+
readonly publicKey: string;
|
|
44
|
+
readonly signature: string;
|
|
45
|
+
}): Promise<Hex>;
|
|
46
|
+
}
|
|
47
|
+
/** Canonical proof-of-possession bytes shared by the agent and broker. */
|
|
48
|
+
export declare function autonomousProofBytes(input: {
|
|
49
|
+
readonly version: typeof AUTONOMOUS_WALLET_VERSION;
|
|
50
|
+
readonly appId: string;
|
|
51
|
+
readonly chainId: typeof AUTONOMOUS_WALLET_CHAIN_ID;
|
|
52
|
+
readonly publicKey: string;
|
|
53
|
+
readonly nonce: string;
|
|
54
|
+
readonly issuedAt: number;
|
|
55
|
+
}): Uint8Array;
|
|
56
|
+
//# sourceMappingURL=autonomous-wallet-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autonomous-wallet-protocol.d.ts","sourceRoot":"","sources":["../../src/wallet/autonomous-wallet-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEzC,eAAO,MAAM,yBAAyB,EAAG,CAAU,CAAC;AACpD,eAAO,MAAM,0BAA0B,EAAG,KAAc,CAAC;AACzD,eAAO,MAAM,uBAAuB,EAAG,cAAuB,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,GAAG,sBAAsB,CAAC;IAChE,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,yBAAyB,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,0BAA0B,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,KAAK,EAAE;QACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,0BAA0B,CAAC;QACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;QACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;KACjC,GAAG,OAAO,CAAC;QACV,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,EAAE;QACb,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,GAAG,sBAAsB,CAAC;QAChE,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;KACrC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,EAAE;QACb,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAClB;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,yBAAyB,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,0BAA0B,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GAAG,UAAU,CAWb"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const AUTONOMOUS_WALLET_VERSION = 1;
|
|
2
|
+
export const AUTONOMOUS_WALLET_CHAIN_ID = 84532;
|
|
3
|
+
export const AUTONOMOUS_WALLET_CAIP2 = "eip155:84532";
|
|
4
|
+
/** Canonical proof-of-possession bytes shared by the agent and broker. */
|
|
5
|
+
export function autonomousProofBytes(input) {
|
|
6
|
+
return new TextEncoder().encode(JSON.stringify({
|
|
7
|
+
appId: input.appId,
|
|
8
|
+
chainId: input.chainId,
|
|
9
|
+
nonce: input.nonce,
|
|
10
|
+
publicKey: input.publicKey,
|
|
11
|
+
version: input.version,
|
|
12
|
+
issuedAt: input.issuedAt,
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=autonomous-wallet-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autonomous-wallet-protocol.js","sourceRoot":"","sources":["../../src/wallet/autonomous-wallet-protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAU,CAAC;AACpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAc,CAAC;AACzD,MAAM,CAAC,MAAM,uBAAuB,GAAG,cAAuB,CAAC;AA+C/D,0EAA0E;AAC1E,MAAM,UAAU,oBAAoB,CAAC,KAOpC;IACC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAC7B,IAAI,CAAC,SAAS,CAAC;QACb,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CACH,CAAC;AACJ,CAAC"}
|