@stellar-agent/x402-client 0.4.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 stellar-agent-bridge contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @stellar-agent/x402-client
2
+
3
+ Local x402-style client support for the Testnet demo.
4
+
5
+ This package implements a concrete local `402 -> policy -> Testnet payment -> retry with proof` flow. It is not a full facilitator-backed Soroban auth-entry x402 implementation yet.
@@ -0,0 +1,68 @@
1
+ import { NetworkProfile, PaymentRequest, TestnetWallet } from "@stellar-agent/core";
2
+ import { Policy, SpendHistory, evaluatePaymentRequest } from "@stellar-agent/policy";
3
+ import { sendPayment } from "@stellar-agent/stellar";
4
+ export interface X402PaymentRequirement {
5
+ protocol: "stellar-agent-local-x402";
6
+ version: 1;
7
+ network: "testnet";
8
+ asset: string;
9
+ amount: string;
10
+ recipient: string;
11
+ resource: string;
12
+ nonce: string;
13
+ memo?: string;
14
+ }
15
+ export interface X402PaymentProof {
16
+ protocol: "stellar-agent-local-x402";
17
+ version: 1;
18
+ transactionHash: string;
19
+ ledger?: number;
20
+ payer: string;
21
+ recipient: string;
22
+ asset: string;
23
+ amount: string;
24
+ resource: string;
25
+ nonce: string;
26
+ }
27
+ export interface X402PaymentResult {
28
+ firstStatus: number;
29
+ finalStatus: number;
30
+ requirement: X402PaymentRequirement;
31
+ policyDecision: ReturnType<typeof evaluatePaymentRequest>;
32
+ transaction?: {
33
+ hash: string;
34
+ ledger?: number;
35
+ successful: boolean;
36
+ feeCharged?: string;
37
+ };
38
+ receiptPath?: string;
39
+ responseBody?: string;
40
+ paidResourceDelivered?: boolean;
41
+ }
42
+ export declare function runX402Payment(args: {
43
+ url: string;
44
+ source: TestnetWallet;
45
+ policy: Policy;
46
+ profile: NetworkProfile;
47
+ receiptsDir: string;
48
+ eventLog: string;
49
+ command: string;
50
+ dryRun?: boolean;
51
+ spendHistory?: SpendHistory;
52
+ loadSpendHistory?: (request: PaymentRequest) => Promise<SpendHistory>;
53
+ fetchImpl?: typeof fetch;
54
+ sendPaymentImpl?: typeof sendPayment;
55
+ }): Promise<X402PaymentResult>;
56
+ export declare function parseX402Requirement(response: Response): Promise<X402PaymentRequirement>;
57
+ export declare function validateRequirement(value: unknown): X402PaymentRequirement;
58
+ export declare function startPaidApiDemo(args: {
59
+ recipient: string;
60
+ amount?: string;
61
+ asset?: string;
62
+ port?: number;
63
+ host?: string;
64
+ }): Promise<{
65
+ url: string;
66
+ close(): Promise<void>;
67
+ }>;
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EAEd,aAAa,EAGd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,0BAA0B,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,sBAAsB,CAAC;IACpC,cAAc,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;IAC1D,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACtE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,WAAW,CAAC;CACtC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2H7B;AAgBD,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAQ9F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CA8B1E;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC,CAiFD"}
package/dist/index.js ADDED
@@ -0,0 +1,302 @@
1
+ import { StellarAgentError, makeId, parseAmount } from "@stellar-agent/core";
2
+ import { appendEvent, writeReceipt } from "@stellar-agent/ledger-logger";
3
+ import { evaluatePaymentRequest } from "@stellar-agent/policy";
4
+ import { sendPayment } from "@stellar-agent/stellar";
5
+ import { createServer } from "node:http";
6
+ export async function runX402Payment(args) {
7
+ const fetchImpl = args.fetchImpl ?? fetch;
8
+ const sendPaymentImpl = args.sendPaymentImpl ?? sendPayment;
9
+ const first = await fetchResource(fetchImpl, args.url);
10
+ if (first.status !== 402) {
11
+ return {
12
+ firstStatus: first.status,
13
+ finalStatus: first.status,
14
+ requirement: syntheticRequirement(args.url),
15
+ policyDecision: evaluatePaymentRequest(args.policy, {
16
+ destination: args.source.publicKey,
17
+ amount: "0.0000001",
18
+ asset: "XLM",
19
+ network: "testnet"
20
+ }),
21
+ responseBody: await first.text()
22
+ };
23
+ }
24
+ const requirement = await parseX402Requirement(first);
25
+ assertSameResource(requirement.resource, args.url);
26
+ const request = {
27
+ source: args.source.publicKey,
28
+ destination: requirement.recipient,
29
+ amount: requirement.amount,
30
+ asset: requirement.asset,
31
+ memo: requirement.memo,
32
+ network: "testnet",
33
+ domain: new URL(args.url).host,
34
+ url: args.url
35
+ };
36
+ const history = args.loadSpendHistory ? await args.loadSpendHistory(request) : args.spendHistory;
37
+ const policyDecision = evaluatePaymentRequest(args.policy, request, history);
38
+ await appendEvent(args.eventLog, {
39
+ event: "policy_decision",
40
+ status: policyDecision.status,
41
+ command: args.command,
42
+ profile: "testnet",
43
+ data: { request, requirement, policyDecision }
44
+ });
45
+ if (policyDecision.status === "denied") {
46
+ throw new StellarAgentError({
47
+ code: "POLICY_DENIED",
48
+ message: "x402 payment request was denied by policy.",
49
+ hint: "Enable x402 and allow the target domain in policy when appropriate.",
50
+ docs: "docs/x402-and-mpp.md#local-x402-demo"
51
+ });
52
+ }
53
+ if (policyDecision.status === "requires_approval") {
54
+ throw new StellarAgentError({
55
+ code: "APPROVAL_REQUIRED",
56
+ message: "x402 payment requires approval.",
57
+ docs: "docs/x402-and-mpp.md#local-x402-demo"
58
+ });
59
+ }
60
+ if (args.dryRun) {
61
+ return { firstStatus: 402, finalStatus: 402, requirement, policyDecision };
62
+ }
63
+ const transaction = await sendPaymentImpl({
64
+ source: args.source,
65
+ destination: requirement.recipient,
66
+ amount: requirement.amount,
67
+ asset: requirement.asset,
68
+ ...(requirement.memo === undefined ? {} : { memo: requirement.memo }),
69
+ profile: args.profile
70
+ });
71
+ const proof = {
72
+ protocol: "stellar-agent-local-x402",
73
+ version: 1,
74
+ transactionHash: transaction.hash,
75
+ payer: args.source.publicKey,
76
+ recipient: requirement.recipient,
77
+ asset: requirement.asset,
78
+ amount: parseAmount(requirement.amount).value,
79
+ resource: requirement.resource,
80
+ nonce: requirement.nonce,
81
+ ...(transaction.ledger === undefined ? {} : { ledger: transaction.ledger })
82
+ };
83
+ const paid = await fetchResource(fetchImpl, args.url, {
84
+ headers: {
85
+ "X-Payment": JSON.stringify(proof),
86
+ "X-Payment-Transaction": transaction.hash
87
+ }
88
+ });
89
+ const responseBody = await paid.text();
90
+ const paidResourceDelivered = paid.status >= 200 && paid.status < 300;
91
+ const { path: receiptPath } = await writeReceipt(args.receiptsDir, {
92
+ command: args.command,
93
+ profile: "testnet",
94
+ networkPassphrase: args.profile.networkPassphrase,
95
+ realFunds: false,
96
+ payment: {
97
+ source: args.source.publicKey,
98
+ destination: requirement.recipient,
99
+ asset: requirement.asset,
100
+ amount: requirement.amount,
101
+ domain: new URL(args.url).host,
102
+ url: args.url,
103
+ ...(requirement.memo === undefined ? {} : { memo: requirement.memo })
104
+ },
105
+ policyDecision,
106
+ transaction,
107
+ ...(transaction.ledger === undefined ? {} : { ledger: { confirmedLedger: transaction.ledger } }),
108
+ eventLog: args.eventLog
109
+ });
110
+ await appendEvent(args.eventLog, {
111
+ event: "receipt_written",
112
+ status: paidResourceDelivered ? "success" : "paid_resource_failed",
113
+ command: args.command,
114
+ profile: "testnet",
115
+ data: { receiptPath, transactionHash: transaction.hash, finalStatus: paid.status, paidResourceDelivered }
116
+ });
117
+ return {
118
+ firstStatus: 402,
119
+ finalStatus: paid.status,
120
+ requirement,
121
+ policyDecision,
122
+ transaction,
123
+ receiptPath,
124
+ responseBody,
125
+ paidResourceDelivered
126
+ };
127
+ }
128
+ async function fetchResource(fetchImpl, url, init) {
129
+ try {
130
+ return await fetchImpl(url, init);
131
+ }
132
+ catch (error) {
133
+ throw new StellarAgentError({
134
+ code: "X402_RESOURCE_UNAVAILABLE",
135
+ message: "Could not fetch the x402 resource.",
136
+ hint: "Check the URL and make sure the paid API is running.",
137
+ docs: "docs/x402-and-mpp.md#local-x402-demo",
138
+ details: String(error)
139
+ });
140
+ }
141
+ }
142
+ export async function parseX402Requirement(response) {
143
+ const header = response.headers.get("Payment-Required") ??
144
+ response.headers.get("PAYMENT-REQUIRED") ??
145
+ response.headers.get("X-Payment-Required") ??
146
+ response.headers.get("X-Payment");
147
+ const parsed = header ? JSON.parse(header) : await response.json();
148
+ return validateRequirement(parsed);
149
+ }
150
+ export function validateRequirement(value) {
151
+ const candidate = value;
152
+ if (candidate.protocol !== "stellar-agent-local-x402" ||
153
+ candidate.version !== 1 ||
154
+ candidate.network !== "testnet" ||
155
+ !candidate.recipient ||
156
+ !candidate.amount ||
157
+ !candidate.asset ||
158
+ !candidate.resource ||
159
+ !candidate.nonce) {
160
+ throw new StellarAgentError({
161
+ code: "INVALID_INPUT",
162
+ message: "HTTP 402 response did not include a supported x402 payment requirement.",
163
+ docs: "docs/x402-and-mpp.md#local-x402-demo"
164
+ });
165
+ }
166
+ parseAmount(candidate.amount, candidate.asset);
167
+ return {
168
+ protocol: "stellar-agent-local-x402",
169
+ version: 1,
170
+ network: "testnet",
171
+ recipient: candidate.recipient,
172
+ amount: candidate.amount,
173
+ asset: candidate.asset,
174
+ resource: candidate.resource,
175
+ nonce: candidate.nonce,
176
+ ...(candidate.memo === undefined ? {} : { memo: candidate.memo })
177
+ };
178
+ }
179
+ export async function startPaidApiDemo(args) {
180
+ const host = args.host ?? "127.0.0.1";
181
+ const amount = args.amount ?? "0.0000001";
182
+ const asset = args.asset ?? "XLM";
183
+ parseAmount(amount, asset);
184
+ const nonce = makeId("x402_req");
185
+ const acceptedTransactions = new Set();
186
+ const server = createServer((request, response) => {
187
+ if (request.url?.startsWith("/health")) {
188
+ writeJson(response, 200, { ok: true });
189
+ return;
190
+ }
191
+ if (!request.url?.startsWith("/paid-report")) {
192
+ writeJson(response, 404, { ok: false, error: "not_found" });
193
+ return;
194
+ }
195
+ const proofHeader = request.headers["x-payment"];
196
+ if (!proofHeader) {
197
+ const resource = paidResource(host, server);
198
+ const requirement = {
199
+ protocol: "stellar-agent-local-x402",
200
+ version: 1,
201
+ network: "testnet",
202
+ asset,
203
+ amount,
204
+ recipient: args.recipient,
205
+ resource,
206
+ nonce,
207
+ memo: "x402-demo"
208
+ };
209
+ const encoded = JSON.stringify(requirement);
210
+ response.setHeader("Payment-Required", encoded);
211
+ response.setHeader("X-Payment-Required", encoded);
212
+ writeJson(response, 402, requirement);
213
+ return;
214
+ }
215
+ const proof = parseProofHeader(proofHeader);
216
+ const resource = paidResource(host, server);
217
+ if (!proof ||
218
+ proof.protocol !== "stellar-agent-local-x402" ||
219
+ proof.version !== 1 ||
220
+ !proof.transactionHash ||
221
+ !proof.payer ||
222
+ proof.recipient !== args.recipient ||
223
+ proof.asset !== asset ||
224
+ proof.amount !== parseAmount(amount, asset).value ||
225
+ proof.resource !== resource ||
226
+ proof.nonce !== nonce) {
227
+ writeJson(response, 402, { ok: false, error: "invalid_payment_proof" });
228
+ return;
229
+ }
230
+ if (acceptedTransactions.has(proof.transactionHash)) {
231
+ writeJson(response, 402, { ok: false, error: "payment_proof_replayed" });
232
+ return;
233
+ }
234
+ acceptedTransactions.add(proof.transactionHash);
235
+ writeJson(response, 200, {
236
+ ok: true,
237
+ id: makeId("paid_report"),
238
+ message: "Local x402 demo content unlocked.",
239
+ paid: {
240
+ transactionHash: proof.transactionHash,
241
+ amount: proof.amount,
242
+ asset: proof.asset
243
+ }
244
+ });
245
+ });
246
+ await new Promise((resolve, reject) => {
247
+ server.once("error", reject);
248
+ server.listen(args.port ?? 0, host, () => resolve());
249
+ });
250
+ return {
251
+ url: `http://${host}:${addressPort(server)}/paid-report`,
252
+ close: () => new Promise((resolve, reject) => {
253
+ server.close((error) => (error ? reject(error) : resolve()));
254
+ })
255
+ };
256
+ }
257
+ function syntheticRequirement(url) {
258
+ return {
259
+ protocol: "stellar-agent-local-x402",
260
+ version: 1,
261
+ network: "testnet",
262
+ asset: "XLM",
263
+ amount: "0.0000001",
264
+ recipient: "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF",
265
+ resource: url,
266
+ nonce: makeId("x402_req")
267
+ };
268
+ }
269
+ function paidResource(host, server) {
270
+ return `http://${host}:${addressPort(server)}/paid-report`;
271
+ }
272
+ function assertSameResource(advertisedResource, requestedUrl) {
273
+ const advertised = new URL(advertisedResource);
274
+ const requested = new URL(requestedUrl);
275
+ if (advertised.origin !== requested.origin || advertised.pathname !== requested.pathname) {
276
+ throw new StellarAgentError({
277
+ code: "INVALID_INPUT",
278
+ message: "HTTP 402 payment requirement resource does not match the requested URL.",
279
+ docs: "docs/x402-and-mpp.md#local-x402-demo"
280
+ });
281
+ }
282
+ }
283
+ function addressPort(server) {
284
+ const address = server.address();
285
+ if (!address || typeof address === "string")
286
+ return 0;
287
+ return address.port;
288
+ }
289
+ function writeJson(response, status, body) {
290
+ response.statusCode = status;
291
+ response.setHeader("content-type", "application/json");
292
+ response.end(JSON.stringify(body));
293
+ }
294
+ function parseProofHeader(header) {
295
+ try {
296
+ return JSON.parse(Array.isArray(header) ? header[0] ?? "{}" : header ?? "{}");
297
+ }
298
+ catch {
299
+ return null;
300
+ }
301
+ }
302
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@stellar-agent/x402-client",
3
+ "version": "0.4.0",
4
+ "description": "Local Testnet x402-style payment demo client and server helpers for Stellar Agent Bridge.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+ssh://git@github.com/someone-in-texas/Stellar-Agent.git",
10
+ "directory": "packages/x402-client"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/someone-in-texas/Stellar-Agent/issues"
14
+ },
15
+ "homepage": "https://github.com/someone-in-texas/Stellar-Agent#readme",
16
+ "engines": {
17
+ "node": ">=22"
18
+ },
19
+ "main": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc -b",
32
+ "test": "vitest run"
33
+ },
34
+ "dependencies": {
35
+ "@stellar-agent/core": "0.4.0",
36
+ "@stellar-agent/ledger-logger": "0.4.0",
37
+ "@stellar-agent/policy": "0.4.0",
38
+ "@stellar-agent/stellar": "0.4.0"
39
+ }
40
+ }