@x402api/agent-wallet-core 0.1.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 (62) hide show
  1. package/README.md +12 -0
  2. package/dist/balances.d.ts +32 -0
  3. package/dist/balances.d.ts.map +1 -0
  4. package/dist/balances.js +278 -0
  5. package/dist/balances.js.map +1 -0
  6. package/dist/errors.d.ts +15 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +73 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/index.d.ts +15 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +15 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/notifications.d.ts +71 -0
  15. package/dist/notifications.d.ts.map +1 -0
  16. package/dist/notifications.js +209 -0
  17. package/dist/notifications.js.map +1 -0
  18. package/dist/payment/attempt-store.d.ts +49 -0
  19. package/dist/payment/attempt-store.d.ts.map +1 -0
  20. package/dist/payment/attempt-store.js +283 -0
  21. package/dist/payment/attempt-store.js.map +1 -0
  22. package/dist/payment/authorize.d.ts +22 -0
  23. package/dist/payment/authorize.d.ts.map +1 -0
  24. package/dist/payment/authorize.js +386 -0
  25. package/dist/payment/authorize.js.map +1 -0
  26. package/dist/payment/contracts.d.ts +36 -0
  27. package/dist/payment/contracts.d.ts.map +1 -0
  28. package/dist/payment/contracts.js +132 -0
  29. package/dist/payment/contracts.js.map +1 -0
  30. package/dist/protocol/base.d.ts +78 -0
  31. package/dist/protocol/base.d.ts.map +1 -0
  32. package/dist/protocol/base.js +459 -0
  33. package/dist/protocol/base.js.map +1 -0
  34. package/dist/protocol/external-recipient.d.ts +22 -0
  35. package/dist/protocol/external-recipient.d.ts.map +1 -0
  36. package/dist/protocol/external-recipient.js +149 -0
  37. package/dist/protocol/external-recipient.js.map +1 -0
  38. package/dist/protocol/http.d.ts +52 -0
  39. package/dist/protocol/http.d.ts.map +1 -0
  40. package/dist/protocol/http.js +283 -0
  41. package/dist/protocol/http.js.map +1 -0
  42. package/dist/protocol/solana.d.ts +147 -0
  43. package/dist/protocol/solana.d.ts.map +1 -0
  44. package/dist/protocol/solana.js +549 -0
  45. package/dist/protocol/solana.js.map +1 -0
  46. package/dist/protocol/tron.d.ts +130 -0
  47. package/dist/protocol/tron.d.ts.map +1 -0
  48. package/dist/protocol/tron.js +539 -0
  49. package/dist/protocol/tron.js.map +1 -0
  50. package/dist/storage/keystore.d.ts +51 -0
  51. package/dist/storage/keystore.d.ts.map +1 -0
  52. package/dist/storage/keystore.js +317 -0
  53. package/dist/storage/keystore.js.map +1 -0
  54. package/dist/storage/paths.d.ts +8 -0
  55. package/dist/storage/paths.d.ts.map +1 -0
  56. package/dist/storage/paths.js +22 -0
  57. package/dist/storage/paths.js.map +1 -0
  58. package/dist/storage/private-files.d.ts +8 -0
  59. package/dist/storage/private-files.d.ts.map +1 -0
  60. package/dist/storage/private-files.js +83 -0
  61. package/dist/storage/private-files.js.map +1 -0
  62. package/package.json +35 -0
