@genesis-tech/genesispay-seller 0.13.2 → 1.5.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 (78) hide show
  1. package/CHANGELOG.md +227 -0
  2. package/README.md +719 -91
  3. package/dist/checkout-documents.d.ts +105 -0
  4. package/dist/checkout-documents.d.ts.map +1 -0
  5. package/dist/checkout-documents.js +171 -0
  6. package/dist/checkout-documents.js.map +1 -0
  7. package/dist/checkout-return.d.ts +5 -5
  8. package/dist/checkout-return.d.ts.map +1 -1
  9. package/dist/checkout-return.js +3 -2
  10. package/dist/checkout-return.js.map +1 -1
  11. package/dist/client.d.ts +57 -7
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +100 -10
  14. package/dist/client.js.map +1 -1
  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/errors.d.ts +71 -5
  24. package/dist/errors.d.ts.map +1 -1
  25. package/dist/errors.js +124 -13
  26. package/dist/errors.js.map +1 -1
  27. package/dist/fulfillment-attempts.d.ts +29 -0
  28. package/dist/fulfillment-attempts.d.ts.map +1 -0
  29. package/dist/fulfillment-attempts.js +71 -0
  30. package/dist/fulfillment-attempts.js.map +1 -0
  31. package/dist/fulfillment.d.ts +152 -0
  32. package/dist/fulfillment.d.ts.map +1 -0
  33. package/dist/fulfillment.js +810 -0
  34. package/dist/fulfillment.js.map +1 -0
  35. package/dist/genesispay-settlement.d.ts +4 -2
  36. package/dist/genesispay-settlement.d.ts.map +1 -1
  37. package/dist/genesispay-settlement.js +412 -15
  38. package/dist/genesispay-settlement.js.map +1 -1
  39. package/dist/index.d.ts +11 -5
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +7 -4
  42. package/dist/index.js.map +1 -1
  43. package/dist/invoices.d.ts +31 -0
  44. package/dist/invoices.d.ts.map +1 -1
  45. package/dist/invoices.js +61 -2
  46. package/dist/invoices.js.map +1 -1
  47. package/dist/item-tax.d.ts +25 -0
  48. package/dist/item-tax.d.ts.map +1 -0
  49. package/dist/item-tax.js +43 -0
  50. package/dist/item-tax.js.map +1 -0
  51. package/dist/mandate-gate.d.ts +6 -1
  52. package/dist/mandate-gate.d.ts.map +1 -1
  53. package/dist/mandate-gate.js +81 -7
  54. package/dist/mandate-gate.js.map +1 -1
  55. package/dist/mandates.d.ts +21 -4
  56. package/dist/mandates.d.ts.map +1 -1
  57. package/dist/mandates.js +24 -3
  58. package/dist/mandates.js.map +1 -1
  59. package/dist/networks.d.ts.map +1 -1
  60. package/dist/networks.js +5 -4
  61. package/dist/networks.js.map +1 -1
  62. package/dist/payment-gate.d.ts +32 -1
  63. package/dist/payment-gate.d.ts.map +1 -1
  64. package/dist/payment-gate.js +275 -11
  65. package/dist/payment-gate.js.map +1 -1
  66. package/dist/products.d.ts +40 -16
  67. package/dist/products.d.ts.map +1 -1
  68. package/dist/products.js +1078 -56
  69. package/dist/products.js.map +1 -1
  70. package/dist/strict-response.d.ts +21 -0
  71. package/dist/strict-response.d.ts.map +1 -0
  72. package/dist/strict-response.js +68 -0
  73. package/dist/strict-response.js.map +1 -0
  74. package/dist/webhooks.d.ts +77 -2
  75. package/dist/webhooks.d.ts.map +1 -1
  76. package/dist/webhooks.js +20 -0
  77. package/dist/webhooks.js.map +1 -1
  78. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExF,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAKvB,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,yBAAyB,GAC/B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,oCAAoC,EACpC,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,KAAK,2BAA2B,GACjC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,yBAAyB,EACzB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAM/D,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,EACvB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,9 +1,12 @@
1
1
  // @genesis-tech/genesispay-seller — framework-agnostic x402 payment gate.
2
2
  export { GenesisPay, } from "./client.js";
3
+ export { createGateRequestFingerprint, } from "./products.js";
4
+ export { GENESISPAY_API_VERSION, GENESISPAY_VERSION_HEADER, GENESISPAY_REQUEST_ID_HEADER, GENESISPAY_PAYMENT_ATTEMPT_ID_HEADER, } from "./fulfillment.js";
3
5
  // Every SDK method throws from this set: 404 → NotFound, 422 (and 400 when the
