@genesis-tech/genesispay-seller 0.13.1 → 1.3.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 (99) hide show
  1. package/CHANGELOG.md +206 -0
  2. package/README.md +670 -91
  3. package/dist/checkout-documents.d.ts +99 -0
  4. package/dist/checkout-documents.d.ts.map +1 -0
  5. package/dist/checkout-documents.js +155 -0
  6. package/dist/checkout-documents.js.map +1 -0
  7. package/dist/checkout-return.d.ts +41 -0
  8. package/dist/checkout-return.d.ts.map +1 -0
  9. package/dist/checkout-return.js +68 -0
  10. package/dist/checkout-return.js.map +1 -0
  11. package/dist/client.d.ts +318 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +718 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/contract-mandates.d.ts +39 -0
  16. package/dist/contract-mandates.d.ts.map +1 -0
  17. package/dist/contract-mandates.js +98 -0
  18. package/dist/contract-mandates.js.map +1 -0
  19. package/dist/contract-usage.d.ts +29 -0
  20. package/dist/contract-usage.d.ts.map +1 -0
  21. package/dist/contract-usage.js +92 -0
  22. package/dist/contract-usage.js.map +1 -0
  23. package/dist/customers.d.ts +41 -0
  24. package/dist/customers.d.ts.map +1 -0
  25. package/dist/customers.js +76 -0
  26. package/dist/customers.js.map +1 -0
  27. package/dist/entitlements.d.ts +19 -0
  28. package/dist/entitlements.d.ts.map +1 -0
  29. package/dist/entitlements.js +30 -0
  30. package/dist/entitlements.js.map +1 -0
  31. package/dist/errors.d.ts +129 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +273 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/fulfillment-attempts.d.ts +29 -0
  36. package/dist/fulfillment-attempts.d.ts.map +1 -0
  37. package/dist/fulfillment-attempts.js +71 -0
  38. package/dist/fulfillment-attempts.js.map +1 -0
  39. package/dist/fulfillment.d.ts +152 -0
  40. package/dist/fulfillment.d.ts.map +1 -0
  41. package/dist/fulfillment.js +810 -0
  42. package/dist/fulfillment.js.map +1 -0
  43. package/dist/genesispay-settlement.d.ts +32 -0
  44. package/dist/genesispay-settlement.d.ts.map +1 -0
  45. package/dist/genesispay-settlement.js +500 -0
  46. package/dist/genesispay-settlement.js.map +1 -0
  47. package/dist/index.d.ts +22 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +21 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/invoices.d.ts +111 -0
  52. package/dist/invoices.d.ts.map +1 -0
  53. package/dist/invoices.js +192 -0
  54. package/dist/invoices.js.map +1 -0
  55. package/dist/item-tax.d.ts +15 -0
  56. package/dist/item-tax.d.ts.map +1 -0
  57. package/dist/item-tax.js +19 -0
  58. package/dist/item-tax.js.map +1 -0
  59. package/dist/mandate-gate.d.ts +54 -0
  60. package/dist/mandate-gate.d.ts.map +1 -0
  61. package/dist/mandate-gate.js +183 -0
  62. package/dist/mandate-gate.js.map +1 -0
  63. package/dist/mandates.d.ts +189 -0
  64. package/dist/mandates.d.ts.map +1 -0
  65. package/dist/mandates.js +234 -0
  66. package/dist/mandates.js.map +1 -0
  67. package/dist/networks.d.ts +10 -0
  68. package/dist/networks.d.ts.map +1 -0
  69. package/dist/networks.js +23 -0
  70. package/dist/networks.js.map +1 -0
  71. package/dist/payment-gate.d.ts +98 -0
  72. package/dist/payment-gate.d.ts.map +1 -0
  73. package/dist/payment-gate.js +370 -0
  74. package/dist/payment-gate.js.map +1 -0
  75. package/dist/plans.d.ts +68 -0
  76. package/dist/plans.d.ts.map +1 -0
  77. package/dist/plans.js +127 -0
  78. package/dist/plans.js.map +1 -0
  79. package/dist/products.d.ts +170 -0
  80. package/dist/products.d.ts.map +1 -0
  81. package/dist/products.js +1317 -0
  82. package/dist/products.js.map +1 -0
  83. package/dist/resource.d.ts +47 -0
  84. package/dist/resource.d.ts.map +1 -0
  85. package/dist/resource.js +71 -0
  86. package/dist/resource.js.map +1 -0
  87. package/dist/strict-response.d.ts +21 -0
  88. package/dist/strict-response.d.ts.map +1 -0
  89. package/dist/strict-response.js +68 -0
  90. package/dist/strict-response.js.map +1 -0
  91. package/dist/usdc-amount.d.ts +7 -0
  92. package/dist/usdc-amount.d.ts.map +1 -0
  93. package/dist/usdc-amount.js +21 -0
  94. package/dist/usdc-amount.js.map +1 -0
  95. package/dist/webhooks.d.ts +352 -0
  96. package/dist/webhooks.d.ts.map +1 -0
  97. package/dist/webhooks.js +244 -0
  98. package/dist/webhooks.js.map +1 -0
  99. package/package.json +4 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networks.d.ts","sourceRoot":"","sources":["../src/networks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAGpE,yDAAyD;AACzD,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,cAAc,CAAC;AAEzD,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,UAAU,CAAC;CACzB,CAAC;AAmBF,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,kBAAkB,GAC1B,wBAAwB,CAU1B"}
