@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.
- package/CHANGELOG.md +227 -0
- package/README.md +719 -91
- package/dist/checkout-documents.d.ts +105 -0
- package/dist/checkout-documents.d.ts.map +1 -0
- package/dist/checkout-documents.js +171 -0
- package/dist/checkout-documents.js.map +1 -0
- package/dist/checkout-return.d.ts +5 -5
- package/dist/checkout-return.d.ts.map +1 -1
- package/dist/checkout-return.js +3 -2
- package/dist/checkout-return.js.map +1 -1
- package/dist/client.d.ts +57 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +100 -10
- package/dist/client.js.map +1 -1
- package/dist/contract-mandates.d.ts +39 -0
- package/dist/contract-mandates.d.ts.map +1 -0
- package/dist/contract-mandates.js +98 -0
- package/dist/contract-mandates.js.map +1 -0
- package/dist/contract-usage.d.ts +29 -0
- package/dist/contract-usage.d.ts.map +1 -0
- package/dist/contract-usage.js +92 -0
- package/dist/contract-usage.js.map +1 -0
- package/dist/errors.d.ts +71 -5
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +124 -13
- package/dist/errors.js.map +1 -1
- package/dist/fulfillment-attempts.d.ts +29 -0
- package/dist/fulfillment-attempts.d.ts.map +1 -0
- package/dist/fulfillment-attempts.js +71 -0
- package/dist/fulfillment-attempts.js.map +1 -0
- package/dist/fulfillment.d.ts +152 -0
- package/dist/fulfillment.d.ts.map +1 -0
- package/dist/fulfillment.js +810 -0
- package/dist/fulfillment.js.map +1 -0
- package/dist/genesispay-settlement.d.ts +4 -2
- package/dist/genesispay-settlement.d.ts.map +1 -1
- package/dist/genesispay-settlement.js +412 -15
- package/dist/genesispay-settlement.js.map +1 -1
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/invoices.d.ts +31 -0
- package/dist/invoices.d.ts.map +1 -1
- package/dist/invoices.js +61 -2
- package/dist/invoices.js.map +1 -1
- package/dist/item-tax.d.ts +25 -0
- package/dist/item-tax.d.ts.map +1 -0
- package/dist/item-tax.js +43 -0
- package/dist/item-tax.js.map +1 -0
- package/dist/mandate-gate.d.ts +6 -1
- package/dist/mandate-gate.d.ts.map +1 -1
- package/dist/mandate-gate.js +81 -7
- package/dist/mandate-gate.js.map +1 -1
- package/dist/mandates.d.ts +21 -4
- package/dist/mandates.d.ts.map +1 -1
- package/dist/mandates.js +24 -3
- package/dist/mandates.js.map +1 -1
- package/dist/networks.d.ts.map +1 -1
- package/dist/networks.js +5 -4
- package/dist/networks.js.map +1 -1
- package/dist/payment-gate.d.ts +32 -1
- package/dist/payment-gate.d.ts.map +1 -1
- package/dist/payment-gate.js +275 -11
- package/dist/payment-gate.js.map +1 -1
- package/dist/products.d.ts +40 -16
- package/dist/products.d.ts.map +1 -1
- package/dist/products.js +1078 -56
- package/dist/products.js.map +1 -1
- package/dist/strict-response.d.ts +21 -0
- package/dist/strict-response.d.ts.map +1 -0
- package/dist/strict-response.js +68 -0
- package/dist/strict-response.js.map +1 -0
- package/dist/webhooks.d.ts +77 -2
- package/dist/webhooks.d.ts.map +1 -1
- package/dist/webhooks.js +20 -0
- package/dist/webhooks.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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`),
|
|
6
|
-
|
|
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 —
|
|
15
|
-
// `
|
|
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,
|
|
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"}
|
package/dist/invoices.d.ts
CHANGED
|
@@ -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>;
|
package/dist/invoices.d.ts.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"invoices.d.ts","sourceRoot":"","sources":["../src/invoices.ts"],"names":[],"mappings":"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"}
|
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
|
package/dist/invoices.js.map
CHANGED
|
@@ -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"}
|
package/dist/item-tax.js
ADDED
|
@@ -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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"}
|
package/dist/mandate-gate.d.ts
CHANGED
|
@@ -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
|
|
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;
|
|
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"}
|
package/dist/mandate-gate.js
CHANGED
|
@@ -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:
|
|
72
|
-
amountMinor
|
|
73
|
-
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
|
|
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({
|
|
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);
|
package/dist/mandate-gate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mandate-gate.js","sourceRoot":"","sources":["../src/mandate-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"mandate-gate.js","sourceRoot":"","sources":["../src/mandate-gate.ts"],"names":[],"mappings":"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"}
|
package/dist/mandates.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
/**
|
|
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;
|