@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,107 @@
1
+ import type { Address, Hex, SignedIntentMandate } from "../types.js";
2
+ import type { PaymentRequirement } from "../x402/types.js";
3
+ /** Provider families Seedhape can compose behind one payment boundary. */
4
+ export type PaymentProviderKind = "eoa" | "metamask-erc7710" | "coinbase-spend-permission";
5
+ /** Transfer methods advertised by an x402 merchant. */
6
+ export type PaymentTransferMethod = "eip3009" | "erc7710" | "permit2" | "coinbase-spend-permission";
7
+ export interface PermissionSnapshot {
8
+ kind: PaymentProviderKind;
9
+ account: Address;
10
+ spender?: Address;
11
+ token: Address;
12
+ network: string;
13
+ allowance: bigint;
14
+ periodSeconds: number;
15
+ start: number;
16
+ end: number;
17
+ revoked?: boolean;
18
+ reference?: Hex;
19
+ metadata?: Record<string, unknown>;
20
+ }
21
+ export interface ProviderPaymentRequest {
22
+ requirement: PaymentRequirement;
23
+ resource: string;
24
+ }
25
+ export interface ProviderPaymentAuthorization {
26
+ kind: PaymentProviderKind;
27
+ transferMethod: PaymentTransferMethod;
28
+ /** Exact EVM payload, or a provider-specific x402 payload. */
29
+ payload: Record<string, unknown>;
30
+ /** The address whose funds the merchant should receive from. */
31
+ payer: Address;
32
+ }
33
+ export interface ComposablePaymentProvider {
34
+ readonly kind: PaymentProviderKind;
35
+ readonly address: Address;
36
+ readonly transferMethods: readonly PaymentTransferMethod[];
37
+ currentPermission(): Promise<PermissionSnapshot | null>;
38
+ remainingAllowance(): Promise<bigint | null>;
39
+ createPaymentAuthorization(request: ProviderPaymentRequest): Promise<ProviderPaymentAuthorization>;
40
+ revokePermission(): Promise<void>;
41
+ }
42
+ export declare function transferMethodForRequirement(requirement: PaymentRequirement): PaymentTransferMethod;
43
+ /** Selects a provider only from the transfer method the merchant advertised. */
44
+ export declare function selectPaymentProvider(providers: readonly ComposablePaymentProvider[], requirement: PaymentRequirement): ComposablePaymentProvider;
45
+ type HttpProviderConfig = {
46
+ baseUrl: string;
47
+ bearerToken: string;
48
+ address: Address;
49
+ fetchImpl?: typeof fetch;
50
+ };
51
+ /**
52
+ * Shared remote adapter for providers whose signing/delegation system lives
53
+ * outside the Seedhape web process. It returns delegation payloads, never
54
+ * private keys. The endpoint contract is intentionally provider-neutral.
55
+ */
56
+ export declare class HttpDelegatedPaymentProvider implements ComposablePaymentProvider {
57
+ readonly kind: Exclude<PaymentProviderKind, "eoa">;
58
+ readonly address: Address;
59
+ readonly transferMethods: readonly PaymentTransferMethod[];
60
+ private readonly fetchImpl;
61
+ private readonly baseUrl;
62
+ constructor(kind: Exclude<PaymentProviderKind, "eoa">, cfg: HttpProviderConfig);
63
+ currentPermission(): Promise<PermissionSnapshot | null>;
64
+ remainingAllowance(): Promise<bigint | null>;
65
+ createPaymentAuthorization(request: ProviderPaymentRequest): Promise<ProviderPaymentAuthorization>;
66
+ revokePermission(): Promise<void>;
67
+ private request;
68
+ private readonly token;
69
+ }
70
+ export declare class HttpMetaMaskDelegationProvider extends HttpDelegatedPaymentProvider {
71
+ constructor(cfg: HttpProviderConfig);
72
+ }
73
+ export declare class HttpCoinbaseSpendPermissionProvider extends HttpDelegatedPaymentProvider {
74
+ constructor(cfg: HttpProviderConfig);
75
+ }
76
+ /** EOA adapter hook; the existing EIP-3009 client remains responsible for signing. */
77
+ export declare class EoaPaymentProvider implements ComposablePaymentProvider {
78
+ readonly address: Address;
79
+ private readonly createPayload;
80
+ private readonly permission;
81
+ readonly kind: "eoa";
82
+ readonly transferMethods: readonly ["eip3009"];
83
+ constructor(address: Address, createPayload: (request: ProviderPaymentRequest) => Promise<Record<string, unknown>>, permission?: () => Promise<PermissionSnapshot | null>);
84
+ currentPermission(): Promise<PermissionSnapshot | null>;
85
+ remainingAllowance(): Promise<bigint | null>;
86
+ createPaymentAuthorization(request: ProviderPaymentRequest): Promise<{
87
+ kind: "eoa";
88
+ transferMethod: "eip3009";
89
+ payload: Record<string, unknown>;
90
+ payer: `0x${string}`;
91
+ }>;
92
+ revokePermission(): Promise<void>;
93
+ }
94
+ /** Uses the ERC-7710 context saved with the active Seedhape mandate. */
95
+ export declare class StoredMetaMaskDelegationProvider implements ComposablePaymentProvider {
96
+ private readonly loadMandate;
97
+ readonly kind: "metamask-erc7710";
98
+ readonly address: Address;
99
+ readonly transferMethods: readonly ["erc7710"];
100
+ constructor(address: Address, loadMandate: () => Promise<SignedIntentMandate | null>);
101
+ currentPermission(): Promise<PermissionSnapshot | null>;
102
+ remainingAllowance(): Promise<bigint | null>;
103
+ createPaymentAuthorization(_request: ProviderPaymentRequest): Promise<ProviderPaymentAuthorization>;
104
+ revokePermission(): Promise<void>;
105
+ }
106
+ export {};
107
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/wallet/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ export function transferMethodForRequirement(requirement) {
2
+ const method = requirement.extra?.assetTransferMethod;
3
+ // x402 v1 merchants and known USDC deployments historically omitted this
4
+ // field. That legacy shape is compatible with EIP-3009, never with a smart
5
+ // contract delegation whose payload format must be explicitly advertised.
6
+ return (method ?? "eip3009");
7
+ }
8
+ /** Selects a provider only from the transfer method the merchant advertised. */
9
+ export function selectPaymentProvider(providers, requirement) {
10
+ const method = transferMethodForRequirement(requirement);
11
+ const provider = providers.find((candidate) => candidate.transferMethods.includes(method) &&
12
+ candidate.currentPermission !== undefined);
13
+ if (!provider) {
14
+ throw new Error(`No configured payment provider supports x402 transfer method ${method}. ` +
15
+ `Configured providers: ${providers.map((item) => `${item.kind} (${item.transferMethods.join(",")})`).join("; ") || "none"}.`);
16
+ }
17
+ return provider;
18
+ }
19
+ /**
20
+ * Shared remote adapter for providers whose signing/delegation system lives
21
+ * outside the Seedhape web process. It returns delegation payloads, never
22
+ * private keys. The endpoint contract is intentionally provider-neutral.
23
+ */
24
+ export class HttpDelegatedPaymentProvider {
25
+ kind;
26
+ address;
27
+ transferMethods;
28
+ fetchImpl;
29
+ baseUrl;
30
+ constructor(kind, cfg) {
31
+ this.kind = kind;
32
+ this.address = cfg.address;
33
+ this.baseUrl = cfg.baseUrl.replace(/\/$/, "");
34
+ this.fetchImpl = cfg.fetchImpl ?? fetch;
35
+ this.token = cfg.bearerToken;
36
+ this.transferMethods = kind === "metamask-erc7710"
37
+ ? ["erc7710"]
38
+ : ["coinbase-spend-permission"];
39
+ }
40
+ async currentPermission() {
41
+ const body = await this.request("/grant");
42
+ const grant = body.grant;
43
+ if (!grant)
44
+ return null;
45
+ if (typeof grant.account !== "string" || typeof grant.token !== "string" ||
46
+ typeof grant.network !== "string" || typeof grant.allowance !== "string" && typeof grant.allowance !== "number" ||
47
+ typeof grant.periodSeconds !== "number" || typeof grant.start !== "number" || typeof grant.end !== "number") {
48
+ throw new Error(`${this.kind} provider returned an invalid permission snapshot.`);
49
+ }
50
+ return {
51
+ kind: this.kind,
52
+ account: grant.account,
53
+ spender: typeof grant.spender === "string" ? grant.spender : undefined,
54
+ token: grant.token,
55
+ network: grant.network,
56
+ allowance: BigInt(grant.allowance),
57
+ periodSeconds: grant.periodSeconds,
58
+ start: grant.start,
59
+ end: grant.end,
60
+ revoked: grant.revoked === true,
61
+ reference: typeof grant.reference === "string" ? grant.reference : undefined,
62
+ metadata: typeof grant.metadata === "object" && grant.metadata !== null ? grant.metadata : undefined,
63
+ };
64
+ }
65
+ async remainingAllowance() {
66
+ const body = await this.request("/remaining");
67
+ const remaining = body.remaining;
68
+ return remaining === null || remaining === undefined ? null : BigInt(remaining);
69
+ }
70
+ async createPaymentAuthorization(request) {
71
+ const body = await this.request("/payment-payload", {
72
+ method: "POST",
73
+ body: JSON.stringify({ requirement: request.requirement, resource: request.resource }),
74
+ headers: { "content-type": "application/json" },
75
+ });
76
+ const payload = body.payload;
77
+ const payer = body.payer;
78
+ if (!payload || typeof payload !== "object" || typeof payer !== "string" || !/^0x[0-9a-fA-F]{40}$/.test(payer)) {
79
+ throw new Error(`${this.kind} provider returned an invalid x402 payment payload.`);
80
+ }
81
+ const transferMethod = this.transferMethods[0];
82
+ return { kind: this.kind, transferMethod, payload: payload, payer: payer };
83
+ }
84
+ async revokePermission() {
85
+ await this.request("/revoke", { method: "POST", body: "{}", headers: { "content-type": "application/json" } });
86
+ }
87
+ async request(path, init = {}) {
88
+ const response = await this.fetchImpl(`${this.baseUrl}${path}`, {
89
+ ...init,
90
+ headers: {
91
+ authorization: `Bearer ${this.token}`,
92
+ accept: "application/json",
93
+ ...(init.headers ?? {}),
94
+ },
95
+ });
96
+ const text = await response.text();
97
+ let body;
98
+ try {
99
+ body = text ? JSON.parse(text) : null;
100
+ }
101
+ catch {
102
+ body = text;
103
+ }
104
+ if (!response.ok)
105
+ throw new Error(`${this.kind} provider ${path} failed with ${response.status}: ${String(text)}`);
106
+ return body;
107
+ }
108
+ token;
109
+ }
110
+ export class HttpMetaMaskDelegationProvider extends HttpDelegatedPaymentProvider {
111
+ constructor(cfg) {
112
+ super("metamask-erc7710", cfg);
113
+ }
114
+ }
115
+ export class HttpCoinbaseSpendPermissionProvider extends HttpDelegatedPaymentProvider {
116
+ constructor(cfg) {
117
+ super("coinbase-spend-permission", cfg);
118
+ }
119
+ }
120
+ /** EOA adapter hook; the existing EIP-3009 client remains responsible for signing. */
121
+ export class EoaPaymentProvider {
122
+ address;
123
+ createPayload;
124
+ permission;
125
+ kind = "eoa";
126
+ transferMethods = ["eip3009"];
127
+ constructor(address, createPayload, permission = async () => null) {
128
+ this.address = address;
129
+ this.createPayload = createPayload;
130
+ this.permission = permission;
131
+ }
132
+ currentPermission() { return this.permission(); }
133
+ async remainingAllowance() { return (await this.permission())?.allowance ?? null; }
134
+ async createPaymentAuthorization(request) {
135
+ return { kind: this.kind, transferMethod: "eip3009", payload: await this.createPayload(request), payer: this.address };
136
+ }
137
+ async revokePermission() { return; }
138
+ }
139
+ /** Uses the ERC-7710 context saved with the active Seedhape mandate. */
140
+ export class StoredMetaMaskDelegationProvider {
141
+ loadMandate;
142
+ kind = "metamask-erc7710";
143
+ address;
144
+ transferMethods = ["erc7710"];
145
+ constructor(address, loadMandate) {
146
+ this.loadMandate = loadMandate;
147
+ this.address = address;
148
+ }
149
+ async currentPermission() {
150
+ const signed = await this.loadMandate();
151
+ const delegation = signed?.delegation;
152
+ if (!delegation || delegation.provider !== this.kind)
153
+ return null;
154
+ return {
155
+ kind: this.kind,
156
+ account: delegation.delegator,
157
+ token: signed.mandate.asset.address,
158
+ network: signed.mandate.asset.network,
159
+ allowance: delegation.allowanceAmount ?? signed.mandate.maxPerPeriod,
160
+ periodSeconds: signed.mandate.periodSeconds,
161
+ start: signed.mandate.notBefore,
162
+ end: delegation.expiry ?? signed.mandate.expiry,
163
+ reference: delegation.permissionContext,
164
+ };
165
+ }
166
+ async remainingAllowance() {
167
+ return (await this.currentPermission())?.allowance ?? null;
168
+ }
169
+ async createPaymentAuthorization(_request) {
170
+ const signed = await this.loadMandate();
171
+ const delegation = signed?.delegation;
172
+ if (!delegation || delegation.provider !== this.kind) {
173
+ throw new Error("No active MetaMask ERC-7710 delegation is attached to the mandate.");
174
+ }
175
+ return {
176
+ kind: this.kind,
177
+ transferMethod: "erc7710",
178
+ payer: delegation.delegator,
179
+ payload: {
180
+ delegationManager: delegation.delegationManager,
181
+ permissionContext: delegation.permissionContext,
182
+ delegator: delegation.delegator,
183
+ },
184
+ };
185
+ }
186
+ async revokePermission() { return; }
187
+ }
188
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/wallet/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { type KeyObject } from "node:crypto";
2
+ /** Headers used by the Web Bot Auth HTTP Message Signatures profile. */
3
+ export type WebBotAuthHeaders = {
4
+ "Signature-Agent": string;
5
+ "Signature-Input": string;
6
+ Signature: string;
7
+ };
8
+ export type WebBotAuthSignOptions = {
9
+ url: string;
10
+ signatureAgent: string;
11
+ keyId: string;
12
+ privateKey: KeyObject | string;
13
+ now?: number;
14
+ expiresInSeconds?: number;
15
+ nonce?: string;
16
+ };
17
+ export type WebBotAuthVerifyOptions = {
18
+ url: string;
19
+ headers: Headers | Record<string, string | undefined>;
20
+ publicKey: KeyObject | string;
21
+ expectedKeyId?: string;
22
+ now?: number;
23
+ clockSkewSeconds?: number;
24
+ /** Maximum accepted signature lifetime, protecting against long-lived replay. */
25
+ maxLifetimeSeconds?: number;
26
+ /** Return true only when this nonce has not already been consumed. */
27
+ consumeNonce?: (input: {
28
+ keyId: string;
29
+ nonce: string;
30
+ }) => Promise<boolean> | boolean;
31
+ };
32
+ export type WebBotAuthDirectorySignOptions = {
33
+ url: string;
34
+ keyId: string;
35
+ privateKey: KeyObject | string;
36
+ now?: number;
37
+ expiresInSeconds?: number;
38
+ nonce?: string;
39
+ };
40
+ /** Create Web Bot Auth headers for an outbound HTTPS request. */
41
+ export declare function signWebBotAuth(options: WebBotAuthSignOptions): WebBotAuthHeaders;
42
+ /** Sign a JWKS directory response using the required directory tag/profile. */
43
+ export declare function signWebBotAuthDirectory(options: WebBotAuthDirectorySignOptions): {
44
+ Signature: string;
45
+ "Signature-Input": string;
46
+ };
47
+ /** Verify Web Bot Auth headers and optionally consume their replay nonce. */
48
+ export declare function verifyWebBotAuth(options: WebBotAuthVerifyOptions): Promise<{
49
+ keyId: string;
50
+ nonce: string;
51
+ created: number;
52
+ expires: number;
53
+ }>;
54
+ //# sourceMappingURL=web-bot-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-bot-auth.d.ts","sourceRoot":"","sources":["../src/web-bot-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3G,wEAAwE;AACxE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACtD,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACxF,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAqDF,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,iBAAiB,CAYhF;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,8BAA8B,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAWjI;AAED,6EAA6E;AAC7E,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBpJ"}
@@ -0,0 +1,112 @@
1
+ import { createPrivateKey, createPublicKey, randomBytes, sign, verify } from "node:crypto";
2
+ function header(headers, name) {
3
+ return headers instanceof Headers ? headers.get(name) ?? undefined : headers[name] ?? headers[name.toLowerCase()];
4
+ }
5
+ function authority(url) {
6
+ const parsed = new URL(url);
7
+ if (parsed.protocol !== "https:")
8
+ throw new Error("Web Bot Auth requires an HTTPS URL.");
9
+ return parsed.host;
10
+ }
11
+ function quote(value) {
12
+ return `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`;
13
+ }
14
+ function unquote(value) {
15
+ if (!value.startsWith('"') || !value.endsWith('"'))
16
+ throw new Error("Invalid Web Bot Auth quoted parameter.");
17
+ return value.slice(1, -1).replaceAll('\\"', '"').replaceAll("\\\\", "\\");
18
+ }
19
+ function signatureBase(url, signatureAgent) {
20
+ return `"@authority": ${authority(url)}\n"signature-agent": ${quote(signatureAgent)}`;
21
+ }
22
+ function parseSignatureInput(value) {
23
+ const match = /^sig1=\("@authority"\s+"signature-agent"\);(.+)$/u.exec(value.trim());
24
+ if (!match)
25
+ throw new Error("Unsupported Web Bot Auth Signature-Input coverage.");
26
+ const params = new Map();
27
+ for (const part of match[1].split(";")) {
28
+ const separator = part.indexOf("=");
29
+ if (separator <= 0)
30
+ throw new Error("Invalid Web Bot Auth Signature-Input parameter.");
31
+ const key = part.slice(0, separator);
32
+ const raw = part.slice(separator + 1);
33
+ if (params.has(key))
34
+ throw new Error(`Duplicate Web Bot Auth Signature-Input parameter: ${key}`);
35
+ params.set(key, raw.startsWith('"') ? unquote(raw) : raw);
36
+ }
37
+ const keyId = params.get("keyid");
38
+ const alg = params.get("alg");
39
+ const tag = params.get("tag");
40
+ const nonce = params.get("nonce");
41
+ const created = Number(params.get("created"));
42
+ const expires = Number(params.get("expires"));
43
+ if (!keyId || alg !== "ed25519" || tag !== "web-bot-auth" || !nonce || !Number.isSafeInteger(created) || !Number.isSafeInteger(expires))
44
+ throw new Error("Invalid Web Bot Auth Signature-Input parameters.");
45
+ return { keyId, created, expires, nonce, tag, alg };
46
+ }
47
+ function parseSignature(value) {
48
+ const match = /^sig1=:([^:]+):$/u.exec(value.trim());
49
+ if (!match)
50
+ throw new Error("Invalid Web Bot Auth Signature header.");
51
+ return Buffer.from(match[1], "base64");
52
+ }
53
+ /** Create Web Bot Auth headers for an outbound HTTPS request. */
54
+ export function signWebBotAuth(options) {
55
+ const now = options.now ?? Math.floor(Date.now() / 1000);
56
+ const lifetime = options.expiresInSeconds ?? 60;
57
+ if (!Number.isSafeInteger(now) || !Number.isSafeInteger(lifetime) || lifetime <= 0)
58
+ throw new Error("Web Bot Auth timestamps must be safe integers and expiry must be positive.");
59
+ const agent = new URL(options.signatureAgent);
60
+ if (agent.protocol !== "https:")
61
+ throw new Error("Web Bot Auth Signature-Agent must use HTTPS.");
62
+ const expires = now + lifetime;
63
+ const nonce = options.nonce ?? randomBytes(24).toString("base64url");
64
+ const input = `sig1=("@authority" "signature-agent");created=${now};keyid=${quote(options.keyId)};alg="ed25519";expires=${expires};nonce=${quote(nonce)};tag="web-bot-auth"`;
65
+ const key = typeof options.privateKey === "string" ? createPrivateKey(options.privateKey) : options.privateKey;
66
+ const signature = sign(null, Buffer.from(`${signatureBase(options.url, options.signatureAgent)}\n"@signature-params": ${input.slice("sig1=".length)}`), key).toString("base64");
67
+ return { "Signature-Agent": quote(options.signatureAgent), "Signature-Input": input, Signature: `sig1=:${signature}:` };
68
+ }
69
+ /** Sign a JWKS directory response using the required directory tag/profile. */
70
+ export function signWebBotAuthDirectory(options) {
71
+ const now = options.now ?? Math.floor(Date.now() / 1000);
72
+ const lifetime = options.expiresInSeconds ?? 60;
73
+ if (!Number.isSafeInteger(now) || !Number.isSafeInteger(lifetime) || lifetime <= 0)
74
+ throw new Error("Web Bot Auth directory timestamps must be safe integers and expiry must be positive.");
75
+ const expires = now + lifetime;
76
+ const nonce = options.nonce ?? randomBytes(24).toString("base64url");
77
+ const input = `sig1=("@authority";req);created=${now};keyid=${quote(options.keyId)};alg="ed25519";expires=${expires};nonce=${quote(nonce)};tag="http-message-signatures-directory"`;
78
+ const key = typeof options.privateKey === "string" ? createPrivateKey(options.privateKey) : options.privateKey;
79
+ const base = `"@authority": ${authority(options.url)}\n"@signature-params": ${input.slice("sig1=".length)}`;
80
+ const signature = sign(null, Buffer.from(base), key).toString("base64");
81
+ return { Signature: `sig1=:${signature}:`, "Signature-Input": input };
82
+ }
83
+ /** Verify Web Bot Auth headers and optionally consume their replay nonce. */
84
+ export async function verifyWebBotAuth(options) {
85
+ const signatureAgentRaw = header(options.headers, "Signature-Agent");
86
+ const signatureInput = header(options.headers, "Signature-Input");
87
+ const signatureRaw = header(options.headers, "Signature");
88
+ if (!signatureAgentRaw || !signatureInput || !signatureRaw)
89
+ throw new Error("Web Bot Auth requires Signature-Agent, Signature-Input, and Signature headers.");
90
+ const signatureAgent = unquote(signatureAgentRaw);
91
+ const agent = new URL(signatureAgent);
92
+ if (agent.protocol !== "https:")
93
+ throw new Error("Web Bot Auth Signature-Agent must use HTTPS.");
94
+ const parsed = parseSignatureInput(signatureInput);
95
+ if (options.expectedKeyId && options.expectedKeyId !== parsed.keyId)
96
+ throw new Error("Web Bot Auth key ID is not trusted.");
97
+ const now = options.now ?? Math.floor(Date.now() / 1000);
98
+ const skew = options.clockSkewSeconds ?? 5;
99
+ const maxLifetime = options.maxLifetimeSeconds ?? 300;
100
+ if (!Number.isSafeInteger(maxLifetime) || maxLifetime <= 0)
101
+ throw new Error("Web Bot Auth maximum lifetime must be a positive integer.");
102
+ if (parsed.expires <= now || parsed.created > now + skew || parsed.expires <= parsed.created || parsed.expires - parsed.created > maxLifetime)
103
+ throw new Error("Web Bot Auth signature is expired or has invalid timestamps.");
104
+ const key = typeof options.publicKey === "string" ? createPublicKey(options.publicKey) : options.publicKey;
105
+ const valid = verify(null, Buffer.from(`${signatureBase(options.url, signatureAgent)}\n"@signature-params": ${signatureInput.slice("sig1=".length)}`), key, parseSignature(signatureRaw));
106
+ if (!valid)
107
+ throw new Error("Web Bot Auth signature verification failed.");
108
+ if (options.consumeNonce && !(await options.consumeNonce({ keyId: parsed.keyId, nonce: parsed.nonce })))
109
+ throw new Error("Web Bot Auth nonce was already consumed.");
110
+ return parsed;
111
+ }
112
+ //# sourceMappingURL=web-bot-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-bot-auth.js","sourceRoot":"","sources":["../src/web-bot-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
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 type { ClientSvmSigner } from "@x402/svm";
19
+ import type { Address, Hex, NetworkId } from "../types.js";
20
+ import { type OutboundRequestPolicy } from "./outbound.js";
21
+ import { type ComposablePaymentProvider } from "../wallet/providers.js";
22
+ import type { PaymentPayload, PaymentRequiredResponse, PaymentRequirement, SettlementResponse } from "./types.js";
23
+ export interface Eip712Signer {
24
+ address: Address;
25
+ signTypedData(args: {
26
+ domain: Record<string, unknown>;
27
+ types: Record<string, unknown>;
28
+ primaryType: string;
29
+ message: Record<string, unknown>;
30
+ }): Promise<Hex>;
31
+ }
32
+ export interface AuthorisationRequest {
33
+ requirement: PaymentRequirement;
34
+ amount: bigint;
35
+ host: string;
36
+ resource: string;
37
+ }
38
+ export interface AuthorisationResult {
39
+ approved: boolean;
40
+ reason?: string;
41
+ /** Opaque handle the caller can use to correlate the ledger entry. */
42
+ spendId?: string;
43
+ }
44
+ export interface X402PaymentContext {
45
+ ap2?: {
46
+ checkoutMandate: string;
47
+ paymentMandate: string;
48
+ checkoutJwt: string;
49
+ };
50
+ }
51
+ export interface X402ClientOptions {
52
+ /** EVM signer. Required only when paying on an EVM network. */
53
+ signer?: Eip712Signer;
54
+ /** Solana transaction signer. Required only when paying on a Solana network. */
55
+ svmSigner?: ClientSvmSigner;
56
+ /** Optional Solana RPC used while constructing exact-SVM payments. */
57
+ svmRpcUrl?: string;
58
+ /** Runs before any signature. Return {approved:false} to abort. */
59
+ authorise(req: AuthorisationRequest): Promise<AuthorisationResult>;
60
+ /** Called after the merchant responds, whether settlement succeeded or not. */
61
+ onSettlement?(spendId: string | undefined, settlement: SettlementResponse | null, httpStatus: number): Promise<void>;
62
+ /** Networks this client will pay on. Anything else is ignored in `accepts`. */
63
+ allowedNetworks: NetworkId[];
64
+ /** Asset identifiers this client will pay with. Solana addresses are case-sensitive. */
65
+ allowedAssets: string[];
66
+ /** Hard ceiling applied regardless of mandate, as a last-resort backstop. */
67
+ absoluteMaxPerPayment: bigint;
68
+ fetchImpl?: typeof fetch;
69
+ outboundPolicy?: OutboundRequestPolicy;
70
+ /** Optional provider stack. Omit to retain the legacy EIP-3009 signer path. */
71
+ paymentProviders?: readonly ComposablePaymentProvider[];
72
+ }
73
+ export declare class PaymentDeclinedError extends Error {
74
+ readonly reason?: string | undefined;
75
+ constructor(message: string, reason?: string | undefined);
76
+ }
77
+ export declare class X402Client {
78
+ private readonly opts;
79
+ private readonly fetchImpl;
80
+ constructor(opts: X402ClientOptions);
81
+ /**
82
+ * Fetch a resource, paying if the server demands it.
83
+ * Returns the final Response plus settlement metadata when a payment happened.
84
+ */
85
+ fetch(input: string, init?: RequestInit, context?: X402PaymentContext): Promise<{
86
+ response: Response;
87
+ paid: boolean;
88
+ settlement?: SettlementResponse;
89
+ requirement?: PaymentRequirement;
90
+ amount?: bigint;
91
+ }>;
92
+ /** Probe a resource's price without paying. Used by the `quote` MCP tool. */
93
+ quote(input: string): Promise<PaymentRequiredResponse | null>;
94
+ private select;
95
+ private buildPayment;
96
+ }
97
+ export declare function normaliseNetwork(n: string): NetworkId;
98
+ export declare function chainIdFor(network: string): number;
99
+ export declare function encodePayment(p: PaymentPayload): string;
100
+ export declare function decodePayment(header: string): PaymentPayload;
101
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/x402/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,KAAK,EAEV,cAAc,EACd,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,IAAI,EAAE;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,gFAAgF;IAChF,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,SAAS,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnE,+EAA+E;IAC/E,YAAY,CAAC,CACX,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,UAAU,EAAE,kBAAkB,GAAG,IAAI,EACrC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,+EAA+E;IAC/E,eAAe,EAAE,SAAS,EAAE,CAAC;IAC7B,wFAAwF;IACxF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,6EAA6E;IAC7E,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;CACzD;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAG3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;gBADxB,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,MAAM,YAAA;CAK3B;AAED,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAEZ,IAAI,EAAE,iBAAiB;IAIpD;;;OAGG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,WAAgB,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC;QACT,QAAQ,EAAE,QAAQ,CAAC;QACnB,IAAI,EAAE,OAAO,CAAC;QACd,UAAU,CAAC,EAAE,kBAAkB,CAAC;QAChC,WAAW,CAAC,EAAE,kBAAkB,CAAC;QACjC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IA0FF,6EAA6E;IACvE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAOnE,OAAO,CAAC,MAAM;YAeA,YAAY;CAgF3B;AAUD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAIrD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKlD;AAwDD,wBAAgB,aAAa,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAEvD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAE5D"}