4
6
  // body carries structured `issues`) → Validation, 429 → RateLimit (with
5
- // `retryAfterSeconds`), anything else → Config.
6
- export { GenesisPayConfigError, GenesisPayNetworkSafetyError, GenesisPayNotFoundError, GenesisPayValidationError, GenesisPayRateLimitError, } from "./errors.js";
7
+ // `retryAfterSeconds`), mandate outcome-unknown 503 → a typed retained charge
8
+ // locator, anything else → Config.
9
+ export { GenesisPayConfigError, GenesisPayNetworkSafetyError, GenesisPayNotFoundError, GenesisPayValidationError, GenesisPayRateLimitError, GenesisPayMandateChargePendingError, GenesisPayContractMismatchError, GenesisPayAmbiguousLocatorError, GenesisPayEvidenceError, GenesisPayVersionError, } from "./errors.js";
7
10
  export { constructEvent, isKnownGenesisPayEventType, GENESISPAY_EVENT_TYPES, GenesisPaySignatureVerificationError, } from "./webhooks.js";
8
11
  export { createPaymentGate, } from "./payment-gate.js";
9
12
  export { genesisPaySettlement, DEFAULT_FACILITATOR_BASE_URL, } from "./genesispay-settlement.js";
@@ -11,8 +14,8 @@ export { resolvePaymentGateNetwork, } from "./networks.js";
11
14
  export { parseUsdcAmountToMinorUnits } from "./usdc-amount.js";
12
15
  // Checkout return parameters: the query-parameter names GenesisPay appends to a
13
16
  // merchant's `returnUrl`, plus the typed hint parser that reads them back. The
14
- // hint is a UI convenience, not proof of payment — verify with
15
- // `checkout.retrieve(hint.linkId)` before acting on it.
17
+ // hint is a UI convenience, not proof of payment — pass its locator plus your
18
+ // immutable expected contract to `fulfillment.verify` before acting on it.
16
19
  export { CHECKOUT_RETURN_LINK_ID_PARAM, CHECKOUT_RETURN_STATUS_PARAM, parseCheckoutReturnHint, } from "./checkout-return.js";
17
20
  export { createMandateGate, MANDATE_HEADER, } from "./mandate-gate.js";
18
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,EACL,UAAU,GAaX,MAAM,aAAa,CAAC;AA0DrB,+EAA+E;AAC/E,wEAAwE;AACxE,gDAAgD;AAChD,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,GAEzB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,oCAAoC,GAWrC,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,GAOlB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,4BAA4B,GAE7B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,yBAAyB,GAG1B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAE/D,gFAAgF;AAChF,+EAA+E;AAC/E,+DAA+D;AAC/D,wDAAwD;AACxD,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,GAExB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,cAAc,GAIf,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,EACL,UAAU,GAcX,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAWL,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AAIvB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,oCAAoC,GAgBrC,MAAM,kBAAkB,CAAC;AA2C1B,+EAA+E;AAC/E,wEAAwE;AACxE,8EAA8E;AAC9E,mCAAmC;AACnC,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,mCAAmC,EACnC,+BAA+B,EAC/B,+BAA+B,EAC/B,uBAAuB,EACvB,sBAAsB,GAMvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,oCAAoC,GAarC,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,GAOlB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,4BAA4B,GAE7B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,yBAAyB,GAG1B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAG/D,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,GAExB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,cAAc,GAIf,MAAM,mBAAmB,CAAC"}
@@ -1,24 +1,31 @@
1
1
  import { type Customer } from "./customers.js";
2
+ import { type ItemTax } from "./item-tax.js";
2
3
  import { type GenesisPayRequest } from "./resource.js";
3
4
  export type InvoiceStatus = "draft" | "open" | "past_due" | "paid" | "void" | "uncollectible";
4
5
  export type InvoiceLineInput = {
6
+ /** Required for new v2 invoices; absent only when editing a legacy v1 draft. */
7
+ taxConfig?: ItemTax;
5
8
  description: string;
6
9
  quantity: number;
7
10
  /** Decimal amount in the invoice asset, as a string with up to 6 decimals. */
8
11
  unitAmount: string;
9
12
  };
10
13
  export type InvoiceDraftInput = {
14
+ /** New invoices are v2 (inclusive per-line tax); v1 is retained drafts only. */
15
+ calculationVersion?: 1 | 2;
11
16
  customerId: string;
12
17
  asset?: "USDC" | "EURC";
13
18
  /** ISO-8601 timestamp with an offset. */
14
19
  dueAt: string;
15
20
  discountBps?: number;
21
+ /** Legacy v1 only. New invoices use lineItems[].taxConfig and taxBps=0. */
16
22
  taxBps?: number;
17
23
  memo?: string;
18
24
  footer?: string;
19
25
  lineItems: InvoiceLineInput[];
20
26
  };
