paygate 2.1.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # paygate
2
2
 
3
- Gate your API with USDC micropayments in one line of code. AI agents pay per-request using the [x402 protocol](https://x402.org) **no accounts, no API keys, no subscriptions needed.**
3
+ Accept agent payments on an existing API with HTTP 402 and USDC settlement. PayGate handles the x402 challenge, calls the ArisPay facilitator, and lets your handler run only after payment settles.
4
4
 
5
- Works with Express and Fastify. Settlement and gas sponsorship handled by ArisPay.
5
+ Use the hosted proxy for zero-code acceptance, or install this package when you want the 402 flow on your own domain.
6
6
 
7
7
  ## Install
8
8
 
@@ -17,16 +17,19 @@ import express from 'express';
17
17
  import { paygate } from 'paygate/express';
18
18
 
19
19
  const app = express();
20
- const pw = paygate({ wallet: '0xYourUSDCWallet' });
20
+
21
+ const pw = paygate({
22
+ merchantId: process.env.PAYGATE_MERCHANT_ID,
23
+ });
21
24
 
22
25
  // $0.10 per request
23
- app.get('/api/data', pw({ price: 0.10 }), (req, res) => {
26
+ app.get('/api/data', pw({ priceCents: 10 }), (req, res) => {
24
27
  res.json({ data: 'premium content' });
25
28
  });
26
29
 
27
30
  // Dynamic pricing
28
31
  app.post('/api/analyze', pw({
29
- price: (req) => req.body.depth === 'deep' ? 0.50 : 0.10,
32
+ priceCents: (req) => req.body.depth === 'deep' ? 50 : 10,
30
33
  description: 'AI analysis',
31
34
  }), (req, res) => {
32
35
  res.json({ result: '...' });
@@ -43,18 +46,23 @@ import paygate from 'paygate/fastify';
43
46
 
44
47
  const app = Fastify();
45
48
 
46
- await app.register(paygate, { wallet: '0xYourUSDCWallet' });
49
+ await app.register(paygate, {
50
+ merchantId: process.env.PAYGATE_MERCHANT_ID,
51
+ });
47
52
 
48
- // Auto-paywall via route config
53
+ // Route-config-driven paywall
49
54
  app.get('/api/data', {
50
- config: { x402: { price: 0.10 } }
55
+ config: { paygate: { priceCents: 10 } },
51
56
  }, async (req, reply) => {
52
57
  reply.send({ data: 'premium content' });
53
58
  });
54
59
 
55
60
  // Or imperative API
56
61
  app.get('/api/research', async (req, reply) => {
57
- const { paid } = await req.x402Pay({ price: 0.05, description: 'Research query' });
62
+ const { paid } = await req.paygatePay({
63
+ priceCents: 5,
64
+ description: 'Research query',
65
+ });
58
66
  if (!paid) return; // 402 challenge already sent
59
67
  reply.send({ results: '...' });
60
68
  });
@@ -62,65 +70,73 @@ app.get('/api/research', async (req, reply) => {
62
70
  await app.listen({ port: 3000 });
63
71
  ```
64
72
 
73
+ ## Hosted proxy
74
+
75
+ For a no-code merchant integration:
76
+
77
+ 1. Register at `https://paygate.arispay.app/merchant-register`.
78
+ 2. Add a primary USDC payout wallet in the PayGate dashboard.
79
+ 3. Add a product with `method`, `path`, `targetUrl`, and `priceCents`.
80
+ 4. Agents call `https://paygate.arispay.app/{slug}{path}`.
81
+
82
+ Example agent test:
83
+
84
+ ```bash
85
+ npx payagent pay https://paygate.arispay.app/acme/forecast?city=London
86
+ ```
87
+
88
+ API equivalent for product creation:
89
+
90
+ ```bash
91
+ curl -X POST https://api.arispay.app/v1/merchants/me/products \
92
+ -H 'authorization: Bearer mp_live_…' \
93
+ -H 'content-type: application/json' \
94
+ -d '{
95
+ "method": "GET",
96
+ "path": "/forecast",
97
+ "targetUrl": "https://api.acme.com/v1/forecast",
98
+ "priceCents": 2,
99
+ "description": "Weather forecast"
100
+ }'
101
+ ```
102
+
65
103
  ## How it works
66
104
 
67
105
  ```
68
- Agent Your API ArisPay Facilitator
106
+ Agent Your API / Proxy ArisPay Facilitator
69
107
  │ │ │
70
108
  ├─── GET /api/data ──────►│ │
71
- │ │ (no X-Payment header)
109
+ │ │ no X-Payment header
72
110
  │◄── 402 + requirements ──┤ │
73
111
  │ │ │
74
- (agent signs EIP-3009 USDC transfer)
112
+ │ agent signs USDC transfer authorization
75
113
  │ │ │
76
114
  ├─── GET /api/data ──────►│ │
77
115
  │ + X-Payment header ├── POST /settle ────────►│
78
116
  │ │ │ verify + settle
79
- │ │◄── { success, txHash } ─┤ sponsor gas
117
+ │ │◄── { success, txHash } ─┤
80
118
  │◄── 200 + data ──────────┤ │
81
119
  ```
82
120
 
83
- The agent SDKs ([payagent](https://npmjs.com/package/payagent)) handle the signing automatically agents don't need to understand the protocol.
121
+ The agent-side [`payagent`](https://www.npmjs.com/package/payagent) CLI and SDK handle the 402 loop automatically.
84
122
 
85
123
  ## Config
86
124
 
87
125
  | Option | Required | Default | Description |
88
126
  |---|---|---|---|
89
- | `wallet` | Yes | — | Your USDC wallet address |
90
- | `network` | No | `eip155:84532` | CAIP-2 network ID (Base Sepolia testnet) |
91
- | `asset` | No | Auto | USDC contract address |
92
- | `facilitatorUrl` | No | ArisPay production | Override the settlement facilitator |
93
- | `timeout` | No | `30000` | Facilitator call timeout (ms) |
94
-
95
- ## Networks
96
-
97
- | Network | ID | Status |
98
- |---|---|---|
99
- | Base Sepolia | `eip155:84532` | **Default (testnet)** |
100
- | Base Mainnet | `eip155:8453` | Production |
101
- | Ethereum | `eip155:1` | Production |
102
- | Polygon | `eip155:137` | Production |
103
-
104
- ## Agent-side
105
-
106
- Agents use [payagent](https://npmjs.com/package/payagent) — a drop-in fetch wrapper that handles 402 payments automatically:
127
+ | `merchantId` | Yes | — | PayGate merchant ID from the dashboard. The SDK fetches payout rail, wallet, asset, facilitator, and trust policy from ArisPay. |
128
+ | `apiUrl` | No | `https://api.arispay.app` | Override ArisPay API URL for staging/self-hosting. |
129
+ | `facilitatorUrl` | No | Manifest value | Compatibility override. In v3, merchant capabilities are authoritative. |
130
+ | `timeout` | No | `30000` | ArisPay/facilitator call timeout in ms. |
131
+ | `cacheTtlMs` | No | `300000` | Merchant capability cache TTL. |
107
132
 
108
- ```bash
109
- npm install payagent
110
- ```
133
+ ### Compatibility mode
111
134
 
112
- ```js
113
- import { createPayagentFetch } from 'payagent';
135
+ Older code that passes `wallet` and `network` still works through a v2 shim, but new integrations should use `merchantId` and configure payout wallets in the dashboard. The shim will be removed in a future major version.
114
136
 
115
- const fetch = createPayagentFetch({
116
- apiKey: 'ap_live_...', // ArisPay API key
117
- agentId: 'agent-123', // Your agent ID
118
- });
137
+ ## Networks
119
138
 
120
- // This call will automatically handle any 402 challenges
121
- const res = await fetch('https://your-api.com/api/data');
122
- const data = await res.json();
123
- ```
139
+ PayGate currently settles USDC on EVM networks advertised by your merchant capability manifest. Base mainnet (`eip155:8453`) is the recommended production network.
124
140
 
125
141
  ## License
126
142
 
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: 2,
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
236
  x402Version: 2,
145
- accepts: requirements.accepts,
146
- facilitator: facilitatorUrl,
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,18 +257,18 @@ 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({
@@ -183,7 +276,7 @@ export async function handlePaywall(config, routePrice, resourceUrl, paymentHead
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.1.0",
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.1",
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,9 +19,13 @@
19
19
  "types": "./dist/fastify.d.ts"
20
20
  }
21
21
  },
22
- "dependencies": {
23
- "ethers": "^6.13.0"
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "dev": "tsc --watch",
25
+ "type-check": "tsc --noEmit",
26
+ "prepublishOnly": "pnpm build"
24
27
  },
28
+ "dependencies": {},
25
29
  "peerDependencies": {
26
30
  "express": ">=4.0.0",
27
31
  "fastify": ">=4.0.0"
@@ -69,10 +73,5 @@
69
73
  "repository": {
70
74
  "type": "git",
71
75
  "url": "https://github.com/arispay-inc/ArisPay"
72
- },
73
- "scripts": {
74
- "build": "tsc",
75
- "dev": "tsc --watch",
76
- "type-check": "tsc --noEmit"
77
76
  }
78
- }
77
+ }