@azeth/provider 0.2.0 → 0.2.2

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.
@@ -9,7 +9,8 @@ import type { ProviderEnv } from '../middleware/pre-settled.js';
9
9
  * - Payment agreement extension (subscription terms in 402 response)
10
10
  * - Pre-settled smart account payments (X-Payment-Tx header bypass)
11
11
  *
12
- * When httpServer is null, all routes return 503 (graceful degradation).
12
+ * The root GET / serves the off-chain catalog (free, no payment required).
13
+ * When httpServer is null, paid routes return 503 (graceful degradation).
13
14
  */
14
15
  export declare function createPricingRoutes(httpServer: x402HTTPResourceServer | null): Hono<ProviderEnv>;
15
16
  //# sourceMappingURL=pricing-routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pricing-routes.d.ts","sourceRoot":"","sources":["../../src/examples/pricing-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAwEhG"}
1
+ {"version":3,"file":"pricing-routes.d.ts","sourceRoot":"","sources":["../../src/examples/pricing-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AA0ChE;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAmFhG"}
@@ -3,6 +3,42 @@ import { AzethError, TOKENS } from '@azeth/common';
3
3
  import { paymentMiddlewareFromHTTPServer } from '@x402/hono';
4
4
  import { isSupportedCoin, getPrice, getFreshPrice } from './price-feed.js';
5
5
  import { preSettledPaymentMiddleware } from '../middleware/pre-settled.js';
6
+ /** Supported coin IDs for the catalog — single source of truth matching price-feed.ts */
7
+ const CATALOG_COINS = [
8
+ 'bitcoin', 'ethereum', 'solana', 'usd-coin', 'chainlink',
9
+ 'aave', 'uniswap', 'maker', 'compound-governance-token',
10
+ ];
11
+ /** Build the off-chain service catalog for the pricing API */
12
+ function buildPricingCatalog() {
13
+ const priceStr = process.env['X402_PRICE_FEED_PRICE'] ?? '$0.01';
14
+ return [
15
+ {
16
+ name: 'Get Price',
17
+ path: '/{coinId}',
18
+ method: 'GET',
19
+ description: 'Get real-time price data for a cryptocurrency. Returns price in USD, 24h change, market cap, and volume.',
20
+ pricing: `${priceStr}/request`,
21
+ params: { coinId: CATALOG_COINS.join(', ') },
22
+ paid: true,
23
+ accepts: [
24
+ {
25
+ network: 'eip155:84532',
26
+ asset: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',
27
+ symbol: 'USDC',
28
+ },
29
+ ],
30
+ },
31
+ {
32
+ name: 'Get Fresh Price',
33
+ path: '/{coinId}?fresh=true',
34
+ method: 'GET',
35
+ description: 'Force-refresh price data bypassing cache. Same as Get Price but fetches live data from CoinGecko.',
36
+ pricing: `${priceStr}/request`,
37
+ params: { coinId: CATALOG_COINS.join(', ') },
38
+ paid: true,
39
+ },
40
+ ];
41
+ }
6
42
  /** Create the x402-gated pricing routes.
7
43
  *
8
44
  * Uses @x402/hono middleware for V2 protocol support including:
@@ -11,10 +47,23 @@ import { preSettledPaymentMiddleware } from '../middleware/pre-settled.js';
11
47
  * - Payment agreement extension (subscription terms in 402 response)
12
48
  * - Pre-settled smart account payments (X-Payment-Tx header bypass)
13
49
  *
14
- * When httpServer is null, all routes return 503 (graceful degradation).
50
+ * The root GET / serves the off-chain catalog (free, no payment required).
51
+ * When httpServer is null, paid routes return 503 (graceful degradation).
15
52
  */
16
53
  export function createPricingRoutes(httpServer) {
17
54
  const app = new Hono();
55
+ // ── Free catalog endpoint ──
56
+ // Serves the off-chain service catalog — the "menu card" describing available
57
+ // offerings, pricing, and accepted payment methods. No payment or auth required.
58
+ app.get('/', (c) => {
59
+ return c.json({
60
+ data: {
61
+ name: 'Azeth Price Feed',
62
+ description: 'x402-gated cryptocurrency price data API powered by Azeth',
63
+ catalog: buildPricingCatalog(),
64
+ },
65
+ });
66
+ });
18
67
  if (!httpServer) {
19
68
  app.get('/:coinId', (c) => {
20
69
  return c.json({
@@ -37,8 +86,9 @@ export function createPricingRoutes(httpServer) {
37
86
  // Parse price string like "$0.01" to atomic USDC (6 decimals)
38
87
  const priceNum = parseFloat(priceStr.replace('$', ''));
39
88
  const priceAtomicAmount = BigInt(Math.round(priceNum * 1e6));
89
+ // Payment middleware scoped to /:coinId — catalog root (/) is free.
40
90
  if (payTo && usdcAddress) {
41
- app.use('*', preSettledPaymentMiddleware({
91
+ app.use('/:coinId', preSettledPaymentMiddleware({
42
92
  payTo,
43
93
  usdcAddress,
44
94
  priceAtomicAmount,
@@ -47,8 +97,8 @@ export function createPricingRoutes(httpServer) {
47
97
  }));
48
98
  }
49
99
  // x402 V2 middleware — handles 402, verify, settle, SIWx, extensions.
50
- // Skipped when pre-settled payment was verified (preSettledVerified flag set).
51
- app.use('*', async (c, next) => {
100
+ // Scoped to /:coinId only. Skipped when pre-settled payment was verified.
101
+ app.use('/:coinId', async (c, next) => {
52
102
  if (c['preSettledVerified']) {
53
103
  return next();
54
104
  }
@@ -62,10 +112,7 @@ export function createPricingRoutes(httpServer) {
62
112
  if (!isSupportedCoin(coinId)) {
63
113
  throw new AzethError('Unsupported coin', 'INVALID_INPUT', {
64
114
  coinId,
65
- supported: [
66
- 'bitcoin', 'ethereum', 'solana', 'usd-coin', 'chainlink',
67
- 'aave', 'uniswap', 'maker', 'compound-governance-token',
68
- ],
115
+ supported: [...CATALOG_COINS],
69
116
  });
70
117
  }
71
118
  const fresh = c.req.query('fresh') === 'true';
@@ -1 +1 @@
1
- {"version":3,"file":"pricing-routes.js","sourceRoot":"","sources":["../../src/examples/pricing-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pricing-routes.js","sourceRoot":"","sources":["../../src/examples/pricing-routes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azeth/provider",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "type": "module",
5
5
  "description": "x402 service provider tooling for Azeth — gate Hono endpoints behind x402 payments with payment-agreement support",
6
6
  "license": "MIT",
@@ -35,8 +35,14 @@
35
35
  "README.md",
36
36
  "LICENSE"
37
37
  ],
38
+ "scripts": {
39
+ "build": "tsc --project tsconfig.json",
40
+ "dev": "tsc -b --watch",
41
+ "test": "vitest run",
42
+ "typecheck": "tsc --noEmit"
43
+ },
38
44
  "dependencies": {
39
- "@azeth/common": "^0.2.0",
45
+ "@azeth/common": "^0.2.2",
40
46
  "@x402/core": "^2.4.0",
41
47
  "@x402/evm": "^2.4.0",
42
48
  "@x402/extensions": "^2.4.0",
@@ -47,20 +53,12 @@
47
53
  "devDependencies": {
48
54
  "@types/node": "^22.0.0",
49
55
  "typescript": "^5.7.0",
50
- "vitest": "^3.0.0",
51
- "@changesets/cli": "^2.27.0"
56
+ "vitest": "^3.0.0"
52
57
  },
53
58
  "publishConfig": {
54
59
  "access": "public"
55
60
  },
56
61
  "engines": {
57
62
  "node": ">=20.0.0"
58
- },
59
- "scripts": {
60
- "build": "tsc --project tsconfig.json",
61
- "dev": "tsc -b --watch",
62
- "test": "vitest run",
63
- "typecheck": "tsc --noEmit",
64
- "release": "pnpm build && changeset publish"
65
63
  }
66
- }
64
+ }