@resvary/sdk 0.5.0-alpha.1

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 (171) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +17 -0
  3. package/dist/billing/index.d.ts +3 -0
  4. package/dist/billing/index.d.ts.map +1 -0
  5. package/dist/billing/index.js +3 -0
  6. package/dist/billing/index.js.map +1 -0
  7. package/dist/billing/meter.d.ts +97 -0
  8. package/dist/billing/meter.d.ts.map +1 -0
  9. package/dist/billing/meter.js +109 -0
  10. package/dist/billing/meter.js.map +1 -0
  11. package/dist/billing/plans.d.ts +77 -0
  12. package/dist/billing/plans.d.ts.map +1 -0
  13. package/dist/billing/plans.js +65 -0
  14. package/dist/billing/plans.js.map +1 -0
  15. package/dist/client/buyer.d.ts +82 -0
  16. package/dist/client/buyer.d.ts.map +1 -0
  17. package/dist/client/buyer.js +168 -0
  18. package/dist/client/buyer.js.map +1 -0
  19. package/dist/client/index.d.ts +2 -0
  20. package/dist/client/index.d.ts.map +1 -0
  21. package/dist/client/index.js +2 -0
  22. package/dist/client/index.js.map +1 -0
  23. package/dist/constants.d.ts +36 -0
  24. package/dist/constants.d.ts.map +1 -0
  25. package/dist/constants.js +42 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/credits/amount.d.ts +7 -0
  28. package/dist/credits/amount.d.ts.map +1 -0
  29. package/dist/credits/amount.js +36 -0
  30. package/dist/credits/amount.js.map +1 -0
  31. package/dist/credits/errors.d.ts +20 -0
  32. package/dist/credits/errors.d.ts.map +1 -0
  33. package/dist/credits/errors.js +35 -0
  34. package/dist/credits/errors.js.map +1 -0
  35. package/dist/credits/index.d.ts +7 -0
  36. package/dist/credits/index.d.ts.map +1 -0
  37. package/dist/credits/index.js +6 -0
  38. package/dist/credits/index.js.map +1 -0
  39. package/dist/credits/ledger.d.ts +175 -0
  40. package/dist/credits/ledger.d.ts.map +1 -0
  41. package/dist/credits/ledger.js +705 -0
  42. package/dist/credits/ledger.js.map +1 -0
  43. package/dist/credits/store.d.ts +104 -0
  44. package/dist/credits/store.d.ts.map +1 -0
  45. package/dist/credits/store.js +420 -0
  46. package/dist/credits/store.js.map +1 -0
  47. package/dist/credits/types.d.ts +234 -0
  48. package/dist/credits/types.d.ts.map +1 -0
  49. package/dist/credits/types.js +2 -0
  50. package/dist/credits/types.js.map +1 -0
  51. package/dist/credits/webhooks.d.ts +5 -0
  52. package/dist/credits/webhooks.d.ts.map +1 -0
  53. package/dist/credits/webhooks.js +13 -0
  54. package/dist/credits/webhooks.js.map +1 -0
  55. package/dist/funding/arc-worker.d.ts +55 -0
  56. package/dist/funding/arc-worker.d.ts.map +1 -0
  57. package/dist/funding/arc-worker.js +133 -0
  58. package/dist/funding/arc-worker.js.map +1 -0
  59. package/dist/funding/arc.d.ts +38 -0
  60. package/dist/funding/arc.d.ts.map +1 -0
  61. package/dist/funding/arc.js +83 -0
  62. package/dist/funding/arc.js.map +1 -0
  63. package/dist/funding/index.d.ts +3 -0
  64. package/dist/funding/index.d.ts.map +1 -0
  65. package/dist/funding/index.js +3 -0
  66. package/dist/funding/index.js.map +1 -0
  67. package/dist/gateway/client.d.ts +51 -0
  68. package/dist/gateway/client.d.ts.map +1 -0
  69. package/dist/gateway/client.js +59 -0
  70. package/dist/gateway/client.js.map +1 -0
  71. package/dist/gateway/index.d.ts +2 -0
  72. package/dist/gateway/index.d.ts.map +1 -0
  73. package/dist/gateway/index.js +2 -0
  74. package/dist/gateway/index.js.map +1 -0
  75. package/dist/index.d.ts +21 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +20 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/middleware/express.d.ts +25 -0
  80. package/dist/middleware/express.d.ts.map +1 -0
  81. package/dist/middleware/express.js +61 -0
  82. package/dist/middleware/express.js.map +1 -0
  83. package/dist/middleware/index.d.ts +4 -0
  84. package/dist/middleware/index.d.ts.map +1 -0
  85. package/dist/middleware/index.js +4 -0
  86. package/dist/middleware/index.js.map +1 -0
  87. package/dist/middleware/next.d.ts +27 -0
  88. package/dist/middleware/next.d.ts.map +1 -0
  89. package/dist/middleware/next.js +67 -0
  90. package/dist/middleware/next.js.map +1 -0
  91. package/dist/middleware/paywall.d.ts +54 -0
  92. package/dist/middleware/paywall.d.ts.map +1 -0
  93. package/dist/middleware/paywall.js +102 -0
  94. package/dist/middleware/paywall.js.map +1 -0
  95. package/dist/pricing/index.d.ts +3 -0
  96. package/dist/pricing/index.d.ts.map +1 -0
  97. package/dist/pricing/index.js +2 -0
  98. package/dist/pricing/index.js.map +1 -0
  99. package/dist/pricing/rating.d.ts +21 -0
  100. package/dist/pricing/rating.d.ts.map +1 -0
  101. package/dist/pricing/rating.js +109 -0
  102. package/dist/pricing/rating.js.map +1 -0
  103. package/dist/receipts/amount.d.ts +8 -0
  104. package/dist/receipts/amount.d.ts.map +1 -0
  105. package/dist/receipts/amount.js +27 -0
  106. package/dist/receipts/amount.js.map +1 -0
  107. package/dist/receipts/index.d.ts +16 -0
  108. package/dist/receipts/index.d.ts.map +1 -0
  109. package/dist/receipts/index.js +15 -0
  110. package/dist/receipts/index.js.map +1 -0
  111. package/dist/receipts/invoice.d.ts +18 -0
  112. package/dist/receipts/invoice.d.ts.map +1 -0
  113. package/dist/receipts/invoice.js +112 -0
  114. package/dist/receipts/invoice.js.map +1 -0
  115. package/dist/receipts/ledger.d.ts +30 -0
  116. package/dist/receipts/ledger.d.ts.map +1 -0
  117. package/dist/receipts/ledger.js +109 -0
  118. package/dist/receipts/ledger.js.map +1 -0
  119. package/dist/receipts/memo-payment.d.ts +100 -0
  120. package/dist/receipts/memo-payment.d.ts.map +1 -0
  121. package/dist/receipts/memo-payment.js +91 -0
  122. package/dist/receipts/memo-payment.js.map +1 -0
  123. package/dist/receipts/memo.d.ts +14 -0
  124. package/dist/receipts/memo.d.ts.map +1 -0
  125. package/dist/receipts/memo.js +39 -0
  126. package/dist/receipts/memo.js.map +1 -0
  127. package/dist/receipts/persistent-ledger.d.ts +27 -0
  128. package/dist/receipts/persistent-ledger.d.ts.map +1 -0
  129. package/dist/receipts/persistent-ledger.js +111 -0
  130. package/dist/receipts/persistent-ledger.js.map +1 -0
  131. package/dist/receipts/persistent-webhook-inbox.d.ts +32 -0
  132. package/dist/receipts/persistent-webhook-inbox.d.ts.map +1 -0
  133. package/dist/receipts/persistent-webhook-inbox.js +93 -0
  134. package/dist/receipts/persistent-webhook-inbox.js.map +1 -0
  135. package/dist/receipts/proof.d.ts +80 -0
  136. package/dist/receipts/proof.d.ts.map +1 -0
  137. package/dist/receipts/proof.js +223 -0
  138. package/dist/receipts/proof.js.map +1 -0
  139. package/dist/receipts/serialization.d.ts +3 -0
  140. package/dist/receipts/serialization.d.ts.map +1 -0
  141. package/dist/receipts/serialization.js +24 -0
  142. package/dist/receipts/serialization.js.map +1 -0
  143. package/dist/receipts/store.d.ts +69 -0
  144. package/dist/receipts/store.d.ts.map +1 -0
  145. package/dist/receipts/store.js +85 -0
  146. package/dist/receipts/store.js.map +1 -0
  147. package/dist/receipts/types.d.ts +134 -0
  148. package/dist/receipts/types.d.ts.map +1 -0
  149. package/dist/receipts/types.js +5 -0
  150. package/dist/receipts/types.js.map +1 -0
  151. package/dist/receipts/watcher.d.ts +92 -0
  152. package/dist/receipts/watcher.d.ts.map +1 -0
  153. package/dist/receipts/watcher.js +323 -0
  154. package/dist/receipts/watcher.js.map +1 -0
  155. package/dist/receipts/webhook-inbox.d.ts +34 -0
  156. package/dist/receipts/webhook-inbox.d.ts.map +1 -0
  157. package/dist/receipts/webhook-inbox.js +101 -0
  158. package/dist/receipts/webhook-inbox.js.map +1 -0
  159. package/dist/receipts/webhook-route.d.ts +22 -0
  160. package/dist/receipts/webhook-route.d.ts.map +1 -0
  161. package/dist/receipts/webhook-route.js +37 -0
  162. package/dist/receipts/webhook-route.js.map +1 -0
  163. package/dist/receipts/webhooks.d.ts +20 -0
  164. package/dist/receipts/webhooks.d.ts.map +1 -0
  165. package/dist/receipts/webhooks.js +72 -0
  166. package/dist/receipts/webhooks.js.map +1 -0
  167. package/dist/types.d.ts +101 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/types.js +5 -0
  170. package/dist/types.js.map +1 -0
  171. package/package.json +116 -0
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Helpers for Arc Memo-wrapped USDC invoice payments.
3
+ */
4
+ import { encodeFunctionData, keccak256, } from 'viem';
5
+ import { ARC_TESTNET_CONTRACTS } from '../constants.js';
6
+ import { createInvoiceMemoData, createInvoiceMemoId } from './memo.js';
7
+ export const ERC20_TRANSFER_ABI = [
8
+ {
9
+ type: 'function',
10
+ name: 'transfer',
11
+ stateMutability: 'nonpayable',
12
+ inputs: [
13
+ { name: 'to', type: 'address' },
14
+ { name: 'amount', type: 'uint256' },
15
+ ],
16
+ outputs: [{ name: '', type: 'bool' }],
17
+ },
18
+ {
19
+ type: 'event',
20
+ name: 'Transfer',
21
+ anonymous: false,
22
+ inputs: [
23
+ { name: 'from', type: 'address', indexed: true },
24
+ { name: 'to', type: 'address', indexed: true },
25
+ { name: 'value', type: 'uint256', indexed: false },
26
+ ],
27
+ },
28
+ ];
29
+ export const ARC_MEMO_ABI = [
30
+ {
31
+ type: 'function',
32
+ name: 'memo',
33
+ stateMutability: 'nonpayable',
34
+ inputs: [
35
+ { name: 'target', type: 'address' },
36
+ { name: 'data', type: 'bytes' },
37
+ { name: 'memoId', type: 'bytes32' },
38
+ { name: 'memoData', type: 'bytes' },
39
+ ],
40
+ outputs: [],
41
+ },
42
+ {
43
+ type: 'event',
44
+ name: 'BeforeMemo',
45
+ anonymous: false,
46
+ inputs: [{ name: 'memoIndex', type: 'uint256', indexed: true }],
47
+ },
48
+ {
49
+ type: 'event',
50
+ name: 'Memo',
51
+ anonymous: false,
52
+ inputs: [
53
+ { name: 'sender', type: 'address', indexed: true },
54
+ { name: 'target', type: 'address', indexed: true },
55
+ { name: 'callDataHash', type: 'bytes32', indexed: false },
56
+ { name: 'memoId', type: 'bytes32', indexed: true },
57
+ { name: 'memo', type: 'bytes', indexed: false },
58
+ { name: 'memoIndex', type: 'uint256', indexed: false },
59
+ ],
60
+ },
61
+ ];
62
+ export function createMemoPaymentRequest(invoice, options = {}) {
63
+ const target = options.usdcAddress ?? ARC_TESTNET_CONTRACTS.usdc;
64
+ const memoContract = options.memoContract ?? ARC_TESTNET_CONTRACTS.memo;
65
+ const memoId = invoice.memoId ?? createInvoiceMemoId(invoice.id);
66
+ const memoData = invoice.memoData ?? createInvoiceMemoData(invoice.memo);
67
+ const data = encodeFunctionData({
68
+ abi: ERC20_TRANSFER_ABI,
69
+ functionName: 'transfer',
70
+ args: [invoice.payTo, BigInt(invoice.amountUnits)],
71
+ });
72
+ const callDataHash = keccak256(data);
73
+ const txData = encodeFunctionData({
74
+ abi: ARC_MEMO_ABI,
75
+ functionName: 'memo',
76
+ args: [target, data, memoId, memoData],
77
+ });
78
+ return {
79
+ invoiceId: invoice.id,
80
+ memoContract,
81
+ target,
82
+ data,
83
+ txData,
84
+ memoId,
85
+ memoData,
86
+ callDataHash,
87
+ amountUnits: invoice.amountUnits,
88
+ payTo: invoice.payTo,
89
+ };
90
+ }
91
+ //# sourceMappingURL=memo-payment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo-payment.js","sourceRoot":"","sources":["../../src/receipts/memo-payment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Arc transaction memo helpers for invoice correlation.
3
+ */
4
+ export interface ParsedInvoiceMemo {
5
+ namespace: string;
6
+ version: 'v1';
7
+ kind: 'invoice';
8
+ invoiceId: string;
9
+ }
10
+ export declare function createInvoiceMemo(invoiceId: string, namespace?: string): string;
11
+ export declare function createInvoiceMemoId(invoiceId: string): `0x${string}`;
12
+ export declare function createInvoiceMemoData(memo: string): `0x${string}`;
13
+ export declare function parseInvoiceMemo(memo: string): ParsedInvoiceMemo | null;
14
+ //# sourceMappingURL=memo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../../src/receipts/memo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,SAAY,GAAG,MAAM,CAalF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAEpE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAmBvE"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Arc transaction memo helpers for invoice correlation.
3
+ */
4
+ import { keccak256, stringToHex } from 'viem';
5
+ const SAFE_ID = /^[a-zA-Z0-9_-]+$/;
6
+ export function createInvoiceMemo(invoiceId, namespace = 'resvary') {
7
+ const cleanInvoiceId = invoiceId.trim();
8
+ const cleanNamespace = namespace.trim();
9
+ if (!SAFE_ID.test(cleanInvoiceId)) {
10
+ throw new Error('Invoice id can only contain letters, numbers, underscores, and dashes');
11
+ }
12
+ if (!SAFE_ID.test(cleanNamespace)) {
13
+ throw new Error('Memo namespace can only contain letters, numbers, underscores, and dashes');
14
+ }
15
+ return `${cleanNamespace}:invoice:v1:${cleanInvoiceId}`;
16
+ }
17
+ export function createInvoiceMemoId(invoiceId) {
18
+ return keccak256(stringToHex(invoiceId));
19
+ }
20
+ export function createInvoiceMemoData(memo) {
21
+ return stringToHex(memo);
22
+ }
23
+ export function parseInvoiceMemo(memo) {
24
+ const [namespace, kind, version, invoiceId, ...extra] = memo.split(':');
25
+ if (!namespace
26
+ || kind !== 'invoice'
27
+ || version !== 'v1'
28
+ || !invoiceId
29
+ || extra.length > 0) {
30
+ return null;
31
+ }
32
+ return {
33
+ namespace,
34
+ kind,
35
+ version,
36
+ invoiceId,
37
+ };
38
+ }
39
+ //# sourceMappingURL=memo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo.js","sourceRoot":"","sources":["../../src/receipts/memo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAS9C,MAAM,OAAO,GAAG,kBAAkB,CAAC;AAEnC,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,SAAS,GAAG,SAAS;IACxE,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAExC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO,GAAG,cAAc,eAAe,cAAc,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExE,IACE,CAAC,SAAS;WACP,IAAI,KAAK,SAAS;WAClB,OAAO,KAAK,IAAI;WAChB,CAAC,SAAS;WACV,KAAK,CAAC,MAAM,GAAG,CAAC,EACnB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,SAAS;QACT,IAAI;QACJ,OAAO;QACP,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { PaymentInvoice, PaymentReceipt, CreateInvoiceInput, ObservedPayment, WebhookEvent } from './types.js';
2
+ import type { ReceiptStore, ReceiptStoreInvoiceFilter } from './store.js';
3
+ export interface PersistentReceiptLedgerConfig {
4
+ store: ReceiptStore;
5
+ }
6
+ export declare class PersistentReceiptLedger {
7
+ private readonly store;
8
+ constructor(config: PersistentReceiptLedgerConfig);
9
+ createInvoice(input: CreateInvoiceInput): Promise<PaymentInvoice>;
10
+ addInvoice(invoice: PaymentInvoice): Promise<void>;
11
+ getInvoice(id: string): Promise<PaymentInvoice | undefined>;
12
+ listInvoices(filter?: ReceiptStoreInvoiceFilter): Promise<PaymentInvoice[]>;
13
+ recordPayment(invoiceId: string, payment: ObservedPayment): Promise<PaymentReceipt>;
14
+ markExpired(invoiceId: string, now?: number): Promise<PaymentInvoice>;
15
+ markRefunded(invoiceId: string, refund?: {
16
+ txHash?: `0x${string}`;
17
+ refundedAt?: number;
18
+ }): Promise<PaymentReceipt>;
19
+ getReceipt(id: string): Promise<PaymentReceipt | undefined>;
20
+ getReceiptByTxHash(txHash: `0x${string}`, invoiceId?: string): Promise<PaymentReceipt | undefined>;
21
+ listReceipts(): Promise<PaymentReceipt[]>;
22
+ listWebhookEvents(): Promise<WebhookEvent[]>;
23
+ private saveWebhookEvent;
24
+ private requireInvoice;
25
+ private updateInvoice;
26
+ }
27
+ //# sourceMappingURL=persistent-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent-ledger.d.ts","sourceRoot":"","sources":["../../src/receipts/persistent-ledger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAG1E,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,MAAM,EAAE,6BAA6B;IAI3C,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAOjE,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAI3D,YAAY,CAAC,MAAM,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAI3E,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAgCnF,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAYzE,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE;QAAE,MAAM,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3D,OAAO,CAAC,cAAc,CAAC;IA2BpB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAI3D,kBAAkB,CACtB,MAAM,EAAE,KAAK,MAAM,EAAE,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAIhC,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzC,iBAAiB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAIpC,gBAAgB;YAIhB,cAAc;YASd,aAAa;CAM5B"}
@@ -0,0 +1,111 @@
1
+ import { createInvoice, createReceipt, isInvoiceExpired } from './invoice.js';
2
+ import { createWebhookEvent } from './webhooks.js';
3
+ export class PersistentReceiptLedger {
4
+ store;
5
+ constructor(config) {
6
+ this.store = config.store;
7
+ }
8
+ async createInvoice(input) {
9
+ const invoice = createInvoice(input);
10
+ await this.addInvoice(invoice);
11
+ await this.saveWebhookEvent(createWebhookEvent('invoice.created', { invoice }));
12
+ return invoice;
13
+ }
14
+ async addInvoice(invoice) {
15
+ const existing = await this.store.getInvoice(invoice.id);
16
+ if (existing) {
17
+ throw new Error(`Invoice already exists: ${invoice.id}`);
18
+ }
19
+ await this.store.saveInvoice(invoice);
20
+ }
21
+ async getInvoice(id) {
22
+ return this.store.getInvoice(id);
23
+ }
24
+ async listInvoices(filter) {
25
+ return this.store.listInvoices(filter);
26
+ }
27
+ async recordPayment(invoiceId, payment) {
28
+ const existingReceipt = payment.txHash
29
+ ? await this.getReceiptByTxHash(payment.txHash, invoiceId)
30
+ : undefined;
31
+ if (existingReceipt) {
32
+ return existingReceipt;
33
+ }
34
+ const invoice = await this.requireInvoice(invoiceId);
35
+ const observedInvoice = await this.updateInvoice(invoice.id, { status: 'observed' });
36
+ await this.saveWebhookEvent(createWebhookEvent('invoice.observed', {
37
+ invoice: observedInvoice,
38
+ payment,
39
+ }));
40
+ const receipt = createReceipt(observedInvoice, payment);
41
+ await this.store.saveReceipt(receipt);
42
+ const persistedReceipt = payment.txHash
43
+ ? ((await this.store.getReceiptByTxHash(payment.txHash, invoice.id)) ?? receipt)
44
+ : receipt;
45
+ const paidInvoice = await this.updateInvoice(invoice.id, { status: 'paid' });
46
+ await this.saveWebhookEvent(createWebhookEvent('invoice.paid', {
47
+ invoice: paidInvoice,
48
+ receipt: persistedReceipt,
49
+ }));
50
+ return persistedReceipt;
51
+ }
52
+ async markExpired(invoiceId, now = Date.now()) {
53
+ const invoice = await this.requireInvoice(invoiceId);
54
+ if (!isInvoiceExpired(invoice, now)) {
55
+ throw new Error(`Invoice is not expired: ${invoiceId}`);
56
+ }
57
+ const expiredInvoice = await this.updateInvoice(invoiceId, { status: 'expired' });
58
+ await this.saveWebhookEvent(createWebhookEvent('invoice.expired', { invoice: expiredInvoice }));
59
+ return expiredInvoice;
60
+ }
61
+ async markRefunded(invoiceId, refund = {}) {
62
+ const invoice = await this.requireInvoice(invoiceId);
63
+ const receipt = (await this.store.listReceipts()).find((item) => item.invoiceId === invoiceId);
64
+ if (!receipt) {
65
+ throw new Error(`Cannot refund invoice without a paid receipt: ${invoiceId}`);
66
+ }
67
+ const refundedReceipt = {
68
+ ...receipt,
69
+ id: `rfnd_${receipt.id}`,
70
+ status: 'refunded',
71
+ txHash: refund.txHash ?? receipt.txHash,
72
+ createdAt: refund.refundedAt ?? Date.now(),
73
+ };
74
+ await this.store.saveReceipt(refundedReceipt);
75
+ const refundedInvoice = await this.updateInvoice(invoice.id, { status: 'refunded' });
76
+ await this.saveWebhookEvent(createWebhookEvent('invoice.refunded', {
77
+ invoice: refundedInvoice,
78
+ receipt: refundedReceipt,
79
+ }));
80
+ return refundedReceipt;
81
+ }
82
+ async getReceipt(id) {
83
+ return this.store.getReceipt(id);
84
+ }
85
+ async getReceiptByTxHash(txHash, invoiceId) {
86
+ return this.store.getReceiptByTxHash(txHash, invoiceId);
87
+ }
88
+ async listReceipts() {
89
+ return this.store.listReceipts();
90
+ }
91
+ async listWebhookEvents() {
92
+ return this.store.listWebhookEvents();
93
+ }
94
+ async saveWebhookEvent(event) {
95
+ await this.store.saveWebhookEvent(event);
96
+ }
97
+ async requireInvoice(id) {
98
+ const invoice = await this.store.getInvoice(id);
99
+ if (!invoice) {
100
+ throw new Error(`Invoice not found: ${id}`);
101
+ }
102
+ return invoice;
103
+ }
104
+ async updateInvoice(id, patch) {
105
+ const invoice = await this.requireInvoice(id);
106
+ const next = { ...invoice, ...patch };
107
+ await this.store.saveInvoice(next);
108
+ return next;
109
+ }
110
+ }
111
+ //# sourceMappingURL=persistent-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent-ledger.js","sourceRoot":"","sources":["../../src/receipts/persistent-ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { WebhookDeliveryAttempt, WebhookEvent } from './types.js';
2
+ import type { ReceiptStore, ReceiptStoreDeliveryFilter } from './store.js';
3
+ export interface PersistentWebhookInboxConfig {
4
+ store: ReceiptStore;
5
+ }
6
+ export interface PersistentReceiveWebhookInput {
7
+ payload: WebhookEvent | string;
8
+ header: string;
9
+ secret: string;
10
+ target?: string;
11
+ now?: number;
12
+ receivedAt?: number;
13
+ toleranceSeconds?: number;
14
+ }
15
+ export interface PersistentReplayWebhookInput {
16
+ event: WebhookEvent;
17
+ secret: string;
18
+ target?: string;
19
+ replayOf?: string;
20
+ timestamp?: number;
21
+ receivedAt?: number;
22
+ }
23
+ export declare class PersistentWebhookInbox {
24
+ private readonly store;
25
+ constructor(config: PersistentWebhookInboxConfig);
26
+ receive(input: PersistentReceiveWebhookInput): Promise<WebhookDeliveryAttempt>;
27
+ replay(input: PersistentReplayWebhookInput): Promise<WebhookDeliveryAttempt>;
28
+ listDeliveries(filter?: ReceiptStoreDeliveryFilter): Promise<WebhookDeliveryAttempt[]>;
29
+ getDelivery(id: string): Promise<WebhookDeliveryAttempt | undefined>;
30
+ private createDelivery;
31
+ }
32
+ //# sourceMappingURL=persistent-webhook-inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent-webhook-inbox.d.ts","sourceRoot":"","sources":["../../src/receipts/persistent-webhook-inbox.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,YAAY,EAEb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAG3E,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,MAAM,EAAE,4BAA4B;IAI1C,OAAO,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAyB9E,MAAM,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAkB5E,cAAc,CAAC,MAAM,GAAE,0BAA+B,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAI1F,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC;YAI5D,cAAc;CAW7B"}
@@ -0,0 +1,93 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { signWebhookEvent, verifyWebhookSignature } from './webhooks.js';
3
+ export class PersistentWebhookInbox {
4
+ store;
5
+ constructor(config) {
6
+ this.store = config.store;
7
+ }
8
+ async receive(input) {
9
+ const event = parseWebhookPayload(input.payload);
10
+ const verified = verifyWebhookSignature({
11
+ payload: input.payload,
12
+ header: input.header,
13
+ secret: input.secret,
14
+ now: input.now,
15
+ toleranceSeconds: input.toleranceSeconds,
16
+ });
17
+ const delivery = await this.createDelivery({
18
+ eventId: event.eventId,
19
+ eventType: event.eventType,
20
+ status: verified ? 'verified' : 'failed',
21
+ verified,
22
+ signatureHeader: input.header,
23
+ receivedAt: input.receivedAt ?? Date.now(),
24
+ target: input.target,
25
+ error: verified ? undefined : 'Webhook signature verification failed',
26
+ });
27
+ await this.store.saveWebhookDelivery(delivery);
28
+ return delivery;
29
+ }
30
+ async replay(input) {
31
+ const signature = signWebhookEvent(input.event, input.secret, input.timestamp);
32
+ const delivery = await this.createDelivery({
33
+ eventId: input.event.id,
34
+ eventType: input.event.type,
35
+ status: 'verified',
36
+ verified: true,
37
+ signatureHeader: signature.header,
38
+ receivedAt: input.receivedAt ?? Date.now(),
39
+ target: input.target,
40
+ replayOf: input.replayOf,
41
+ });
42
+ await this.store.saveWebhookDelivery(delivery);
43
+ return delivery;
44
+ }
45
+ async listDeliveries(filter = {}) {
46
+ return this.store.listWebhookDeliveries(filter);
47
+ }
48
+ async getDelivery(id) {
49
+ return this.store.getWebhookDelivery(id);
50
+ }
51
+ async createDelivery(input) {
52
+ const attempts = await this.store.listWebhookDeliveries({ eventId: input.eventId });
53
+ return {
54
+ id: `dlv_${randomBytes(12).toString('hex')}`,
55
+ attempt: attempts.length + 1,
56
+ ...input,
57
+ };
58
+ }
59
+ }
60
+ function parseWebhookPayload(payload) {
61
+ const event = typeof payload === 'string'
62
+ ? parseJson(payload)
63
+ : payload;
64
+ if (!isWebhookEventLike(event)) {
65
+ return {
66
+ eventId: 'unknown',
67
+ eventType: 'unknown',
68
+ };
69
+ }
70
+ return {
71
+ eventId: event.id,
72
+ eventType: event.type,
73
+ };
74
+ }
75
+ function parseJson(value) {
76
+ try {
77
+ return JSON.parse(value);
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ function isWebhookEventLike(value) {
84
+ if (!value || typeof value !== 'object') {
85
+ return false;
86
+ }
87
+ const event = value;
88
+ return typeof event.id === 'string'
89
+ && typeof event.type === 'string'
90
+ && typeof event.createdAt === 'number'
91
+ && 'data' in event;
92
+ }
93
+ //# sourceMappingURL=persistent-webhook-inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent-webhook-inbox.js","sourceRoot":"","sources":["../../src/receipts/persistent-webhook-inbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Read-only Arc Testnet proof verification for Memo-wrapped receipt payments.
3
+ */
4
+ import { type Log } from 'viem';
5
+ import type { ReceiptOnchainProof, MemoPaymentRequest } from './types.js';
6
+ export type ProofTransactionReceipt = {
7
+ status: string;
8
+ blockNumber: bigint;
9
+ transactionIndex?: number;
10
+ logs: readonly Log[];
11
+ };
12
+ export type ProofMemoLog = {
13
+ transactionHash?: `0x${string}` | null;
14
+ };
15
+ export type ProofClient = {
16
+ getTransactionReceipt: (params: {
17
+ hash: `0x${string}`;
18
+ }) => Promise<ProofTransactionReceipt | null>;
19
+ };
20
+ export type ProofPollingClient = ProofClient & {
21
+ getBlockNumber: () => Promise<bigint>;
22
+ getLogs: (params: {
23
+ address: `0x${string}`;
24
+ event: unknown;
25
+ args: {
26
+ memoId: `0x${string}`;
27
+ };
28
+ fromBlock: bigint;
29
+ toBlock: bigint;
30
+ }) => Promise<readonly ProofMemoLog[]>;
31
+ };
32
+ export type VerifyMemoPaymentProofFailureReason = 'tx_not_found' | 'tx_reverted' | 'wrong_memo_contract' | 'missing_memo_event' | 'memo_id_mismatch' | 'target_mismatch' | 'call_data_hash_mismatch' | 'missing_transfer' | 'recipient_mismatch' | 'amount_mismatch';
33
+ export declare class MemoPaymentProofError extends Error {
34
+ readonly reason: VerifyMemoPaymentProofFailureReason;
35
+ constructor(reason: VerifyMemoPaymentProofFailureReason, message: string);
36
+ }
37
+ export interface VerifyMemoPaymentProofInput {
38
+ txHash: `0x${string}`;
39
+ paymentRequest: MemoPaymentRequest;
40
+ rpcUrl?: string;
41
+ publicClient?: ProofClient;
42
+ verifiedAt?: number;
43
+ }
44
+ export interface VerifyMemoPaymentProofResult {
45
+ proof: ReceiptOnchainProof;
46
+ }
47
+ export interface FindMemoPaymentProofInput {
48
+ paymentRequest: MemoPaymentRequest;
49
+ rpcUrl?: string;
50
+ publicClient?: ProofPollingClient;
51
+ fromBlock?: bigint;
52
+ toBlock?: bigint;
53
+ confirmations?: number;
54
+ lookbackBlocks?: bigint | number;
55
+ verifiedAt?: number;
56
+ }
57
+ export type FindMemoPaymentProofResult = {
58
+ status: 'found';
59
+ proof: ReceiptOnchainProof;
60
+ txHash: `0x${string}`;
61
+ fromBlock: bigint;
62
+ toBlock: bigint;
63
+ nextFromBlock: bigint;
64
+ scannedLogCount: number;
65
+ } | {
66
+ status: 'pending';
67
+ fromBlock: bigint;
68
+ toBlock: bigint;
69
+ nextFromBlock: bigint;
70
+ scannedLogCount: number;
71
+ };
72
+ export declare function verifyMemoPaymentProof(input: VerifyMemoPaymentProofInput): Promise<ReceiptOnchainProof>;
73
+ export declare function findMemoPaymentProof(input: FindMemoPaymentProofInput): Promise<FindMemoPaymentProofResult>;
74
+ export declare function createMemoPaymentProofFromReceipt(params: {
75
+ txHash: `0x${string}`;
76
+ paymentRequest: MemoPaymentRequest;
77
+ txReceipt: ProofTransactionReceipt;
78
+ verifiedAt?: number;
79
+ }): ReceiptOnchainProof;
80
+ //# sourceMappingURL=proof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../src/receipts/proof.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAML,KAAK,GAAG,EACT,MAAM,MAAM,CAAC;AAGd,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,eAAe,CAAC,EAAE,KAAK,MAAM,EAAE,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,qBAAqB,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,KAAK,MAAM,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;CACrG,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG;IAC7C,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;QACvB,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE;YAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;SAAE,CAAC;QAChC,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,KAAK,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;CACxC,CAAC;AAQF,MAAM,MAAM,mCAAmC,GAC3C,cAAc,GACd,aAAa,GACb,qBAAqB,GACrB,oBAAoB,GACpB,kBAAkB,GAClB,iBAAiB,GACjB,yBAAyB,GACzB,kBAAkB,GAClB,oBAAoB,GACpB,iBAAiB,CAAC;AAEtB,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,mCAAmC,CAAC;gBAEzC,MAAM,EAAE,mCAAmC,EAAE,OAAO,EAAE,MAAM;CAKzE;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,kBAAkB,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,kBAAkB,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,0BAA0B,GAClC;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,GACD;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAkBN,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,mBAAmB,CAAC,CA4B9B;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CA0CrC;AAoFD,wBAAgB,iCAAiC,CAAC,MAAM,EAAE;IACxD,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,kBAAkB,CAAC;IACnC,SAAS,EAAE,uBAAuB,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,mBAAmB,CAsJtB"}