pay-lobster 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +401 -0
  2. package/README.md.bak +401 -0
  3. package/dist/agent.d.ts +132 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +224 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/analytics.d.ts +120 -0
  8. package/dist/analytics.d.ts.map +1 -0
  9. package/dist/analytics.js +345 -0
  10. package/dist/analytics.js.map +1 -0
  11. package/dist/approvals.d.ts +168 -0
  12. package/dist/approvals.d.ts.map +1 -0
  13. package/dist/approvals.js +406 -0
  14. package/dist/approvals.js.map +1 -0
  15. package/dist/circle-client.d.ts +152 -0
  16. package/dist/circle-client.d.ts.map +1 -0
  17. package/dist/circle-client.js +266 -0
  18. package/dist/circle-client.js.map +1 -0
  19. package/dist/commission.d.ts +191 -0
  20. package/dist/commission.d.ts.map +1 -0
  21. package/dist/commission.js +475 -0
  22. package/dist/commission.js.map +1 -0
  23. package/dist/condition-builder.d.ts +98 -0
  24. package/dist/condition-builder.d.ts.map +1 -0
  25. package/dist/condition-builder.js +193 -0
  26. package/dist/condition-builder.js.map +1 -0
  27. package/dist/contacts.d.ts +179 -0
  28. package/dist/contacts.d.ts.map +1 -0
  29. package/dist/contacts.js +445 -0
  30. package/dist/contacts.js.map +1 -0
  31. package/dist/easy.d.ts +22 -0
  32. package/dist/easy.d.ts.map +1 -0
  33. package/dist/easy.js +40 -0
  34. package/dist/easy.js.map +1 -0
  35. package/dist/erc8004/constants.d.ts +152 -0
  36. package/dist/erc8004/constants.d.ts.map +1 -0
  37. package/dist/erc8004/constants.js +114 -0
  38. package/dist/erc8004/constants.js.map +1 -0
  39. package/dist/erc8004/discovery.d.ts +84 -0
  40. package/dist/erc8004/discovery.d.ts.map +1 -0
  41. package/dist/erc8004/discovery.js +217 -0
  42. package/dist/erc8004/discovery.js.map +1 -0
  43. package/dist/erc8004/identity.d.ts +91 -0
  44. package/dist/erc8004/identity.d.ts.map +1 -0
  45. package/dist/erc8004/identity.js +250 -0
  46. package/dist/erc8004/identity.js.map +1 -0
  47. package/dist/erc8004/index.d.ts +147 -0
  48. package/dist/erc8004/index.d.ts.map +1 -0
  49. package/dist/erc8004/index.js +225 -0
  50. package/dist/erc8004/index.js.map +1 -0
  51. package/dist/erc8004/reputation.d.ts +133 -0
  52. package/dist/erc8004/reputation.d.ts.map +1 -0
  53. package/dist/erc8004/reputation.js +277 -0
  54. package/dist/erc8004/reputation.js.map +1 -0
  55. package/dist/escrow-templates.d.ts +38 -0
  56. package/dist/escrow-templates.d.ts.map +1 -0
  57. package/dist/escrow-templates.js +419 -0
  58. package/dist/escrow-templates.js.map +1 -0
  59. package/dist/escrow.d.ts +320 -0
  60. package/dist/escrow.d.ts.map +1 -0
  61. package/dist/escrow.js +854 -0
  62. package/dist/escrow.js.map +1 -0
  63. package/dist/index.d.ts +11 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +33 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/invoices.d.ts +212 -0
  68. package/dist/invoices.d.ts.map +1 -0
  69. package/dist/invoices.js +393 -0
  70. package/dist/invoices.js.map +1 -0
  71. package/dist/notifications.d.ts +141 -0
  72. package/dist/notifications.d.ts.map +1 -0
  73. package/dist/notifications.js +350 -0
  74. package/dist/notifications.js.map +1 -0
  75. package/dist/tips.d.ts +171 -0
  76. package/dist/tips.d.ts.map +1 -0
  77. package/dist/tips.js +390 -0
  78. package/dist/tips.js.map +1 -0
  79. package/dist/types.d.ts +100 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +6 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/x402-client.d.ts +127 -0
  84. package/dist/x402-client.d.ts.map +1 -0
  85. package/dist/x402-client.js +350 -0
  86. package/dist/x402-client.js.map +1 -0
  87. package/dist/x402-server.d.ts +133 -0
  88. package/dist/x402-server.d.ts.map +1 -0
  89. package/dist/x402-server.js +330 -0
  90. package/dist/x402-server.js.map +1 -0
  91. package/lib/agent.ts +273 -0
  92. package/lib/analytics.ts +474 -0
  93. package/lib/analytics.ts.bak +474 -0
  94. package/lib/approvals.ts +585 -0
  95. package/lib/approvals.ts.bak +585 -0
  96. package/lib/circle-client.ts +376 -0
  97. package/lib/circle-client.ts.bak +376 -0
  98. package/lib/commission.ts +680 -0
  99. package/lib/commission.ts.bak +680 -0
  100. package/lib/condition-builder.ts +223 -0
  101. package/lib/condition-builder.ts.bak +223 -0
  102. package/lib/contacts.ts +615 -0
  103. package/lib/contacts.ts.bak +615 -0
  104. package/lib/easy.ts +46 -0
  105. package/lib/easy.ts.bak +352 -0
  106. package/lib/erc8004/constants.ts +175 -0
  107. package/lib/erc8004/discovery.ts +299 -0
  108. package/lib/erc8004/identity.ts +327 -0
  109. package/lib/erc8004/index.ts +285 -0
  110. package/lib/erc8004/reputation.ts +368 -0
  111. package/lib/escrow-templates.ts +462 -0
  112. package/lib/escrow.ts +1216 -0
  113. package/lib/index.ts +13 -0
  114. package/lib/invoices.ts +588 -0
  115. package/lib/notifications.ts +484 -0
  116. package/lib/tips.ts +570 -0
  117. package/lib/types.ts +108 -0
  118. package/lib/x402-client.ts +471 -0
  119. package/lib/x402-server.ts +462 -0
  120. package/package.json +58 -0
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ /**
3
+ * x402 Payment-Enabled HTTP Client
4
+ *
5
+ * Wraps fetch() to automatically handle 402 Payment Required responses.
6
+ * Uses Circle Programmable Wallets to pay and retry with signature.
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.X402Client = void 0;
13
+ exports.createX402Fetch = createX402Fetch;
14
+ exports.simpleX402Fetch = simpleX402Fetch;
15
+ const crypto_1 = __importDefault(require("crypto"));
16
+ const promises_1 = __importDefault(require("fs/promises"));
17
+ const path_1 = __importDefault(require("path"));
18
+ /**
19
+ * Create a payment-enabled fetch wrapper
20
+ */
21
+ function createX402Fetch(config) {
22
+ const client = new X402Client(config);
23
+ return async (url, init) => {
24
+ return client.fetch(url, init);
25
+ };
26
+ }
27
+ /**
28
+ * X402 HTTP Client
29
+ */
30
+ class X402Client {
31
+ constructor(config) {
32
+ // In-memory receipt cache
33
+ this.receiptCache = new Map();
34
+ this.wallet = config.wallet;
35
+ this.walletId = config.walletId;
36
+ this.maxAutoPayUSDC = config.maxAutoPayUSDC ? parseFloat(config.maxAutoPayUSDC) : undefined;
37
+ this.requireConfirmation = config.requireConfirmation ?? false;
38
+ this.cacheReceipts = config.cacheReceipts ?? true;
39
+ this.cacheDir = config.cacheDir || './data/x402-receipts';
40
+ this.onPayment = config.onPayment;
41
+ this.onChallenge = config.onChallenge;
42
+ this.onVerified = config.onVerified;
43
+ this.onError = config.onError;
44
+ // Load cached receipts on init
45
+ if (this.cacheReceipts) {
46
+ this.loadReceiptCache().catch(() => {
47
+ // Ignore cache load errors
48
+ });
49
+ }
50
+ }
51
+ /**
52
+ * Main fetch method - handles 402 automatically
53
+ */
54
+ async fetch(url, init) {
55
+ const urlString = this.getUrlString(url);
56
+ try {
57
+ // Check for cached receipt
58
+ const cachedReceipt = this.getCachedReceipt(urlString);
59
+ if (cachedReceipt) {
60
+ // Use cached payment signature
61
+ return this.fetchWithPayment(url, init, cachedReceipt.signature);
62
+ }
63
+ // First attempt - no payment
64
+ const response = await fetch(url, init);
65
+ // Success or non-402 error - return as-is
66
+ if (response.status !== 402) {
67
+ return response;
68
+ }
69
+ // 402 Payment Required - handle payment
70
+ const paymentResponse = await this.handlePaymentRequired(response, urlString, url, init);
71
+ return paymentResponse;
72
+ }
73
+ catch (error) {
74
+ const err = error;
75
+ this.onError?.(err, urlString);
76
+ throw err;
77
+ }
78
+ }
79
+ /**
80
+ * Handle 402 Payment Required response
81
+ */
82
+ async handlePaymentRequired(response, urlString, originalUrl, originalInit) {
83
+ // Parse payment challenge from response
84
+ const challenge = await this.parsePaymentChallenge(response);
85
+ if (!challenge) {
86
+ throw new Error('Invalid 402 response: missing x-payment-required');
87
+ }
88
+ // Trigger challenge hook
89
+ this.onChallenge?.(challenge);
90
+ // Check if challenge is expired
91
+ if (challenge['x-payment-required'].expires < Math.floor(Date.now() / 1000)) {
92
+ throw new Error('Payment challenge expired');
93
+ }
94
+ // Check max auto-pay limit
95
+ const amount = parseFloat(challenge['x-payment-required'].amount);
96
+ if (this.maxAutoPayUSDC !== undefined && amount > this.maxAutoPayUSDC) {
97
+ throw new Error(`Payment amount ${amount} USDC exceeds max auto-pay limit ${this.maxAutoPayUSDC} USDC`);
98
+ }
99
+ // Confirm payment if required
100
+ if (this.requireConfirmation) {
101
+ const confirmed = await this.confirmPayment(challenge);
102
+ if (!confirmed) {
103
+ throw new Error('Payment cancelled by user');
104
+ }
105
+ }
106
+ // Execute payment
107
+ const txHash = await this.executePayment(challenge);
108
+ // Trigger payment hook
109
+ this.onPayment?.(challenge['x-payment-required'].amount, urlString, txHash);
110
+ // Generate payment signature
111
+ const signature = this.generatePaymentSignature(challenge, txHash);
112
+ // Cache receipt
113
+ const receipt = {
114
+ url: urlString,
115
+ challenge: challenge['x-payment-required'],
116
+ txHash,
117
+ signature,
118
+ paidAt: new Date().toISOString(),
119
+ expiresAt: challenge['x-payment-required'].expires,
120
+ };
121
+ await this.cacheReceipt(receipt);
122
+ this.onVerified?.(receipt);
123
+ // Retry request with payment signature
124
+ return this.fetchWithPayment(originalUrl, originalInit, signature);
125
+ }
126
+ /**
127
+ * Execute USDC payment via Circle
128
+ */
129
+ async executePayment(challenge) {
130
+ const { amount, receiver, network } = challenge['x-payment-required'];
131
+ // Determine wallet to use
132
+ let walletId = this.walletId;
133
+ if (!walletId) {
134
+ // Auto-select wallet for the network
135
+ const wallets = await this.wallet.listWallets();
136
+ const wallet = wallets.find(w => w.blockchain === network);
137
+ if (!wallet) {
138
+ throw new Error(`No wallet found for network ${network}`);
139
+ }
140
+ walletId = wallet.id;
141
+ }
142
+ // Send USDC
143
+ const tx = await this.wallet.sendUSDC({
144
+ fromWalletId: walletId,
145
+ toAddress: receiver,
146
+ amount,
147
+ });
148
+ // Wait for transaction to be confirmed
149
+ // In production, you might want to poll for confirmation
150
+ // For now, return transaction ID
151
+ return tx.txHash || tx.id;
152
+ }
153
+ /**
154
+ * Fetch with payment signature header
155
+ */
156
+ async fetchWithPayment(url, init, signature) {
157
+ const headers = new Headers(init?.headers);
158
+ headers.set('x-payment-signature', signature);
159
+ return fetch(url, {
160
+ ...init,
161
+ headers,
162
+ });
163
+ }
164
+ /**
165
+ * Parse payment challenge from 402 response
166
+ */
167
+ async parsePaymentChallenge(response) {
168
+ try {
169
+ const body = await response.json();
170
+ if (body['x-payment-required']) {
171
+ return body;
172
+ }
173
+ return null;
174
+ }
175
+ catch {
176
+ return null;
177
+ }
178
+ }
179
+ /**
180
+ * Generate payment signature from challenge and tx hash
181
+ */
182
+ generatePaymentSignature(challenge, txHash) {
183
+ // In production, this would involve the x402 facilitator
184
+ // For now, create a deterministic signature
185
+ const data = JSON.stringify({
186
+ nonce: challenge['x-payment-required'].nonce,
187
+ amount: challenge['x-payment-required'].amount,
188
+ receiver: challenge['x-payment-required'].receiver,
189
+ txHash,
190
+ });
191
+ // Simple hash-based signature (production would use proper signing)
192
+ return crypto_1.default.createHash('sha256').update(data).digest('hex');
193
+ }
194
+ /**
195
+ * Confirm payment with user (if required)
196
+ */
197
+ async confirmPayment(challenge) {
198
+ // In a real implementation, this would prompt the user
199
+ // For CLI/automated contexts, we can skip confirmation
200
+ // For UI contexts, show a dialog
201
+ const { amount, description } = challenge['x-payment-required'];
202
+ console.log(`\n💳 Payment Required`);
203
+ console.log(` Amount: ${amount} USDC`);
204
+ console.log(` Description: ${description}`);
205
+ console.log(` Confirm? (auto-approved)\n`);
206
+ // Auto-approve for now
207
+ return true;
208
+ }
209
+ /**
210
+ * Get cached receipt for URL
211
+ */
212
+ getCachedReceipt(url) {
213
+ if (!this.cacheReceipts)
214
+ return null;
215
+ const receipt = this.receiptCache.get(url);
216
+ // Check if receipt is still valid
217
+ if (receipt && receipt.expiresAt > Math.floor(Date.now() / 1000)) {
218
+ return receipt;
219
+ }
220
+ // Expired - remove from cache
221
+ if (receipt) {
222
+ this.receiptCache.delete(url);
223
+ }
224
+ return null;
225
+ }
226
+ /**
227
+ * Cache payment receipt
228
+ */
229
+ async cacheReceipt(receipt) {
230
+ if (!this.cacheReceipts)
231
+ return;
232
+ // Add to in-memory cache
233
+ this.receiptCache.set(receipt.url, receipt);
234
+ // Persist to disk
235
+ try {
236
+ await promises_1.default.mkdir(this.cacheDir, { recursive: true });
237
+ const filename = crypto_1.default.createHash('md5').update(receipt.url).digest('hex') + '.json';
238
+ const filepath = path_1.default.join(this.cacheDir, filename);
239
+ await promises_1.default.writeFile(filepath, JSON.stringify(receipt, null, 2));
240
+ }
241
+ catch (error) {
242
+ // Ignore cache write errors
243
+ console.error('Failed to cache receipt:', error);
244
+ }
245
+ }
246
+ /**
247
+ * Load cached receipts from disk
248
+ */
249
+ async loadReceiptCache() {
250
+ try {
251
+ await promises_1.default.mkdir(this.cacheDir, { recursive: true });
252
+ const files = await promises_1.default.readdir(this.cacheDir);
253
+ for (const file of files) {
254
+ if (!file.endsWith('.json'))
255
+ continue;
256
+ try {
257
+ const filepath = path_1.default.join(this.cacheDir, file);
258
+ const data = await promises_1.default.readFile(filepath, 'utf-8');
259
+ const receipt = JSON.parse(data);
260
+ // Only cache if not expired
261
+ if (receipt.expiresAt > Math.floor(Date.now() / 1000)) {
262
+ this.receiptCache.set(receipt.url, receipt);
263
+ }
264
+ else {
265
+ // Delete expired receipt
266
+ await promises_1.default.unlink(filepath);
267
+ }
268
+ }
269
+ catch {
270
+ // Ignore individual file errors
271
+ }
272
+ }
273
+ }
274
+ catch {
275
+ // Ignore cache directory errors
276
+ }
277
+ }
278
+ /**
279
+ * Get receipt history
280
+ */
281
+ async getReceiptHistory() {
282
+ const receipts = [];
283
+ try {
284
+ const files = await promises_1.default.readdir(this.cacheDir);
285
+ for (const file of files) {
286
+ if (!file.endsWith('.json'))
287
+ continue;
288
+ try {
289
+ const filepath = path_1.default.join(this.cacheDir, file);
290
+ const data = await promises_1.default.readFile(filepath, 'utf-8');
291
+ const receipt = JSON.parse(data);
292
+ receipts.push(receipt);
293
+ }
294
+ catch {
295
+ // Ignore individual file errors
296
+ }
297
+ }
298
+ }
299
+ catch {
300
+ // Ignore directory errors
301
+ }
302
+ // Sort by payment date (newest first)
303
+ return receipts.sort((a, b) => new Date(b.paidAt).getTime() - new Date(a.paidAt).getTime());
304
+ }
305
+ /**
306
+ * Clear receipt cache
307
+ */
308
+ async clearCache() {
309
+ this.receiptCache.clear();
310
+ try {
311
+ const files = await promises_1.default.readdir(this.cacheDir);
312
+ for (const file of files) {
313
+ const filepath = path_1.default.join(this.cacheDir, file);
314
+ await promises_1.default.unlink(filepath);
315
+ }
316
+ }
317
+ catch {
318
+ // Ignore errors
319
+ }
320
+ }
321
+ /**
322
+ * Extract URL string from various input types
323
+ */
324
+ getUrlString(url) {
325
+ if (typeof url === 'string') {
326
+ return url;
327
+ }
328
+ else if (url instanceof URL) {
329
+ return url.toString();
330
+ }
331
+ else {
332
+ return url.url;
333
+ }
334
+ }
335
+ }
336
+ exports.X402Client = X402Client;
337
+ /**
338
+ * Helper: Create simple x402 client with minimal config
339
+ */
340
+ function simpleX402Fetch(wallet, maxAutoPayUSDC) {
341
+ return createX402Fetch({
342
+ wallet,
343
+ maxAutoPayUSDC,
344
+ onPayment: (amount, url) => {
345
+ console.log(`💸 Paid ${amount} USDC for ${url}`);
346
+ },
347
+ });
348
+ }
349
+ exports.default = { createX402Fetch, simpleX402Fetch, X402Client };
350
+ //# sourceMappingURL=x402-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-client.js","sourceRoot":"","sources":["../lib/x402-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * x402 Payment Server Middleware
3
+ *
4
+ * Express middleware for HTTP 402 Payment Required.
5
+ * Generates payment challenges and verifies payments via Coinbase facilitator.
6
+ */
7
+ import { Request, Response, NextFunction } from 'express';
8
+ export interface X402ServerConfig {
9
+ facilitatorUrl?: string;
10
+ network: string;
11
+ receiverAddress: string;
12
+ acceptedAssets?: string[];
13
+ challengeExpiry?: number;
14
+ verifyPayment?: (signature: string, amount: string) => Promise<boolean>;
15
+ }
16
+ export interface PaymentChallenge {
17
+ 'x-payment-required': {
18
+ version: '1';
19
+ network: string;
20
+ receiver: string;
21
+ asset: string;
22
+ amount: string;
23
+ description: string;
24
+ expires: number;
25
+ nonce: string;
26
+ };
27
+ }
28
+ /**
29
+ * Configure x402 server globally
30
+ */
31
+ export declare function configureX402Server(config: X402ServerConfig): void;
32
+ /**
33
+ * Create payment challenge
34
+ */
35
+ export declare function createPaymentChallenge(amount: string, description: string, config?: Partial<X402ServerConfig>): PaymentChallenge;
36
+ /**
37
+ * Paywall middleware - require payment to access endpoint
38
+ */
39
+ export declare function paywall(price: string, description: string, config?: Partial<X402ServerConfig>): (req: Request, res: Response, next: NextFunction) => Promise<void>;
40
+ /**
41
+ * Dynamic paywall - determine price at runtime
42
+ */
43
+ export declare function dynamicPaywall(priceFn: (req: Request) => string | Promise<string>, descriptionFn: (req: Request) => string | Promise<string>, config?: Partial<X402ServerConfig>): (req: Request, res: Response, next: NextFunction) => Promise<void>;
44
+ /**
45
+ * Mock verification for testing (accepts any signature)
46
+ */
47
+ export declare function mockVerification(): (signature: string, amount: string) => Promise<boolean>;
48
+ /**
49
+ * Simple signature verification (hash-based)
50
+ * Use only for testing - NOT secure for production
51
+ */
52
+ export declare function simpleVerification(secret: string): (signature: string, amount: string) => Promise<boolean>;
53
+ /**
54
+ * Pricing helper - combine multiple tiers
55
+ */
56
+ export declare class PricingTier {
57
+ private tiers;
58
+ add(key: string, price: string): this;
59
+ get(key: string): string | undefined;
60
+ middleware(keyFn: (req: Request) => string, descriptionFn: (req: Request) => string, config?: Partial<X402ServerConfig>): (req: Request, res: Response, next: NextFunction) => Promise<void>;
61
+ }
62
+ /**
63
+ * Usage-based pricing
64
+ */
65
+ export interface UsageConfig {
66
+ basePrice: string;
67
+ perUnit: string;
68
+ unit: string;
69
+ calculate: (req: Request) => number | Promise<number>;
70
+ }
71
+ export declare function usagePaywall(usage: UsageConfig, config?: Partial<X402ServerConfig>): (req: Request, res: Response, next: NextFunction) => Promise<void>;
72
+ /**
73
+ * Subscription paywall (check for valid subscription)
74
+ */
75
+ export interface SubscriptionConfig {
76
+ getSubscription: (req: Request) => Promise<{
77
+ active: boolean;
78
+ expiresAt: string;
79
+ } | null>;
80
+ price: string;
81
+ period: 'monthly' | 'yearly';
82
+ renewalUrl?: string;
83
+ }
84
+ export declare function subscriptionPaywall(subscription: SubscriptionConfig, config?: Partial<X402ServerConfig>): (req: Request, res: Response, next: NextFunction) => Promise<void>;
85
+ /**
86
+ * Rate-limited paywall (free tier + paid tier)
87
+ */
88
+ export interface RateLimitConfig {
89
+ free: {
90
+ limit: number;
91
+ windowMs: number;
92
+ };
93
+ paid: {
94
+ price: string;
95
+ description: string;
96
+ };
97
+ getUserId: (req: Request) => string;
98
+ }
99
+ export declare function rateLimitedPaywall(rateLimitConfig: RateLimitConfig, config?: Partial<X402ServerConfig>): (req: Request, res: Response, next: NextFunction) => Promise<void>;
100
+ /**
101
+ * Express router with common x402 endpoints
102
+ */
103
+ export declare function createX402Router(): null;
104
+ export declare const PRICING: {
105
+ micro: string;
106
+ small: string;
107
+ medium: string;
108
+ large: string;
109
+ premium: string;
110
+ enterprise: string;
111
+ };
112
+ declare const _default: {
113
+ configureX402Server: typeof configureX402Server;
114
+ createPaymentChallenge: typeof createPaymentChallenge;
115
+ paywall: typeof paywall;
116
+ dynamicPaywall: typeof dynamicPaywall;
117
+ usagePaywall: typeof usagePaywall;
118
+ subscriptionPaywall: typeof subscriptionPaywall;
119
+ rateLimitedPaywall: typeof rateLimitedPaywall;
120
+ mockVerification: typeof mockVerification;
121
+ simpleVerification: typeof simpleVerification;
122
+ PricingTier: typeof PricingTier;
123
+ PRICING: {
124
+ micro: string;
125
+ small: string;
126
+ medium: string;
127
+ large: string;
128
+ premium: string;
129
+ enterprise: string;
130
+ };
131
+ };
132
+ export default _default;
133
+ //# sourceMappingURL=x402-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-server.d.ts","sourceRoot":"","sources":["../lib/x402-server.ts"],"names":[],"mappings":"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"}