@@ -0,0 +1,23 @@
1
+ import { GENESISPAY_ASSET_DEPLOYMENTS } from "@genesis-tech/genesispay-protocol";
2
+ const BASE_MAINNET = {
3
+ network: "base",
4
+ chainId: GENESISPAY_ASSET_DEPLOYMENTS.live.USDC.chainId,
5
+ usdcAddress: GENESISPAY_ASSET_DEPLOYMENTS.live.USDC.tokenAddress,
6
+ };
7
+ const BASE_SEPOLIA = {
8
+ network: "base-sepolia",
9
+ chainId: GENESISPAY_ASSET_DEPLOYMENTS.test.USDC.chainId,
10
+ usdcAddress: GENESISPAY_ASSET_DEPLOYMENTS.test.USDC.tokenAddress,
11
+ };
12
+ const NETWORK_CONFIGS = {
13
+ base: BASE_MAINNET,
14
+ "base-sepolia": BASE_SEPOLIA,
15
+ };
16
+ export function resolvePaymentGateNetwork(network) {
17
+ const config = NETWORK_CONFIGS[network];
18
+ if (!config) {
19
+ throw new Error(`Unsupported network "${String(network)}". Supported networks: ${Object.keys(NETWORK_CONFIGS).join(", ")}.`);
20
+ }
21
+ return config;
22
+ }
23
+ //# sourceMappingURL=networks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networks.js","sourceRoot":"","sources":["../src/networks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAWjF,MAAM,YAAY,GAA6B;IAC7C,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;IACvD,WAAW,EAAE,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;CACjE,CAAC;AAEF,MAAM,YAAY,GAA6B;IAC7C,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;IACvD,WAAW,EAAE,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;CACjE,CAAC;AAEF,MAAM,eAAe,GAAyD;IAC5E,IAAI,EAAE,YAAY;IAClB,cAAc,EAAE,YAAY;CAC7B,CAAC;AAEF,MAAM,UAAU,yBAAyB,CACvC,OAA2B;IAE3B,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,wBAAwB,MAAM,CAAC,OAAO,CAAC,0BAA0B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC5G,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,98 @@
1
+ import type { EvmAddress, PaymentAccept, PaymentSignaturePayload, SettlementResponsePayload } from "@genesis-tech/genesispay-protocol";
2
+ import type { PaymentGateNetwork } from "./networks.js";
3
+ export type PaymentGateConfig = {
4
+ /** Human-readable decimal USDC amount, e.g. "0.10". */
5
+ amountUsdc: string;
6
+ /** Wallet that receives the USDC payment. */
7
+ payTo: string;
8
+ /** Shown to payers in the PAYMENT-REQUIRED payload. */
9
+ description?: string;
10
+ /** Defaults to "base-sepolia". */
11
+ network?: PaymentGateNetwork;
12
+ /**
13
+ * Canonical resource URL advertised in PAYMENT-REQUIRED. Defaults to the
14
+ * incoming request URL (origin + pathname, query stripped).
15
+ */
16
+ resource?: string;
17
+ /** MIME type of the paid resource. Defaults to "application/json". */
18
+ mimeType?: string;
19
+ /** Payment authorization validity window advertised to payers. */
20
+ maxTimeoutSeconds?: number;
21
+ /**
22
+ * EIP-712 domain (`name`/`version`) of the settlement asset contract,
23
+ * advertised as the x402 `extra` field so generic clients sign with the
24
+ * exact domain the contract's DOMAIN_SEPARATOR() uses (e.g. Base mainnet
25
+ * USDC is { name: "USD Coin", version: "2" }). Omitted by default —
26
+ * clients then fall back to the standard "USDC"/"2" domain.
27
+ */
28
+ eip712Domain?: {
29
+ name: string;
30
+ version: string;
31
+ };
32
+ };
33
+ /** Context handed to the settlement hook once a payment passed structural checks. */
34
+ export type SettlementContext = {
35
+ request: Request;
36
+ /** The raw PAYMENT-SIGNATURE header value, ready to forward to a facilitator. */
37
+ paymentSignatureHeader: string;
38
+ /** The decoded, structurally validated payment payload. */
39
+ payment: PaymentSignaturePayload;
40
+ /** The payment requirement this request must satisfy. */
41
+ requirement: PaymentAccept;
42
+ /** Persisted authority prepared before the payer signed. */
43
+ planId?: string;
44
+ };
45
+ export type PreparedSettlement = {
46
+ settlementPlan: {
47
+ planId: string;
48
+ sellerAuthorization: {
49
+ from: EvmAddress;
50
+ to: EvmAddress;
51
+ value: string;
52
+ validAfter: string;
53
+ validBefore: string;
54
+ nonce: `0x${string}`;
55
+ };
56
+ feeAuthorization: null;
57
+ };
58
+ };
59
+ export type PreparedAuthorizationRequest = {
60
+ sellerNonce: `0x${string}`;
61
+ feeNonce: `0x${string}` | null;
62
+ validBefore: string;
63
+ };
64
+ export type SettlementVerification = {
65
+ ok: true;
66
+ settlement: SettlementResponsePayload;
67
+ } | {
68
+ ok: false;
69
+ errorReason: string;
70
+ settlement?: SettlementResponsePayload;
71
+ /** Signed authority may already be accepted or broadcast; never issue a fresh 402. */
72
+ outcomeUnknown?: true;
73
+ };
74
+ export type VerifySettlement = (context: SettlementContext) => Promise<SettlementVerification>;
75
+ export type PlanAwareVerifySettlement = VerifySettlement & {
76
+ prepare?: (input: {
77
+ payer: EvmAddress;
78
+ idempotencyKey: string | null;
79
+ requirement: PaymentAccept;
80
+ authority?: PreparedAuthorizationRequest;
81
+ }) => Promise<PreparedSettlement>;
82
+ };
83
+ export type WrapOptions = {
84
+ verifySettlement: VerifySettlement;
85
+ };
86
+ type WrappableHandler<Args extends unknown[]> = (request: Request, ...args: Args) => Response | Promise<Response>;
87
+ export type PaymentGate = {
88
+ /**
89
+ * Wraps a Web-standard (Request) => Response handler. Works with Next.js
90
+ * route handlers, Hono (`(c) => gated(c.req.raw)`), and Bun.serve.
91
+ */
92
+ wrap<Args extends unknown[]>(handler: WrappableHandler<Args>, options: WrapOptions): (request: Request, ...args: Args) => Promise<Response>;
93
+ /** Builds the PAYMENT-REQUIRED requirement for a given resource URL. */
94
+ requirementFor(resource: string): PaymentAccept;
95
+ };
96
+ export declare function createPaymentGate(config: PaymentGateConfig): PaymentGate;
97
+ export {};
98
+ //# sourceMappingURL=payment-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-gate.d.ts","sourceRoot":"","sources":["../src/payment-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,370 @@
1
+ import { GENESISPAY_SETTLEMENT_PREPARE_HEADER, GENESISPAY_SETTLEMENT_PREPARE_PARAMS_HEADER, PAYMENT_REQUIRED_HEADER, PAYMENT_RESPONSE_HEADER, PAYMENT_SIGNATURE_HEADER, buildPaymentRequiredPayload, decodePaymentSignatureHeader, decodeSettlementPrepareParamsHeader, encodePaymentRequiredHeader, encodeSettlementResponseHeader, validatePaymentSignatureAgainstRequirement, } from "@genesis-tech/genesispay-protocol";
2
+ import { getAddress, isAddress } from "viem";
3
+ import { resolvePaymentGateNetwork } from "./networks.js";
4
+ import { parseUsdcAmountToMinorUnits } from "./usdc-amount.js";
5
+ export function createPaymentGate(config) {
6
+ const network = resolvePaymentGateNetwork(config.network ?? "base-sepolia");
7
+ const amountUsdcMinor = parseUsdcAmountToMinorUnits(config.amountUsdc);
8
+ const payTo = normalizePayToAddress(config.payTo);
9
+ const description = config.description ?? "Payment required";
10
+ function buildPayload(resource) {
11
+ return buildPaymentRequiredPayload({
12
+ amount: config.amountUsdc.trim(),
13
+ amountUsdcMinor,
14
+ asset: "USDC",
15
+ assetAddress: network.usdcAddress,
16
+ chainId: network.chainId,
17
+ network: network.network,
18
+ destination: payTo,
19
+ description,
20
+ resource,
21
+ mimeType: config.mimeType,
22
+ maxTimeoutSeconds: config.maxTimeoutSeconds,
23
+ extra: config.eip712Domain,
24
+ });
25
+ }
26
+ function resolveResource(request) {
27
+ if (config.resource) {
28
+ return config.resource;
29
+ }
30
+ const url = new URL(request.url);
31
+ return `${url.origin}${url.pathname}`;
32
+ }
33
+ return {
34
+ requirementFor(resource) {
35
+ return buildPayload(resource).accepts[0];
36
+ },
37
+ wrap(handler, options) {
38
+ if (typeof options?.verifySettlement !== "function") {
39
+ throw new Error("gate.wrap requires a verifySettlement hook — use genesisPaySettlement({ facilitatorBaseUrl, apiKey }) or provide your own.");
40
+ }
41
+ return async (request, ...args) => {
42
+ const planAwareVerifier = options.verifySettlement;
43
+ const payload = buildPayload(resolveResource(request));
44
+ const paymentSignatureHeader = request.headers.get(PAYMENT_SIGNATURE_HEADER);
45
+ if (!paymentSignatureHeader?.trim() &&
46
+ request.headers.get(GENESISPAY_SETTLEMENT_PREPARE_HEADER) === "1") {
47
+ if (!planAwareVerifier.prepare) {
48
+ return new Response(JSON.stringify({
49
+ error: "This gate does not support settlement preparation.",
50
+ code: "settlement_plan_required",
51
+ }), { status: 426, headers: { "Content-Type": "application/json" } });
52
+ }
53
+ const paramsHeader = request.headers.get(GENESISPAY_SETTLEMENT_PREPARE_PARAMS_HEADER);
54
+ const prepareParams = paramsHeader === null
55
+ ? await readLegacyPrepareBody(request)
56
+ : readPrepareParamsHeader(paramsHeader);
57
+ if (!prepareParams.ok)
58
+ return prepareParams.response;
59
+ const { payer, idempotencyKey, authority } = prepareParams;
60
+ try {
61
+ const prepared = await planAwareVerifier.prepare({
62
+ payer,
63
+ idempotencyKey,
64
+ requirement: payload.accepts[0],
65
+ ...(authority ? { authority } : {}),
66
+ });
67
+ return Response.json(prepared, {
68
+ status: 201,
69
+ headers: { "Cache-Control": "no-store" },
70
+ });
71
+ }
72
+ catch (error) {
73
+ return new Response(JSON.stringify({ error: describeError(error), code: "settlement_prepare_failed" }), { status: 502, headers: { "Content-Type": "application/json" } });
74
+ }
75
+ }
76
+ if (!paymentSignatureHeader?.trim()) {
77
+ return paymentRequiredResponse(payload, undefined, undefined, planAwareVerifier.prepare ? request.url : undefined);
78
+ }
79
+ let payment;
80
+ try {
81
+ payment = decodePaymentSignatureHeader(paymentSignatureHeader);
82
+ }
83
+ catch (error) {
84
+ return paymentRequiredResponse(payload, describeError(error));
85
+ }
86
+ const planId = request.headers.get("GENESISPAY-Settlement-Plan");
87
+ if (planAwareVerifier.prepare &&
88
+ !planId &&
89
+ !hasHistoricalSettlementTransaction(payment)) {
90
+ return new Response(JSON.stringify({
91
+ error: "Prepare a versioned settlement plan before signing.",
92
+ code: "settlement_plan_required",
93
+ }), { status: 426, headers: { "Content-Type": "application/json" } });
94
+ }
95
+ let requirement = payload.accepts[0];
96
+ const mismatch = validatePaymentSignatureAgainstRequirement(payment, requirement);
97
+ if (mismatch) {
98
+ const transactionHash = getHistoricalSettlementTransaction(payment);
99
+ const preparedReconciliationRequirement = transactionHash && planId && planAwareVerifier.prepare
100
+ ? paymentRequirementForPreparedReconciliation(payment, requirement)
101
+ : null;
102
+ if (preparedReconciliationRequirement) {
103
+ // Only a plan-aware verifier may receive this payer-carried
104
+ // snapshot: its prepare capability is the SDK contract that says
105
+ // the downstream facilitator will revalidate it against immutable
106
+ // server-side authority. A custom verifier without that capability
107
+ // must never be handed payer-selected amount/destination fields.
108
+ requirement = preparedReconciliationRequirement;
109
+ }
110
+ else if (transactionHash) {
111
+ return settlementOutcomeUnknownResponse({
112
+ ok: false,
113
+ outcomeUnknown: true,
114
+ errorReason: `${mismatch} The payer transaction may already be on-chain; do not initiate another payment.`,
115
+ settlement: {
116
+ success: false,
117
+ transaction: transactionHash,
118
+ network: requirement.network,
119
+ amount: requirement.maxAmountRequired,
120
+ errorReason: mismatch,
121
+ extensions: {
122
+ authorizationVerified: false,
123
+ settlementVerified: false,
124
+ },
125
+ },
126
+ });
127
+ }
128
+ else {
129
+ return paymentRequiredResponse(payload, mismatch);
130
+ }
131
+ }
132
+ let verification;
133
+ try {
134
+ verification = await options.verifySettlement({
135
+ request,
136
+ paymentSignatureHeader,
137
+ payment,
138
+ requirement,
139
+ ...(planId ? { planId } : {}),
140
+ });
141
+ }
142
+ catch (error) {
143
+ const transactionHash = getHistoricalSettlementTransaction(payment);
144
+ if (!transactionHash)
145
+ throw error;
146
+ const errorReason = "The settlement verifier failed after the payer transaction was supplied. Do not initiate another payment; retry reconciliation.";
147
+ return settlementOutcomeUnknownResponse({
148
+ ok: false,
149
+ outcomeUnknown: true,
150
+ errorReason,
151
+ settlement: payerBroadcastOutcomeUnknownSettlement({
152
+ transactionHash,
153
+ requirement,
154
+ errorReason,
155
+ }),
156
+ });
157
+ }
158
+ if (!verification.ok) {
159
+ const transactionHash = getHistoricalSettlementTransaction(payment);
160
+ if (verification.outcomeUnknown || transactionHash) {
161
+ return settlementOutcomeUnknownResponse(transactionHash
162
+ ? {
163
+ ...verification,
164
+ outcomeUnknown: true,
165
+ settlement: payerBroadcastOutcomeUnknownSettlement({
166
+ transactionHash,
167
+ requirement,
168
+ errorReason: verification.errorReason,
169
+ settlement: verification.settlement,
170
+ }),
171
+ }
172
+ : verification);
173
+ }
174
+ return paymentRequiredResponse(payload, verification.errorReason, verification.settlement);
175
+ }
176
+ const response = await handler(request, ...args);
177
+ return withSettlementHeader(response, verification.settlement);
178
+ };
179
+ },
180
+ };
181
+ }
182
+ function settlementOutcomeUnknownResponse(verification) {
183
+ const headers = new Headers({
184
+ "Content-Type": "application/json",
185
+ "Cache-Control": "no-store",
186
+ "Retry-After": "1",
187
+ });
188
+ if (verification.settlement) {
189
+ headers.set(PAYMENT_RESPONSE_HEADER, encodeSettlementResponseHeader(verification.settlement));
190
+ }
191
+ return new Response(JSON.stringify({
192
+ code: "settlement_outcome_unknown",
193
+ error: verification.errorReason,
194
+ }), { status: 503, headers });
195
+ }
196
+ function invalidPrepareRequest(error) {
197
+ return {
198
+ ok: false,
199
+ response: new Response(JSON.stringify({ error, code: "invalid_request" }), {
200
+ status: 422,
201
+ headers: { "Content-Type": "application/json" },
202
+ }),
203
+ };
204
+ }
205
+ /**
206
+ * Legacy preparation: the request BODY is the plan parameters. Kept unchanged
207
+ * for clients that predate `GENESISPAY-Settlement-Prepare-Params`.
208
+ */
209
+ async function readLegacyPrepareBody(request) {
210
+ let body;
211
+ try {
212
+ body = await request.json();
213
+ }
214
+ catch {
215
+ body = null;
216
+ }
217
+ const payer = readPreparePayer(body);
218
+ if (!payer)
219
+ return invalidPrepareRequest("A valid payer is required.");
220
+ const idempotencyKey = typeof body === "object" &&
221
+ body !== null &&
222
+ "idempotencyKey" in body &&
223
+ typeof body.idempotencyKey === "string"
224
+ ? body.idempotencyKey
225
+ : null;
226
+ const authority = readPrepareAuthority(body);
227
+ if (typeof body === "object" && body !== null && "authority" in body && !authority) {
228
+ return invalidPrepareRequest("Prepared authority is invalid.");
229
+ }
230
+ return { ok: true, payer, idempotencyKey, authority };
231
+ }
232
+ /**
233
+ * Header preparation (ADR-0083): the plan parameters travel in
234
+ * `GENESISPAY-Settlement-Prepare-Params`, and the body is the purchase body.
235
+ * This gate prices by configuration and binds no request fingerprint, so the
236
+ * body stays opaque here and is never read; the resource URL alone scopes the
237
+ * requirement. A present but malformed header is refused, never read as a body.
238
+ */
239
+ function readPrepareParamsHeader(paramsHeader) {
240
+ const params = decodeSettlementPrepareParamsHeader(paramsHeader);
241
+ if (!params)
242
+ return invalidPrepareRequest("Invalid settlement preparation parameters.");
243
+ return {
244
+ ok: true,
245
+ payer: params.payer,
246
+ idempotencyKey: params.idempotencyKey,
247
+ authority: params.authority ?? null,
248
+ };
249
+ }
250
+ function readPrepareAuthority(body) {
251
+ if (typeof body !== "object" || body === null || !("authority" in body)) {
252
+ return null;
253
+ }
254
+ const authority = body.authority;
255
+ if (typeof authority !== "object" ||
256
+ authority === null ||
257
+ !("sellerNonce" in authority) ||
258
+ typeof authority.sellerNonce !== "string" ||
259
+ !/^0x[0-9a-fA-F]{64}$/.test(authority.sellerNonce) ||
260
+ !("feeNonce" in authority) ||
261
+ (authority.feeNonce !== null &&
262
+ (typeof authority.feeNonce !== "string" ||
263
+ !/^0x[0-9a-fA-F]{64}$/.test(authority.feeNonce))) ||
264
+ !("validBefore" in authority) ||
265
+ typeof authority.validBefore !== "string" ||
266
+ !/^\d+$/.test(authority.validBefore)) {
267
+ return null;
268
+ }
269
+ return authority;
270
+ }
271
+ function hasHistoricalSettlementTransaction(payment) {
272
+ return getHistoricalSettlementTransaction(payment) !== null;
273
+ }
274
+ function getHistoricalSettlementTransaction(payment) {
275
+ const extensions = payment.extensions;
276
+ if (!extensions) {
277
+ return null;
278
+ }
279
+ for (const key of ["txHash", "transaction", "transactionHash"]) {
280
+ const value = extensions[key];
281
+ if (typeof value === "string" && /^0x[0-9a-fA-F]{64}$/.test(value)) {
282
+ return value;
283
+ }
284
+ }
285
+ return null;
286
+ }
287
+ function payerBroadcastOutcomeUnknownSettlement(input) {
288
+ return {
289
+ ...input.settlement,
290
+ success: false,
291
+ transaction: input.transactionHash,
292
+ network: input.settlement?.network ?? input.requirement.network,
293
+ amount: input.settlement?.amount ?? input.requirement.maxAmountRequired,
294
+ errorReason: input.settlement?.errorReason ?? input.errorReason,
295
+ extensions: {
296
+ ...input.settlement?.extensions,
297
+ settlementVerified: false,
298
+ },
299
+ };
300
+ }
301
+ function paymentRequirementForPreparedReconciliation(payment, fallback) {
302
+ const accepted = payment.accepted;
303
+ const destination = accepted.payTo ?? accepted.destination;
304
+ const resource = payment.resource?.url;
305
+ if (!accepted.chainId ||
306
+ !accepted.assetAddress ||
307
+ !destination ||
308
+ !resource) {
309
+ return null;
310
+ }
311
+ return {
312
+ ...fallback,
313
+ network: accepted.network,
314
+ chainId: accepted.chainId,
315
+ assetAddress: accepted.assetAddress,
316
+ asset: accepted.asset ?? fallback.asset,
317
+ amount: accepted.amount,
318
+ maxAmountRequired: accepted.amount,
319
+ destination,
320
+ payTo: destination,
321
+ resource,
322
+ };
323
+ }
324
+ function paymentRequiredResponse(payload, errorReason, settlement, prepareUrl) {
325
+ const body = errorReason
326
+ ? { ...payload, error: errorReason }
327
+ : payload;
328
+ const headers = new Headers({
329
+ "Content-Type": "application/json",
330
+ "Cache-Control": "no-store",
331
+ [PAYMENT_REQUIRED_HEADER]: encodePaymentRequiredHeader(body),
332
+ });
333
+ if (settlement) {
334
+ headers.set(PAYMENT_RESPONSE_HEADER, encodeSettlementResponseHeader(settlement));
335
+ }
336
+ if (prepareUrl) {
337
+ headers.set("GENESISPAY-Settlement-Prepare", prepareUrl);
338
+ headers.set("GENESISPAY-Settlement-Version", "1");
339
+ }
340
+ return new Response(JSON.stringify(body), { status: 402, headers });
341
+ }
342
+ function readPreparePayer(value) {
343
+ if (typeof value !== "object" ||
344
+ value === null ||
345
+ !("payer" in value) ||
346
+ typeof value.payer !== "string" ||
347
+ !isAddress(value.payer)) {
348
+ return null;
349
+ }
350
+ return getAddress(value.payer);
351
+ }
352
+ function withSettlementHeader(response, settlement) {
353
+ const headers = new Headers(response.headers);
354
+ headers.set(PAYMENT_RESPONSE_HEADER, encodeSettlementResponseHeader(settlement));
355
+ return new Response(response.body, {
356
+ status: response.status,
357
+ statusText: response.statusText,
358
+ headers,
359
+ });
360
+ }
361
+ function normalizePayToAddress(payTo) {
362
+ if (typeof payTo !== "string" || !isAddress(payTo.trim())) {
363
+ throw new Error(`Invalid payTo address "${String(payTo)}": expected an EVM address like 0x1234....`);
364
+ }
365
+ return getAddress(payTo.trim());
366
+ }
367
+ function describeError(error) {
368
+ return error instanceof Error ? error.message : "Malformed PAYMENT-SIGNATURE header.";
369
+ }
370
+ //# sourceMappingURL=payment-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-gate.js","sourceRoot":"","sources":["../src/payment-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { type GenesisPayRequest } from "./resource.js";
2
+ export type SubscriptionPlanStatus = "active" | "archived";
3
+ export type SubscriptionPlan = {
4
+ /** Internal id. Address a plan by `publicId` — that is what the routes take. */
5
+ id: string;
6
+ publicId: string;
7
+ title: string;
8
+ description: string | null;
9
+ asset: "USDC" | "EURC";
10
+ /** Decimal amount charged per period, e.g. "9.00". */
11
+ amountPerPeriod: string;
12
+ /** Same amount in 6-decimal minor units, as a string (no precision loss). */
13
+ amountPerPeriodMinor: string;
14
+ periodDays: number;
15
+ /**
16
+ * How many periods of allowance the customer approves up front. The mandate's
17
+ * total allowance is `amountPerPeriodMinor * prepaidCycles`; when it runs out
18
+ * the customer signs again.
19
+ */
20
+ prepaidCycles: number;
21
+ capPerChargeMinor: string;
22
+ allowanceMinor: string;
23
+ destinationWallet: string;
24
+ chainId: number;
25
+ status: SubscriptionPlanStatus;
26
+ /**
27
+ * The hosted subscribe flow (`/subscribe/:publicId`) — send the customer
28
+ * here. This is the whole reason to call the API rather than build the URL
29
+ * yourself: the host depends on the deployment the key points at.
30
+ */
31
+ checkoutUrl: string;
32
+ createdAt: string;
33
+ archivedAt: string | null;
34
+ };
35
+ export type PlanCreateInput = {
36
+ title: string;
37
+ /** Decimal amount per period, e.g. "9" or "9.00". */
38
+ amountPerPeriod: string;
39
+ /** Billing period in whole days, e.g. 30. */
40
+ periodDays: number;
41
+ description?: string;
42
+ /** Periods of allowance collected in one signature. Server default applies. */
43
+ prepaidCycles?: number;
44
+ /** Defaults to the account's receiving wallet. */
45
+ destinationWallet?: string;
46
+ /** Defaults to USDC. */
47
+ asset?: "USDC" | "EURC";
48
+ };
49
+ export interface PlansResource {
50
+ create(input: PlanCreateInput): Promise<SubscriptionPlan>;
51
+ list(): Promise<SubscriptionPlan[]>;
52
+ retrieve(publicId: string): Promise<SubscriptionPlan>;
53
+ /**
54
+ * Stops the hosted page from taking new subscribers. Mandates already signed
55
+ * from this plan keep billing until the payer revokes them — archiving is not
56
+ * a cancellation. Archiving twice is a no-op that returns the same plan.
57
+ */
58
+ archive(publicId: string): Promise<SubscriptionPlan>;
59
+ }
60
+ export declare function createPlansResource(request: GenesisPayRequest,
61
+ /**
62
+ * Applies the client's `expectedPayTo` pin to the wallet the server froze
63
+ * onto the plan. A plan's destination is where every future renewal settles,
64
+ * so it is exactly the value the pin exists to guard.
65
+ */
66
+ assertPinnedDestination?: (wallet: unknown, what: string) => void): PlansResource;
67
+ export declare function toSubscriptionPlan(raw: Record<string, unknown>): SubscriptionPlan;
68
+ //# sourceMappingURL=plans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../src/plans.ts"],"names":[],"mappings":"AASA,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE3D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,sDAAsD;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,sBAAsB,CAAC;IAC/B;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,eAAe,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1D,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACtD;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,iBAAiB;AAC1B;;;;GAIG;AACH,uBAAuB,GAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAe,GAC1E,aAAa,CAwEf;AA6BD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAwBjF"}