@seedhape/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 (133) hide show
  1. package/dist/__tests__/acp.test.d.ts +2 -0
  2. package/dist/__tests__/acp.test.d.ts.map +1 -0
  3. package/dist/__tests__/acp.test.js +16 -0
  4. package/dist/__tests__/acp.test.js.map +1 -0
  5. package/dist/__tests__/ap2-official.test.d.ts +2 -0
  6. package/dist/__tests__/ap2-official.test.d.ts.map +1 -0
  7. package/dist/__tests__/ap2-official.test.js +49 -0
  8. package/dist/__tests__/ap2-official.test.js.map +1 -0
  9. package/dist/__tests__/mpp.test.d.ts +2 -0
  10. package/dist/__tests__/mpp.test.d.ts.map +1 -0
  11. package/dist/__tests__/mpp.test.js +42 -0
  12. package/dist/__tests__/mpp.test.js.map +1 -0
  13. package/dist/__tests__/outbound.test.d.ts +2 -0
  14. package/dist/__tests__/outbound.test.d.ts.map +1 -0
  15. package/dist/__tests__/outbound.test.js +23 -0
  16. package/dist/__tests__/outbound.test.js.map +1 -0
  17. package/dist/__tests__/protocols.test.d.ts +2 -0
  18. package/dist/__tests__/protocols.test.d.ts.map +1 -0
  19. package/dist/__tests__/protocols.test.js +16 -0
  20. package/dist/__tests__/protocols.test.js.map +1 -0
  21. package/dist/__tests__/providers.test.d.ts +2 -0
  22. package/dist/__tests__/providers.test.d.ts.map +1 -0
  23. package/dist/__tests__/providers.test.js +41 -0
  24. package/dist/__tests__/providers.test.js.map +1 -0
  25. package/dist/__tests__/reconciliation.test.d.ts +2 -0
  26. package/dist/__tests__/reconciliation.test.d.ts.map +1 -0
  27. package/dist/__tests__/reconciliation.test.js +35 -0
  28. package/dist/__tests__/reconciliation.test.js.map +1 -0
  29. package/dist/__tests__/spending-controls.test.d.ts +2 -0
  30. package/dist/__tests__/spending-controls.test.d.ts.map +1 -0
  31. package/dist/__tests__/spending-controls.test.js +47 -0
  32. package/dist/__tests__/spending-controls.test.js.map +1 -0
  33. package/dist/__tests__/tax-and-policy.test.d.ts +7 -0
  34. package/dist/__tests__/tax-and-policy.test.d.ts.map +1 -0
  35. package/dist/__tests__/tax-and-policy.test.js +389 -0
  36. package/dist/__tests__/tax-and-policy.test.js.map +1 -0
  37. package/dist/__tests__/web-bot-auth.test.d.ts +2 -0
  38. package/dist/__tests__/web-bot-auth.test.d.ts.map +1 -0
  39. package/dist/__tests__/web-bot-auth.test.js +33 -0
  40. package/dist/__tests__/web-bot-auth.test.js.map +1 -0
  41. package/dist/__tests__/x402-solana.test.d.ts +2 -0
  42. package/dist/__tests__/x402-solana.test.d.ts.map +1 -0
  43. package/dist/__tests__/x402-solana.test.js +155 -0
  44. package/dist/__tests__/x402-solana.test.js.map +1 -0
  45. package/dist/acp.d.ts +28 -0
  46. package/dist/acp.d.ts.map +1 -0
  47. package/dist/acp.js +49 -0
  48. package/dist/acp.js.map +1 -0
  49. package/dist/ap2/mandates.d.ts +319 -0
  50. package/dist/ap2/mandates.d.ts.map +1 -0
  51. package/dist/ap2/mandates.js +214 -0
  52. package/dist/ap2/mandates.js.map +1 -0
  53. package/dist/ap2/official.d.ts +156 -0
  54. package/dist/ap2/official.d.ts.map +1 -0
  55. package/dist/ap2/official.js +222 -0
  56. package/dist/ap2/official.js.map +1 -0
  57. package/dist/ap2/policy.d.ts +93 -0
  58. package/dist/ap2/policy.d.ts.map +1 -0
  59. package/dist/ap2/policy.js +216 -0
  60. package/dist/ap2/policy.js.map +1 -0
  61. package/dist/index.d.ts +22 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +22 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/india/fx.d.ts +59 -0
  66. package/dist/india/fx.d.ts.map +1 -0
  67. package/dist/india/fx.js +93 -0
  68. package/dist/india/fx.js.map +1 -0
  69. package/dist/india/vda-tax.d.ts +151 -0
  70. package/dist/india/vda-tax.d.ts.map +1 -0
  71. package/dist/india/vda-tax.js +226 -0
  72. package/dist/india/vda-tax.js.map +1 -0
  73. package/dist/mandate-builder.d.ts +102 -0
  74. package/dist/mandate-builder.d.ts.map +1 -0
  75. package/dist/mandate-builder.js +99 -0
  76. package/dist/mandate-builder.js.map +1 -0
  77. package/dist/mpp.d.ts +53 -0
  78. package/dist/mpp.d.ts.map +1 -0
  79. package/dist/mpp.js +164 -0
  80. package/dist/mpp.js.map +1 -0
  81. package/dist/orchestrator.d.ts +115 -0
  82. package/dist/orchestrator.d.ts.map +1 -0
  83. package/dist/orchestrator.js +351 -0
  84. package/dist/orchestrator.js.map +1 -0
  85. package/dist/postgres-store.d.ts +60 -0
  86. package/dist/postgres-store.d.ts.map +1 -0
  87. package/dist/postgres-store.js +441 -0
  88. package/dist/postgres-store.js.map +1 -0
  89. package/dist/protocols.d.ts +18 -0
  90. package/dist/protocols.d.ts.map +1 -0
  91. package/dist/protocols.js +24 -0
  92. package/dist/protocols.js.map +1 -0
  93. package/dist/reconciliation.d.ts +27 -0
  94. package/dist/reconciliation.d.ts.map +1 -0
  95. package/dist/reconciliation.js +38 -0
  96. package/dist/reconciliation.js.map +1 -0
  97. package/dist/store.d.ts +110 -0
  98. package/dist/store.d.ts.map +1 -0
  99. package/dist/store.js +369 -0
  100. package/dist/store.js.map +1 -0
  101. package/dist/types.d.ts +195 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +30 -0
  104. package/dist/types.js.map +1 -0
  105. package/dist/util/canonical.d.ts +9 -0
  106. package/dist/util/canonical.d.ts.map +1 -0
  107. package/dist/util/canonical.js +35 -0
  108. package/dist/util/canonical.js.map +1 -0
  109. package/dist/wallet/provider.d.ts +118 -0
  110. package/dist/wallet/provider.d.ts.map +1 -0
  111. package/dist/wallet/provider.js +160 -0
  112. package/dist/wallet/provider.js.map +1 -0
  113. package/dist/wallet/providers.d.ts +107 -0
  114. package/dist/wallet/providers.d.ts.map +1 -0
  115. package/dist/wallet/providers.js +188 -0
  116. package/dist/wallet/providers.js.map +1 -0
  117. package/dist/web-bot-auth.d.ts +54 -0
  118. package/dist/web-bot-auth.d.ts.map +1 -0
  119. package/dist/web-bot-auth.js +112 -0
  120. package/dist/web-bot-auth.js.map +1 -0
  121. package/dist/x402/client.d.ts +101 -0
  122. package/dist/x402/client.d.ts.map +1 -0
  123. package/dist/x402/client.js +291 -0
  124. package/dist/x402/client.js.map +1 -0
  125. package/dist/x402/outbound.d.ts +15 -0
  126. package/dist/x402/outbound.d.ts.map +1 -0
  127. package/dist/x402/outbound.js +59 -0
  128. package/dist/x402/outbound.js.map +1 -0
  129. package/dist/x402/types.d.ts +80 -0
  130. package/dist/x402/types.d.ts.map +1 -0
  131. package/dist/x402/types.js +2 -0
  132. package/dist/x402/types.js.map +1 -0
  133. package/package.json +29 -0
