@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.
- package/LICENSE +13 -0
- package/README.md +17 -0
- package/dist/billing/index.d.ts +3 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +3 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing/meter.d.ts +97 -0
- package/dist/billing/meter.d.ts.map +1 -0
- package/dist/billing/meter.js +109 -0
- package/dist/billing/meter.js.map +1 -0
- package/dist/billing/plans.d.ts +77 -0
- package/dist/billing/plans.d.ts.map +1 -0
- package/dist/billing/plans.js +65 -0
- package/dist/billing/plans.js.map +1 -0
- package/dist/client/buyer.d.ts +82 -0
- package/dist/client/buyer.d.ts.map +1 -0
- package/dist/client/buyer.js +168 -0
- package/dist/client/buyer.js.map +1 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -0
- package/dist/constants.d.ts +36 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +42 -0
- package/dist/constants.js.map +1 -0
- package/dist/credits/amount.d.ts +7 -0
- package/dist/credits/amount.d.ts.map +1 -0
- package/dist/credits/amount.js +36 -0
- package/dist/credits/amount.js.map +1 -0
- package/dist/credits/errors.d.ts +20 -0
- package/dist/credits/errors.d.ts.map +1 -0
- package/dist/credits/errors.js +35 -0
- package/dist/credits/errors.js.map +1 -0
- package/dist/credits/index.d.ts +7 -0
- package/dist/credits/index.d.ts.map +1 -0
- package/dist/credits/index.js +6 -0
- package/dist/credits/index.js.map +1 -0
- package/dist/credits/ledger.d.ts +175 -0
- package/dist/credits/ledger.d.ts.map +1 -0
- package/dist/credits/ledger.js +705 -0
- package/dist/credits/ledger.js.map +1 -0
- package/dist/credits/store.d.ts +104 -0
- package/dist/credits/store.d.ts.map +1 -0
- package/dist/credits/store.js +420 -0
- package/dist/credits/store.js.map +1 -0
- package/dist/credits/types.d.ts +234 -0
- package/dist/credits/types.d.ts.map +1 -0
- package/dist/credits/types.js +2 -0
- package/dist/credits/types.js.map +1 -0
- package/dist/credits/webhooks.d.ts +5 -0
- package/dist/credits/webhooks.d.ts.map +1 -0
- package/dist/credits/webhooks.js +13 -0
- package/dist/credits/webhooks.js.map +1 -0
- package/dist/funding/arc-worker.d.ts +55 -0
- package/dist/funding/arc-worker.d.ts.map +1 -0
- package/dist/funding/arc-worker.js +133 -0
- package/dist/funding/arc-worker.js.map +1 -0
- package/dist/funding/arc.d.ts +38 -0
- package/dist/funding/arc.d.ts.map +1 -0
- package/dist/funding/arc.js +83 -0
- package/dist/funding/arc.js.map +1 -0
- package/dist/funding/index.d.ts +3 -0
- package/dist/funding/index.d.ts.map +1 -0
- package/dist/funding/index.js +3 -0
- package/dist/funding/index.js.map +1 -0
- package/dist/gateway/client.d.ts +51 -0
- package/dist/gateway/client.d.ts.map +1 -0
- package/dist/gateway/client.js +59 -0
- package/dist/gateway/client.js.map +1 -0
- package/dist/gateway/index.d.ts +2 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +2 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/express.d.ts +25 -0
- package/dist/middleware/express.d.ts.map +1 -0
- package/dist/middleware/express.js +61 -0
- package/dist/middleware/express.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +4 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/next.d.ts +27 -0
- package/dist/middleware/next.d.ts.map +1 -0
- package/dist/middleware/next.js +67 -0
- package/dist/middleware/next.js.map +1 -0
- package/dist/middleware/paywall.d.ts +54 -0
- package/dist/middleware/paywall.d.ts.map +1 -0
- package/dist/middleware/paywall.js +102 -0
- package/dist/middleware/paywall.js.map +1 -0
- package/dist/pricing/index.d.ts +3 -0
- package/dist/pricing/index.d.ts.map +1 -0
- package/dist/pricing/index.js +2 -0
- package/dist/pricing/index.js.map +1 -0
- package/dist/pricing/rating.d.ts +21 -0
- package/dist/pricing/rating.d.ts.map +1 -0
- package/dist/pricing/rating.js +109 -0
- package/dist/pricing/rating.js.map +1 -0
- package/dist/receipts/amount.d.ts +8 -0
- package/dist/receipts/amount.d.ts.map +1 -0
- package/dist/receipts/amount.js +27 -0
- package/dist/receipts/amount.js.map +1 -0
- package/dist/receipts/index.d.ts +16 -0
- package/dist/receipts/index.d.ts.map +1 -0
- package/dist/receipts/index.js +15 -0
- package/dist/receipts/index.js.map +1 -0
- package/dist/receipts/invoice.d.ts +18 -0
- package/dist/receipts/invoice.d.ts.map +1 -0
- package/dist/receipts/invoice.js +112 -0
- package/dist/receipts/invoice.js.map +1 -0
- package/dist/receipts/ledger.d.ts +30 -0
- package/dist/receipts/ledger.d.ts.map +1 -0
- package/dist/receipts/ledger.js +109 -0
- package/dist/receipts/ledger.js.map +1 -0
- package/dist/receipts/memo-payment.d.ts +100 -0
- package/dist/receipts/memo-payment.d.ts.map +1 -0
- package/dist/receipts/memo-payment.js +91 -0
- package/dist/receipts/memo-payment.js.map +1 -0
- package/dist/receipts/memo.d.ts +14 -0
- package/dist/receipts/memo.d.ts.map +1 -0
- package/dist/receipts/memo.js +39 -0
- package/dist/receipts/memo.js.map +1 -0
- package/dist/receipts/persistent-ledger.d.ts +27 -0
- package/dist/receipts/persistent-ledger.d.ts.map +1 -0
- package/dist/receipts/persistent-ledger.js +111 -0
- package/dist/receipts/persistent-ledger.js.map +1 -0
- package/dist/receipts/persistent-webhook-inbox.d.ts +32 -0
- package/dist/receipts/persistent-webhook-inbox.d.ts.map +1 -0
- package/dist/receipts/persistent-webhook-inbox.js +93 -0
- package/dist/receipts/persistent-webhook-inbox.js.map +1 -0
- package/dist/receipts/proof.d.ts +80 -0
- package/dist/receipts/proof.d.ts.map +1 -0
- package/dist/receipts/proof.js +223 -0
- package/dist/receipts/proof.js.map +1 -0
- package/dist/receipts/serialization.d.ts +3 -0
- package/dist/receipts/serialization.d.ts.map +1 -0
- package/dist/receipts/serialization.js +24 -0
- package/dist/receipts/serialization.js.map +1 -0
- package/dist/receipts/store.d.ts +69 -0
- package/dist/receipts/store.d.ts.map +1 -0
- package/dist/receipts/store.js +85 -0
- package/dist/receipts/store.js.map +1 -0
- package/dist/receipts/types.d.ts +134 -0
- package/dist/receipts/types.d.ts.map +1 -0
- package/dist/receipts/types.js +5 -0
- package/dist/receipts/types.js.map +1 -0
- package/dist/receipts/watcher.d.ts +92 -0
- package/dist/receipts/watcher.d.ts.map +1 -0
- package/dist/receipts/watcher.js +323 -0
- package/dist/receipts/watcher.js.map +1 -0
- package/dist/receipts/webhook-inbox.d.ts +34 -0
- package/dist/receipts/webhook-inbox.d.ts.map +1 -0
- package/dist/receipts/webhook-inbox.js +101 -0
- package/dist/receipts/webhook-inbox.js.map +1 -0
- package/dist/receipts/webhook-route.d.ts +22 -0
- package/dist/receipts/webhook-route.d.ts.map +1 -0
- package/dist/receipts/webhook-route.js +37 -0
- package/dist/receipts/webhook-route.js.map +1 -0
- package/dist/receipts/webhooks.d.ts +20 -0
- package/dist/receipts/webhooks.d.ts.map +1 -0
- package/dist/receipts/webhooks.js +72 -0
- package/dist/receipts/webhooks.js.map +1 -0
- package/dist/types.d.ts +101 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- 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":"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"}
|