paygate 2.0.1 → 4.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.
- package/dist/core.d.ts +52 -30
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +178 -76
- package/dist/core.js.map +1 -1
- package/dist/express.d.ts +12 -16
- package/dist/express.d.ts.map +1 -1
- package/dist/express.js +13 -8
- package/dist/express.js.map +1 -1
- package/dist/fastify.d.ts +19 -15
- package/dist/fastify.d.ts.map +1 -1
- package/dist/fastify.js +20 -12
- package/dist/fastify.js.map +1 -1
- package/dist/index.d.ts +13 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/package.json +9 -11
package/dist/core.d.ts
CHANGED
|
@@ -1,52 +1,66 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* paygate —
|
|
2
|
+
* paygate v3 — core x402 paywall logic.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* v3 change: one config knob (`merchantId`). The SDK fetches the merchant's
|
|
5
|
+
* capability manifest from api.arispay.app on boot, caches it for 5 minutes,
|
|
6
|
+
* and derives wallet/network/asset/trustMinTier from the response.
|
|
7
|
+
*
|
|
8
|
+
* v2 callers (who passed `wallet` + `network` directly) are supported via
|
|
9
|
+
* a compatibility shim until v4.
|
|
10
|
+
*
|
|
11
|
+
* See docs/paygate-v2.md §7.
|
|
6
12
|
*/
|
|
7
13
|
export declare const DEFAULT_FACILITATOR = "https://facilitator.arispay.app";
|
|
14
|
+
export declare const DEFAULT_API_URL = "https://api.arispay.app";
|
|
15
|
+
export declare const CAPABILITY_CACHE_TTL_MS: number;
|
|
16
|
+
/**
|
|
17
|
+
* v3 config.
|
|
18
|
+
*
|
|
19
|
+
* New callers pass `merchantId` (required). The SDK will fetch the
|
|
20
|
+
* merchant's capability manifest and derive everything else.
|
|
21
|
+
*
|
|
22
|
+
* v2 callers can still pass `wallet` + `network`; the shim translates
|
|
23
|
+
* this into a direct PaymentRequirements build without an apps/api
|
|
24
|
+
* lookup. Emits a `console.warn` on first use suggesting migration.
|
|
25
|
+
*/
|
|
8
26
|
export interface PaygateConfig {
|
|
27
|
+
/** v3 — the merchant id (a cuid from /v1/merchants/me). */
|
|
28
|
+
merchantId?: string;
|
|
9
29
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
30
|
+
* v2 compat — USDC wallet address.
|
|
31
|
+
* @deprecated Pass `merchantId` instead. Will be removed in v4.
|
|
12
32
|
*/
|
|
13
|
-
wallet
|
|
33
|
+
wallet?: string;
|
|
14
34
|
/**
|
|
15
|
-
* CAIP-2
|
|
16
|
-
*
|
|
17
|
-
* Accepted short names: base-sepolia, base, ethereum, polygon.
|
|
35
|
+
* v2 compat — CAIP-2 or short name.
|
|
36
|
+
* @deprecated Pass `merchantId` instead. Will be removed in v4.
|
|
18
37
|
*/
|
|
19
|
-
network
|
|
38
|
+
network?: string;
|
|
20
39
|
/**
|
|
21
40
|
* USDC contract address. Auto-derived from network if omitted.
|
|
41
|
+
* Ignored in the v3 path (merchant manifest is authoritative).
|
|
22
42
|
*/
|
|
23
43
|
asset?: string;
|
|
24
|
-
/**
|
|
25
|
-
* Override the default AgFac facilitator URL.
|
|
26
|
-
* Leave unset to use the production ArisPay facilitator.
|
|
27
|
-
*/
|
|
44
|
+
/** Override the default facilitator URL. */
|
|
28
45
|
facilitatorUrl?: string;
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
-
|
|
46
|
+
/** Override the default apps/api URL (for staging / self-hosted). */
|
|
47
|
+
apiUrl?: string;
|
|
48
|
+
/** Facilitator call timeout in ms. Default 30s. */
|
|
32
49
|
timeout?: number;
|
|
33
|
-
/**
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
* Default: 10 probes per 60s per IP.
|
|
37
|
-
*/
|
|
50
|
+
/** Merchant-capability cache TTL in ms. Default 5 min. */
|
|
51
|
+
cacheTtlMs?: number;
|
|
52
|
+
/** Discovery probe rate limit. */
|
|
38
53
|
discoveryRateLimit?: DiscoveryRateLimitConfig;
|
|
39
54
|
}
|
|
40
55
|
export interface RoutePrice {
|
|
56
|
+
/** Price in integer USD cents. 10 = $0.10. */
|
|
57
|
+
priceCents?: number | ((request: unknown) => number | Promise<number>);
|
|
41
58
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*/
|
|
45
|
-
price: number | ((request: unknown) => number | Promise<number>);
|
|
46
|
-
/**
|
|
47
|
-
* Optional description shown in the 402 response.
|
|
48
|
-
* Helps agents understand what they're paying for.
|
|
59
|
+
* v2 compat — floating-point USDC price.
|
|
60
|
+
* @deprecated Use `priceCents` (integer). Will be removed in v4.
|
|
49
61
|
*/
|
|
62
|
+
price?: number | ((request: unknown) => number | Promise<number>);
|
|
63
|
+
/** Optional description shown in the 402 response. */
|
|
50
64
|
description?: string;
|
|
51
65
|
}
|
|
52
66
|
export interface DiscoveryRateLimitConfig {
|
|
@@ -64,12 +78,19 @@ interface X402PaymentAccept {
|
|
|
64
78
|
}
|
|
65
79
|
interface FacilitatorSettleResponse {
|
|
66
80
|
success: boolean;
|
|
67
|
-
|
|
81
|
+
transaction?: string;
|
|
82
|
+
payer?: string;
|
|
68
83
|
errorReason?: string;
|
|
69
84
|
errorMessage?: string;
|
|
70
85
|
}
|
|
71
86
|
export interface PaywallResult {
|
|
72
87
|
paid: boolean;
|
|
88
|
+
receipt?: {
|
|
89
|
+
paid: true;
|
|
90
|
+
txHash?: string;
|
|
91
|
+
trustTier: string;
|
|
92
|
+
merchant: string;
|
|
93
|
+
};
|
|
73
94
|
settlement?: FacilitatorSettleResponse;
|
|
74
95
|
challenge?: {
|
|
75
96
|
statusCode: 402;
|
|
@@ -79,6 +100,7 @@ export interface PaywallResult {
|
|
|
79
100
|
x402Version: number;
|
|
80
101
|
accepts: X402PaymentAccept[];
|
|
81
102
|
facilitator: string;
|
|
103
|
+
trustMinTier: string;
|
|
82
104
|
gasSponsored: boolean;
|
|
83
105
|
};
|
|
84
106
|
};
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
package/dist/core.js
CHANGED
|
@@ -1,31 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* paygate —
|
|
2
|
+
* paygate v3 — core x402 paywall logic.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* v3 change: one config knob (`merchantId`). The SDK fetches the merchant's
|
|
5
|
+
* capability manifest from api.arispay.app on boot, caches it for 5 minutes,
|
|
6
|
+
* and derives wallet/network/asset/trustMinTier from the response.
|
|
7
|
+
*
|
|
8
|
+
* v2 callers (who passed `wallet` + `network` directly) are supported via
|
|
9
|
+
* a compatibility shim until v4.
|
|
10
|
+
*
|
|
11
|
+
* See docs/paygate-v2.md §7.
|
|
6
12
|
*/
|
|
7
13
|
// ── Default facilitator ─────────────────────────────
|
|
8
|
-
// The canonical ArisPay x402 facilitator service. Override via
|
|
9
|
-
// `facilitatorUrl` in config if you run your own.
|
|
10
14
|
export const DEFAULT_FACILITATOR = 'https://facilitator.arispay.app';
|
|
15
|
+
export const DEFAULT_API_URL = 'https://api.arispay.app';
|
|
16
|
+
export const CAPABILITY_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
11
17
|
// ── Known USDC addresses per network ───────────────
|
|
12
18
|
const USDC_ADDRESSES = {
|
|
13
|
-
'eip155:84532': '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Base Sepolia
|
|
19
|
+
'eip155:84532': '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Base Sepolia
|
|
14
20
|
'eip155:8453': '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // Base Mainnet
|
|
15
21
|
'eip155:1': '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // Ethereum
|
|
16
22
|
'eip155:137': '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', // Polygon
|
|
17
23
|
};
|
|
18
|
-
// Short name → CAIP-2 mapping so merchants can say network: 'base' instead of 'eip155:8453'
|
|
19
24
|
const NETWORK_ALIASES = {
|
|
20
25
|
'base-sepolia': 'eip155:84532',
|
|
21
26
|
'base': 'eip155:8453',
|
|
22
27
|
'ethereum': 'eip155:1',
|
|
23
28
|
'polygon': 'eip155:137',
|
|
24
29
|
};
|
|
25
|
-
/** Normalize network to CAIP-2 format. Accepts both short names and CAIP-2. */
|
|
26
30
|
function normalizeNetwork(network) {
|
|
27
31
|
return NETWORK_ALIASES[network] ?? network;
|
|
28
32
|
}
|
|
33
|
+
const USDC_DOMAIN_NAMES = {
|
|
34
|
+
'eip155:84532': 'USDC',
|
|
35
|
+
'eip155:8453': 'USD Coin',
|
|
36
|
+
'eip155:1': 'USD Coin',
|
|
37
|
+
'eip155:137': 'USD Coin',
|
|
38
|
+
};
|
|
29
39
|
const DEFAULT_DISCOVERY_LIMIT = {
|
|
30
40
|
maxProbes: 10,
|
|
31
41
|
windowMs: 60_000,
|
|
@@ -46,69 +56,148 @@ function checkDiscoveryRateLimit(key, config = DEFAULT_DISCOVERY_LIMIT) {
|
|
|
46
56
|
timestamps.push(now);
|
|
47
57
|
return true;
|
|
48
58
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
'
|
|
57
|
-
}
|
|
58
|
-
function
|
|
59
|
-
|
|
59
|
+
const capabilityCache = new Map();
|
|
60
|
+
let v2ShimWarned = false;
|
|
61
|
+
function warnV2Shim() {
|
|
62
|
+
if (v2ShimWarned)
|
|
63
|
+
return;
|
|
64
|
+
v2ShimWarned = true;
|
|
65
|
+
// eslint-disable-next-line no-console
|
|
66
|
+
console.warn('[paygate] v2 config detected (`wallet` + `network`). Pass `merchantId` instead; v2 will be removed in v4. See https://paygate.arispay.app/docs#v3-migration');
|
|
67
|
+
}
|
|
68
|
+
async function fetchMerchantConfig(config) {
|
|
69
|
+
if (!config.merchantId) {
|
|
70
|
+
throw new Error('paygate: merchantId is required for v3 flow');
|
|
71
|
+
}
|
|
72
|
+
const cached = capabilityCache.get(config.merchantId);
|
|
73
|
+
const cacheTtl = config.cacheTtlMs ?? CAPABILITY_CACHE_TTL_MS;
|
|
74
|
+
if (cached && Date.now() - cached.fetchedAt < cacheTtl) {
|
|
75
|
+
return cached;
|
|
76
|
+
}
|
|
77
|
+
const apiUrl = config.apiUrl ?? DEFAULT_API_URL;
|
|
78
|
+
const url = `${apiUrl}/v1/merchants/${encodeURIComponent(config.merchantId)}/capabilities`;
|
|
79
|
+
let res;
|
|
80
|
+
try {
|
|
81
|
+
res = await fetch(url, {
|
|
82
|
+
signal: AbortSignal.timeout(config.timeout ?? 30_000),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
if (cached) {
|
|
87
|
+
// Extend stale cache on network blip — don't take down the merchant.
|
|
88
|
+
return { ...cached, fetchedAt: Date.now() - cacheTtl + 60_000 };
|
|
89
|
+
}
|
|
90
|
+
throw new Error(`paygate: failed to fetch merchant capabilities: ${err instanceof Error ? err.message : String(err)}`);
|
|
91
|
+
}
|
|
92
|
+
if (res.status === 404) {
|
|
93
|
+
capabilityCache.delete(config.merchantId);
|
|
94
|
+
throw new Error(`paygate: merchantId "${config.merchantId}" not found at ${apiUrl}`);
|
|
95
|
+
}
|
|
96
|
+
if (res.status >= 500 && cached) {
|
|
97
|
+
return { ...cached, fetchedAt: Date.now() - cacheTtl + 60_000 };
|
|
98
|
+
}
|
|
99
|
+
if (!res.ok) {
|
|
100
|
+
throw new Error(`paygate: capability fetch failed HTTP ${res.status}`);
|
|
101
|
+
}
|
|
102
|
+
const manifest = (await res.json());
|
|
103
|
+
const rail = manifest.rails?.[0];
|
|
104
|
+
if (!rail) {
|
|
105
|
+
throw new Error(`paygate: merchant "${config.merchantId}" has no active payout rail — add a PayoutMethod in the dashboard`);
|
|
106
|
+
}
|
|
107
|
+
const resolved = {
|
|
108
|
+
network: rail.network,
|
|
109
|
+
asset: rail.asset,
|
|
110
|
+
payTo: rail.payTo,
|
|
111
|
+
facilitator: rail.facilitator ?? DEFAULT_FACILITATOR,
|
|
112
|
+
trustMinTier: manifest.trust?.minTier ?? 'any',
|
|
113
|
+
slug: manifest.merchant.slug,
|
|
114
|
+
fetchedAt: Date.now(),
|
|
115
|
+
};
|
|
116
|
+
capabilityCache.set(config.merchantId, resolved);
|
|
117
|
+
return resolved;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* v2 shim — synthesise a ResolvedMerchantConfig from `wallet` + `network`.
|
|
121
|
+
* No apps/api round-trip; trustMinTier defaults to "any" because the
|
|
122
|
+
* caller didn't configure anything and v2 never knew about tiers.
|
|
123
|
+
*/
|
|
124
|
+
function resolveV2Shim(config) {
|
|
125
|
+
warnV2Shim();
|
|
126
|
+
if (!config.wallet) {
|
|
127
|
+
throw new Error('paygate: wallet is required in v2-shim mode');
|
|
128
|
+
}
|
|
129
|
+
if (!config.network) {
|
|
130
|
+
throw new Error('paygate: network is required in v2-shim mode');
|
|
131
|
+
}
|
|
132
|
+
const network = normalizeNetwork(config.network);
|
|
133
|
+
const asset = config.asset ?? USDC_ADDRESSES[network];
|
|
134
|
+
if (!asset) {
|
|
135
|
+
throw new Error(`paygate: unsupported network ${network} — no known USDC address`);
|
|
136
|
+
}
|
|
60
137
|
return {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
payTo: opts.payTo,
|
|
69
|
-
extra: { name: domainName, version: '2' },
|
|
70
|
-
},
|
|
71
|
-
],
|
|
138
|
+
network,
|
|
139
|
+
asset,
|
|
140
|
+
payTo: config.wallet,
|
|
141
|
+
facilitator: config.facilitatorUrl ?? DEFAULT_FACILITATOR,
|
|
142
|
+
trustMinTier: 'any',
|
|
143
|
+
slug: 'v2-shim',
|
|
144
|
+
fetchedAt: Date.now(),
|
|
72
145
|
};
|
|
73
146
|
}
|
|
147
|
+
// ── Price resolution ───────────────────────────────
|
|
148
|
+
async function resolvePriceCents(routePrice, request) {
|
|
149
|
+
const v3 = routePrice.priceCents;
|
|
150
|
+
if (v3 !== undefined) {
|
|
151
|
+
const cents = typeof v3 === 'function' ? await v3(request) : v3;
|
|
152
|
+
if (!Number.isInteger(cents) || cents < 1) {
|
|
153
|
+
throw new Error(`paygate: priceCents must be a positive integer. Got ${JSON.stringify(cents)}. If you meant $0.10, use priceCents: 10.`);
|
|
154
|
+
}
|
|
155
|
+
return cents;
|
|
156
|
+
}
|
|
157
|
+
const v2 = routePrice.price;
|
|
158
|
+
if (v2 !== undefined) {
|
|
159
|
+
warnV2Shim();
|
|
160
|
+
const dollars = typeof v2 === 'function' ? await v2(request) : v2;
|
|
161
|
+
if (typeof dollars !== 'number' || dollars <= 0) {
|
|
162
|
+
throw new Error('paygate: price must be a positive number');
|
|
163
|
+
}
|
|
164
|
+
return Math.round(dollars * 100);
|
|
165
|
+
}
|
|
166
|
+
throw new Error('paygate: RoutePrice requires `priceCents` (preferred) or `price` (v2 compat)');
|
|
167
|
+
}
|
|
74
168
|
function decodePaymentHeader(header) {
|
|
75
169
|
try {
|
|
76
170
|
const decoded = Buffer.from(header, 'base64').toString('utf8');
|
|
77
171
|
return JSON.parse(decoded);
|
|
78
172
|
}
|
|
79
173
|
catch {
|
|
80
|
-
// Try raw JSON
|
|
81
174
|
return JSON.parse(header);
|
|
82
175
|
}
|
|
83
176
|
}
|
|
84
177
|
// ── Core paywall handler ───────────────────────────
|
|
85
178
|
export async function handlePaywall(config, routePrice, resourceUrl, paymentHeader, clientIp) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
},
|
|
93
|
-
};
|
|
179
|
+
// Resolve the merchant: v3 fetch vs v2 shim
|
|
180
|
+
let resolved;
|
|
181
|
+
try {
|
|
182
|
+
resolved = config.merchantId
|
|
183
|
+
? await fetchMerchantConfig(config)
|
|
184
|
+
: resolveV2Shim(config);
|
|
94
185
|
}
|
|
95
|
-
|
|
96
|
-
const asset = config.asset || USDC_ADDRESSES[network];
|
|
97
|
-
const facilitatorUrl = config.facilitatorUrl || DEFAULT_FACILITATOR;
|
|
98
|
-
if (!asset) {
|
|
186
|
+
catch (err) {
|
|
99
187
|
return {
|
|
100
188
|
paid: false,
|
|
101
189
|
error: {
|
|
102
190
|
statusCode: 500,
|
|
103
|
-
body: {
|
|
191
|
+
body: {
|
|
192
|
+
error: err instanceof Error ? err.message : 'paygate: configuration error',
|
|
193
|
+
code: 'PAYGATE_CONFIG',
|
|
194
|
+
},
|
|
104
195
|
},
|
|
105
196
|
};
|
|
106
197
|
}
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const priceBaseUnits = Math.round(resolvedPrice * 1e6).toString();
|
|
111
|
-
// No payment header → return 402 challenge
|
|
198
|
+
const priceCents = await resolvePriceCents(routePrice, undefined);
|
|
199
|
+
const priceBaseUnits = (BigInt(priceCents) * BigInt(10_000)).toString();
|
|
200
|
+
// No payment header → 402 challenge
|
|
112
201
|
if (!paymentHeader) {
|
|
113
202
|
if (clientIp) {
|
|
114
203
|
if (!checkDiscoveryRateLimit(clientIp, config.discoveryRateLimit)) {
|
|
@@ -116,40 +205,44 @@ export async function handlePaywall(config, routePrice, resourceUrl, paymentHead
|
|
|
116
205
|
paid: false,
|
|
117
206
|
error: {
|
|
118
207
|
statusCode: 429,
|
|
119
|
-
body: {
|
|
208
|
+
body: {
|
|
209
|
+
error: 'Too many discovery requests. Try again later.',
|
|
210
|
+
code: 'DISCOVERY_RATE_LIMITED',
|
|
211
|
+
},
|
|
120
212
|
},
|
|
121
213
|
};
|
|
122
214
|
}
|
|
123
215
|
}
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
216
|
+
const domainName = USDC_DOMAIN_NAMES[resolved.network] ?? 'USD Coin';
|
|
217
|
+
const accepts = [
|
|
218
|
+
{
|
|
219
|
+
scheme: 'exact',
|
|
220
|
+
network: resolved.network,
|
|
221
|
+
maxAmountRequired: priceBaseUnits,
|
|
222
|
+
resource: resourceUrl,
|
|
223
|
+
asset: resolved.asset,
|
|
224
|
+
payTo: resolved.payTo,
|
|
225
|
+
extra: { name: domainName, version: '2' },
|
|
226
|
+
},
|
|
227
|
+
];
|
|
228
|
+
const requirementsStr = JSON.stringify({ x402Version: 2, accepts }).replace(/[\r\n\0]/g, ' ');
|
|
135
229
|
return {
|
|
136
230
|
paid: false,
|
|
137
231
|
challenge: {
|
|
138
232
|
statusCode: 402,
|
|
139
|
-
headers: {
|
|
140
|
-
'X-Payment-Requirements': requirementsStr,
|
|
141
|
-
},
|
|
233
|
+
headers: { 'X-Payment-Requirements': requirementsStr },
|
|
142
234
|
body: {
|
|
143
235
|
error: 'Payment Required',
|
|
144
|
-
x402Version:
|
|
145
|
-
accepts
|
|
146
|
-
facilitator:
|
|
236
|
+
x402Version: 2,
|
|
237
|
+
accepts,
|
|
238
|
+
facilitator: resolved.facilitator,
|
|
239
|
+
trustMinTier: resolved.trustMinTier,
|
|
147
240
|
gasSponsored: true,
|
|
148
241
|
},
|
|
149
242
|
},
|
|
150
243
|
};
|
|
151
244
|
}
|
|
152
|
-
// Decode X-Payment
|
|
245
|
+
// Decode X-Payment
|
|
153
246
|
let paymentPayload;
|
|
154
247
|
try {
|
|
155
248
|
paymentPayload = decodePaymentHeader(paymentHeader);
|
|
@@ -164,26 +257,26 @@ export async function handlePaywall(config, routePrice, resourceUrl, paymentHead
|
|
|
164
257
|
};
|
|
165
258
|
}
|
|
166
259
|
// Settle via facilitator
|
|
167
|
-
const domainName = USDC_DOMAIN_NAMES[network] ?? 'USD Coin';
|
|
260
|
+
const domainName = USDC_DOMAIN_NAMES[resolved.network] ?? 'USD Coin';
|
|
168
261
|
const accept = {
|
|
169
262
|
scheme: 'exact',
|
|
170
|
-
network,
|
|
263
|
+
network: resolved.network,
|
|
171
264
|
maxAmountRequired: priceBaseUnits,
|
|
172
265
|
resource: resourceUrl,
|
|
173
|
-
asset,
|
|
174
|
-
payTo:
|
|
266
|
+
asset: resolved.asset,
|
|
267
|
+
payTo: resolved.payTo,
|
|
175
268
|
extra: { name: domainName, version: '2' },
|
|
176
269
|
};
|
|
177
270
|
try {
|
|
178
|
-
const res = await fetch(`${
|
|
271
|
+
const res = await fetch(`${resolved.facilitator}/settle`, {
|
|
179
272
|
method: 'POST',
|
|
180
273
|
headers: { 'Content-Type': 'application/json' },
|
|
181
274
|
body: JSON.stringify({
|
|
182
|
-
x402Version:
|
|
275
|
+
x402Version: 2,
|
|
183
276
|
paymentPayload,
|
|
184
277
|
paymentRequirements: accept,
|
|
185
278
|
}),
|
|
186
|
-
signal: AbortSignal.timeout(config.timeout
|
|
279
|
+
signal: AbortSignal.timeout(config.timeout ?? 30_000),
|
|
187
280
|
});
|
|
188
281
|
const settlement = (await res.json());
|
|
189
282
|
if (!settlement.success) {
|
|
@@ -198,7 +291,16 @@ export async function handlePaywall(config, routePrice, resourceUrl, paymentHead
|
|
|
198
291
|
},
|
|
199
292
|
};
|
|
200
293
|
}
|
|
201
|
-
return {
|
|
294
|
+
return {
|
|
295
|
+
paid: true,
|
|
296
|
+
settlement,
|
|
297
|
+
receipt: {
|
|
298
|
+
paid: true,
|
|
299
|
+
txHash: settlement.transaction,
|
|
300
|
+
trustTier: 'any', // SDK path has no tier check in v1
|
|
301
|
+
merchant: resolved.slug,
|
|
302
|
+
},
|
|
303
|
+
};
|
|
202
304
|
}
|
|
203
305
|
catch (err) {
|
|
204
306
|
const message = err instanceof Error ? err.message : 'Facilitator unreachable';
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
package/dist/express.d.ts
CHANGED
|
@@ -1,36 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* paygate/express — Express middleware for x402 paywalls.
|
|
2
|
+
* paygate/express — Express middleware for x402 paywalls (v3).
|
|
3
3
|
*
|
|
4
|
-
* Usage:
|
|
4
|
+
* Usage (v3):
|
|
5
5
|
* import express from 'express';
|
|
6
6
|
* import { paygate } from 'paygate/express';
|
|
7
7
|
*
|
|
8
8
|
* const app = express();
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* // v3: one knob — merchantId. SDK fetches the rest from api.arispay.app.
|
|
11
|
+
* const pw = paygate({ merchantId: process.env.PAYGATE_MERCHANT_ID });
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
-
* app.get('/api/data', pw({ price: 0.10 }), (req, res) => {
|
|
13
|
+
* app.get('/api/data', pw({ priceCents: 10 }), (req, res) => {
|
|
14
14
|
* res.json({ data: 'premium content' });
|
|
15
15
|
* });
|
|
16
16
|
*
|
|
17
|
-
* // Dynamic pricing
|
|
18
|
-
* app.post('/api/
|
|
19
|
-
*
|
|
20
|
-
* description: 'AI
|
|
21
|
-
* }),
|
|
22
|
-
*
|
|
23
|
-
*
|
|
17
|
+
* // Dynamic pricing
|
|
18
|
+
* app.post('/api/analyse', pw({
|
|
19
|
+
* priceCents: (req) => req.body.deep ? 50 : 10,
|
|
20
|
+
* description: 'AI analysis',
|
|
21
|
+
* }), handler);
|
|
22
|
+
*
|
|
23
|
+
* v2 config (`wallet` + `network`) still works via the compat shim.
|
|
24
24
|
*/
|
|
25
25
|
import type { RequestHandler } from 'express';
|
|
26
26
|
import { type PaygateConfig, type RoutePrice } from './core.js';
|
|
27
27
|
export type { PaygateConfig, RoutePrice };
|
|
28
28
|
/**
|
|
29
29
|
* Create a paywall middleware factory.
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* const pw = paygate({ wallet: '0x...' });
|
|
33
|
-
* app.get('/api/data', pw({ price: 0.10 }), handler);
|
|
34
30
|
*/
|
|
35
31
|
export declare function paygate(config: PaygateConfig): (routePrice: RoutePrice) => RequestHandler;
|
|
36
32
|
//# sourceMappingURL=express.d.ts.map
|
package/dist/express.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAmC,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAiB,MAAM,WAAW,CAAC;AAE/E,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAQ1C
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAmC,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAiB,MAAM,WAAW,CAAC;AAE/E,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAQ1C;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,IACnB,YAAY,UAAU,KAAG,cAAc,CAsChE"}
|
package/dist/express.js
CHANGED
|
@@ -7,10 +7,6 @@ function getClientIp(req) {
|
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* Create a paywall middleware factory.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* const pw = paygate({ wallet: '0x...' });
|
|
13
|
-
* app.get('/api/data', pw({ price: 0.10 }), handler);
|
|
14
10
|
*/
|
|
15
11
|
export function paygate(config) {
|
|
16
12
|
return function paywall(routePrice) {
|
|
@@ -18,12 +14,21 @@ export function paygate(config) {
|
|
|
18
14
|
const resourceUrl = `${req.protocol}://${req.get('host')}${req.originalUrl}`;
|
|
19
15
|
const paymentHeader = req.headers['x-payment'];
|
|
20
16
|
const clientIp = getClientIp(req);
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
// Resolve dynamic price functions against the real request.
|
|
18
|
+
const resolved = { ...routePrice };
|
|
19
|
+
if (typeof routePrice.priceCents === 'function') {
|
|
20
|
+
resolved.priceCents = await routePrice.priceCents(req);
|
|
21
|
+
}
|
|
22
|
+
if (typeof routePrice.price === 'function') {
|
|
23
|
+
resolved.price = await routePrice.price(req);
|
|
24
|
+
}
|
|
24
25
|
const result = await handlePaywall(config, resolved, resourceUrl, paymentHeader, clientIp);
|
|
25
26
|
if (result.paid) {
|
|
26
|
-
|
|
27
|
+
// Attach settlement + emit receipt header — body stays pristine
|
|
28
|
+
req.paygate = result.receipt ?? { paid: true };
|
|
29
|
+
if (result.receipt) {
|
|
30
|
+
res.setHeader('X-Paygate-Receipt', JSON.stringify(result.receipt));
|
|
31
|
+
}
|
|
27
32
|
return next();
|
|
28
33
|
}
|
|
29
34
|
if (result.challenge) {
|
package/dist/express.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAuC,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/E,SAAS,WAAW,CAAC,GAAY;IAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjD,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IAC1E,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC;AACzD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAuC,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/E,SAAS,WAAW,CAAC,GAAY;IAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjD,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IAC1E,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAqB;IAC3C,OAAO,SAAS,OAAO,CAAC,UAAsB;QAC5C,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YAC/D,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAC7E,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAuB,CAAC;YACrE,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAElC,4DAA4D;YAC5D,MAAM,QAAQ,GAAe,EAAE,GAAG,UAAU,EAAE,CAAC;YAC/C,IAAI,OAAO,UAAU,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBAChD,QAAQ,CAAC,UAAU,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC3C,QAAQ,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;YAE3F,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,gEAAgE;gBAC/D,GAAW,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACxD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC5B,CAAC;gBACD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/fastify.d.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* paygate/fastify — Fastify plugin for x402 paywalls.
|
|
2
|
+
* paygate/fastify — Fastify plugin for x402 paywalls (v3).
|
|
3
3
|
*
|
|
4
|
-
* Usage:
|
|
4
|
+
* Usage (v3):
|
|
5
5
|
* import Fastify from 'fastify';
|
|
6
6
|
* import paygate from 'paygate/fastify';
|
|
7
7
|
*
|
|
8
8
|
* const app = Fastify();
|
|
9
|
+
* await app.register(paygate, { merchantId: process.env.PAYGATE_MERCHANT_ID });
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
+
* // Route-config-driven paywall
|
|
12
|
+
* app.get('/api/data',
|
|
13
|
+
* { config: { paygate: { priceCents: 10 } } },
|
|
14
|
+
* async (req, reply) => reply.send({ data: 'premium' })
|
|
15
|
+
* );
|
|
11
16
|
*
|
|
12
|
-
* //
|
|
13
|
-
* app.get('/api/
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* // Or imperative API:
|
|
18
|
-
* app.get('/api/joke', async (req, reply) => {
|
|
19
|
-
* const { paid } = await req.x402Pay({ price: 0.05 });
|
|
20
|
-
* if (!paid) return; // 402 already sent
|
|
21
|
-
* reply.send({ joke: '...' });
|
|
17
|
+
* // Or imperative
|
|
18
|
+
* app.get('/api/premium', async (req, reply) => {
|
|
19
|
+
* const { paid } = await req.paygatePay({ priceCents: 25 });
|
|
20
|
+
* if (!paid) return;
|
|
21
|
+
* reply.send({ data: '...' });
|
|
22
22
|
* });
|
|
23
23
|
*/
|
|
24
24
|
import type { FastifyPluginAsync } from 'fastify';
|
|
@@ -26,15 +26,19 @@ import { type PaygateConfig, type RoutePrice } from './core.js';
|
|
|
26
26
|
export type { PaygateConfig, RoutePrice };
|
|
27
27
|
declare module 'fastify' {
|
|
28
28
|
interface FastifyRequest {
|
|
29
|
-
|
|
29
|
+
paygate?: {
|
|
30
30
|
paid: boolean;
|
|
31
31
|
txHash?: string;
|
|
32
|
+
trustTier?: string;
|
|
33
|
+
merchant?: string;
|
|
32
34
|
};
|
|
33
|
-
|
|
35
|
+
paygatePay: (routePrice: RoutePrice) => Promise<{
|
|
34
36
|
paid: boolean;
|
|
35
37
|
}>;
|
|
36
38
|
}
|
|
37
39
|
interface FastifyContextConfig {
|
|
40
|
+
paygate?: RoutePrice;
|
|
41
|
+
/** @deprecated — v2 key. Use `paygate` instead. */
|
|
38
42
|
x402?: RoutePrice;
|
|
39
43
|
}
|
|
40
44
|
}
|
package/dist/fastify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAEV,kBAAkB,EAGnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAiB,MAAM,WAAW,CAAC;AAE/E,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAE1C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAEV,kBAAkB,EAGnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAiB,MAAM,WAAW,CAAC;AAE/E,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAE1C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,OAAO,CAAC,EAAE;YACR,IAAI,EAAE,OAAO,CAAC;YACd,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC;YAAE,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACpE;IACD,UAAU,oBAAoB;QAC5B,OAAO,CAAC,EAAE,UAAU,CAAC;QACrB,mDAAmD;QACnD,IAAI,CAAC,EAAE,UAAU,CAAC;KACnB;CACF;AAsBD,QAAA,MAAM,aAAa,EAAE,kBAAkB,CAAC,aAAa,CA+CpD,CAAC;AAEF,eAAe,aAAa,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/fastify.js
CHANGED
|
@@ -5,24 +5,31 @@ function getClientIp(request) {
|
|
|
5
5
|
return forwarded.split(',')[0].trim();
|
|
6
6
|
return request.ip;
|
|
7
7
|
}
|
|
8
|
-
async function
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
async function resolveRoutePrice(routePrice, request) {
|
|
9
|
+
const out = { ...routePrice };
|
|
10
|
+
if (typeof routePrice.priceCents === 'function') {
|
|
11
|
+
out.priceCents = await routePrice.priceCents(request);
|
|
12
|
+
}
|
|
13
|
+
if (typeof routePrice.price === 'function') {
|
|
14
|
+
out.price = await routePrice.price(request);
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
13
17
|
}
|
|
14
18
|
const paygatePlugin = async (fastify, config) => {
|
|
15
|
-
fastify.decorateRequest('
|
|
16
|
-
fastify.decorateRequest('
|
|
19
|
+
fastify.decorateRequest('paygate', undefined);
|
|
20
|
+
fastify.decorateRequest('paygatePay', (async (_routePrice) => ({ paid: false })));
|
|
17
21
|
fastify.addHook('onRequest', async (request, reply) => {
|
|
18
22
|
const clientIp = getClientIp(request);
|
|
19
|
-
request.
|
|
23
|
+
request.paygatePay = async (routePrice) => {
|
|
20
24
|
const resourceUrl = `${request.protocol}://${request.hostname}${request.url}`;
|
|
21
25
|
const paymentHeader = request.headers['x-payment'];
|
|
22
|
-
const resolved = await
|
|
26
|
+
const resolved = await resolveRoutePrice(routePrice, request);
|
|
23
27
|
const result = await handlePaywall(config, resolved, resourceUrl, paymentHeader, clientIp);
|
|
24
28
|
if (result.paid) {
|
|
25
|
-
request.
|
|
29
|
+
request.paygate = result.receipt ?? { paid: true };
|
|
30
|
+
if (result.receipt) {
|
|
31
|
+
reply.header('X-Paygate-Receipt', JSON.stringify(result.receipt));
|
|
32
|
+
}
|
|
26
33
|
return { paid: true };
|
|
27
34
|
}
|
|
28
35
|
if (result.challenge) {
|
|
@@ -38,9 +45,10 @@ const paygatePlugin = async (fastify, config) => {
|
|
|
38
45
|
}
|
|
39
46
|
return { paid: false };
|
|
40
47
|
};
|
|
41
|
-
const
|
|
48
|
+
const ctx = request.routeOptions?.config ?? {};
|
|
49
|
+
const routePrice = (ctx.paygate ?? ctx.x402);
|
|
42
50
|
if (routePrice) {
|
|
43
|
-
const { paid } = await request.
|
|
51
|
+
const { paid } = await request.paygatePay(routePrice);
|
|
44
52
|
if (!paid)
|
|
45
53
|
return;
|
|
46
54
|
}
|
package/dist/fastify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAuC,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* paygate — x402 paywall middleware for Express and Fastify.
|
|
2
|
+
* paygate v3 — x402 paywall middleware for Express and Fastify.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Accept payment from AI agents in two lines of code. Merchants don't
|
|
5
|
+
* hold keys, agents pay per-request, USDC settles in seconds on Base
|
|
6
|
+
* mainnet via ArisPay's facilitator.
|
|
6
7
|
*
|
|
7
8
|
* Express:
|
|
8
9
|
* import { paygate } from 'paygate/express';
|
|
9
|
-
* const pw = paygate({
|
|
10
|
-
* app.get('/api/data', pw({
|
|
10
|
+
* const pw = paygate({ merchantId: process.env.PAYGATE_MERCHANT_ID });
|
|
11
|
+
* app.get('/api/data', pw({ priceCents: 10 }), handler);
|
|
11
12
|
*
|
|
12
13
|
* Fastify:
|
|
13
14
|
* import paygate from 'paygate/fastify';
|
|
14
|
-
* await app.register(paygate, {
|
|
15
|
-
* app.get('/api/data', { config: {
|
|
15
|
+
* await app.register(paygate, { merchantId: process.env.PAYGATE_MERCHANT_ID });
|
|
16
|
+
* app.get('/api/data', { config: { paygate: { priceCents: 10 } } }, handler);
|
|
17
|
+
*
|
|
18
|
+
* v2 callers (`wallet` + `network` + `price`) keep working via a compat
|
|
19
|
+
* shim; a deprecation warning fires on first use. The shim is removed
|
|
20
|
+
* in v4.
|
|
16
21
|
*/
|
|
17
|
-
export { handlePaywall, DEFAULT_FACILITATOR } from './core.js';
|
|
22
|
+
export { handlePaywall, DEFAULT_FACILITATOR, DEFAULT_API_URL } from './core.js';
|
|
18
23
|
export type { PaygateConfig, RoutePrice, PaywallResult, DiscoveryRateLimitConfig } from './core.js';
|
|
19
24
|
export { paygate } from './express.js';
|
|
20
25
|
export { paygatePlugin } from './fastify.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGpG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* paygate — x402 paywall middleware for Express and Fastify.
|
|
2
|
+
* paygate v3 — x402 paywall middleware for Express and Fastify.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Accept payment from AI agents in two lines of code. Merchants don't
|
|
5
|
+
* hold keys, agents pay per-request, USDC settles in seconds on Base
|
|
6
|
+
* mainnet via ArisPay's facilitator.
|
|
6
7
|
*
|
|
7
8
|
* Express:
|
|
8
9
|
* import { paygate } from 'paygate/express';
|
|
9
|
-
* const pw = paygate({
|
|
10
|
-
* app.get('/api/data', pw({
|
|
10
|
+
* const pw = paygate({ merchantId: process.env.PAYGATE_MERCHANT_ID });
|
|
11
|
+
* app.get('/api/data', pw({ priceCents: 10 }), handler);
|
|
11
12
|
*
|
|
12
13
|
* Fastify:
|
|
13
14
|
* import paygate from 'paygate/fastify';
|
|
14
|
-
* await app.register(paygate, {
|
|
15
|
-
* app.get('/api/data', { config: {
|
|
15
|
+
* await app.register(paygate, { merchantId: process.env.PAYGATE_MERCHANT_ID });
|
|
16
|
+
* app.get('/api/data', { config: { paygate: { priceCents: 10 } } }, handler);
|
|
17
|
+
*
|
|
18
|
+
* v2 callers (`wallet` + `network` + `price`) keep working via a compat
|
|
19
|
+
* shim; a deprecation warning fires on first use. The shim is removed
|
|
20
|
+
* in v4.
|
|
16
21
|
*/
|
|
17
22
|
// Core (framework-agnostic)
|
|
18
|
-
export { handlePaywall, DEFAULT_FACILITATOR } from './core.js';
|
|
23
|
+
export { handlePaywall, DEFAULT_FACILITATOR, DEFAULT_API_URL } from './core.js';
|
|
19
24
|
// Express
|
|
20
25
|
export { paygate } from './express.js';
|
|
21
26
|
// Fastify
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGhF,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paygate",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
|
+
"description": "Accept payment from AI agents in two lines of code. Gate any Express or Fastify route with an x402 paywall backed by ArisPay — merchants don't hold keys, agents pay per-request, USDC settles in seconds on Base mainnet.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -19,14 +19,7 @@
|
|
|
19
19
|
"types": "./dist/fastify.d.ts"
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
|
-
"
|
|
23
|
-
"build": "tsc",
|
|
24
|
-
"dev": "tsc --watch",
|
|
25
|
-
"prepublishOnly": "pnpm build"
|
|
26
|
-
},
|
|
27
|
-
"dependencies": {
|
|
28
|
-
"ethers": "^6.13.0"
|
|
29
|
-
},
|
|
22
|
+
"dependencies": {},
|
|
30
23
|
"peerDependencies": {
|
|
31
24
|
"express": ">=4.0.0",
|
|
32
25
|
"fastify": ">=4.0.0"
|
|
@@ -74,5 +67,10 @@
|
|
|
74
67
|
"repository": {
|
|
75
68
|
"type": "git",
|
|
76
69
|
"url": "https://github.com/arispay-inc/ArisPay"
|
|
70
|
+
},
|
|
71
|
+
"scripts": {
|
|
72
|
+
"build": "tsc",
|
|
73
|
+
"dev": "tsc --watch",
|
|
74
|
+
"type-check": "tsc --noEmit"
|
|
77
75
|
}
|
|
78
|
-
}
|
|
76
|
+
}
|