@@ -0,0 +1,209 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { Wallet } from "ethers";
3
+ import { Trx } from "tronweb";
4
+ import nacl from "tweetnacl";
5
+ import { readWalletBalance } from "./balances.js";
6
+ import { AgentWalletError } from "./errors.js";
7
+ import { canonicalJson } from "./protocol/http.js";
8
+ import { unlockWallet } from "./storage/keystore.js";
9
+ const DECIMAL = /^(?:0|[1-9][0-9]{0,77})$/;
10
+ const REFERENCE = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/;
11
+ const DOMAIN = "x402api-agent-wallet-refill-v1\n";
12
+ export function validateNotificationUrl(value) {
13
+ let url;
14
+ try {
15
+ url = new URL(value);
16
+ }
17
+ catch (error) {
18
+ throw new AgentWalletError("notification_not_configured", "x402api notification URL is invalid", { cause: error });
19
+ }
20
+ const local = ["localhost", "127.0.0.1", "::1"].includes(url.hostname);
21
+ if ((!local && url.protocol !== "https:") ||
22
+ (local && !["http:", "https:"].includes(url.protocol)) ||
23
+ url.username ||
24
+ url.password ||
25
+ url.hash ||
26
+ value !== url.toString()) {
27
+ throw new AgentWalletError("notification_not_configured", "x402api notification URL must be normalized credential-free HTTPS");
28
+ }
29
+ return url.toString();
30
+ }
31
+ function canonicalRenewBy(value, now) {
32
+ if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/.test(value)) {
33
+ throw new AgentWalletError("invalid_input", "--renew-by must be a canonical UTC timestamp");
34
+ }
35
+ const timestamp = Date.parse(value);
36
+ const normalized = Number.isFinite(timestamp) ? new Date(timestamp).toISOString() : "";
37
+ if (!Number.isFinite(timestamp) ||
38
+ (value !== normalized && value !== normalized.replace(".000Z", "Z")) ||
39
+ timestamp <= now ||
40
+ timestamp > now + 366 * 86_400_000) {
41
+ throw new AgentWalletError("invalid_input", "--renew-by must be in the future and no more than 366 days away");
42
+ }
43
+ return normalized;
44
+ }
45
+ function signingMessage(intent) {
46
+ return `${DOMAIN}${canonicalJson(intent)}`;
47
+ }
48
+ export async function createSignedRefillNotification(options) {
49
+ const now = options.now ?? Date.now();
50
+ const audience = validateNotificationUrl(options.notificationUrl);
51
+ if (!REFERENCE.test(options.subscriptionReference)) {
52
+ throw new AgentWalletError("invalid_input", "subscription reference must contain 1-128 safe identifier characters");
53
+ }
54
+ if (!DECIMAL.test(options.targetBalanceAtomic)) {
55
+ throw new AgentWalletError("invalid_input", "target balance is not canonical decimal");
56
+ }
57
+ if (options.balance.network !== options.wallet.metadata.network ||
58
+ options.balance.address !== options.wallet.metadata.address) {
59
+ throw new AgentWalletError("invalid_input", "balance does not belong to the unlocked wallet");
60
+ }
61
+ const current = BigInt(options.balance.assetAtomic);
62
+ const target = BigInt(options.targetBalanceAtomic);
63
+ if (target <= current) {
64
+ throw new AgentWalletError("invalid_input", "target balance must exceed current balance");
65
+ }
66
+ if (!["low_balance", "renewal"].includes(options.reason)) {
67
+ throw new AgentWalletError("invalid_input", "refill reason is unsupported");
68
+ }
69
+ const createdAt = new Date(now).toISOString();
70
+ const intent = {
71
+ version: 1,
72
+ kind: "x402api.refill-notification.v1",
73
+ audience,
74
+ subscriptionReference: options.subscriptionReference,
75
+ wallet: {
76
+ network: options.wallet.metadata.network,
77
+ address: options.wallet.metadata.address,
78
+ },
79
+ balance: {
80
+ asset: options.balance.asset,
81
+ assetSymbol: options.balance.assetSymbol,
82
+ currentAtomic: current.toString(),
83
+ targetAtomic: target.toString(),
84
+ refillAtomic: (target - current).toString(),
85
+ },
86
+ renewBy: canonicalRenewBy(options.renewBy, now),
87
+ reason: options.reason,
88
+ createdAt,
89
+ expiresAt: new Date(now + 15 * 60_000).toISOString(),
90
+ nonce: randomBytes(24).toString("base64url"),
91
+ };
92
+ const message = signingMessage(intent);
93
+ let scheme;
94
+ let value;
95
+ if (options.wallet.metadata.network === "eip155:8453") {
96
+ if (!options.wallet.secret.privateKeyHex) {
97
+ throw new AgentWalletError("wallet_locked", "Base private key is unavailable");
98
+ }
99
+ scheme = "eip191";
100
+ value = await new Wallet(`0x${options.wallet.secret.privateKeyHex}`).signMessage(message);
101
+ }
102
+ else if (options.wallet.metadata.network === "tron:mainnet") {
103
+ if (!options.wallet.secret.privateKeyHex) {
104
+ throw new AgentWalletError("wallet_locked", "TRON private key is unavailable");
105
+ }
106
+ scheme = "tron-message-v2";
107
+ value = Trx.signMessageV2(message, options.wallet.secret.privateKeyHex);
108
+ }
109
+ else {
110
+ if (!options.wallet.secret.seedBase64) {
111
+ throw new AgentWalletError("wallet_locked", "Solana seed is unavailable");
112
+ }
113
+ scheme = "ed25519";
114
+ const keyPair = nacl.sign.keyPair.fromSeed(Buffer.from(options.wallet.secret.seedBase64, "base64"));
115
+ value = Buffer.from(nacl.sign.detached(Buffer.from(message, "utf8"), keyPair.secretKey)).toString("base64");
116
+ }
117
+ return { version: 1, intent, signature: { scheme, value } };
118
+ }
119
+ function responseBody(value) {
120
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
121
+ throw new Error("notification response is malformed");
122
+ }
123
+ const body = value;
124
+ if (Object.keys(body).some((key) => !["version", "notificationId", "status"].includes(key)) ||
125
+ body.version !== 1 ||
126
+ typeof body.notificationId !== "string" ||
127
+ !/^[A-Za-z0-9_-]{8,128}$/.test(body.notificationId) ||
128
+ typeof body.status !== "string" ||
129
+ !["accepted", "deduplicated", "not_required"].includes(body.status)) {
130
+ throw new Error("notification response failed validation");
131
+ }
132
+ return body;
133
+ }
134
+ export async function requestRefillNotification(options) {
135
+ if (!DECIMAL.test(options.targetBalanceAtomic)) {
136
+ throw new AgentWalletError("invalid_input", "target balance is not canonical decimal");
137
+ }
138
+ const endpoint = validateNotificationUrl(options.notificationUrl);
139
+ if (!REFERENCE.test(options.subscriptionReference)) {
140
+ throw new AgentWalletError("invalid_input", "subscription reference must contain 1-128 safe identifier characters");
141
+ }
142
+ if (!["low_balance", "renewal"].includes(options.reason)) {
143
+ throw new AgentWalletError("invalid_input", "refill reason is unsupported");
144
+ }
145
+ const renewBy = canonicalRenewBy(options.renewBy, Date.now());
146
+ const wallet = await unlockWallet(options.walletsDirectory, options.wallet, options.passphrase);
147
+ const balance = await readWalletBalance({
148
+ network: wallet.metadata.network,
149
+ address: wallet.metadata.address,
150
+ rpc: options.rpc,
151
+ });
152
+ const target = BigInt(options.targetBalanceAtomic);
153
+ const current = BigInt(balance.assetAtomic);
154
+ const common = {
155
+ version: 1,
156
+ wallet: wallet.metadata.name,
157
+ network: wallet.metadata.network,
158
+ address: wallet.metadata.address,
159
+ asset: balance.asset,
160
+ assetSymbol: balance.assetSymbol,
161
+ currentBalanceAtomic: balance.assetAtomic,
162
+ targetBalanceAtomic: options.targetBalanceAtomic,
163
+ refillAmountAtomic: (target > current ? target - current : 0n).toString(),
164
+ renewBy,
165
+ subscriptionReference: options.subscriptionReference,
166
+ };
167
+ if (current >= target) {
168
+ return { ...common, status: "not_required" };
169
+ }
170
+ const signed = await createSignedRefillNotification({
171
+ wallet,
172
+ balance,
173
+ notificationUrl: endpoint,
174
+ subscriptionReference: options.subscriptionReference,
175
+ targetBalanceAtomic: options.targetBalanceAtomic,
176
+ renewBy,
177
+ reason: options.reason,
178
+ });
179
+ const controller = new AbortController();
180
+ const timeout = setTimeout(() => controller.abort(), 15_000);
181
+ try {
182
+ const response = await fetch(endpoint, {
183
+ method: "POST",
184
+ headers: { "Content-Type": "application/json" },
185
+ body: JSON.stringify(signed),
186
+ redirect: "error",
187
+ signal: controller.signal,
188
+ });
189
+ const text = await response.text();
190
+ if (!response.ok || text.length > 64 * 1024) {
191
+ throw new Error(`notification service returned HTTP ${response.status}`);
192
+ }
193
+ const delivered = responseBody(JSON.parse(text));
194
+ return {
195
+ ...common,
196
+ status: delivered.status,
197
+ notificationId: delivered.notificationId,
198
+ };
199
+ }
200
+ catch (error) {
201
+ if (error instanceof AgentWalletError)
202
+ throw error;
203
+ throw new AgentWalletError("notification_unavailable", "x402api could not accept the refill notification", { retryable: true, cause: error });
204
+ }
205
+ finally {
206
+ clearTimeout(timeout);
207
+ }
208
+ }
209
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type PaymentArtifact } from "./contracts.js";
2
+ export type AttemptState = "authorized" | "submitting" | "pending" | "settled" | "fulfilled" | "terminal_failed" | "abandoned_local";
3
+ export type AttemptRecord = {
4
+ version: 1;
5
+ attemptId: string;
6
+ requestDigest: string;
7
+ challengeDigest: string;
8
+ selectedRequirementDigest: string;
9
+ buyerPaymentIdentifier: string;
10
+ paymentArtifactDigest: string;
11
+ artifactPath: string;
12
+ wallet: string;
13
+ network: string;
14
+ state: AttemptState;
15
+ createdAt: string;
16
+ updatedAt: string;
17
+ };
18
+ export declare class AttemptStore {
19
+ readonly root: string;
20
+ readonly records: string;
21
+ readonly indexes: string;
22
+ readonly locks: string;
23
+ constructor(root: string);
24
+ initialize(): Promise<void>;
25
+ private digestName;
26
+ private acquire;
27
+ findByRequestDigest(requestDigest: string): Promise<AttemptRecord | null>;
28
+ persistAuthorized(options: {
29
+ requestDigest: string;
30
+ challengeDigest: string;
31
+ selectedRequirementDigest: string;
32
+ buyerPaymentIdentifier: string;
33
+ wallet: string;
34
+ network: string;
35
+ payerAddress: string;
36
+ paymentSignature: string;
37
+ artifactPath: string;
38
+ expiresAt: string;
39
+ }): Promise<{
40
+ record: AttemptRecord;
41
+ artifact: PaymentArtifact;
42
+ }>;
43
+ get(attemptId: string): Promise<AttemptRecord>;
44
+ readArtifact(attemptId: string): Promise<PaymentArtifact>;
45
+ copyArtifact(attemptId: string, output: string): Promise<string>;
46
+ updateState(attemptId: string, state: AttemptState): Promise<AttemptRecord>;
47
+ activeForWallet(wallet: string): Promise<AttemptRecord[]>;
48
+ }
49
+ //# sourceMappingURL=attempt-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt-store.d.ts","sourceRoot":"","sources":["../../src/payment/attempt-store.ts"],"names":[],"mappings":"AAUA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEnE,MAAM,MAAM,YAAY,GACpB,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,SAAS,GACT,WAAW,GACX,iBAAiB,GACjB,iBAAiB,CAAC;AAEtB,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB,EAAE,MAAM,CAAC;IAClC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AA0GF,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,IAAI,EAAE,MAAM;IAOlB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,OAAO,CAAC,UAAU;YAOJ,OAAO;IA8Bf,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAyBzE,iBAAiB,CAAC,OAAO,EAAE;QAC/B,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,yBAAyB,EAAE,MAAM,CAAC;QAClC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,QAAQ,EAAE,eAAe,CAAA;KAAE,CAAC;IA4D3D,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAgB9C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAiBzD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOhE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAkB3E,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAchE"}
@@ -0,0 +1,283 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { lstat, open, readdir, unlink } from "node:fs/promises";
3
+ import { join, resolve } from "node:path";
4
+ import { AgentWalletError } from "../errors.js";
5
+ import { atomicWritePrivate, ensurePrivateDirectory, readPrivateFile, } from "../storage/private-files.js";
6
+ import { digestBytes } from "./contracts.js";
7
+ const SHA256 = /^sha256:[0-9a-f]{64}$/;
8
+ const IDENTIFIER = /^[A-Za-z0-9_-]{16,128}$/;
9
+ const STATES = new Set([
10
+ "authorized",
11
+ "submitting",
12
+ "pending",
13
+ "settled",
14
+ "fulfilled",
15
+ "terminal_failed",
16
+ "abandoned_local",
17
+ ]);
18
+ function parseRecord(value) {
19
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
20
+ throw new AgentWalletError("payment_artifact_corrupt", "attempt record is malformed");
21
+ }
22
+ const record = value;
23
+ const keys = [
24
+ "version",
25
+ "attemptId",
26
+ "requestDigest",
27
+ "challengeDigest",
28
+ "selectedRequirementDigest",
29
+ "buyerPaymentIdentifier",
30
+ "paymentArtifactDigest",
31
+ "artifactPath",
32
+ "wallet",
33
+ "network",
34
+ "state",
35
+ "createdAt",
36
+ "updatedAt",
37
+ ];
38
+ if (Object.keys(record).some((key) => !keys.includes(key)) ||
39
+ record.version !== 1 ||
40
+ typeof record.attemptId !== "string" ||
41
+ typeof record.requestDigest !== "string" ||
42
+ !SHA256.test(record.requestDigest) ||
43
+ typeof record.challengeDigest !== "string" ||
44
+ !SHA256.test(record.challengeDigest) ||
45
+ typeof record.selectedRequirementDigest !== "string" ||
46
+ !SHA256.test(record.selectedRequirementDigest) ||
47
+ typeof record.buyerPaymentIdentifier !== "string" ||
48
+ !IDENTIFIER.test(record.buyerPaymentIdentifier) ||
49
+ typeof record.paymentArtifactDigest !== "string" ||
50
+ !SHA256.test(record.paymentArtifactDigest) ||
51
+ typeof record.artifactPath !== "string" ||
52
+ !record.artifactPath.startsWith("/") ||
53
+ typeof record.wallet !== "string" ||
54
+ typeof record.network !== "string" ||
55
+ typeof record.state !== "string" ||
56
+ !STATES.has(record.state) ||
57
+ typeof record.createdAt !== "string" ||
58
+ !Number.isFinite(Date.parse(record.createdAt)) ||
59
+ typeof record.updatedAt !== "string" ||
60
+ !Number.isFinite(Date.parse(record.updatedAt))) {
61
+ throw new AgentWalletError("payment_artifact_corrupt", "attempt record failed validation");
62
+ }
63
+ return record;
64
+ }
65
+ function parseArtifact(value) {
66
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
67
+ throw new AgentWalletError("payment_artifact_corrupt", "payment artifact is malformed");
68
+ }
69
+ const artifact = value;
70
+ const keys = [
71
+ "version",
72
+ "attemptId",
73
+ "requestDigest",
74
+ "buyerPaymentIdentifier",
75
+ "wallet",
76
+ "payerAddress",
77
+ "selectedRequirementDigest",
78
+ "paymentSignature",
79
+ "createdAt",
80
+ "expiresAt",
81
+ ];
82
+ if (Object.keys(artifact).some((key) => !keys.includes(key)) ||
83
+ artifact.version !== 1 ||
84
+ typeof artifact.attemptId !== "string" ||
85
+ typeof artifact.requestDigest !== "string" ||
86
+ !SHA256.test(artifact.requestDigest) ||
87
+ typeof artifact.buyerPaymentIdentifier !== "string" ||
88
+ !IDENTIFIER.test(artifact.buyerPaymentIdentifier) ||
89
+ typeof artifact.wallet !== "string" ||
90
+ typeof artifact.payerAddress !== "string" ||
91
+ typeof artifact.selectedRequirementDigest !== "string" ||
92
+ !SHA256.test(artifact.selectedRequirementDigest) ||
93
+ typeof artifact.paymentSignature !== "string" ||
94
+ artifact.paymentSignature.length < 1 ||
95
+ artifact.paymentSignature.length > 512 * 1024 ||
96
+ typeof artifact.createdAt !== "string" ||
97
+ !Number.isFinite(Date.parse(artifact.createdAt)) ||
98
+ typeof artifact.expiresAt !== "string" ||
99
+ !Number.isFinite(Date.parse(artifact.expiresAt))) {
100
+ throw new AgentWalletError("payment_artifact_corrupt", "payment artifact failed validation");
101
+ }
102
+ return artifact;
103
+ }
104
+ export class AttemptStore {
105
+ root;
106
+ records;
107
+ indexes;
108
+ locks;
109
+ constructor(root) {
110
+ this.root = resolve(root);
111
+ this.records = join(this.root, "records");
112
+ this.indexes = join(this.root, "request-index");
113
+ this.locks = join(this.root, "locks");
114
+ }
115
+ async initialize() {
116
+ await Promise.all([
117
+ ensurePrivateDirectory(this.records),
118
+ ensurePrivateDirectory(this.indexes),
119
+ ensurePrivateDirectory(this.locks),
120
+ ]);
121
+ }
122
+ digestName(digest) {
123
+ if (!SHA256.test(digest)) {
124
+ throw new AgentWalletError("invalid_input", "request digest is malformed");
125
+ }
126
+ return digest.slice("sha256:".length);
127
+ }
128
+ async acquire(requestDigest) {
129
+ await this.initialize();
130
+ const path = join(this.locks, `${this.digestName(requestDigest)}.lock`);
131
+ const create = async () => {
132
+ const handle = await open(path, "wx", 0o600);
133
+ await handle.writeFile(`${JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() })}\n`);
134
+ await handle.sync();
135
+ await handle.close();
136
+ };
137
+ try {
138
+ await create();
139
+ }
140
+ catch (error) {
141
+ if (error.code !== "EEXIST")
142
+ throw error;
143
+ const stat = await lstat(path);
144
+ if (!stat.isFile() || stat.isSymbolicLink()) {
145
+ throw new AgentWalletError("wallet_storage_unsafe", "attempt lock is unsafe");
146
+ }
147
+ if (Date.now() - stat.mtimeMs <= 120_000) {
148
+ throw new AgentWalletError("attempt_already_exists", "another authorization is already active for this request", { retryable: true });
149
+ }
150
+ await unlink(path);
151
+ await create();
152
+ }
153
+ return async () => unlink(path).catch(() => undefined);
154
+ }
155
+ async findByRequestDigest(requestDigest) {
156
+ await this.initialize();
157
+ const indexPath = join(this.indexes, `${this.digestName(requestDigest)}.json`);
158
+ let index;
159
+ try {
160
+ index = JSON.parse((await readPrivateFile(indexPath)).toString("utf8"));
161
+ }
162
+ catch (error) {
163
+ if (error instanceof AgentWalletError && error.code === "wallet_not_found")
164
+ return null;
165
+ throw new AgentWalletError("payment_artifact_corrupt", "attempt index is corrupt", {
166
+ cause: error,
167
+ });
168
+ }
169
+ if (typeof index !== "object" ||
170
+ index === null ||
171
+ Array.isArray(index) ||
172
+ Object.keys(index).sort().join(",") !== "attemptId,version" ||
173
+ index.version !== 1 ||
174
+ typeof index.attemptId !== "string") {
175
+ throw new AgentWalletError("payment_artifact_corrupt", "attempt index failed validation");
176
+ }
177
+ return this.get(index.attemptId);
178
+ }
179
+ async persistAuthorized(options) {
180
+ const release = await this.acquire(options.requestDigest);
181
+ try {
182
+ const existing = await this.findByRequestDigest(options.requestDigest);
183
+ if (existing !== null && !["terminal_failed", "abandoned_local"].includes(existing.state)) {
184
+ throw new AgentWalletError("attempt_already_exists", "a live payment attempt already exists for this exact request", { details: { attemptId: existing.attemptId, state: existing.state } });
185
+ }
186
+ const attemptId = randomUUID();
187
+ const createdAt = new Date().toISOString();
188
+ const artifact = {
189
+ version: 1,
190
+ attemptId,
191
+ requestDigest: options.requestDigest,
192
+ buyerPaymentIdentifier: options.buyerPaymentIdentifier,
193
+ wallet: options.wallet,
194
+ payerAddress: options.payerAddress,
195
+ selectedRequirementDigest: options.selectedRequirementDigest,
196
+ paymentSignature: options.paymentSignature,
197
+ createdAt,
198
+ expiresAt: options.expiresAt,
199
+ };
200
+ const artifactText = `${JSON.stringify(artifact, null, 2)}\n`;
201
+ const artifactPath = resolve(options.artifactPath);
202
+ await atomicWritePrivate(artifactPath, artifactText, {
203
+ existsCode: "attempt_already_exists",
204
+ });
205
+ const record = {
206
+ version: 1,
207
+ attemptId,
208
+ requestDigest: options.requestDigest,
209
+ challengeDigest: options.challengeDigest,
210
+ selectedRequirementDigest: options.selectedRequirementDigest,
211
+ buyerPaymentIdentifier: options.buyerPaymentIdentifier,
212
+ paymentArtifactDigest: digestBytes(artifactText),
213
+ artifactPath,
214
+ wallet: options.wallet,
215
+ network: options.network,
216
+ state: "authorized",
217
+ createdAt,
218
+ updatedAt: createdAt,
219
+ };
220
+ await atomicWritePrivate(join(this.records, `${attemptId}.json`), `${JSON.stringify(record, null, 2)}\n`);
221
+ await atomicWritePrivate(join(this.indexes, `${this.digestName(options.requestDigest)}.json`), `${JSON.stringify({ version: 1, attemptId }, null, 2)}\n`, { overwrite: existing !== null, existsCode: "attempt_already_exists" });
222
+ return { record, artifact };
223
+ }
224
+ finally {
225
+ await release();
226
+ }
227
+ }
228
+ async get(attemptId) {
229
+ if (!/^[0-9a-f-]{36}$/.test(attemptId)) {
230
+ throw new AgentWalletError("invalid_input", "attempt ID is malformed");
231
+ }
232
+ try {
233
+ return parseRecord(JSON.parse((await readPrivateFile(join(this.records, `${attemptId}.json`))).toString("utf8")));
234
+ }
235
+ catch (error) {
236
+ if (error instanceof AgentWalletError && error.code === "wallet_not_found") {
237
+ throw new AgentWalletError("attempt_not_found", `attempt not found: ${attemptId}`);
238
+ }
239
+ throw error;
240
+ }
241
+ }
242
+ async readArtifact(attemptId) {
243
+ const record = await this.get(attemptId);
244
+ const bytes = await readPrivateFile(record.artifactPath, 1024 * 1024);
245
+ if (digestBytes(bytes) !== record.paymentArtifactDigest) {
246
+ throw new AgentWalletError("payment_artifact_corrupt", "payment artifact digest does not match");
247
+ }
248
+ const artifact = parseArtifact(JSON.parse(bytes.toString("utf8")));
249
+ if (artifact.attemptId !== record.attemptId ||
250
+ artifact.requestDigest !== record.requestDigest ||
251
+ artifact.selectedRequirementDigest !== record.selectedRequirementDigest) {
252
+ throw new AgentWalletError("payment_artifact_corrupt", "payment artifact does not match attempt");
253
+ }
254
+ return artifact;
255
+ }
256
+ async copyArtifact(attemptId, output) {
257
+ const record = await this.get(attemptId);
258
+ await this.readArtifact(attemptId);
259
+ await atomicWritePrivate(resolve(output), await readPrivateFile(record.artifactPath, 1024 * 1024));
260
+ return resolve(output);
261
+ }
262
+ async updateState(attemptId, state) {
263
+ if (!STATES.has(state)) {
264
+ throw new AgentWalletError("invalid_input", "attempt state is invalid");
265
+ }
266
+ const record = await this.get(attemptId);
267
+ const updated = {
268
+ ...record,
269
+ state,
270
+ updatedAt: new Date().toISOString(),
271
+ };
272
+ await atomicWritePrivate(join(this.records, `${attemptId}.json`), `${JSON.stringify(updated, null, 2)}\n`, { overwrite: true });
273
+ return updated;
274
+ }
275
+ async activeForWallet(wallet) {
276
+ await this.initialize();
277
+ const files = (await readdir(this.records)).filter((file) => file.endsWith(".json"));
278
+ const records = await Promise.all(files.map(async (file) => parseRecord(JSON.parse((await readPrivateFile(join(this.records, file))).toString("utf8")))));
279
+ return records.filter((record) => record.wallet === wallet &&
280
+ !["fulfilled", "terminal_failed", "abandoned_local"].includes(record.state));
281
+ }
282
+ }
283
+ //# sourceMappingURL=attempt-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt-store.js","sourceRoot":"","sources":["../../src/payment/attempt-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type RpcConfiguration } from "../balances.js";
2
+ export type AuthorizationResult = {
3
+ version: 1;
4
+ attemptId: string;
5
+ wallet: string;
6
+ payerAddress: string;
7
+ network: string;
8
+ asset: string;
9
+ amountAtomic: string;
10
+ artifactPath: string;
11
+ state: "authorized";
12
+ };
13
+ export declare function authorizePayment(options: {
14
+ walletsDirectory: string;
15
+ attemptsDirectory: string;
16
+ wallet: string;
17
+ passphrase: string;
18
+ requestEnvelopePath: string;
19
+ artifactPath: string;
20
+ rpc: RpcConfiguration;
21
+ }): Promise<AuthorizationResult>;
22
+ //# sourceMappingURL=authorize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../src/payment/authorize.ts"],"names":[],"mappings":"AAWA,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AA2CxB,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC;AA+XF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,gBAAgB,CAAC;CACvB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmF/B"}