@@ -0,0 +1,291 @@
1
+ /**
2
+ * x402 client.
3
+ *
4
+ * Flow:
5
+ * 1. Plain request to the resource.
6
+ * 2. On 402, parse the challenge and pick an acceptable requirement.
7
+ * 3. Hand the candidate to the caller's `authorise` hook — this is where the
8
+ * AP2 policy engine runs and where a human can be asked. If it declines,
9
+ * we stop. No signature is ever produced for a declined payment.
10
+ * 4. Build and sign the selected EVM authorization or Solana transaction.
11
+ * 5. Replay the request with the version-appropriate payment header.
12
+ * 6. Decode the settlement response and hand back the result.
13
+ *
14
+ * The client never retries a payment automatically. A failed settlement returns
15
+ * to the caller; an agent looping on 402s is exactly the failure mode the
16
+ * policy engine's burst limit exists to catch.
17
+ */
18
+ import { randomBytes } from "node:crypto";
19
+ import { toHex } from "viem";
20
+ import { ExactSvmScheme } from "@x402/svm/exact/client";
21
+ import { NETWORKS } from "../types.js";
22
+ import { validateOutboundUrl } from "./outbound.js";
23
+ import { selectPaymentProvider } from "../wallet/providers.js";
24
+ export class PaymentDeclinedError extends Error {
25
+ reason;
26
+ constructor(message, reason) {
27
+ super(message);
28
+ this.reason = reason;
29
+ this.name = "PaymentDeclinedError";
30
+ }
31
+ }
32
+ export class X402Client {
33
+ opts;
34
+ fetchImpl;
35
+ constructor(opts) {
36
+ this.opts = opts;
37
+ this.fetchImpl = opts.fetchImpl ?? fetch;
38
+ }
39
+ /**
40
+ * Fetch a resource, paying if the server demands it.
41
+ * Returns the final Response plus settlement metadata when a payment happened.
42
+ */
43
+ async fetch(input, init = {}, context = {}) {
44
+ await validateOutboundUrl(input, this.opts.outboundPolicy);
45
+ const first = await this.fetchImpl(input, init);
46
+ if (first.status !== 402)
47
+ return { response: first, paid: false };
48
+ const challenge = await parseChallenge(first);
49
+ const requirement = this.select(challenge.accepts);
50
+ if (!requirement) {
51
+ throw new PaymentDeclinedError("No payment option offered by the server is acceptable to this client " +
52
+ `(offered: ${challenge.accepts.map((a) => `${a.scheme}/${a.network}`).join(", ") || "none"}).`, "NO_ACCEPTABLE_REQUIREMENT");
53
+ }
54
+ const amount = BigInt(requirement.maxAmountRequired);
55
+ if (amount > this.opts.absoluteMaxPerPayment) {
56
+ throw new PaymentDeclinedError(`Server requested ${amount} base units, above the client's absolute ceiling.`, "ABSOLUTE_CEILING");
57
+ }
58
+ const url = new URL(input);
59
+ const decision = await this.opts.authorise({
60
+ requirement,
61
+ amount,
62
+ host: url.host,
63
+ resource: requirement.resource || input,
64
+ });
65
+ if (!decision.approved) {
66
+ throw new PaymentDeclinedError(decision.reason ?? "Payment was not authorised.", "POLICY_DECLINED");
67
+ }
68
+ const provider = this.opts.paymentProviders?.length
69
+ ? selectPaymentProvider(this.opts.paymentProviders, requirement)
70
+ : undefined;
71
+ let header;
72
+ let headerName = challenge.x402Version >= 2
73
+ ? "PAYMENT-SIGNATURE"
74
+ : "X-PAYMENT";
75
+ if (provider) {
76
+ const permission = await provider.currentPermission();
77
+ if (!permission || permission.revoked) {
78
+ throw new PaymentDeclinedError(`The ${provider.kind} permission is not active.`, "PERMISSION_UNAVAILABLE");
79
+ }
80
+ const remaining = await provider.remainingAllowance();
81
+ if (remaining !== null && remaining < amount) {
82
+ throw new PaymentDeclinedError(`The ${provider.kind} permission has ${remaining} base units remaining, below the ${amount} required.`, "PERMISSION_ALLOWANCE_EXHAUSTED");
83
+ }
84
+ const authorisation = await provider.createPaymentAuthorization({ requirement, resource: requirement.resource || input });
85
+ const providerPayload = challenge.x402Version >= 2
86
+ ? { x402Version: 2, accepted: wireRequirement(requirement), payload: authorisation.payload, ...(context.ap2 ? { extensions: { ap2: context.ap2 } } : {}) }
87
+ : { x402Version: challenge.x402Version, scheme: "exact", network: requirement.network, payload: authorisation.payload, ...(context.ap2 ? { extensions: { ap2: context.ap2 } } : {}) };
88
+ header = encodePayment(providerPayload);
89
+ }
90
+ else {
91
+ const payload = await this.buildPayment(requirement, amount, challenge.x402Version);
92
+ if (context.ap2)
93
+ payload.extensions = { ...(payload.extensions ?? {}), ap2: context.ap2 };
94
+ header = encodePayment(payload);
95
+ if (challenge.x402Version >= 2 || requirement.network.startsWith("solana:")) {
96
+ headerName = "PAYMENT-SIGNATURE";
97
+ }
98
+ }
99
+ const headers = new Headers(init.headers);
100
+ headers.set(headerName, header);
101
+ // Ask the facilitator-backed server to return settlement details.
102
+ headers.set("Access-Control-Expose-Headers", "X-PAYMENT-RESPONSE");
103
+ await validateOutboundUrl(input, this.opts.outboundPolicy);
104
+ const second = await this.fetchImpl(input, { ...init, headers });
105
+ const settlement = decodeSettlement(second);
106
+ await this.opts.onSettlement?.(decision.spendId, settlement, second.status);
107
+ return {
108
+ response: second,
109
+ paid: true,
110
+ settlement: settlement ?? undefined,
111
+ requirement,
112
+ amount,
113
+ };
114
+ }
115
+ /** Probe a resource's price without paying. Used by the `quote` MCP tool. */
116
+ async quote(input) {
117
+ await validateOutboundUrl(input, this.opts.outboundPolicy);
118
+ const res = await this.fetchImpl(input, { method: "GET" });
119
+ if (res.status !== 402)
120
+ return null;
121
+ return parseChallenge(res);
122
+ }
123
+ select(accepts) {
124
+ const allowedNetworks = new Set(this.opts.allowedNetworks);
125
+ const viable = accepts.filter((a) => a.scheme === "exact" &&
126
+ allowedNetworks.has(a.network) &&
127
+ this.opts.allowedAssets.some((allowed) => assetsEqual(a.network, allowed, a.asset)));
128
+ if (viable.length === 0)
129
+ return null;
130
+ // Cheapest wins. Ties broken by first offered, which is the merchant's preference.
131
+ return viable.reduce((best, cur) => BigInt(cur.maxAmountRequired) < BigInt(best.maxAmountRequired) ? cur : best);
132
+ }
133
+ async buildPayment(req, amount, x402Version) {
134
+ if (req.network.startsWith("solana:")) {
135
+ if (!this.opts.svmSigner) {
136
+ throw new PaymentDeclinedError("No Solana signer is configured for this payment.", "SIGNER_UNAVAILABLE");
137
+ }
138
+ const scheme = new ExactSvmScheme(this.opts.svmSigner, this.opts.svmRpcUrl
139
+ ? { rpcUrl: this.opts.svmRpcUrl }
140
+ : undefined);
141
+ const accepted = wireRequirement(req);
142
+ const result = await scheme.createPaymentPayload(x402Version, accepted);
143
+ return {
144
+ x402Version,
145
+ accepted,
146
+ resource: {
147
+ url: req.resource,
148
+ description: req.description,
149
+ mimeType: req.mimeType ?? "application/json",
150
+ },
151
+ payload: result.payload,
152
+ };
153
+ }
154
+ if (!this.opts.signer) {
155
+ throw new PaymentDeclinedError("No EVM signer is configured for this payment.", "SIGNER_UNAVAILABLE");
156
+ }
157
+ const now = Math.floor(Date.now() / 1000);
158
+ const authorization = {
159
+ from: this.opts.signer.address,
160
+ to: req.payTo,
161
+ value: amount.toString(),
162
+ // Backdate slightly to tolerate clock skew between us and the facilitator.
163
+ validAfter: String(now - 60),
164
+ validBefore: String(now + (req.maxTimeoutSeconds || 300)),
165
+ nonce: toHex(randomBytes(32)),
166
+ };
167
+ const chainId = chainIdFor(req.network);
168
+ const signature = await this.opts.signer.signTypedData({
169
+ domain: {
170
+ name: req.extra?.name ?? "USD Coin",
171
+ version: req.extra?.version ?? "2",
172
+ chainId,
173
+ verifyingContract: req.asset,
174
+ },
175
+ types: {
176
+ TransferWithAuthorization: [
177
+ { name: "from", type: "address" },
178
+ { name: "to", type: "address" },
179
+ { name: "value", type: "uint256" },
180
+ { name: "validAfter", type: "uint256" },
181
+ { name: "validBefore", type: "uint256" },
182
+ { name: "nonce", type: "bytes32" },
183
+ ],
184
+ },
185
+ primaryType: "TransferWithAuthorization",
186
+ message: {
187
+ from: authorization.from,
188
+ to: authorization.to,
189
+ value: BigInt(authorization.value),
190
+ validAfter: BigInt(authorization.validAfter),
191
+ validBefore: BigInt(authorization.validBefore),
192
+ nonce: authorization.nonce,
193
+ },
194
+ });
195
+ return x402Version >= 2
196
+ ? {
197
+ x402Version,
198
+ accepted: wireRequirement(req),
199
+ resource: { url: req.resource, description: req.description, mimeType: req.mimeType ?? "application/json" },
200
+ payload: { signature, authorization },
201
+ }
202
+ : { x402Version, scheme: "exact", network: req.network, payload: { signature, authorization } };
203
+ }
204
+ }
205
+ function assetsEqual(network, allowed, offered) {
206
+ return network.startsWith("solana:")
207
+ ? allowed === offered
208
+ : allowed.toLowerCase() === offered.toLowerCase();
209
+ }
210
+ // --- wire helpers ----------------------------------------------------------
211
+ export function normaliseNetwork(n) {
212
+ if (n.includes(":"))
213
+ return n;
214
+ const known = NETWORKS[n];
215
+ return known ? known.caip2 : n;
216
+ }
217
+ export function chainIdFor(network) {
218
+ if (network.startsWith("eip155:"))
219
+ return Number(network.split(":")[1]);
220
+ const known = NETWORKS[network];
221
+ if (!known)
222
+ throw new Error(`Unknown network: ${network}`);
223
+ return known.chainId;
224
+ }
225
+ async function parseChallenge(res) {
226
+ let raw;
227
+ try {
228
+ const encoded = res.headers.get("payment-required");
229
+ raw = encoded
230
+ ? JSON.parse(Buffer.from(encoded, "base64").toString("utf8"))
231
+ : await res.clone().json();
232
+ }
233
+ catch {
234
+ throw new PaymentDeclinedError("Server returned 402 with a body that is not valid x402 JSON.", "MALFORMED_CHALLENGE");
235
+ }
236
+ const resource = isRecord(raw.resource) ? raw.resource : undefined;
237
+ const rawAccepts = Array.isArray(raw.accepts) ? raw.accepts : [];
238
+ const accepts = rawAccepts.filter(isRecord).map((entry) => ({
239
+ ...entry,
240
+ network: normaliseNetwork(String(entry.network ?? "")),
241
+ maxAmountRequired: String(entry.amount ?? entry.maxAmountRequired ?? ""),
242
+ amount: String(entry.amount ?? entry.maxAmountRequired ?? ""),
243
+ resource: typeof entry.resource === "string" ? entry.resource : String(resource?.url ?? ""),
244
+ description: typeof entry.description === "string" ? entry.description : String(resource?.description ?? ""),
245
+ mimeType: typeof entry.mimeType === "string" ? entry.mimeType : typeof resource?.mimeType === "string" ? resource.mimeType : undefined,
246
+ payTo: String(entry.payTo ?? entry.recipient ?? ""),
247
+ asset: String(entry.asset ?? entry.currency ?? ""),
248
+ maxTimeoutSeconds: Number(entry.maxTimeoutSeconds ?? 300),
249
+ extra: isRecord(entry.extra) ? entry.extra : undefined,
250
+ }));
251
+ return {
252
+ x402Version: typeof raw.x402Version === "number" ? raw.x402Version : 1,
253
+ accepts,
254
+ resource: resource,
255
+ extensions: isRecord(raw.extensions) ? raw.extensions : undefined,
256
+ error: typeof raw.error === "string" ? raw.error : undefined,
257
+ ap2CheckoutJwt: res.headers.get("ap2-checkout-jwt") ?? undefined,
258
+ };
259
+ }
260
+ function wireRequirement(req) {
261
+ return {
262
+ scheme: req.scheme,
263
+ network: req.network,
264
+ amount: req.maxAmountRequired,
265
+ asset: req.asset,
266
+ payTo: req.payTo,
267
+ maxTimeoutSeconds: req.maxTimeoutSeconds,
268
+ ...(req.extra ? { extra: req.extra } : {}),
269
+ };
270
+ }
271
+ function isRecord(value) {
272
+ return typeof value === "object" && value !== null && !Array.isArray(value);
273
+ }
274
+ export function encodePayment(p) {
275
+ return Buffer.from(JSON.stringify(p), "utf8").toString("base64");
276
+ }
277
+ export function decodePayment(header) {
278
+ return JSON.parse(Buffer.from(header, "base64").toString("utf8"));
279
+ }
280
+ function decodeSettlement(res) {
281
+ const h = res.headers.get("payment-response") ?? res.headers.get("x-payment-response");
282
+ if (!h)
283
+ return null;
284
+ try {
285
+ return JSON.parse(Buffer.from(h, "base64").toString("utf8"));
286
+ }
287
+ catch {
288
+ return null;
289
+ }
290
+ }
291
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/x402/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface OutboundRequestPolicy {
2
+ /** Allow loopback/private/link-local destinations only in isolated tests. */
3
+ allowPrivateNetworks?: boolean;
4
+ /** Production callers should require HTTPS for merchant resources. */
5
+ requireHttps?: boolean;
6
+ }
7
+ /**
8
+ * Validate a merchant URL before the server makes an agent-controlled request.
9
+ * DNS is resolved here so hostnames that point at private infrastructure are
10
+ * rejected before fetch is called. Production deployments should pair this
11
+ * with an egress proxy that pins the validated address to close the remaining
12
+ * DNS time-of-check/time-of-use gap.
13
+ */
14
+ export declare function validateOutboundUrl(input: string, policy?: OutboundRequestPolicy): Promise<URL>;
15
+ //# sourceMappingURL=outbound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound.d.ts","sourceRoot":"","sources":["../../src/x402/outbound.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,sEAAsE;IACtE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAyBD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,qBAA0B,GACjC,OAAO,CAAC,GAAG,CAAC,CA8Bd"}
@@ -0,0 +1,59 @@
1
+ import { lookup } from "node:dns/promises";
2
+ import { isIP } from "node:net";
3
+ const PRIVATE_IPV4 = [
4
+ [/^10\./, "private 10/8"],
5
+ [/^127\./, "loopback"],
6
+ [/^169\.254\./, "link-local"],
7
+ [/^172\.(1[6-9]|2\d|3[01])\./, "private 172.16/12"],
8
+ [/^192\.168\./, "private 192.168/16"],
9
+ ];
10
+ function privateAddress(address) {
11
+ if (isIP(address) === 4) {
12
+ return PRIVATE_IPV4.find(([pattern]) => pattern.test(address))?.[1];
13
+ }
14
+ if (isIP(address) === 6) {
15
+ const normalized = address.toLowerCase();
16
+ if (normalized === "::1")
17
+ return "loopback";
18
+ if (normalized.startsWith("fe80:"))
19
+ return "link-local";
20
+ if (normalized.startsWith("fc") || normalized.startsWith("fd"))
21
+ return "private IPv6";
22
+ }
23
+ return undefined;
24
+ }
25
+ /**
26
+ * Validate a merchant URL before the server makes an agent-controlled request.
27
+ * DNS is resolved here so hostnames that point at private infrastructure are
28
+ * rejected before fetch is called. Production deployments should pair this
29
+ * with an egress proxy that pins the validated address to close the remaining
30
+ * DNS time-of-check/time-of-use gap.
31
+ */
32
+ export async function validateOutboundUrl(input, policy = {}) {
33
+ const url = new URL(input);
34
+ const requireHttps = policy.requireHttps ?? process.env.NODE_ENV === "production";
35
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
36
+ throw new Error(`Outbound resource must use HTTP(S), got ${url.protocol}`);
37
+ }
38
+ if (requireHttps && url.protocol !== "https:") {
39
+ throw new Error("Outbound resource must use HTTPS in production.");
40
+ }
41
+ if (url.username || url.password) {
42
+ throw new Error("Outbound resource URLs must not contain embedded credentials.");
43
+ }
44
+ if (policy.allowPrivateNetworks)
45
+ return url;
46
+ const literalReason = privateAddress(url.hostname);
47
+ if (literalReason) {
48
+ throw new Error(`Outbound resource resolves to a blocked ${literalReason} address.`);
49
+ }
50
+ const addresses = await lookup(url.hostname, { all: true, verbatim: true });
51
+ for (const address of addresses) {
52
+ const reason = privateAddress(address.address);
53
+ if (reason) {
54
+ throw new Error(`Outbound resource resolves to a blocked ${reason} address.`);
55
+ }
56
+ }
57
+ return url;
58
+ }
59
+ //# sourceMappingURL=outbound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/x402/outbound.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAShC,MAAM,YAAY,GAAG;IACnB,CAAC,OAAO,EAAE,cAAc,CAAC;IACzB,CAAC,QAAQ,EAAE,UAAU,CAAC;IACtB,CAAC,aAAa,EAAE,YAAY,CAAC;IAC7B,CAAC,4BAA4B,EAAE,mBAAmB,CAAC;IACnD,CAAC,aAAa,EAAE,oBAAoB,CAAC;CAC7B,CAAC;AAEX,SAAS,cAAc,CAAC,OAAe;IACrC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,UAAU,KAAK,KAAK;YAAE,OAAO,UAAU,CAAC;QAC5C,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,YAAY,CAAC;QACxD,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,cAAc,CAAC;IACxF,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAa,EACb,SAAgC,EAAE;IAElC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAElF,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,2CAA2C,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,YAAY,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,MAAM,CAAC,oBAAoB;QAAE,OAAO,GAAG,CAAC;IAE5C,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,2CAA2C,aAAa,WAAW,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,2CAA2C,MAAM,WAAW,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,80 @@
1
+ import type { Address, Hex } from "../types.js";
2
+ /**
3
+ * A single payment option offered by the merchant in a 402 response.
4
+ * Field names follow x402 v2's chain-neutral `exact` requirements. Legacy EVM
5
+ * network aliases are normalized to CAIP-2 by the parser.
6
+ */
7
+ export interface PaymentRequirement {
8
+ scheme: "exact" | string;
9
+ /** "base" (v1) or "eip155:8453" (v2). Normalised to CAIP-2 by the parser. */
10
+ network: string;
11
+ /** Max amount in asset base units, as a decimal string. */
12
+ maxAmountRequired: string;
13
+ /** Native x402 v2 wire name; retained alongside the normalized alias. */
14
+ amount?: string;
15
+ resource: string;
16
+ description: string;
17
+ mimeType?: string;
18
+ payTo: string;
19
+ maxTimeoutSeconds: number;
20
+ /** ERC-20 contract address or Solana token mint. */
21
+ asset: string;
22
+ /** EIP-712 domain of the token, needed to sign EIP-3009. */
23
+ extra?: {
24
+ name?: string;
25
+ version?: string;
26
+ decimals?: number;
27
+ assetTransferMethod?: "eip3009" | "erc7710" | "permit2" | "coinbase-spend-permission" | string;
28
+ facilitatorAddresses?: Address[];
29
+ feePayer?: string;
30
+ recentBlockhash?: string;
31
+ lastValidBlockHeight?: string;
32
+ memo?: string;
33
+ [key: string]: unknown;
34
+ };
35
+ outputSchema?: unknown;
36
+ }
37
+ export interface PaymentRequiredResponse {
38
+ x402Version: number;
39
+ accepts: PaymentRequirement[];
40
+ resource?: {
41
+ url: string;
42
+ description?: string;
43
+ mimeType?: string;
44
+ [key: string]: unknown;
45
+ };
46
+ extensions?: Record<string, unknown>;
47
+ error?: string;
48
+ ap2CheckoutJwt?: string;
49
+ }
50
+ /** EIP-3009 TransferWithAuthorization parameters. */
51
+ export interface ExactEvmAuthorization {
52
+ from: Address;
53
+ to: Address;
54
+ value: string;
55
+ validAfter: string;
56
+ validBefore: string;
57
+ nonce: Hex;
58
+ }
59
+ export interface ExactEvmPayload {
60
+ signature: Hex;
61
+ authorization: ExactEvmAuthorization;
62
+ }
63
+ export interface PaymentPayload {
64
+ x402Version: number;
65
+ scheme?: string;
66
+ network?: string;
67
+ accepted?: Record<string, unknown>;
68
+ resource?: Record<string, unknown>;
69
+ payload: ExactEvmPayload | Record<string, unknown>;
70
+ extensions?: Record<string, unknown>;
71
+ }
72
+ /** Decoded X-PAYMENT-RESPONSE header returned by the merchant on success. */
73
+ export interface SettlementResponse {
74
+ success: boolean;
75
+ transaction?: string;
76
+ network?: string;
77
+ payer?: string;
78
+ errorReason?: string;
79
+ }
80
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/x402/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/x402/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@seedhape/core",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "files": ["dist"],
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": "./dist/index.js"
17
+ },
18
+ "dependencies": {
19
+ "@solana/kit": "^5.5.1",
20
+ "@x402/core": "2.23.0",
21
+ "@x402/svm": "2.23.0",
22
+ "jose": "^6.2.10",
23
+ "pg": "^8.16.3",
24
+ "viem": "^2.21.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/pg": "^8.15.5"
28
+ }
29
+ }