@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,109 @@
1
+ import { creditUnitsToString, divideCeil, parseCreditUnits, toCreditUnits, } from '../credits/amount.js';
2
+ export function createMeterDefinition(input) {
3
+ const dimensions = [...new Set(input.dimensions.map(assertIdentifier))];
4
+ if (dimensions.length === 0) {
5
+ throw new Error('A meter requires at least one dimension');
6
+ }
7
+ return {
8
+ id: assertIdentifier(input.id),
9
+ projectId: assertIdentifier(input.projectId),
10
+ key: assertIdentifier(input.key),
11
+ name: input.name?.trim() || input.key,
12
+ dimensions,
13
+ createdAt: input.createdAt ?? Date.now(),
14
+ metadata: input.metadata,
15
+ };
16
+ }
17
+ export function createPriceVersion(input) {
18
+ if (!Number.isSafeInteger(input.version) || input.version < 1) {
19
+ throw new Error('Price version must be a positive integer');
20
+ }
21
+ if (input.projectId !== input.meter.projectId) {
22
+ throw new Error('Price and meter must belong to the same project');
23
+ }
24
+ if (input.rates.length === 0) {
25
+ throw new Error('A price requires at least one rate');
26
+ }
27
+ const seen = new Set();
28
+ const rates = input.rates.map((rate) => {
29
+ const dimension = assertIdentifier(rate.dimension);
30
+ if (!input.meter.dimensions.includes(dimension)) {
31
+ throw new Error(`Unknown meter dimension: ${dimension}`);
32
+ }
33
+ if (seen.has(dimension)) {
34
+ throw new Error(`Duplicate price dimension: ${dimension}`);
35
+ }
36
+ seen.add(dimension);
37
+ const unitSize = parsePositiveInteger(rate.unitSize, 'unitSize').toString();
38
+ const amountUnits = toCreditUnits(rate.amount);
39
+ if (amountUnits <= 0n) {
40
+ throw new Error('Rate amount must be positive');
41
+ }
42
+ return {
43
+ dimension,
44
+ unitSize,
45
+ amount: creditUnitsToString(amountUnits),
46
+ amountUnits: amountUnits.toString(),
47
+ };
48
+ });
49
+ return {
50
+ id: assertIdentifier(input.id),
51
+ projectId: assertIdentifier(input.projectId),
52
+ meterId: input.meter.id,
53
+ meterKey: input.meter.key,
54
+ version: input.version,
55
+ currency: 'USD',
56
+ rates,
57
+ createdAt: input.createdAt ?? Date.now(),
58
+ metadata: input.metadata,
59
+ };
60
+ }
61
+ export function rateUsage(price, quantities) {
62
+ const lineItems = price.rates.map((rate) => {
63
+ const quantity = parseNonNegativeInteger(quantities[rate.dimension] ?? '0', rate.dimension);
64
+ const rateUnits = parseCreditUnits(rate.amountUnits, 'rate amount units');
65
+ const amountUnits = divideCeil(quantity * rateUnits, BigInt(rate.unitSize));
66
+ return {
67
+ dimension: rate.dimension,
68
+ quantity: quantity.toString(),
69
+ unitSize: rate.unitSize,
70
+ rateAmount: rate.amount,
71
+ rateUnits: rate.amountUnits,
72
+ amount: creditUnitsToString(amountUnits),
73
+ amountUnits: amountUnits.toString(),
74
+ };
75
+ });
76
+ for (const dimension of Object.keys(quantities)) {
77
+ if (!price.rates.some((rate) => rate.dimension === dimension)) {
78
+ throw new Error(`Usage contains an unpriced dimension: ${dimension}`);
79
+ }
80
+ }
81
+ const totalUnits = lineItems.reduce((total, item) => total + parseCreditUnits(item.amountUnits), 0n);
82
+ return {
83
+ priceId: price.id,
84
+ totalAmount: creditUnitsToString(totalUnits),
85
+ totalUnits: totalUnits.toString(),
86
+ lineItems,
87
+ };
88
+ }
89
+ function assertIdentifier(value) {
90
+ const normalized = value.trim();
91
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,127}$/.test(normalized)) {
92
+ throw new Error(`Invalid identifier: ${value}`);
93
+ }
94
+ return normalized;
95
+ }
96
+ function parsePositiveInteger(value, label) {
97
+ const parsed = parseNonNegativeInteger(value, label);
98
+ if (parsed === 0n) {
99
+ throw new Error(`${label} must be positive`);
100
+ }
101
+ return parsed;
102
+ }
103
+ function parseNonNegativeInteger(value, label) {
104
+ if (!/^(0|[1-9]\d*)$/.test(value)) {
105
+ throw new Error(`${label} must be a non-negative integer`);
106
+ }
107
+ return BigInt(value);
108
+ }
109
+ //# sourceMappingURL=rating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rating.js","sourceRoot":"","sources":["../../src/pricing/rating.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Stablecoin amount helpers.
3
+ */
4
+ export declare const STABLECOIN_DECIMALS = 6;
5
+ export declare function toStablecoinUnits(amount: string, decimals?: number): bigint;
6
+ export declare function stablecoinUnitsToString(units: bigint, decimals?: number): string;
7
+ export declare function isAmountAtLeast(received: string, required: string): boolean;
8
+ //# sourceMappingURL=amount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amount.d.ts","sourceRoot":"","sources":["../../src/receipts/amount.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAsB,GAAG,MAAM,CAcxF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAsB,GAAG,MAAM,CAO7F;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3E"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Stablecoin amount helpers.
3
+ */
4
+ export const STABLECOIN_DECIMALS = 6;
5
+ export function toStablecoinUnits(amount, decimals = STABLECOIN_DECIMALS) {
6
+ const normalized = amount.trim();
7
+ if (!/^\d+(\.\d+)?$/.test(normalized)) {
8
+ throw new Error(`Invalid stablecoin amount: ${amount}`);
9
+ }
10
+ const [whole, fraction = ''] = normalized.split('.');
11
+ if (fraction.length > decimals) {
12
+ throw new Error(`Stablecoin amount exceeds ${decimals} decimals: ${amount}`);
13
+ }
14
+ return BigInt(whole) * 10n ** BigInt(decimals)
15
+ + BigInt(fraction.padEnd(decimals, '0'));
16
+ }
17
+ export function stablecoinUnitsToString(units, decimals = STABLECOIN_DECIMALS) {
18
+ const divisor = 10n ** BigInt(decimals);
19
+ const whole = units / divisor;
20
+ const fraction = units % divisor;
21
+ const fractionText = fraction.toString().padStart(decimals, '0').replace(/0+$/, '');
22
+ return fractionText ? `${whole}.${fractionText}` : whole.toString();
23
+ }
24
+ export function isAmountAtLeast(received, required) {
25
+ return toStablecoinUnits(received) >= toStablecoinUnits(required);
26
+ }
27
+ //# sourceMappingURL=amount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amount.js","sourceRoot":"","sources":["../../src/receipts/amount.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,QAAQ,GAAG,mBAAmB;IAC9E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAEjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,cAAc,MAAM,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC;UAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,QAAQ,GAAG,mBAAmB;IACnF,MAAM,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IAC9B,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEpF,OAAO,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,QAAgB;IAChE,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,16 @@
1
+ export { STABLECOIN_DECIMALS, isAmountAtLeast, stablecoinUnitsToString, toStablecoinUnits, } from './amount.js';
2
+ export { createInvoice, createInvoiceId, createPaymentUri, createReceipt, isInvoiceExpired, matchPaymentToInvoice, } from './invoice.js';
3
+ export { ReceiptLedger, type LedgerFilter } from './ledger.js';
4
+ export { createInvoiceMemo, parseInvoiceMemo, type ParsedInvoiceMemo, createInvoiceMemoData, createInvoiceMemoId, } from './memo.js';
5
+ export { ARC_MEMO_ABI, ERC20_TRANSFER_ABI, createMemoPaymentRequest, type MemoPaymentRequestOptions, } from './memo-payment.js';
6
+ export { ReceiptWatcher, type ReceiptWatcherConfig, type ReceiptWatcherLifecycleEvent, type ReceiptWatcherClient, } from './watcher.js';
7
+ export { MemoPaymentProofError, findMemoPaymentProof, verifyMemoPaymentProof, type FindMemoPaymentProofInput, type FindMemoPaymentProofResult, type ProofClient, type ProofMemoLog, type ProofPollingClient, type ProofTransactionReceipt, type VerifyMemoPaymentProofFailureReason, type VerifyMemoPaymentProofInput, type VerifyMemoPaymentProofResult, } from './proof.js';
8
+ export { createWebhookEvent, serializeWebhookPayload, signWebhookEvent, verifyWebhookSignature, type WebhookSignature, } from './webhooks.js';
9
+ export { WebhookInbox, type ReceiveWebhookInput, type ReplayWebhookInput, type WebhookDeliveryFilter, } from './webhook-inbox.js';
10
+ export { PersistentReceiptLedger, type PersistentReceiptLedgerConfig, } from './persistent-ledger.js';
11
+ export { PersistentWebhookInbox, type PersistentReceiveWebhookInput, type PersistentReplayWebhookInput, type PersistentWebhookInboxConfig, } from './persistent-webhook-inbox.js';
12
+ export { InMemoryReceiptStore, createWatcherCursorKey, type ReceiptStore, type ReceiptStoreDeliveryFilter, type ReceiptStoreEventFilter, type ReceiptStoreInvoiceFilter, type WatcherCursor, type WatcherCursorKeyInput, } from './store.js';
13
+ export { parseReceiptStoreValue, serializeReceiptStoreValue, } from './serialization.js';
14
+ export { createWebhookRouteHandler, type WebhookRouteHandlerConfig, type WebhookRouteResult, } from './webhook-route.js';
15
+ export type { PaymentInvoice, PaymentReceipt, ReceiptOnchainProof, CreateInvoiceInput, InvoiceStatus, MemoPaymentRequest, ObservedPayment, PaymentMatchResult, ReceiptStatus, StablecoinSymbol, WebhookDeliveryAttempt, WebhookDeliveryStatus, WebhookEvent, WebhookEventType, } from './types.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/receipts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,yBAAyB,GAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,mCAAmC,EACxC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,GAClC,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,uBAAuB,EACvB,KAAK,6BAA6B,GACnC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,sBAAsB,EACtB,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,GAClC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAClB,KAAK,qBAAqB,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { STABLECOIN_DECIMALS, isAmountAtLeast, stablecoinUnitsToString, toStablecoinUnits, } from './amount.js';
2
+ export { createInvoice, createInvoiceId, createPaymentUri, createReceipt, isInvoiceExpired, matchPaymentToInvoice, } from './invoice.js';
3
+ export { ReceiptLedger } from './ledger.js';
4
+ export { createInvoiceMemo, parseInvoiceMemo, createInvoiceMemoData, createInvoiceMemoId, } from './memo.js';
5
+ export { ARC_MEMO_ABI, ERC20_TRANSFER_ABI, createMemoPaymentRequest, } from './memo-payment.js';
6
+ export { ReceiptWatcher, } from './watcher.js';
7
+ export { MemoPaymentProofError, findMemoPaymentProof, verifyMemoPaymentProof, } from './proof.js';
8
+ export { createWebhookEvent, serializeWebhookPayload, signWebhookEvent, verifyWebhookSignature, } from './webhooks.js';
9
+ export { WebhookInbox, } from './webhook-inbox.js';
10
+ export { PersistentReceiptLedger, } from './persistent-ledger.js';
11
+ export { PersistentWebhookInbox, } from './persistent-webhook-inbox.js';
12
+ export { InMemoryReceiptStore, createWatcherCursorKey, } from './store.js';
13
+ export { parseReceiptStoreValue, serializeReceiptStoreValue, } from './serialization.js';
14
+ export { createWebhookRouteHandler, } from './webhook-route.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/receipts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAEhB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,GAIf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,GAUvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,GAIb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,sBAAsB,GAIvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GAOvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,yBAAyB,GAG1B,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Invoice and receipt creation helpers.
3
+ */
4
+ import type { PaymentInvoice, PaymentReceipt, CreateInvoiceInput, ObservedPayment, PaymentMatchResult } from './types.js';
5
+ export declare function createInvoice(input: CreateInvoiceInput): PaymentInvoice;
6
+ export declare function createPaymentUri(params: {
7
+ payTo: `0x${string}`;
8
+ amount: string;
9
+ currency: string;
10
+ network: string;
11
+ memo: string;
12
+ scheme?: string;
13
+ }): string;
14
+ export declare function isInvoiceExpired(invoice: PaymentInvoice, now?: number): boolean;
15
+ export declare function matchPaymentToInvoice(invoice: PaymentInvoice, payment: ObservedPayment, now?: number): PaymentMatchResult;
16
+ export declare function createReceipt(invoice: PaymentInvoice, payment: ObservedPayment, createdAt?: number): PaymentReceipt;
17
+ export declare function createInvoiceId(size?: number): string;
18
+ //# sourceMappingURL=invoice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice.d.ts","sourceRoot":"","sources":["../../src/receipts/invoice.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAIpB,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,cAAc,CAkCvE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAUT;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,SAAa,GAAG,OAAO,CAEnF;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,eAAe,EACxB,GAAG,SAAa,GACf,kBAAkB,CAkCpB;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,eAAe,EACxB,SAAS,SAAmC,GAC3C,cAAc,CA4BhB;AAED,wBAAgB,eAAe,CAAC,IAAI,SAAK,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Invoice and receipt creation helpers.
3
+ */
4
+ import { randomBytes } from 'node:crypto';
5
+ import { DEFAULTS } from '../constants.js';
6
+ import { isAmountAtLeast, toStablecoinUnits } from './amount.js';
7
+ import { createInvoiceMemo, createInvoiceMemoData, createInvoiceMemoId } from './memo.js';
8
+ const DEFAULT_PAYMENT_URI_SCHEME = 'arc';
9
+ export function createInvoice(input) {
10
+ const id = input.id ?? createInvoiceId();
11
+ const currency = input.currency ?? 'USDC';
12
+ const network = input.network ?? DEFAULTS.network;
13
+ const createdAt = input.createdAt ?? Date.now();
14
+ const memo = createInvoiceMemo(id);
15
+ const memoId = createInvoiceMemoId(id);
16
+ const memoData = createInvoiceMemoData(memo);
17
+ const amountUnits = toStablecoinUnits(input.amount).toString();
18
+ return {
19
+ id,
20
+ status: 'open',
21
+ amount: input.amount,
22
+ amountUnits,
23
+ currency,
24
+ payTo: input.payTo,
25
+ network,
26
+ memo,
27
+ memoId,
28
+ memoData,
29
+ paymentUri: createPaymentUri({
30
+ payTo: input.payTo,
31
+ amount: input.amount,
32
+ currency,
33
+ network,
34
+ memo,
35
+ }),
36
+ createdAt,
37
+ expiresAt: input.expiresAt,
38
+ customerId: input.customerId,
39
+ description: input.description,
40
+ metadata: input.metadata,
41
+ };
42
+ }
43
+ export function createPaymentUri(params) {
44
+ const search = new URLSearchParams({
45
+ to: params.payTo,
46
+ amount: params.amount,
47
+ currency: params.currency,
48
+ network: params.network,
49
+ memo: params.memo,
50
+ });
51
+ return `${params.scheme ?? DEFAULT_PAYMENT_URI_SCHEME}://pay?${search.toString()}`;
52
+ }
53
+ export function isInvoiceExpired(invoice, now = Date.now()) {
54
+ return invoice.expiresAt !== undefined && now > invoice.expiresAt;
55
+ }
56
+ export function matchPaymentToInvoice(invoice, payment, now = Date.now()) {
57
+ if (isInvoiceExpired(invoice, now)) {
58
+ return { success: false, reason: 'invoice_expired' };
59
+ }
60
+ if (payment.to.toLowerCase() !== invoice.payTo.toLowerCase()) {
61
+ return { success: false, reason: 'wrong_recipient' };
62
+ }
63
+ if ((payment.currency ?? invoice.currency) !== invoice.currency) {
64
+ return { success: false, reason: 'wrong_currency' };
65
+ }
66
+ if ((payment.network ?? invoice.network) !== invoice.network) {
67
+ return { success: false, reason: 'wrong_network' };
68
+ }
69
+ if (payment.memo !== undefined && payment.memo !== invoice.memo) {
70
+ return { success: false, reason: 'wrong_memo' };
71
+ }
72
+ if (payment.memoId !== undefined
73
+ && invoice.memoId !== undefined
74
+ && payment.memoId.toLowerCase() !== invoice.memoId.toLowerCase()) {
75
+ return { success: false, reason: 'wrong_memo_id' };
76
+ }
77
+ if (!isAmountAtLeast(payment.amount, invoice.amount)) {
78
+ return { success: false, reason: 'insufficient_amount' };
79
+ }
80
+ return { success: true };
81
+ }
82
+ export function createReceipt(invoice, payment, createdAt = payment.observedAt ?? Date.now()) {
83
+ const match = matchPaymentToInvoice(invoice, payment, createdAt);
84
+ if (!match.success) {
85
+ throw new Error(`Payment does not match invoice: ${match.reason}`);
86
+ }
87
+ const amount = payment.amount;
88
+ return {
89
+ id: `rcpt_${createInvoiceId(12)}`,
90
+ invoiceId: invoice.id,
91
+ status: 'paid',
92
+ amount,
93
+ amountUnits: toStablecoinUnits(amount).toString(),
94
+ currency: payment.currency ?? invoice.currency,
95
+ network: payment.network ?? invoice.network,
96
+ payTo: invoice.payTo,
97
+ payer: payment.from,
98
+ memo: payment.memo ?? invoice.memo,
99
+ txHash: payment.txHash,
100
+ createdAt,
101
+ blockNumber: payment.blockNumber,
102
+ onchainProof: payment.onchainProof,
103
+ metadata: {
104
+ ...invoice.metadata,
105
+ ...payment.metadata,
106
+ },
107
+ };
108
+ }
109
+ export function createInvoiceId(size = 16) {
110
+ return randomBytes(size).toString('hex');
111
+ }
112
+ //# sourceMappingURL=invoice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice.js","sourceRoot":"","sources":["../../src/receipts/invoice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * In-memory invoice and receipt ledger.
3
+ */
4
+ import type { PaymentInvoice, PaymentReceipt, CreateInvoiceInput, InvoiceStatus, ObservedPayment, WebhookEvent } from './types.js';
5
+ export interface LedgerFilter {
6
+ status?: InvoiceStatus;
7
+ customerId?: string;
8
+ }
9
+ export declare class ReceiptLedger {
10
+ private readonly invoices;
11
+ private readonly receipts;
12
+ private readonly events;
13
+ createInvoice(input: CreateInvoiceInput): PaymentInvoice;
14
+ addInvoice(invoice: PaymentInvoice): void;
15
+ getInvoice(id: string): PaymentInvoice | undefined;
16
+ listInvoices(filter?: LedgerFilter): PaymentInvoice[];
17
+ recordPayment(invoiceId: string, payment: ObservedPayment): PaymentReceipt;
18
+ markExpired(invoiceId: string, now?: number): PaymentInvoice;
19
+ markRefunded(invoiceId: string, refund?: {
20
+ txHash?: `0x${string}`;
21
+ refundedAt?: number;
22
+ }): PaymentReceipt;
23
+ getReceipt(id: string): PaymentReceipt | undefined;
24
+ getReceiptByTxHash(txHash: `0x${string}`, invoiceId?: string): PaymentReceipt | undefined;
25
+ listReceipts(): PaymentReceipt[];
26
+ listWebhookEvents(): WebhookEvent[];
27
+ private requireInvoice;
28
+ private updateInvoice;
29
+ }
30
+ //# sourceMappingURL=ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/receipts/ledger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAE7C,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,cAAc;IAOxD,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAQzC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIlD,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,cAAc,EAAE;IAcrD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,cAAc;IAmB1E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,cAAc;IAYhE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE;QAAE,MAAM,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,cAAc;IAyB7G,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIlD,kBAAkB,CAAC,MAAM,EAAE,KAAK,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAOzF,YAAY,IAAI,cAAc,EAAE;IAIhC,iBAAiB,IAAI,YAAY,EAAE;IAInC,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;CAMtB"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * In-memory invoice and receipt ledger.
3
+ */
4
+ import { createInvoice, createReceipt, isInvoiceExpired } from './invoice.js';
5
+ import { createWebhookEvent } from './webhooks.js';
6
+ export class ReceiptLedger {
7
+ invoices = new Map();
8
+ receipts = new Map();
9
+ events = [];
10
+ createInvoice(input) {
11
+ const invoice = createInvoice(input);
12
+ this.addInvoice(invoice);
13
+ this.events.push(createWebhookEvent('invoice.created', { invoice }));
14
+ return invoice;
15
+ }
16
+ addInvoice(invoice) {
17
+ if (this.invoices.has(invoice.id)) {
18
+ throw new Error(`Invoice already exists: ${invoice.id}`);
19
+ }
20
+ this.invoices.set(invoice.id, invoice);
21
+ }
22
+ getInvoice(id) {
23
+ return this.invoices.get(id);
24
+ }
25
+ listInvoices(filter) {
26
+ return [...this.invoices.values()].filter((invoice) => {
27
+ if (filter?.status && invoice.status !== filter.status) {
28
+ return false;
29
+ }
30
+ if (filter?.customerId && invoice.customerId !== filter.customerId) {
31
+ return false;
32
+ }
33
+ return true;
34
+ });
35
+ }
36
+ recordPayment(invoiceId, payment) {
37
+ const existingReceipt = payment.txHash
38
+ ? this.getReceiptByTxHash(payment.txHash, invoiceId)
39
+ : undefined;
40
+ if (existingReceipt) {
41
+ return existingReceipt;
42
+ }
43
+ const invoice = this.requireInvoice(invoiceId);
44
+ const observedInvoice = this.updateInvoice(invoice.id, { status: 'observed' });
45
+ this.events.push(createWebhookEvent('invoice.observed', { invoice: observedInvoice, payment }));
46
+ const receipt = createReceipt(observedInvoice, payment);
47
+ this.receipts.set(receipt.id, receipt);
48
+ const paidInvoice = this.updateInvoice(invoice.id, { status: 'paid' });
49
+ this.events.push(createWebhookEvent('invoice.paid', { invoice: paidInvoice, receipt }));
50
+ return receipt;
51
+ }
52
+ markExpired(invoiceId, now = Date.now()) {
53
+ const invoice = this.requireInvoice(invoiceId);
54
+ if (!isInvoiceExpired(invoice, now)) {
55
+ throw new Error(`Invoice is not expired: ${invoiceId}`);
56
+ }
57
+ const expiredInvoice = this.updateInvoice(invoiceId, { status: 'expired' });
58
+ this.events.push(createWebhookEvent('invoice.expired', { invoice: expiredInvoice }));
59
+ return expiredInvoice;
60
+ }
61
+ markRefunded(invoiceId, refund = {}) {
62
+ const invoice = this.requireInvoice(invoiceId);
63
+ const receipt = [...this.receipts.values()].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
+ this.receipts.set(refundedReceipt.id, refundedReceipt);
75
+ const refundedInvoice = this.updateInvoice(invoice.id, { status: 'refunded' });
76
+ this.events.push(createWebhookEvent('invoice.refunded', {
77
+ invoice: refundedInvoice,
78
+ receipt: refundedReceipt,
79
+ }));
80
+ return refundedReceipt;
81
+ }
82
+ getReceipt(id) {
83
+ return this.receipts.get(id);
84
+ }
85
+ getReceiptByTxHash(txHash, invoiceId) {
86
+ return [...this.receipts.values()].find((receipt) => (receipt.txHash?.toLowerCase() === txHash.toLowerCase()
87
+ && (invoiceId === undefined || receipt.invoiceId === invoiceId)));
88
+ }
89
+ listReceipts() {
90
+ return [...this.receipts.values()];
91
+ }
92
+ listWebhookEvents() {
93
+ return [...this.events];
94
+ }
95
+ requireInvoice(id) {
96
+ const invoice = this.invoices.get(id);
97
+ if (!invoice) {
98
+ throw new Error(`Invoice not found: ${id}`);
99
+ }
100
+ return invoice;
101
+ }
102
+ updateInvoice(id, patch) {
103
+ const invoice = this.requireInvoice(id);
104
+ const next = { ...invoice, ...patch };
105
+ this.invoices.set(id, next);
106
+ return next;
107
+ }
108
+ }
109
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/receipts/ledger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAS9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAOnD,MAAM,OAAO,aAAa;IACP,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC7C,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC7C,MAAM,GAAmB,EAAE,CAAC;IAE7C,aAAa,CAAC,KAAyB;QACrC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,OAAuB;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,YAAY,CAAC,MAAqB;QAChC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YACpD,IAAI,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;gBACvD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,MAAM,EAAE,UAAU,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;gBACnE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,SAAiB,EAAE,OAAwB;QACvD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM;YACpC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;YACpD,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhG,MAAM,OAAO,GAAG,aAAa,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACxF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAE/C,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QACrF,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,SAA0D,EAAE;QAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAEzF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iDAAiD,SAAS,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,eAAe,GAAmB;YACtC,GAAG,OAAO;YACV,EAAE,EAAE,QAAQ,OAAO,CAAC,EAAE,EAAE;YACxB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;YACvC,SAAS,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE;SAC3C,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QACvD,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;YACtD,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,eAAe;SACzB,CAAC,CAAC,CAAC;QACJ,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,kBAAkB,CAAC,MAAqB,EAAE,SAAkB;QAC1D,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACnD,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE;eACnD,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAChE,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,iBAAiB;QACf,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAEO,cAAc,CAAC,EAAU;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,aAAa,CAAC,EAAU,EAAE,KAA8B;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Helpers for Arc Memo-wrapped USDC invoice payments.
3
+ */
4
+ import type { PaymentInvoice, MemoPaymentRequest } from './types.js';
5
+ export declare const ERC20_TRANSFER_ABI: readonly [{
6
+ readonly type: "function";
7
+ readonly name: "transfer";
8
+ readonly stateMutability: "nonpayable";
9
+ readonly inputs: readonly [{
10
+ readonly name: "to";
11
+ readonly type: "address";
12
+ }, {
13
+ readonly name: "amount";
14
+ readonly type: "uint256";
15
+ }];
16
+ readonly outputs: readonly [{
17
+ readonly name: "";
18
+ readonly type: "bool";
19
+ }];
20
+ }, {
21
+ readonly type: "event";
22
+ readonly name: "Transfer";
23
+ readonly anonymous: false;
24
+ readonly inputs: readonly [{
25
+ readonly name: "from";
26
+ readonly type: "address";
27
+ readonly indexed: true;
28
+ }, {
29
+ readonly name: "to";
30
+ readonly type: "address";
31
+ readonly indexed: true;
32
+ }, {
33
+ readonly name: "value";
34
+ readonly type: "uint256";
35
+ readonly indexed: false;
36
+ }];
37
+ }];
38
+ export declare const ARC_MEMO_ABI: readonly [{
39
+ readonly type: "function";
40
+ readonly name: "memo";
41
+ readonly stateMutability: "nonpayable";
42
+ readonly inputs: readonly [{
43
+ readonly name: "target";
44
+ readonly type: "address";
45
+ }, {
46
+ readonly name: "data";
47
+ readonly type: "bytes";
48
+ }, {
49
+ readonly name: "memoId";
50
+ readonly type: "bytes32";
51
+ }, {
52
+ readonly name: "memoData";
53
+ readonly type: "bytes";
54
+ }];
55
+ readonly outputs: readonly [];
56
+ }, {
57
+ readonly type: "event";
58
+ readonly name: "BeforeMemo";
59
+ readonly anonymous: false;
60
+ readonly inputs: readonly [{
61
+ readonly name: "memoIndex";
62
+ readonly type: "uint256";
63
+ readonly indexed: true;
64
+ }];
65
+ }, {
66
+ readonly type: "event";
67
+ readonly name: "Memo";
68
+ readonly anonymous: false;
69
+ readonly inputs: readonly [{
70
+ readonly name: "sender";
71
+ readonly type: "address";
72
+ readonly indexed: true;
73
+ }, {
74
+ readonly name: "target";
75
+ readonly type: "address";
76
+ readonly indexed: true;
77
+ }, {
78
+ readonly name: "callDataHash";
79
+ readonly type: "bytes32";
80
+ readonly indexed: false;
81
+ }, {
82
+ readonly name: "memoId";
83
+ readonly type: "bytes32";
84
+ readonly indexed: true;
85
+ }, {
86
+ readonly name: "memo";
87
+ readonly type: "bytes";
88
+ readonly indexed: false;
89
+ }, {
90
+ readonly name: "memoIndex";
91
+ readonly type: "uint256";
92
+ readonly indexed: false;
93
+ }];
94
+ }];
95
+ export interface MemoPaymentRequestOptions {
96
+ usdcAddress?: `0x${string}`;
97
+ memoContract?: `0x${string}`;
98
+ }
99
+ export declare function createMemoPaymentRequest(invoice: PaymentInvoice, options?: MemoPaymentRequestOptions): MemoPaymentRequest;
100
+ //# sourceMappingURL=memo-payment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo-payment.d.ts","sourceRoot":"","sources":["../../src/receipts/memo-payment.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBP,CAAC;AAEzB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCD,CAAC;AAEzB,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,yBAA8B,GACtC,kBAAkB,CA8BpB"}