@bankofai/x402 0.5.9 → 0.6.0-beta.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/client/x402Client.js +1 -1
- package/dist/client/x402Client.js.map +1 -1
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -1
- package/dist/facilitator/client.d.ts +77 -0
- package/dist/facilitator/client.d.ts.map +1 -0
- package/dist/facilitator/client.js +130 -0
- package/dist/facilitator/client.js.map +1 -0
- package/dist/facilitator/index.d.ts +14 -0
- package/dist/facilitator/index.d.ts.map +1 -0
- package/dist/facilitator/index.js +12 -0
- package/dist/facilitator/index.js.map +1 -0
- package/dist/facilitator/x402Facilitator.d.ts +97 -0
- package/dist/facilitator/x402Facilitator.d.ts.map +1 -0
- package/dist/facilitator/x402Facilitator.js +212 -0
- package/dist/facilitator/x402Facilitator.js.map +1 -0
- package/dist/http/client.d.ts +66 -17
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +90 -31
- package/dist/http/client.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/mechanisms/_base/index.d.ts +19 -0
- package/dist/mechanisms/_base/index.d.ts.map +1 -0
- package/dist/mechanisms/_base/index.js +17 -0
- package/dist/mechanisms/_base/index.js.map +1 -0
- package/dist/mechanisms/_exact_base/adapter.d.ts +23 -0
- package/dist/mechanisms/_exact_base/adapter.d.ts.map +1 -0
- package/dist/mechanisms/_exact_base/adapter.js +9 -0
- package/dist/mechanisms/_exact_base/adapter.js.map +1 -0
- package/dist/mechanisms/_exact_base/evmAdapter.d.ts +10 -0
- package/dist/mechanisms/_exact_base/evmAdapter.d.ts.map +1 -0
- package/dist/mechanisms/_exact_base/evmAdapter.js +28 -0
- package/dist/mechanisms/_exact_base/evmAdapter.js.map +1 -0
- package/dist/mechanisms/_exact_base/facilitator.d.ts +46 -0
- package/dist/mechanisms/_exact_base/facilitator.d.ts.map +1 -0
- package/dist/mechanisms/_exact_base/facilitator.js +87 -0
- package/dist/mechanisms/_exact_base/facilitator.js.map +1 -0
- package/dist/mechanisms/_exact_base/index.d.ts +12 -0
- package/dist/mechanisms/_exact_base/index.d.ts.map +1 -0
- package/dist/mechanisms/_exact_base/index.js +10 -0
- package/dist/mechanisms/_exact_base/index.js.map +1 -0
- package/dist/mechanisms/_exact_base/server.d.ts +40 -0
- package/dist/mechanisms/_exact_base/server.d.ts.map +1 -0
- package/dist/mechanisms/_exact_base/server.js +62 -0
- package/dist/mechanisms/_exact_base/server.js.map +1 -0
- package/dist/mechanisms/_exact_base/tronAdapter.d.ts +11 -0
- package/dist/mechanisms/_exact_base/tronAdapter.d.ts.map +1 -0
- package/dist/mechanisms/_exact_base/tronAdapter.js +48 -0
- package/dist/mechanisms/_exact_base/tronAdapter.js.map +1 -0
- package/dist/mechanisms/{nativeExact.d.ts → _exact_base/types.d.ts} +4 -4
- package/dist/mechanisms/_exact_base/types.d.ts.map +1 -0
- package/dist/mechanisms/{nativeExact.js → _exact_base/types.js} +1 -1
- package/dist/mechanisms/_exact_base/types.js.map +1 -0
- package/dist/mechanisms/_exact_permit_base/facilitator.d.ts +44 -0
- package/dist/mechanisms/_exact_permit_base/facilitator.d.ts.map +1 -0
- package/dist/mechanisms/_exact_permit_base/facilitator.js +65 -0
- package/dist/mechanisms/_exact_permit_base/facilitator.js.map +1 -0
- package/dist/mechanisms/_exact_permit_base/index.d.ts +8 -0
- package/dist/mechanisms/_exact_permit_base/index.d.ts.map +1 -0
- package/dist/mechanisms/_exact_permit_base/index.js +7 -0
- package/dist/mechanisms/_exact_permit_base/index.js.map +1 -0
- package/dist/mechanisms/_exact_permit_base/server.d.ts +31 -0
- package/dist/mechanisms/_exact_permit_base/server.d.ts.map +1 -0
- package/dist/mechanisms/_exact_permit_base/server.js +53 -0
- package/dist/mechanisms/_exact_permit_base/server.js.map +1 -0
- package/dist/mechanisms/{nativeExactEvm.d.ts → evm/exact/client.d.ts} +2 -2
- package/dist/mechanisms/evm/exact/client.d.ts.map +1 -0
- package/dist/mechanisms/{nativeExactEvm.js → evm/exact/client.js} +4 -4
- package/dist/mechanisms/evm/exact/client.js.map +1 -0
- package/dist/mechanisms/evm/exact/facilitator.d.ts +20 -0
- package/dist/mechanisms/evm/exact/facilitator.d.ts.map +1 -0
- package/dist/mechanisms/evm/exact/facilitator.js +28 -0
- package/dist/mechanisms/evm/exact/facilitator.js.map +1 -0
- package/dist/mechanisms/evm/exact/index.d.ts +4 -0
- package/dist/mechanisms/evm/exact/index.d.ts.map +1 -0
- package/dist/mechanisms/evm/exact/index.js +4 -0
- package/dist/mechanisms/evm/exact/index.js.map +1 -0
- package/dist/mechanisms/evm/exact/server.d.ts +19 -0
- package/dist/mechanisms/evm/exact/server.d.ts.map +1 -0
- package/dist/mechanisms/evm/exact/server.js +23 -0
- package/dist/mechanisms/evm/exact/server.js.map +1 -0
- package/dist/mechanisms/{exactEvm.d.ts → evm/exact_permit/client.d.ts} +2 -2
- package/dist/mechanisms/evm/exact_permit/client.d.ts.map +1 -0
- package/dist/mechanisms/{exactEvm.js → evm/exact_permit/client.js} +2 -2
- package/dist/mechanisms/evm/exact_permit/client.js.map +1 -0
- package/dist/mechanisms/evm/exact_permit/facilitator.d.ts +18 -0
- package/dist/mechanisms/evm/exact_permit/facilitator.d.ts.map +1 -0
- package/dist/mechanisms/evm/exact_permit/facilitator.js +25 -0
- package/dist/mechanisms/evm/exact_permit/facilitator.js.map +1 -0
- package/dist/mechanisms/evm/exact_permit/index.d.ts +4 -0
- package/dist/mechanisms/evm/exact_permit/index.d.ts.map +1 -0
- package/dist/mechanisms/evm/exact_permit/index.js +4 -0
- package/dist/mechanisms/evm/exact_permit/index.js.map +1 -0
- package/dist/mechanisms/evm/exact_permit/server.d.ts +11 -0
- package/dist/mechanisms/evm/exact_permit/server.d.ts.map +1 -0
- package/dist/mechanisms/evm/exact_permit/server.js +16 -0
- package/dist/mechanisms/evm/exact_permit/server.js.map +1 -0
- package/dist/mechanisms/index.d.ts +27 -7
- package/dist/mechanisms/index.d.ts.map +1 -1
- package/dist/mechanisms/index.js +27 -11
- package/dist/mechanisms/index.js.map +1 -1
- package/dist/mechanisms/{nativeExactTron.d.ts → tron/exact/client.d.ts} +2 -2
- package/dist/mechanisms/tron/exact/client.d.ts.map +1 -0
- package/dist/mechanisms/{nativeExactTron.js → tron/exact/client.js} +4 -4
- package/dist/mechanisms/tron/exact/client.js.map +1 -0
- package/dist/mechanisms/tron/exact/facilitator.d.ts +17 -0
- package/dist/mechanisms/tron/exact/facilitator.d.ts.map +1 -0
- package/dist/mechanisms/tron/exact/facilitator.js +25 -0
- package/dist/mechanisms/tron/exact/facilitator.js.map +1 -0
- package/dist/mechanisms/tron/exact/index.d.ts +4 -0
- package/dist/mechanisms/tron/exact/index.d.ts.map +1 -0
- package/dist/mechanisms/tron/exact/index.js +4 -0
- package/dist/mechanisms/tron/exact/index.js.map +1 -0
- package/dist/mechanisms/tron/exact/server.d.ts +18 -0
- package/dist/mechanisms/tron/exact/server.d.ts.map +1 -0
- package/dist/mechanisms/tron/exact/server.js +22 -0
- package/dist/mechanisms/tron/exact/server.js.map +1 -0
- package/dist/mechanisms/{exactGasfree.d.ts → tron/exact_gasfree/client.d.ts} +3 -3
- package/dist/mechanisms/tron/exact_gasfree/client.d.ts.map +1 -0
- package/dist/mechanisms/{exactGasfree.js → tron/exact_gasfree/client.js} +4 -4
- package/dist/mechanisms/tron/exact_gasfree/client.js.map +1 -0
- package/dist/mechanisms/tron/exact_gasfree/facilitator.d.ts +38 -0
- package/dist/mechanisms/tron/exact_gasfree/facilitator.d.ts.map +1 -0
- package/dist/mechanisms/tron/exact_gasfree/facilitator.js +71 -0
- package/dist/mechanisms/tron/exact_gasfree/facilitator.js.map +1 -0
- package/dist/mechanisms/tron/exact_gasfree/index.d.ts +5 -0
- package/dist/mechanisms/tron/exact_gasfree/index.d.ts.map +1 -0
- package/dist/mechanisms/tron/exact_gasfree/index.js +4 -0
- package/dist/mechanisms/tron/exact_gasfree/index.js.map +1 -0
- package/dist/mechanisms/tron/exact_gasfree/server.d.ts +23 -0
- package/dist/mechanisms/tron/exact_gasfree/server.d.ts.map +1 -0
- package/dist/mechanisms/tron/exact_gasfree/server.js +43 -0
- package/dist/mechanisms/tron/exact_gasfree/server.js.map +1 -0
- package/dist/mechanisms/{exact.d.ts → tron/exact_permit/client.d.ts} +2 -2
- package/dist/mechanisms/tron/exact_permit/client.d.ts.map +1 -0
- package/dist/mechanisms/{exact.js → tron/exact_permit/client.js} +2 -2
- package/dist/mechanisms/tron/exact_permit/client.js.map +1 -0
- package/dist/mechanisms/tron/exact_permit/facilitator.d.ts +17 -0
- package/dist/mechanisms/tron/exact_permit/facilitator.d.ts.map +1 -0
- package/dist/mechanisms/tron/exact_permit/facilitator.js +24 -0
- package/dist/mechanisms/tron/exact_permit/facilitator.js.map +1 -0
- package/dist/mechanisms/tron/exact_permit/index.d.ts +4 -0
- package/dist/mechanisms/tron/exact_permit/index.d.ts.map +1 -0
- package/dist/mechanisms/tron/exact_permit/index.js +4 -0
- package/dist/mechanisms/tron/exact_permit/index.js.map +1 -0
- package/dist/mechanisms/tron/exact_permit/server.d.ts +11 -0
- package/dist/mechanisms/tron/exact_permit/server.d.ts.map +1 -0
- package/dist/mechanisms/tron/exact_permit/server.js +22 -0
- package/dist/mechanisms/tron/exact_permit/server.js.map +1 -0
- package/dist/middleware/core.d.ts +75 -0
- package/dist/middleware/core.d.ts.map +1 -0
- package/dist/middleware/core.js +132 -0
- package/dist/middleware/core.js.map +1 -0
- package/dist/middleware/express.d.ts +40 -0
- package/dist/middleware/express.d.ts.map +1 -0
- package/dist/middleware/express.js +83 -0
- package/dist/middleware/express.js.map +1 -0
- package/dist/middleware/hono.d.ts +43 -0
- package/dist/middleware/hono.d.ts.map +1 -0
- package/dist/middleware/hono.js +72 -0
- package/dist/middleware/hono.js.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +11 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +10 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/types.d.ts +78 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +12 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/x402Server.d.ts +115 -0
- package/dist/server/x402Server.d.ts.map +1 -0
- package/dist/server/x402Server.js +318 -0
- package/dist/server/x402Server.js.map +1 -0
- package/dist/tokens.d.ts +29 -0
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +44 -0
- package/dist/tokens.js.map +1 -1
- package/dist/utils/encoding.d.ts +7 -0
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +15 -0
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/tx_verification.d.ts +113 -0
- package/dist/utils/tx_verification.d.ts.map +1 -0
- package/dist/utils/tx_verification.js +98 -0
- package/dist/utils/tx_verification.js.map +1 -0
- package/package.json +15 -2
- package/dist/mechanisms/exact.d.ts.map +0 -1
- package/dist/mechanisms/exact.js.map +0 -1
- package/dist/mechanisms/exactEvm.d.ts.map +0 -1
- package/dist/mechanisms/exactEvm.js.map +0 -1
- package/dist/mechanisms/exactGasfree.d.ts.map +0 -1
- package/dist/mechanisms/exactGasfree.js.map +0 -1
- package/dist/mechanisms/nativeExact.d.ts.map +0 -1
- package/dist/mechanisms/nativeExact.js.map +0 -1
- package/dist/mechanisms/nativeExactEvm.d.ts.map +0 -1
- package/dist/mechanisms/nativeExactEvm.js.map +0 -1
- package/dist/mechanisms/nativeExactTron.d.ts.map +0 -1
- package/dist/mechanisms/nativeExactTron.js.map +0 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express adapter for the x402 server middleware.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```ts
|
|
6
|
+
* import express from 'express';
|
|
7
|
+
* import { FacilitatorClient, x402Express } from '@bankofai/x402';
|
|
8
|
+
*
|
|
9
|
+
* const facilitator = new FacilitatorClient({ baseUrl: 'https://facilitator.example' });
|
|
10
|
+
* const app = express();
|
|
11
|
+
*
|
|
12
|
+
* app.use(
|
|
13
|
+
* '/api/llm-summary',
|
|
14
|
+
* x402Express({
|
|
15
|
+
* facilitator,
|
|
16
|
+
* accepts: [{
|
|
17
|
+
* scheme: 'exact_permit',
|
|
18
|
+
* network: 'eip155:97',
|
|
19
|
+
* amount: '1000000',
|
|
20
|
+
* asset: '0x...',
|
|
21
|
+
* payTo: '0x...',
|
|
22
|
+
* }],
|
|
23
|
+
* }),
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* app.get('/api/llm-summary', (req, res) => res.json({ summary: '...' }));
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* Express is imported via `peerDependencies`; consumers add it to their app.
|
|
30
|
+
*/
|
|
31
|
+
import { PAYMENT_SIGNATURE_HEADER, processX402Request, } from './core.js';
|
|
32
|
+
/**
|
|
33
|
+
* Build an Express request handler that gates the route on x402 payment.
|
|
34
|
+
*
|
|
35
|
+
* Behavior matches the Hono adapter — see {@link X402MiddlewareConfig} and
|
|
36
|
+
* {@link processX402Request} for the underlying decision logic.
|
|
37
|
+
*/
|
|
38
|
+
export function x402Express(config) {
|
|
39
|
+
return async (req, res, next) => {
|
|
40
|
+
const signature = readHeader(req, PAYMENT_SIGNATURE_HEADER);
|
|
41
|
+
let decision;
|
|
42
|
+
try {
|
|
43
|
+
decision = await processX402Request(signature, config);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
next(err);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
switch (decision.kind) {
|
|
50
|
+
case 'paymentRequired':
|
|
51
|
+
for (const [k, v] of Object.entries(decision.headers)) {
|
|
52
|
+
res.setHeader(k, v);
|
|
53
|
+
}
|
|
54
|
+
res.status(402).json(decision.paymentRequired);
|
|
55
|
+
return;
|
|
56
|
+
case 'invalid':
|
|
57
|
+
res.status(400).json({ error: decision.reason });
|
|
58
|
+
return;
|
|
59
|
+
case 'failed': {
|
|
60
|
+
const body = { error: decision.reason };
|
|
61
|
+
if (decision.transaction)
|
|
62
|
+
body.txHash = decision.transaction;
|
|
63
|
+
if (decision.network)
|
|
64
|
+
body.network = decision.network;
|
|
65
|
+
res.status(500).json(body);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
case 'allow':
|
|
69
|
+
for (const [k, v] of Object.entries(decision.headers)) {
|
|
70
|
+
res.setHeader(k, v);
|
|
71
|
+
}
|
|
72
|
+
next();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function readHeader(req, name) {
|
|
78
|
+
const raw = req.headers[name.toLowerCase()];
|
|
79
|
+
if (Array.isArray(raw))
|
|
80
|
+
return raw[0] ?? null;
|
|
81
|
+
return raw ?? null;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,EACL,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,WAAW,CAAC;AAEnB;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,MAA4B;IACtD,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC/D,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;QAC5D,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO;QACT,CAAC;QAED,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,iBAAiB;gBACpB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAC/C,OAAO;YACT,KAAK,SAAS;gBACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBACjD,OAAO;YACT,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACjE,IAAI,QAAQ,CAAC,WAAW;oBAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC;gBAC7D,IAAI,QAAQ,CAAC,OAAO;oBAAE,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;gBACtD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,KAAK,OAAO;gBACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,CAAC;gBACD,IAAI,EAAE,CAAC;gBACP,OAAO;QACX,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,GAAY,EAAE,IAAY;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC9C,OAAO,GAAG,IAAI,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hono adapter for the x402 server middleware.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { Hono } from 'hono';
|
|
7
|
+
* import { FacilitatorClient, x402Hono } from '@bankofai/x402';
|
|
8
|
+
*
|
|
9
|
+
* const facilitator = new FacilitatorClient({ baseUrl: 'https://facilitator.example' });
|
|
10
|
+
* const app = new Hono();
|
|
11
|
+
*
|
|
12
|
+
* app.use(
|
|
13
|
+
* '/api/llm-summary',
|
|
14
|
+
* x402Hono({
|
|
15
|
+
* facilitator,
|
|
16
|
+
* accepts: [{
|
|
17
|
+
* scheme: 'exact_permit',
|
|
18
|
+
* network: 'tron:nile',
|
|
19
|
+
* amount: '1000000',
|
|
20
|
+
* asset: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
|
|
21
|
+
* payTo: 'TJWdoJ...',
|
|
22
|
+
* }],
|
|
23
|
+
* }),
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* app.get('/api/llm-summary', (c) => c.json({ summary: '...' }));
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* Hono is imported via `peerDependencies`; consumers add it to their app.
|
|
30
|
+
*/
|
|
31
|
+
import type { MiddlewareHandler } from 'hono';
|
|
32
|
+
import { type X402MiddlewareConfig } from './core.js';
|
|
33
|
+
/**
|
|
34
|
+
* Build a Hono middleware that gates the wrapped route on x402 payment.
|
|
35
|
+
*
|
|
36
|
+
* Behavior:
|
|
37
|
+
* - No `PAYMENT-SIGNATURE` header → respond 402 with `PAYMENT-REQUIRED` header + body.
|
|
38
|
+
* - Malformed / mismatched payload → 400 JSON error.
|
|
39
|
+
* - Verify or settle failure → 500 JSON error.
|
|
40
|
+
* - Success → call `next()` and attach `PAYMENT-RESPONSE` header to the response.
|
|
41
|
+
*/
|
|
42
|
+
export declare function x402Hono(config: X402MiddlewareConfig): MiddlewareHandler;
|
|
43
|
+
//# sourceMappingURL=hono.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/middleware/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAW,iBAAiB,EAAQ,MAAM,MAAM,CAAC;AAE7D,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,WAAW,CAAC;AAEnB;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,GAAG,iBAAiB,CA6BxE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hono adapter for the x402 server middleware.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { Hono } from 'hono';
|
|
7
|
+
* import { FacilitatorClient, x402Hono } from '@bankofai/x402';
|
|
8
|
+
*
|
|
9
|
+
* const facilitator = new FacilitatorClient({ baseUrl: 'https://facilitator.example' });
|
|
10
|
+
* const app = new Hono();
|
|
11
|
+
*
|
|
12
|
+
* app.use(
|
|
13
|
+
* '/api/llm-summary',
|
|
14
|
+
* x402Hono({
|
|
15
|
+
* facilitator,
|
|
16
|
+
* accepts: [{
|
|
17
|
+
* scheme: 'exact_permit',
|
|
18
|
+
* network: 'tron:nile',
|
|
19
|
+
* amount: '1000000',
|
|
20
|
+
* asset: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
|
|
21
|
+
* payTo: 'TJWdoJ...',
|
|
22
|
+
* }],
|
|
23
|
+
* }),
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* app.get('/api/llm-summary', (c) => c.json({ summary: '...' }));
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* Hono is imported via `peerDependencies`; consumers add it to their app.
|
|
30
|
+
*/
|
|
31
|
+
import { PAYMENT_SIGNATURE_HEADER, processX402Request, } from './core.js';
|
|
32
|
+
/**
|
|
33
|
+
* Build a Hono middleware that gates the wrapped route on x402 payment.
|
|
34
|
+
*
|
|
35
|
+
* Behavior:
|
|
36
|
+
* - No `PAYMENT-SIGNATURE` header → respond 402 with `PAYMENT-REQUIRED` header + body.
|
|
37
|
+
* - Malformed / mismatched payload → 400 JSON error.
|
|
38
|
+
* - Verify or settle failure → 500 JSON error.
|
|
39
|
+
* - Success → call `next()` and attach `PAYMENT-RESPONSE` header to the response.
|
|
40
|
+
*/
|
|
41
|
+
export function x402Hono(config) {
|
|
42
|
+
return async (c, next) => {
|
|
43
|
+
const signature = c.req.header(PAYMENT_SIGNATURE_HEADER);
|
|
44
|
+
const decision = await processX402Request(signature, config);
|
|
45
|
+
switch (decision.kind) {
|
|
46
|
+
case 'paymentRequired': {
|
|
47
|
+
for (const [k, v] of Object.entries(decision.headers)) {
|
|
48
|
+
c.header(k, v);
|
|
49
|
+
}
|
|
50
|
+
return c.json(decision.paymentRequired, 402);
|
|
51
|
+
}
|
|
52
|
+
case 'invalid':
|
|
53
|
+
return c.json({ error: decision.reason }, 400);
|
|
54
|
+
case 'failed': {
|
|
55
|
+
const body = { error: decision.reason };
|
|
56
|
+
if (decision.transaction)
|
|
57
|
+
body.txHash = decision.transaction;
|
|
58
|
+
if (decision.network)
|
|
59
|
+
body.network = decision.network;
|
|
60
|
+
return c.json(body, 500);
|
|
61
|
+
}
|
|
62
|
+
case 'allow': {
|
|
63
|
+
await next();
|
|
64
|
+
for (const [k, v] of Object.entries(decision.headers)) {
|
|
65
|
+
c.header(k, v);
|
|
66
|
+
}
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=hono.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/middleware/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,EACL,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,WAAW,CAAC;AAEnB;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,MAA4B;IACnD,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAAE,EAAE;QACtC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAE7D,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjB,CAAC;gBACD,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YAC/C,CAAC;YACD,KAAK,SAAS;gBACZ,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YACjD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACjE,IAAI,QAAQ,CAAC,WAAW;oBAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC;gBAC7D,IAAI,QAAQ,CAAC,OAAO;oBAAE,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;gBACtD,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3B,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,IAAI,EAAE,CAAC;gBACb,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjB,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 server middleware.
|
|
3
|
+
*
|
|
4
|
+
* - {@link x402Hono} — Hono adapter
|
|
5
|
+
* - {@link x402Express} — Express adapter
|
|
6
|
+
* - {@link processX402Request} — framework-agnostic core (build your own adapter)
|
|
7
|
+
*/
|
|
8
|
+
export { processX402Request, X402_VERSION } from './core.js';
|
|
9
|
+
export type { X402Decision, X402MiddlewareConfig } from './core.js';
|
|
10
|
+
export { x402Hono } from './hono.js';
|
|
11
|
+
export { x402Express } from './express.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 server middleware.
|
|
3
|
+
*
|
|
4
|
+
* - {@link x402Hono} — Hono adapter
|
|
5
|
+
* - {@link x402Express} — Express adapter
|
|
6
|
+
* - {@link processX402Request} — framework-agnostic core (build your own adapter)
|
|
7
|
+
*/
|
|
8
|
+
export { processX402Request, X402_VERSION } from './core.js';
|
|
9
|
+
export { x402Hono } from './hono.js';
|
|
10
|
+
export { x402Express } from './express.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level x402 server API.
|
|
3
|
+
*
|
|
4
|
+
* For framework-agnostic protocol handling, see also `src/middleware/core.ts`.
|
|
5
|
+
* {@link X402Server} sits above that — it owns mechanism registration, price
|
|
6
|
+
* parsing, anti-tamper validation, and facilitator coordination.
|
|
7
|
+
*/
|
|
8
|
+
export { DefaultServerMechanism, X402Server } from './x402Server.js';
|
|
9
|
+
export type { BuildPaymentRequiredOptions } from './x402Server.js';
|
|
10
|
+
export { PAYMENT_ONLY } from './types.js';
|
|
11
|
+
export type { ResourceConfig, ServerMechanism } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACrE,YAAY,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level x402 server API.
|
|
3
|
+
*
|
|
4
|
+
* For framework-agnostic protocol handling, see also `src/middleware/core.ts`.
|
|
5
|
+
* {@link X402Server} sits above that — it owns mechanism registration, price
|
|
6
|
+
* parsing, anti-tamper validation, and facilitator coordination.
|
|
7
|
+
*/
|
|
8
|
+
export { DefaultServerMechanism, X402Server } from './x402Server.js';
|
|
9
|
+
export { PAYMENT_ONLY } from './types.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side type contracts for x402 SDK.
|
|
3
|
+
*
|
|
4
|
+
* - {@link ResourceConfig} — high-level config for a protected endpoint
|
|
5
|
+
* - {@link ServerMechanism} — per-(network, scheme) plugin used by {@link X402Server}
|
|
6
|
+
*/
|
|
7
|
+
import type { AssetAmount } from '../tokens.js';
|
|
8
|
+
import type { PaymentPermit, PaymentRequirements } from '../types/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Delivery modes for a protected resource. Only `PAYMENT_ONLY` ships today;
|
|
11
|
+
* future modes (e.g. `RECEIPT_REQUIRED`) plug in here.
|
|
12
|
+
*/
|
|
13
|
+
export declare const PAYMENT_ONLY = "PAYMENT_ONLY";
|
|
14
|
+
/**
|
|
15
|
+
* One protected endpoint's payment configuration.
|
|
16
|
+
*
|
|
17
|
+
* Mirrors Python `bankofai.x402.server.ResourceConfig`.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const cfg: ResourceConfig = {
|
|
22
|
+
* scheme: 'exact_permit',
|
|
23
|
+
* network: 'tron:nile',
|
|
24
|
+
* price: '1 USDT',
|
|
25
|
+
* payTo: 'TJWdoJ...',
|
|
26
|
+
* };
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export interface ResourceConfig {
|
|
30
|
+
/** Payment scheme (`"exact"`, `"exact_permit"`, `"exact_gasfree"`, ...). */
|
|
31
|
+
scheme: string;
|
|
32
|
+
/** CAIP-2 network identifier (`"tron:nile"`, `"eip155:97"`, ...). */
|
|
33
|
+
network: string;
|
|
34
|
+
/** Human-readable price string parsed by {@link parsePrice} (e.g. `"1 USDT"`). */
|
|
35
|
+
price: string;
|
|
36
|
+
/** Recipient address. */
|
|
37
|
+
payTo: string;
|
|
38
|
+
/** Authorization validity window in seconds. Default 3600. */
|
|
39
|
+
validFor?: number;
|
|
40
|
+
/** Delivery mode. Default {@link PAYMENT_ONLY}. */
|
|
41
|
+
deliveryMode?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Server-side mechanism interface.
|
|
45
|
+
*
|
|
46
|
+
* One instance per `(network, scheme)`. Implementations live in the
|
|
47
|
+
* mechanism packages (TRON / EVM / ...) and plug into {@link X402Server} via
|
|
48
|
+
* `register(network, mechanism)`.
|
|
49
|
+
*
|
|
50
|
+
* Mirrors Python `bankofai.x402.server.x402_server.ServerMechanism`.
|
|
51
|
+
*/
|
|
52
|
+
export interface ServerMechanism {
|
|
53
|
+
/** Scheme name (matches `ResourceConfig.scheme`). */
|
|
54
|
+
scheme(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Resolve a `"<amount> <symbol>"` price string into a typed asset amount.
|
|
57
|
+
* The default mechanism implementation delegates to {@link parsePrice}.
|
|
58
|
+
*/
|
|
59
|
+
parsePrice(price: string, network: string): Promise<AssetAmount>;
|
|
60
|
+
/**
|
|
61
|
+
* Hook to attach scheme-specific extra fields onto `PaymentRequirements`
|
|
62
|
+
* (e.g. `extra.name` / `extra.version` for permit tokens). Should return
|
|
63
|
+
* the requirements (possibly mutated, but a fresh object is preferred).
|
|
64
|
+
*/
|
|
65
|
+
enhancePaymentRequirements(requirements: PaymentRequirements, deliveryMode: string): Promise<PaymentRequirements>;
|
|
66
|
+
/** Sanity check on requirements (return false to reject the config). */
|
|
67
|
+
validatePaymentRequirements(requirements: PaymentRequirements): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Optional server-side signature verification before delegating to facilitator.
|
|
70
|
+
* Defense-in-depth — facilitator also verifies, but a misbehaving client / proxy
|
|
71
|
+
* should be rejected here too. Return `true` if the signature is valid.
|
|
72
|
+
*
|
|
73
|
+
* Implementations that don't perform local verification should be omitted entirely;
|
|
74
|
+
* {@link X402Server} treats an absent method as "trust the facilitator".
|
|
75
|
+
*/
|
|
76
|
+
verifySignature?(permit: PaymentPermit | null | undefined, signature: string, network: string): Promise<boolean>;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE5E;;;GAGG;AACH,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,MAAM,IAAI,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE;;;;OAIG;IACH,0BAA0B,CACxB,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,wEAAwE;IACxE,2BAA2B,CAAC,YAAY,EAAE,mBAAmB,GAAG,OAAO,CAAC;IACxE;;;;;;;OAOG;IACH,eAAe,CAAC,CACd,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side type contracts for x402 SDK.
|
|
3
|
+
*
|
|
4
|
+
* - {@link ResourceConfig} — high-level config for a protected endpoint
|
|
5
|
+
* - {@link ServerMechanism} — per-(network, scheme) plugin used by {@link X402Server}
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Delivery modes for a protected resource. Only `PAYMENT_ONLY` ships today;
|
|
9
|
+
* future modes (e.g. `RECEIPT_REQUIRED`) plug in here.
|
|
10
|
+
*/
|
|
11
|
+
export const PAYMENT_ONLY = 'PAYMENT_ONLY';
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* X402Server — TypeScript port of `bankofai.x402.server.X402Server`.
|
|
3
|
+
*
|
|
4
|
+
* High-level server orchestration:
|
|
5
|
+
* - Registry of {@link ServerMechanism}s keyed by `(network, scheme)`
|
|
6
|
+
* - Build {@link PaymentRequirements} from {@link ResourceConfig} via `parsePrice`
|
|
7
|
+
* + optional facilitator `feeQuote` enrichment for permit-style schemes
|
|
8
|
+
* - Anti-tamper validation of incoming `PaymentPayload` against server's
|
|
9
|
+
* original requirements
|
|
10
|
+
* - Delegates `/verify` and `/settle` to a {@link FacilitatorClient}
|
|
11
|
+
*
|
|
12
|
+
* This sits **above** the framework-agnostic {@link processX402Request} core
|
|
13
|
+
* (see `src/middleware/core.ts`). Framework middleware (Hono / Express)
|
|
14
|
+
* can be wired against either:
|
|
15
|
+
* - Raw `accepts[]` + `FacilitatorClient` (lower-level, `processX402Request`)
|
|
16
|
+
* - `X402Server` + `ResourceConfig[]` (higher-level, this file)
|
|
17
|
+
*/
|
|
18
|
+
import type { FacilitatorClient } from '../facilitator/client.js';
|
|
19
|
+
import type { PaymentPayload, PaymentRequired, PaymentRequirements, SettleResponse, VerifyResponse } from '../types/index.js';
|
|
20
|
+
import { type ResourceConfig, type ServerMechanism } from './types.js';
|
|
21
|
+
/** Resource info echoed back in the 402 response body. */
|
|
22
|
+
export interface ResourceInfo {
|
|
23
|
+
url?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
mimeType?: string;
|
|
26
|
+
}
|
|
27
|
+
/** Optional overrides when building the 402 response. */
|
|
28
|
+
export interface BuildPaymentRequiredOptions {
|
|
29
|
+
resource?: ResourceInfo;
|
|
30
|
+
paymentId?: string;
|
|
31
|
+
nonce?: string;
|
|
32
|
+
validAfter?: number;
|
|
33
|
+
validBefore?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Default {@link ServerMechanism} that delegates `parsePrice` to the token
|
|
37
|
+
* registry and applies a no-op `enhancePaymentRequirements`. Useful when a
|
|
38
|
+
* chain/scheme needs no scheme-specific enrichment.
|
|
39
|
+
*/
|
|
40
|
+
export declare class DefaultServerMechanism implements ServerMechanism {
|
|
41
|
+
private readonly schemeName;
|
|
42
|
+
constructor(schemeName: string);
|
|
43
|
+
scheme(): string;
|
|
44
|
+
parsePrice(price: string, network: string): Promise<import("../tokens.js").AssetAmount>;
|
|
45
|
+
enhancePaymentRequirements(requirements: PaymentRequirements, _deliveryMode: string): Promise<PaymentRequirements>;
|
|
46
|
+
validatePaymentRequirements(_requirements: PaymentRequirements): boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Core server orchestration. One instance per resource server.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* const facilitator = new FacilitatorClient({ baseUrl: 'https://fac.example' });
|
|
54
|
+
* const server = new X402Server()
|
|
55
|
+
* .register('tron:nile', new DefaultServerMechanism('exact_permit'))
|
|
56
|
+
* .setFacilitator(facilitator);
|
|
57
|
+
*
|
|
58
|
+
* const accepts = await server.buildPaymentRequirements([
|
|
59
|
+
* { scheme: 'exact_permit', network: 'tron:nile', price: '1 USDT', payTo: 'T...' },
|
|
60
|
+
* ]);
|
|
61
|
+
* const challenge = server.createPaymentRequiredResponse(accepts);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare class X402Server {
|
|
65
|
+
/** network → scheme → mechanism */
|
|
66
|
+
private readonly mechanisms;
|
|
67
|
+
private facilitator;
|
|
68
|
+
/** Register a {@link ServerMechanism} for one network. Chainable. */
|
|
69
|
+
register(network: string, mechanism: ServerMechanism): this;
|
|
70
|
+
/** Set the facilitator client. Required before {@link verifyPayment} / {@link settlePayment}. */
|
|
71
|
+
setFacilitator(client: FacilitatorClient): this;
|
|
72
|
+
/**
|
|
73
|
+
* Turn a list of {@link ResourceConfig} into ready-to-serve {@link PaymentRequirements}.
|
|
74
|
+
*
|
|
75
|
+
* Pipeline per config:
|
|
76
|
+
* 1. Find mechanism by `(network, scheme)`; throw if not registered.
|
|
77
|
+
* 2. Parse `price` → asset + amount via mechanism.
|
|
78
|
+
* 3. Build initial `PaymentRequirements`.
|
|
79
|
+
* 4. Let mechanism `enhancePaymentRequirements` attach extras (token name/version, etc.).
|
|
80
|
+
* 5. Normalize EVM addresses via checksum.
|
|
81
|
+
*
|
|
82
|
+
* If a facilitator is configured, permit-style requirements (`scheme !== 'exact'`)
|
|
83
|
+
* get enriched with `extra.fee` from `/fee/quote`. Unsupported (network, scheme, asset)
|
|
84
|
+
* tuples returned by the facilitator are silently dropped from the result.
|
|
85
|
+
*
|
|
86
|
+
* Mirrors Python `X402Server.build_payment_requirements`.
|
|
87
|
+
*/
|
|
88
|
+
buildPaymentRequirements(configs: ResourceConfig[]): Promise<PaymentRequirements[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Build the 402 PaymentRequired challenge body. The facilitator is not
|
|
91
|
+
* consulted here — the caller has already obtained `requirements` via
|
|
92
|
+
* {@link buildPaymentRequirements} or constructed them by hand.
|
|
93
|
+
*/
|
|
94
|
+
createPaymentRequiredResponse(requirements: PaymentRequirements[], options?: BuildPaymentRequiredOptions): PaymentRequired;
|
|
95
|
+
/**
|
|
96
|
+
* Anti-tamper validation + optional server-side signature check, then
|
|
97
|
+
* delegate to the facilitator. Mirrors Python `verify_payment`.
|
|
98
|
+
*/
|
|
99
|
+
verifyPayment(payload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>;
|
|
100
|
+
/** Delegate settlement to the facilitator. Mirrors Python `settle_payment`. */
|
|
101
|
+
settlePayment(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>;
|
|
102
|
+
/**
|
|
103
|
+
* Anti-tampering: the client's `payload.accepted` must match server's
|
|
104
|
+
* canonical `requirements`, and the embedded authorization / permit must
|
|
105
|
+
* point at the right asset / payTo / amount.
|
|
106
|
+
*
|
|
107
|
+
* Two flavors:
|
|
108
|
+
* - `exact` (ERC-3009): inspects `payload.payload.authorization`
|
|
109
|
+
* - other (permit-style): inspects `payload.payload.paymentPermit`
|
|
110
|
+
*/
|
|
111
|
+
private validatePayloadMatchesRequirements;
|
|
112
|
+
private findMechanism;
|
|
113
|
+
private normalizeEvmRequirements;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=x402Server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402Server.d.ts","sourceRoot":"","sources":["../../src/server/x402Server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAErF,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,yDAAyD;AACzD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,MAAM;IAE/C,MAAM,IAAI,MAAM;IAIV,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAIzC,0BAA0B,CAC9B,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,CAAC;IAI/B,2BAA2B,CAAC,aAAa,EAAE,mBAAmB,GAAG,OAAO;CAGzE;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAU;IACrB,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmD;IAC9E,OAAO,CAAC,WAAW,CAAkC;IAErD,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,IAAI;IAW3D,iGAAiG;IACjG,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAK/C;;;;;;;;;;;;;;;OAeG;IACG,wBAAwB,CAC5B,OAAO,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAiEjC;;;;OAIG;IACH,6BAA6B,CAC3B,YAAY,EAAE,mBAAmB,EAAE,EACnC,OAAO,GAAE,2BAAgC,GACxC,eAAe;IAwBlB;;;OAGG;IACG,aAAa,CACjB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAAC,cAAc,CAAC;IAqB1B,+EAA+E;IACzE,aAAa,CACjB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAAC,cAAc,CAAC;IAW1B;;;;;;;;OAQG;IACH,OAAO,CAAC,kCAAkC;IAkD1C,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,wBAAwB;CA0BjC"}
|