21
27
  export type Invoice = {
28
+ calculationVersion: 1 | 2;
22
29
  id: string;
23
30
  publicId: string;
24
31
  invoiceNumber: string | null;
@@ -33,6 +40,11 @@ export type Invoice = {
33
40
  quantity: number;
34
41
  unitAmountMinor: string;
35
42
  amountMinor: string;
43
+ taxConfig: ItemTax | null;
44
+ subtotalMinor: string | null;
45
+ discountMinor: string | null;
46
+ taxMinor: string | null;
47
+ totalMinor: string | null;
36
48
  }>;
37
49
  subtotalMinor: string;
38
50
  discountBps: number;
@@ -63,9 +75,28 @@ export type InvoiceEmailDelivery = {
63
75
  providerMessageId: string | null;
64
76
  sentAt: string | null;
65
77
  };
78
+ /** Small list projection; retrieve the full invoice for line items and payment evidence. */
79
+ export type InvoiceSummary = Pick<Invoice, "id" | "publicId" | "invoiceNumber" | "status" | "asset" | "chainId" | "totalMinor" | "dueAt" | "createdAt" | "paidAt"> & {
80
+ customer: {
81
+ name: string;
82
+ companyName: string | null;
83
+ };
84
+ };
85
+ export type InvoiceSummaryPage = {
86
+ invoices: InvoiceSummary[];
87
+ limit: number;
88
+ nextCursor: string | null;
89
+ };
90
+ export type InvoiceSummaryListOptions = {
91
+ limit?: number;
92
+ after?: string;
93
+ };
66
94
  export interface InvoicesResource {
67
95
  create(input: InvoiceDraftInput): Promise<Invoice>;
96
+ /** Legacy full resources: at most the newest 100 invoices. */
68
97
  list(): Promise<Invoice[]>;
98
+ /** Bounded summaries, default 25/max 100; follow nextCursor for older invoices. */
99
+ listSummaries(options?: InvoiceSummaryListOptions): Promise<InvoiceSummaryPage>;
69
100
  retrieve(publicId: string): Promise<Invoice>;
70
101
  update(publicId: string, input: InvoiceDraftInput): Promise<Invoice>;
71
102
  finalize(publicId: string): Promise<Invoice>;
@@ -1 +1 @@
1
- {"version":3,"file":"invoices.d.ts","sourceRoot":"","sources":["../src/invoices.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,MAAM,GACN,UAAU,GACV,MAAM,GACN,MAAM,GACN,eAAe,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3F,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAkFnF;AAmDD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAmD/D"}
1
+ {"version":3,"file":"invoices.d.ts","sourceRoot":"","sources":["../src/invoices.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,MAAM,GACN,UAAU,GACV,MAAM,GACN,MAAM,GACN,eAAe,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;QAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,UAAU,GAAG,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC,GAAG;IACnK,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACxD,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAC1G,MAAM,MAAM,yBAAyB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,8DAA8D;IAC9D,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3B,mFAAmF;IACnF,aAAa,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3F,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAmGnF;AAmDD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAyD/D"}
package/dist/invoices.js CHANGED
@@ -1,10 +1,11 @@
1
1
  // `genesispay.invoices.*` — one-off invoice lifecycle over `/api/v1/invoices`.
2
2
  import { GenesisPayConfigError } from "./errors.js";
3
3
  import { toCustomer } from "./customers.js";
4
+ import { parseItemTax } from "./item-tax.js";
4
5
  import { asRecord, oneOf, optionalString, requiredString, toAmountString, toCount, } from "./resource.js";
5
6
  export function createInvoicesResource(request) {
6
7
  return {
7
- create: async (input) => invoiceRequest(request, "POST", "/api/v1/invoices", input, "create an invoice"),
8
+ create: async (input) => invoiceRequest(request, "POST", "/api/v1/invoices", validateInvoiceTax(input, true), "create an invoice"),
8
9
  list: async () => {
9
10
  const body = await request({
10
11
  path: "/api/v1/invoices",
@@ -20,13 +21,31 @@ export function createInvoicesResource(request) {
20
21
  .filter((row) => Boolean(row?.publicId))
21
22
  .map(toInvoice);
22
23
  },
24
+ listSummaries: async (options = {}) => {
25
+ const limit = options.limit ?? 25;
26
+ if (!Number.isInteger(limit) || limit < 1 || limit > 100) {
27
+ throw new GenesisPayConfigError("invoices.listSummaries limit must be an integer from 1 to 100.");
28
+ }
29
+ if (options.after !== undefined && (typeof options.after !== "string" || !/^[A-Za-z0-9_-]{1,256}$/.test(options.after))) {
30
+ throw new GenesisPayConfigError("invoices.listSummaries after must be the opaque nextCursor from a previous page.");
31
+ }
32
+ const query = new URLSearchParams({ limit: String(limit) });
33
+ if (options.after)
34
+ query.set("after", options.after);
35
+ const body = asRecord(await request({ path: `/api/v1/invoices/summaries?${query}`, operation: "GET /api/v1/invoices/summaries", action: "list invoice summaries" }));
36
+ if (!body || !Array.isArray(body.invoices) || body.invoices.length > limit || body.limit !== limit ||
37
+ !(body.nextCursor === null || typeof body.nextCursor === "string" && /^[A-Za-z0-9_-]{1,256}$/.test(body.nextCursor))) {
38
+ throw new GenesisPayConfigError("GenesisPay returned an invalid invoice summary page.");
39
+ }
40
+ return { invoices: body.invoices.map(toInvoiceSummary), limit, nextCursor: body.nextCursor };
41
+ },
23
42
  retrieve: async (publicId) => {
24
43
  const id = requirePublicId(publicId, "invoices.retrieve");
25
44
  return invoiceRequest(request, "GET", `/api/v1/invoices/${encodeURIComponent(id)}`, undefined, `retrieve invoice "${id}"`);
26
45
  },
27
46
  update: async (publicId, input) => {
28
47
  const id = requirePublicId(publicId, "invoices.update");
29
- return invoiceRequest(request, "PATCH", `/api/v1/invoices/${encodeURIComponent(id)}`, input, `update invoice "${id}"`);
48
+ return invoiceRequest(request, "PATCH", `/api/v1/invoices/${encodeURIComponent(id)}`, validateInvoiceTax(input, false), `update invoice "${id}"`);
30
49
  },
31
50
  finalize: async (publicId) => transition(request, publicId, "finalize", "finalize an invoice"),
32
51
  void: async (publicId) => transition(request, publicId, "void", "void an invoice"),
@@ -88,6 +107,7 @@ export function toInvoice(raw) {
88
107
  const payment = asRecord(raw.payment) ?? {};
89
108
  const lines = Array.isArray(raw.lineItems) ? raw.lineItems : [];
90
109
  return {
110
+ calculationVersion: raw.calculationVersion === 2 ? 2 : 1,
91
111
  id: requiredString(raw.id),
92
112
  publicId: requiredString(raw.publicId),
93
113
  invoiceNumber: optionalString(raw.invoiceNumber),
@@ -105,6 +125,11 @@ export function toInvoice(raw) {
105
125
  quantity: toCount(line.quantity),
106
126
  unitAmountMinor: toAmountString(line.unitAmountMinor),
107
127
  amountMinor: toAmountString(line.amountMinor),
128
+ taxConfig: parseItemTax(line.taxConfig),
129
+ subtotalMinor: optionalString(line.subtotalMinor),
130
+ discountMinor: optionalString(line.discountMinor),
131
+ taxMinor: optionalString(line.taxMinor),
132
+ totalMinor: optionalString(line.totalMinor),
108
133
  })),
109
134
  subtotalMinor: toAmountString(raw.subtotalMinor),
110
135
  discountBps: toCount(raw.discountBps),
@@ -130,4 +155,38 @@ export function toInvoice(raw) {
130
155
  },
131
156
  };
132
157
  }
158
+ function validateInvoiceTax(input, creating) {
159
+ const version = input.calculationVersion ?? (creating ? 2 : undefined);
160
+ if (creating && version !== 2)
161
+ throw new GenesisPayConfigError("New invoices require calculationVersion 2 and per-line inclusive tax.");
162
+ if (version === 2 && (input.taxBps ?? 0) !== 0)
163
+ throw new GenesisPayConfigError("New invoices use line taxConfig, not invoice-wide taxBps.");
164
+ const lineItems = input.lineItems.map((line) => {
165
+ const taxConfig = parseItemTax(line.taxConfig);
166
+ if (version === 2 && !taxConfig)
167
+ throw new GenesisPayConfigError("Choose taxConfig for every invoice line.");
168
+ return { ...line, ...(taxConfig ? { taxConfig } : {}) };
169
+ });
170
+ return { ...input, ...(version ? { calculationVersion: version } : {}), lineItems };
171
+ }
172
+ /** This new endpoint has no older partial shape: missing rows must never silently disappear. */
173
+ function toInvoiceSummary(value) {
174
+ const raw = asRecord(value), customer = asRecord(raw?.customer);
175
+ const statuses = ["draft", "open", "past_due", "paid", "void", "uncollectible"];
176
+ if (!raw || !customer || typeof raw.id !== "string" || !raw.id || typeof raw.publicId !== "string" || !raw.publicId ||
177
+ !(raw.invoiceNumber === null || typeof raw.invoiceNumber === "string") ||
178
+ typeof raw.status !== "string" || !statuses.includes(raw.status) ||
179
+ !(raw.asset === "USDC" || raw.asset === "EURC") || typeof raw.chainId !== "number" || !Number.isInteger(raw.chainId) || raw.chainId <= 0 ||
180
+ typeof raw.totalMinor !== "string" || !/^(0|[1-9][0-9]*)$/.test(raw.totalMinor) ||
181
+ typeof customer.name !== "string" || !(customer.companyName === null || typeof customer.companyName === "string") ||
182
+ typeof raw.dueAt !== "string" || !Number.isFinite(Date.parse(raw.dueAt)) ||
183
+ typeof raw.createdAt !== "string" || !Number.isFinite(Date.parse(raw.createdAt)) ||
184
+ !(raw.paidAt === null || typeof raw.paidAt === "string" && Number.isFinite(Date.parse(raw.paidAt)))) {
185
+ throw new GenesisPayConfigError("GenesisPay returned an invalid invoice summary.");
186
+ }
187
+ return { id: raw.id, publicId: raw.publicId, invoiceNumber: raw.invoiceNumber,
188
+ status: raw.status, asset: raw.asset, chainId: raw.chainId, totalMinor: raw.totalMinor,
189
+ customer: { name: customer.name, companyName: customer.companyName },
190
+ dueAt: raw.dueAt, createdAt: raw.createdAt, paidAt: raw.paidAt };
191
+ }
133
192
  //# sourceMappingURL=invoices.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"invoices.js","sourceRoot":"","sources":["../src/invoices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"invoices.js","sourceRoot":"","sources":["../src/invoices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /** Seller-provided inclusive item tax. This is not automatic tax determination. */
2
+ export type ItemTax = {
3
+ version: 1;
4
+ treatment: "taxable" | "zero_rated" | "exempt" | "not_collected";
5
+ /** Integer basis points: 2000 = 20%. Taxable requires 1..10000, others 0. */
6
+ rateBps: number;
7
+ /** Required nonempty explanation for zero_rated, exempt and not_collected. */
8
+ note: string | null;
9
+ };
10
+ export declare function parseItemTax(value: unknown): ItemTax | null;
11
+ export type ItemTaxUpdate = {
12
+ taxConfig: ItemTax;
13
+ expectedTaxConfig: ItemTax | null;
14
+ };
15
+ export type ExternalOrderTax = {
16
+ version: 2;
17
+ calculation: "external";
18
+ source: "woocommerce";
19
+ subtotalMinor: string;
20
+ taxMinor: string;
21
+ totalMinor: string;
22
+ };
23
+ export type PaymentLinkTax = ItemTax | ExternalOrderTax;
24
+ export declare function parsePaymentLinkTax(value: unknown): PaymentLinkTax | null;
25
+ //# sourceMappingURL=item-tax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-tax.d.ts","sourceRoot":"","sources":["../src/item-tax.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,eAAe,CAAC;IACjE,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAc3D;AAED,MAAM,MAAM,aAAa,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,CAAC;AAEtF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,gBAAgB,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAoBzE"}
@@ -0,0 +1,43 @@
1
+ import { GenesisPayConfigError } from "./errors.js";
2
+ export function parseItemTax(value) {
3
+ // Old servers/entries are unconfigured, never silently zero-rated.
4
+ if (value === undefined || value === null)
5
+ return null;
6
+ if (typeof value !== "object" || Array.isArray(value))
7
+ throw new GenesisPayConfigError("Invalid item tax configuration.");
8
+ const tax = value;
9
+ const treatment = tax.treatment;
10
+ const note = typeof tax.note === "string" ? tax.note.trim() : tax.note;
11
+ if (tax.version !== 1 || !["taxable", "zero_rated", "exempt", "not_collected"].includes(String(treatment)) ||
12
+ typeof tax.rateBps !== "number" || !Number.isInteger(tax.rateBps) || tax.rateBps < 0 || tax.rateBps > 10000 ||
13
+ !(note === null || typeof note === "string") || (typeof note === "string" && note.length > 1000) ||
14
+ (treatment === "taxable" ? tax.rateBps === 0 : tax.rateBps !== 0 || !note)) {
15
+ throw new GenesisPayConfigError("Invalid item tax configuration. Supply a positive taxable rate or an explicit zero-tax treatment with a reason.");
16
+ }
17
+ return { version: 1, treatment: treatment, rateBps: tax.rateBps, note };
18
+ }
19
+ export function parsePaymentLinkTax(value) {
20
+ if (value === undefined || value === null)
21
+ return null;
22
+ if (typeof value !== "object" || Array.isArray(value))
23
+ throw new GenesisPayConfigError("Invalid payment tax configuration.");
24
+ const tax = value;
25
+ if (tax.version === 1)
26
+ return parseItemTax(value);
27
+ const canonical = (entry) => typeof entry === "string" && /^(0|[1-9][0-9]*)$/.test(entry);
28
+ if (tax.version !== 2 || tax.calculation !== "external" || tax.source !== "woocommerce" ||
29
+ !canonical(tax.subtotalMinor) || !canonical(tax.taxMinor) || !canonical(tax.totalMinor) ||
30
+ BigInt(tax.totalMinor) <= 0n ||
31
+ BigInt(tax.subtotalMinor) + BigInt(tax.taxMinor) !== BigInt(tax.totalMinor)) {
32
+ throw new GenesisPayConfigError("Invalid externally calculated order tax.");
33
+ }
34
+ return {
35
+ version: 2,
36
+ calculation: "external",
37
+ source: "woocommerce",
38
+ subtotalMinor: tax.subtotalMinor,
39
+ taxMinor: tax.taxMinor,
40
+ totalMinor: tax.totalMinor,
41
+ };
42
+ }
43
+ //# sourceMappingURL=item-tax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-tax.js","sourceRoot":"","sources":["../src/item-tax.ts"],"names":[],"mappings":"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"}
@@ -34,10 +34,15 @@ export type MandateChargeOutcome = {
34
34
  status: number;
35
35
  code?: string;
36
36
  error: string;
37
+ charge?: {
38
+ id: string;
39
+ amountMinor: string;
40
+ txHash: string | null;
41
+ };
37
42
  };
38
43
  export type MandateGate = {
39
44
  /** Charges the mandate once. Exposed for custom flows. */
40
- charge: (mandateId: string, resourceUrl?: string) => Promise<MandateChargeOutcome>;
45
+ charge: (mandateId: string, resourceUrl: string | undefined, idempotencyKey: string) => Promise<MandateChargeOutcome>;
41
46
  /**
42
47
  * Wraps a fetch-style handler: requests carrying a valid `GENESISPAY-MANDATE`
43
48
  * header are charged and passed through; requests without one get a 402
@@ -1 +1 @@
1
- {"version":3,"file":"mandate-gate.d.ts","sourceRoot":"","sources":["../src/mandate-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,cAAc,uBAAuB,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC5B;IACE,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG;IACxB,0DAA0D;IAC1D,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnF;;;;OAIG;IACH,IAAI,EAAE,CACJ,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KACxD,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC9C,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAsH1E"}
1
+ {"version":3,"file":"mandate-gate.d.ts","sourceRoot":"","sources":["../src/mandate-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,eAAO,MAAM,cAAc,uBAAuB,CAAC;AAanD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC5B;IACE,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACrE,CAAC;AAEN,MAAM,MAAM,WAAW,GAAG;IACxB,0DAA0D;IAC1D,MAAM,EAAE,CACN,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,cAAc,EAAE,MAAM,KACnB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC;;;;OAIG;IACH,IAAI,EAAE,CACJ,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KACxD,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC9C,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAwM1E"}
@@ -9,7 +9,18 @@
9
9
  * charge settled. Combine with `createPaymentGate` to accept both per-call
10
10
  * x402 payments and mandate-metered calls on one endpoint.
11
11
  */
12
+ import { parseUsdcAmountToMinorUnits } from "./usdc-amount.js";
12
13
  export const MANDATE_HEADER = "GENESISPAY-MANDATE";
14
+ const MANDATE_IDEMPOTENCY_KEY = /^[A-Za-z0-9][A-Za-z0-9._:-]{7,199}$/;
15
+ const TRANSACTION_HASH = /^0x[0-9a-f]{64}$/i;
16
+ function validIdempotencyKey(value) {
17
+ const key = value?.trim();
18
+ return key &&
19
+ key.toLowerCase() !== "undefined" &&
20
+ MANDATE_IDEMPOTENCY_KEY.test(key)
21
+ ? key
22
+ : null;
23
+ }
13
24
  export function createMandateGate(options) {
14
25
  const apiKey = options.apiKey?.trim();
15
26
  if (!apiKey) {
@@ -22,8 +33,18 @@ export function createMandateGate(options) {
22
33
  if (!/^\d+(\.\d{1,6})?$/.test(options.amount)) {
23
34
  throw new Error("createMandateGate requires a decimal amount with up to 6 decimals, e.g. \"0.08\".");
24
35
  }
36
+ const expectedAmountMinor = parseUsdcAmountToMinorUnits(options.amount).toString();
25
37
  const fetchFn = options.fetchFn ?? fetch;
26
- async function charge(mandateId, resourceUrl) {
38
+ async function charge(mandateId, resourceUrl, idempotencyKey) {
39
+ const stableKey = validIdempotencyKey(idempotencyKey);
40
+ if (!stableKey) {
41
+ return {
42
+ ok: false,
43
+ status: 400,
44
+ code: "invalid_idempotency_key",
45
+ error: "Idempotency-Key is required for mandate charges and must be reused after an outcome-unknown response.",
46
+ };
47
+ }
27
48
  let response;
28
49
  try {
29
50
  response = await fetchFn(`${baseUrl}/api/v1/mandates/${encodeURIComponent(mandateId)}/charge`, {
@@ -31,6 +52,7 @@ export function createMandateGate(options) {
31
52
  headers: {
32
53
  "Content-Type": "application/json",
33
54
  Authorization: `Bearer ${apiKey}`,
55
+ "Idempotency-Key": stableKey,
34
56
  },
35
57
  body: JSON.stringify({
36
58
  amount: options.amount,
@@ -55,6 +77,7 @@ export function createMandateGate(options) {
55
77
  }
56
78
  const record = (body ?? {});
57
79
  if (!response.ok) {
80
+ const chargeRecord = (record.charge ?? null);
58
81
  return {
59
82
  ok: false,
60
83
  status: response.status,
@@ -62,15 +85,55 @@ export function createMandateGate(options) {
62
85
  error: typeof record.error === "string"
63
86
  ? record.error
64
87
  : `GenesisPay rejected the mandate charge (${response.status}).`,
88
+ ...(chargeRecord && typeof chargeRecord.id === "string"
89
+ ? {
90
+ charge: {
91
+ id: chargeRecord.id,
92
+ amountMinor: String(chargeRecord.amountMinor ?? ""),
93
+ txHash: typeof chargeRecord.txHash === "string"
94
+ ? chargeRecord.txHash
95
+ : null,
96
+ },
97
+ }
98
+ : {}),
99
+ };
100
+ }
101
+ const chargeRecord = record.charge &&
102
+ typeof record.charge === "object" &&
103
+ !Array.isArray(record.charge)
104
+ ? record.charge
105
+ : null;
106
+ const chargeId = typeof chargeRecord?.id === "string" ? chargeRecord.id : "";
107
+ const amountMinor = typeof chargeRecord?.amountMinor === "string"
108
+ ? chargeRecord.amountMinor
109
+ : "";
110
+ const txHash = typeof chargeRecord?.txHash === "string" ? chargeRecord.txHash : "";
111
+ if (chargeRecord?.status !== "settled" ||
112
+ chargeId.trim().length === 0 ||
113
+ amountMinor !== expectedAmountMinor ||
114
+ !TRANSACTION_HASH.test(txHash)) {
115
+ return {
116
+ ok: false,
117
+ status: 503,
118
+ code: "charge_response_unverified",
119
+ error: "GenesisPay did not return a verified settled mandate charge. Do not retry with a new Idempotency-Key.",
120
+ ...(chargeId.trim().length > 0
121
+ ? {
122
+ charge: {
123
+ id: chargeId,
124
+ amountMinor,
125
+ txHash: TRANSACTION_HASH.test(txHash) ? txHash : null,
126
+ },
127
+ }
128
+ : {}),
65
129
  };
66
130
  }
67
- const chargeRecord = (record.charge ?? {});
68
131
  return {
69
132
  ok: true,
70
133
  charge: {
71
- id: String(chargeRecord.id ?? ""),
72
- amountMinor: String(chargeRecord.amountMinor ?? ""),
73
- txHash: String(chargeRecord.txHash ?? ""),
134
+ id: chargeId,
135
+ amountMinor,
136
+ txHash,
74
137
  },
75
138
  };
76
139
  }
@@ -84,9 +147,20 @@ export function createMandateGate(options) {
84
147
  amount: options.amount,
85
148
  }, 402);
86
149
  }
87
- const outcome = await charge(mandateId, request.url);
150
+ const idempotencyKey = validIdempotencyKey(request.headers.get("Idempotency-Key"));
151
+ if (!idempotencyKey) {
152
+ return jsonResponse({
153
+ error: "Idempotency-Key is required for a mandate-metered request and must be reused after a timeout.",
154
+ code: "invalid_idempotency_key",
155
+ }, 400);
156
+ }
157
+ const outcome = await charge(mandateId, request.url, idempotencyKey);
88
158
  if (!outcome.ok) {
89
- return jsonResponse({ error: outcome.error, code: outcome.code }, outcome.status === 403 || outcome.status === 404 ? outcome.status : 402);
159
+ return jsonResponse({
160
+ error: outcome.error,
161
+ code: outcome.code,
162
+ ...(outcome.charge ? { charge: outcome.charge } : {}),
163
+ }, outcome.status);
90
164
  }
91
165
  const response = await handler(request);
92
166
  const headers = new Headers(response.headers);
@@ -1 +1 @@
1
- {"version":3,"file":"mandate-gate.js","sourceRoot":"","sources":["../src/mandate-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mandate-gate.js","sourceRoot":"","sources":["../src/mandate-gate.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,16 @@
1
1
  import { type GenesisPayRequest } from "./resource.js";
2
+ import { type ContractUsageCharge, type ContractUsageInput } from "./contract-usage.js";
3
+ import type { Hex } from "viem";
4
+ import { type ContractPerUseCreateInput, type ContractPerUseCreateResult, type ContractSubscriptionCreateInput, type ContractSubscriptionCreateResult } from "./contract-mandates.js";
2
5
  export type MandateKind = "per_use" | "subscription";
3
- export type MandateStatus = "pending_permit" | "active" | "past_due" | "revoked" | "expired";
4
- export type MandateChargeStatus = "pending" | "settled" | "failed";
6
+ export type MandateStatus = "pending_permit" | "active" | "past_due" | "revoked" | "expired" | "cancelled";
7
+ export type MandateChargeStatus = "pending" | "submitted" | "settled" | "failed";
5
8
  export type Mandate = {
9
+ protocol?: "contract_mandate_v1";
10
+ activationStatus?: "proposed" | "submitted" | "confirmed";
11
+ revocationStatus?: "none" | "requested" | "confirmed";
12
+ executor?: string;
13
+ contractVersion?: string;
6
14
  id: string;
7
15
  kind: MandateKind;
8
16
  status: MandateStatus;
@@ -33,7 +41,7 @@ export type Mandate = {
33
41
  permitDeadline: string;
34
42
  permitTxHash: string | null;
35
43
  createdAt: string;
36
- /** Set when the payer's signature was submitted — until then the mandate is inert. */
44
+ /** Set after canonical activation confirmation. HTTP acceptance is not activation. */
37
45
  activatedAt: string | null;
38
46
  revokedAt: string | null;
39
47
  };
@@ -90,6 +98,8 @@ export type MandateCreateResult = {
90
98
  export type MandateChargeInput = {
91
99
  /** Decimal amount, e.g. "0.08". Must not exceed the mandate's cap per charge. */
92
100
  amount: string;
101
+ /** Stable identity for this logical usage request; reuse it after timeouts. */
102
+ idempotencyKey: string;
93
103
  /** What was paid for — surfaced to the payer in their mandate history. */
94
104
  resourceUrl?: string;
95
105
  description?: string;
@@ -128,6 +138,13 @@ export interface MandatesResource {
128
138
  * payer's frontend — see the note at the top of this module on `activate`.
129
139
  */
130
140
  create(input: MandateCreateInput): Promise<MandateCreateResult>;
141
+ /** Explicit two-signature contract protocol. New capabilities remain gated by the deployment. */
142
+ createContractSubscription(input: ContractSubscriptionCreateInput): Promise<ContractSubscriptionCreateResult>;
143
+ /** Bounded per-use consent; every later charge needs a separate payer signature. */
144
+ createContractPerUse(input: ContractPerUseCreateInput): Promise<ContractPerUseCreateResult>;
145
+ proposeContractUsage(input: ContractUsageInput): Promise<ContractUsageCharge>;
146
+ submitContractUsage(proposal: ContractUsageCharge, signature: Hex): Promise<ContractUsageCharge>;
147
+ getContractUsage(proposal: ContractUsageCharge): Promise<ContractUsageCharge>;
131
148
  /**
132
149
  * One page of this account's mandates, newest first.
133
150
  *
@@ -164,7 +181,7 @@ export interface MandatesResource {
164
181
  retrieve(id: string): Promise<Mandate>;
165
182
  /** Pulls a single charge. Signature-free — this is the metered path. */
166
183
  charge(id: string, input: MandateChargeInput): Promise<MandateCharge>;
167
- /** Stops all future charges. Already-settled charges are unaffected. */
184
+ /** Requests cancellation. Contract mandates require confirmed payer revocation before authority is extinguished. */
168
185
  revoke(id: string): Promise<Mandate>;
169
186
  }
170
187
  export declare function createMandatesResource(request: GenesisPayRequest): MandatesResource;