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 CHANGED
@@ -1,52 +1,66 @@
1
1
  /**
2
- * paygate — Core x402 paywall logic.
2
+ * paygate v3 core x402 paywall logic.
3
3
  *
4
- * Framework-agnostic. Express and Fastify adapters wrap this.
5
- * Self-contained no monorepo dependencies.
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
- * Your USDC wallet address — where payments are sent.
11
- * Required.
30
+ * v2 compat — USDC wallet address.
31
+ * @deprecated Pass `merchantId` instead. Will be removed in v4.
12
32
  */
13
- wallet: string;
33
+ wallet?: string;
14
34
  /**
15
- * CAIP-2 network ID (e.g. "eip155:8453" for Base Mainnet) or short name
16
- * (e.g. "base", "base-sepolia"). Required no implicit default.
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: string;
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
- * Timeout for facilitator calls in ms. Default: 30000.
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
- * Rate limit for unpaid discovery probes (402 responses without payment).
35
- * Agents can probe pricing without a wallet, but this prevents abuse.
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
- * Price in USDC (e.g. 0.10 for $0.10).
43
- * Can be a static number or a function for dynamic pricing.
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
- txHash?: string;
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
  };
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AA0BrE,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;CAC/C;AAED,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjE;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA+CD,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,UAAU,yBAAyB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAgDD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC,SAAS,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE;YACJ,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,iBAAiB,EAAE,CAAC;YAC7B,WAAW,EAAE,MAAM,CAAC;YACpB,YAAY,EAAE,OAAO,CAAC;SACvB,CAAC;KACH,CAAC;IACF,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACvE;AAID,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CA2IxB"}
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 — Core x402 paywall logic.
2
+ * paygate v3 core x402 paywall logic.
3
3
  *
4
- * Framework-agnostic. Express and Fastify adapters wrap this.
5
- * Self-contained no monorepo dependencies.
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 (default/testnet)
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
- // ── Payment requirements builder ────────────────────
50
- // EIP-712 domain names per USDC deployment — must match what the on-chain
51
- // contract returns from `name()`. Getting this wrong breaks signature verification.
52
- const USDC_DOMAIN_NAMES = {
53
- 'eip155:84532': 'USDC', // Base Sepolia
54
- 'eip155:8453': 'USD Coin', // Base Mainnet
55
- 'eip155:1': 'USD Coin', // Ethereum Mainnet
56
- 'eip155:137': 'USD Coin', // Polygon Mainnet
57
- };
58
- function buildPaymentRequirements(opts) {
59
- const domainName = USDC_DOMAIN_NAMES[opts.network] ?? 'USD Coin';
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
- accepts: [
62
- {
63
- scheme: 'exact',
64
- network: opts.network,
65
- maxAmountRequired: opts.feeBaseUnits,
66
- resource: opts.resource,
67
- asset: opts.asset,
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
- if (!config.network) {
87
- return {
88
- paid: false,
89
- error: {
90
- statusCode: 500,
91
- body: { error: 'PaygateConfig.network is required', code: 'UNSUPPORTED_NETWORK' },
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
- const network = normalizeNetwork(config.network);
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: { error: `No USDC address for network ${network}`, code: 'UNSUPPORTED_NETWORK' },
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 resolvedPrice = typeof routePrice.price === 'function'
108
- ? await routePrice.price(undefined)
109
- : routePrice.price;
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: { error: 'Too many discovery requests. Try again later.', code: 'DISCOVERY_RATE_LIMITED' },
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 requirements = buildPaymentRequirements({
125
- feeBaseUnits: priceBaseUnits,
126
- resource: resourceUrl,
127
- payTo: config.wallet,
128
- asset,
129
- network,
130
- });
131
- const requirementsStr = JSON.stringify({
132
- x402Version: 1,
133
- accepts: requirements.accepts,
134
- }).replace(/[\r\n\0]/g, ' ');
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: 1,
145
- accepts: requirements.accepts,
146
- facilitator: facilitatorUrl,
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 header
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: config.wallet,
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(`${facilitatorUrl}/facilitator/settle`, {
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: 1,
275
+ x402Version: 2,
183
276
  paymentPayload,
184
277
  paymentRequirements: accept,
185
278
  }),
186
- signal: AbortSignal.timeout(config.timeout || 30_000),
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 { paid: true, settlement };
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":"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"}
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
- * const pw = paygate({ wallet: '0xYourUSDCWallet' });
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
- * // Static pricing:
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/search', pw({
19
- * price: (req) => req.body.deep ? 0.015 : 0.007,
20
- * description: 'AI-powered search',
21
- * }), (req, res) => {
22
- * res.json({ results: [] });
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
@@ -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;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,IACnB,YAAY,UAAU,KAAG,cAAc,CA6BhE"}
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
- const resolved = typeof routePrice.price === 'function'
22
- ? { ...routePrice, price: await routePrice.price(req) }
23
- : routePrice;
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
- req.x402 = result.settlement;
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) {
@@ -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;;;;;;GAMG;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,MAAM,QAAQ,GAAe,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU;gBACjE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACvD,CAAC,CAAC,UAAU,CAAC;YAEf,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;YAE3F,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBACf,GAAW,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;gBACtC,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"}
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
- * await app.register(paygate, { wallet: '0xYourUSDCWallet' });
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
- * // Static pricing via route config:
13
- * app.get('/api/data', { config: { x402: { price: 0.10 } } }, async (req, reply) => {
14
- * reply.send({ data: 'premium content' });
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
- x402?: {
29
+ paygate?: {
30
30
  paid: boolean;
31
31
  txHash?: string;
32
+ trustTier?: string;
33
+ merchant?: string;
32
34
  };
33
- x402Pay: (routePrice: RoutePrice) => Promise<{
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
  }
@@ -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,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,OAAO,CAAC;YACd,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC;YAAE,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACjE;IACD,UAAU,oBAAoB;QAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;KACnB;CACF;AAcD,QAAA,MAAM,aAAa,EAAE,kBAAkB,CAAC,aAAa,CA2CpD,CAAC;AAEF,eAAe,aAAa,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,CAAC"}
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 resolvePrice(routePrice, request) {
9
- if (typeof routePrice.price !== 'function')
10
- return routePrice;
11
- const resolved = await routePrice.price(request);
12
- return { ...routePrice, price: resolved };
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('x402', undefined);
16
- fastify.decorateRequest('x402Pay', (async (_routePrice) => ({ paid: false })));
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.x402Pay = async (routePrice) => {
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 resolvePrice(routePrice, request);
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.x402 = { paid: true, txHash: result.settlement?.txHash };
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 routePrice = request.routeOptions?.config?.x402;
48
+ const ctx = request.routeOptions?.config ?? {};
49
+ const routePrice = (ctx.paygate ?? ctx.x402);
42
50
  if (routePrice) {
43
- const { paid } = await request.x402Pay(routePrice);
51
+ const { paid } = await request.paygatePay(routePrice);
44
52
  if (!paid)
45
53
  return;
46
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAuC,aAAa,EAAE,MAAM,WAAW,CAAC;AAqB/E,SAAS,WAAW,CAAC,OAAuB;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrD,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IAC1E,OAAO,OAAO,CAAC,EAAE,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,UAAsB,EACtB,OAAuB;IAEvB,MAAM,GAAG,GAAe,EAAE,GAAG,UAAU,EAAE,CAAC;IAC1C,IAAI,OAAO,UAAU,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAChD,GAAG,CAAC,UAAU,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAC3C,GAAG,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,aAAa,GAAsC,KAAK,EAC5D,OAAwB,EACxB,MAAqB,EACrB,EAAE;IACF,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,SAAgB,CAAC,CAAC;IACrD,OAAO,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,WAAuB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAQ,CAAC,CAAC;IAErG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAClF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEtC,OAAO,CAAC,UAAU,GAAG,KAAK,EAAE,UAAsB,EAAE,EAAE;YACpD,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC9E,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAuB,CAAC;YACzE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9D,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,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACnD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBACpE,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACxB,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,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC3B,CAAC;gBACD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC9C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzB,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzB,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,GAAG,GAAI,OAAO,CAAC,YAAY,EAAE,MAAc,IAAI,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAA2B,CAAC;QACvE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI;gBAAE,OAAO;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,CAAC"}
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
- * Gate your API with USDC micropayments in one line of code.
5
- * AI agents pay per-request no accounts, no API keys needed.
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({ wallet: '0xYourWallet' });
10
- * app.get('/api/data', pw({ price: 0.10 }), handler);
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, { wallet: '0xYourWallet' });
15
- * app.get('/api/data', { config: { x402: { price: 0.10 } } }, handler);
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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC/D,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"}
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
- * Gate your API with USDC micropayments in one line of code.
5
- * AI agents pay per-request no accounts, no API keys needed.
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({ wallet: '0xYourWallet' });
10
- * app.get('/api/data', pw({ price: 0.10 }), handler);
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, { wallet: '0xYourWallet' });
15
- * app.get('/api/data', { config: { x402: { price: 0.10 } } }, handler);
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;;;;;;;;;;;;;;;GAeG;AAEH,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAG/D,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"}
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": "2.0.1",
4
- "description": "Gate your API with USDC micropayments in one line. Add x402 payment enforcement to any Express or Fastify server — agents pay per-request, no accounts needed.",
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
- "scripts": {
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
+ }