@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,318 @@
|
|
|
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 { getAddress, isAddress } from 'viem';
|
|
19
|
+
import { parsePrice } from '../tokens.js';
|
|
20
|
+
import { generatePaymentId } from '../utils/index.js';
|
|
21
|
+
import { PAYMENT_ONLY } from './types.js';
|
|
22
|
+
/**
|
|
23
|
+
* Default {@link ServerMechanism} that delegates `parsePrice` to the token
|
|
24
|
+
* registry and applies a no-op `enhancePaymentRequirements`. Useful when a
|
|
25
|
+
* chain/scheme needs no scheme-specific enrichment.
|
|
26
|
+
*/
|
|
27
|
+
export class DefaultServerMechanism {
|
|
28
|
+
schemeName;
|
|
29
|
+
constructor(schemeName) {
|
|
30
|
+
this.schemeName = schemeName;
|
|
31
|
+
}
|
|
32
|
+
scheme() {
|
|
33
|
+
return this.schemeName;
|
|
34
|
+
}
|
|
35
|
+
async parsePrice(price, network) {
|
|
36
|
+
return parsePrice(price, network);
|
|
37
|
+
}
|
|
38
|
+
async enhancePaymentRequirements(requirements, _deliveryMode) {
|
|
39
|
+
return requirements;
|
|
40
|
+
}
|
|
41
|
+
validatePaymentRequirements(_requirements) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Core server orchestration. One instance per resource server.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* const facilitator = new FacilitatorClient({ baseUrl: 'https://fac.example' });
|
|
51
|
+
* const server = new X402Server()
|
|
52
|
+
* .register('tron:nile', new DefaultServerMechanism('exact_permit'))
|
|
53
|
+
* .setFacilitator(facilitator);
|
|
54
|
+
*
|
|
55
|
+
* const accepts = await server.buildPaymentRequirements([
|
|
56
|
+
* { scheme: 'exact_permit', network: 'tron:nile', price: '1 USDT', payTo: 'T...' },
|
|
57
|
+
* ]);
|
|
58
|
+
* const challenge = server.createPaymentRequiredResponse(accepts);
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export class X402Server {
|
|
62
|
+
/** network → scheme → mechanism */
|
|
63
|
+
mechanisms = new Map();
|
|
64
|
+
facilitator = null;
|
|
65
|
+
/** Register a {@link ServerMechanism} for one network. Chainable. */
|
|
66
|
+
register(network, mechanism) {
|
|
67
|
+
const scheme = mechanism.scheme();
|
|
68
|
+
let byScheme = this.mechanisms.get(network);
|
|
69
|
+
if (!byScheme) {
|
|
70
|
+
byScheme = new Map();
|
|
71
|
+
this.mechanisms.set(network, byScheme);
|
|
72
|
+
}
|
|
73
|
+
byScheme.set(scheme, mechanism);
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
/** Set the facilitator client. Required before {@link verifyPayment} / {@link settlePayment}. */
|
|
77
|
+
setFacilitator(client) {
|
|
78
|
+
this.facilitator = client;
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Turn a list of {@link ResourceConfig} into ready-to-serve {@link PaymentRequirements}.
|
|
83
|
+
*
|
|
84
|
+
* Pipeline per config:
|
|
85
|
+
* 1. Find mechanism by `(network, scheme)`; throw if not registered.
|
|
86
|
+
* 2. Parse `price` → asset + amount via mechanism.
|
|
87
|
+
* 3. Build initial `PaymentRequirements`.
|
|
88
|
+
* 4. Let mechanism `enhancePaymentRequirements` attach extras (token name/version, etc.).
|
|
89
|
+
* 5. Normalize EVM addresses via checksum.
|
|
90
|
+
*
|
|
91
|
+
* If a facilitator is configured, permit-style requirements (`scheme !== 'exact'`)
|
|
92
|
+
* get enriched with `extra.fee` from `/fee/quote`. Unsupported (network, scheme, asset)
|
|
93
|
+
* tuples returned by the facilitator are silently dropped from the result.
|
|
94
|
+
*
|
|
95
|
+
* Mirrors Python `X402Server.build_payment_requirements`.
|
|
96
|
+
*/
|
|
97
|
+
async buildPaymentRequirements(configs) {
|
|
98
|
+
const built = [];
|
|
99
|
+
for (const config of configs) {
|
|
100
|
+
const mechanism = this.findMechanism(config.network, config.scheme);
|
|
101
|
+
if (!mechanism) {
|
|
102
|
+
throw new Error(`No ServerMechanism registered for network=${config.network}, scheme=${config.scheme}`);
|
|
103
|
+
}
|
|
104
|
+
const assetInfo = await mechanism.parsePrice(config.price, config.network);
|
|
105
|
+
let requirements = {
|
|
106
|
+
scheme: config.scheme,
|
|
107
|
+
network: config.network,
|
|
108
|
+
amount: assetInfo.amount,
|
|
109
|
+
asset: assetInfo.asset,
|
|
110
|
+
payTo: config.payTo,
|
|
111
|
+
maxTimeoutSeconds: config.validFor ?? 3600,
|
|
112
|
+
};
|
|
113
|
+
requirements = await mechanism.enhancePaymentRequirements(requirements, config.deliveryMode ?? PAYMENT_ONLY);
|
|
114
|
+
requirements = this.normalizeEvmRequirements(requirements);
|
|
115
|
+
built.push(requirements);
|
|
116
|
+
}
|
|
117
|
+
if (!this.facilitator) {
|
|
118
|
+
throw new Error('Facilitator is not set (call setFacilitator first)');
|
|
119
|
+
}
|
|
120
|
+
// Split: exact doesn't need fee quote; everything else (permit-style) does.
|
|
121
|
+
const exactReqs = built.filter((r) => r.scheme === 'exact');
|
|
122
|
+
const permitReqs = built.filter((r) => r.scheme !== 'exact');
|
|
123
|
+
const supported = [...exactReqs];
|
|
124
|
+
if (permitReqs.length > 0) {
|
|
125
|
+
const quotes = await this.facilitator.feeQuote(permitReqs);
|
|
126
|
+
const quoteMap = new Map();
|
|
127
|
+
for (const q of quotes) {
|
|
128
|
+
quoteMap.set(`${q.scheme}|${q.network}|${q.asset}`, q);
|
|
129
|
+
}
|
|
130
|
+
for (const req of permitReqs) {
|
|
131
|
+
const quote = quoteMap.get(`${req.scheme}|${req.network}|${req.asset}`);
|
|
132
|
+
if (!quote) {
|
|
133
|
+
// Facilitator can't quote this (unsupported token / scheme). Silently skip.
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const enriched = {
|
|
137
|
+
...req,
|
|
138
|
+
extra: {
|
|
139
|
+
...(req.extra ?? {}),
|
|
140
|
+
fee: {
|
|
141
|
+
...quote.fee,
|
|
142
|
+
facilitatorId: this.facilitator.facilitatorId,
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
supported.push(this.normalizeEvmRequirements(enriched));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return supported;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Build the 402 PaymentRequired challenge body. The facilitator is not
|
|
153
|
+
* consulted here — the caller has already obtained `requirements` via
|
|
154
|
+
* {@link buildPaymentRequirements} or constructed them by hand.
|
|
155
|
+
*/
|
|
156
|
+
createPaymentRequiredResponse(requirements, options = {}) {
|
|
157
|
+
const now = Math.floor(Date.now() / 1000);
|
|
158
|
+
const validBefore = options.validBefore ?? now + 3600;
|
|
159
|
+
const validAfter = options.validAfter ?? now;
|
|
160
|
+
return {
|
|
161
|
+
x402Version: 2,
|
|
162
|
+
error: 'Payment required',
|
|
163
|
+
...(options.resource ? { resource: options.resource } : {}),
|
|
164
|
+
accepts: requirements,
|
|
165
|
+
extensions: {
|
|
166
|
+
paymentPermitContext: {
|
|
167
|
+
meta: {
|
|
168
|
+
kind: PAYMENT_ONLY,
|
|
169
|
+
paymentId: options.paymentId ?? generatePaymentId(),
|
|
170
|
+
nonce: options.nonce ?? generateNonce(),
|
|
171
|
+
validAfter,
|
|
172
|
+
validBefore,
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Anti-tamper validation + optional server-side signature check, then
|
|
180
|
+
* delegate to the facilitator. Mirrors Python `verify_payment`.
|
|
181
|
+
*/
|
|
182
|
+
async verifyPayment(payload, requirements) {
|
|
183
|
+
if (!this.validatePayloadMatchesRequirements(payload, requirements)) {
|
|
184
|
+
return { isValid: false, invalidReason: 'payload_mismatch' };
|
|
185
|
+
}
|
|
186
|
+
const mechanism = this.findMechanism(requirements.network, requirements.scheme);
|
|
187
|
+
if (mechanism?.verifySignature) {
|
|
188
|
+
const permit = payload.payload.paymentPermit ?? null;
|
|
189
|
+
const signature = payload.payload.signature;
|
|
190
|
+
const ok = await mechanism.verifySignature(permit, signature, requirements.network);
|
|
191
|
+
if (!ok) {
|
|
192
|
+
return { isValid: false, invalidReason: 'invalid_signature_server' };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (!this.facilitator) {
|
|
196
|
+
return { isValid: false, invalidReason: 'no_facilitator' };
|
|
197
|
+
}
|
|
198
|
+
return this.facilitator.verify(payload, requirements);
|
|
199
|
+
}
|
|
200
|
+
/** Delegate settlement to the facilitator. Mirrors Python `settle_payment`. */
|
|
201
|
+
async settlePayment(payload, requirements) {
|
|
202
|
+
if (!this.facilitator) {
|
|
203
|
+
return {
|
|
204
|
+
success: false,
|
|
205
|
+
network: requirements.network,
|
|
206
|
+
errorReason: 'no_facilitator',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return this.facilitator.settle(payload, requirements);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Anti-tampering: the client's `payload.accepted` must match server's
|
|
213
|
+
* canonical `requirements`, and the embedded authorization / permit must
|
|
214
|
+
* point at the right asset / payTo / amount.
|
|
215
|
+
*
|
|
216
|
+
* Two flavors:
|
|
217
|
+
* - `exact` (ERC-3009): inspects `payload.payload.authorization`
|
|
218
|
+
* - other (permit-style): inspects `payload.payload.paymentPermit`
|
|
219
|
+
*/
|
|
220
|
+
validatePayloadMatchesRequirements(payload, requirements) {
|
|
221
|
+
if (requirements.scheme === 'exact') {
|
|
222
|
+
const auth = payload.payload.authorization ??
|
|
223
|
+
(payload.extensions ?? {})['transferAuthorization'];
|
|
224
|
+
if (!auth)
|
|
225
|
+
return false;
|
|
226
|
+
if (payload.accepted) {
|
|
227
|
+
if (payload.accepted.asset !== requirements.asset)
|
|
228
|
+
return false;
|
|
229
|
+
if (payload.accepted.network !== requirements.network)
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
if (BigInt(String(auth.value)) < BigInt(requirements.amount))
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
if (String(auth.to).toLowerCase() !== String(requirements.payTo).toLowerCase()) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
const now = Math.floor(Date.now() / 1000);
|
|
243
|
+
try {
|
|
244
|
+
const validBefore = BigInt(String(auth.validBefore ?? '0'));
|
|
245
|
+
const validAfter = BigInt(String(auth.validAfter ?? now));
|
|
246
|
+
if (validBefore < BigInt(now))
|
|
247
|
+
return false;
|
|
248
|
+
if (validAfter > BigInt(now))
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
const permit = payload.payload.paymentPermit;
|
|
257
|
+
if (!permit)
|
|
258
|
+
return false;
|
|
259
|
+
if (permit.payment.payToken !== requirements.asset)
|
|
260
|
+
return false;
|
|
261
|
+
if (permit.payment.payTo !== requirements.payTo)
|
|
262
|
+
return false;
|
|
263
|
+
try {
|
|
264
|
+
if (BigInt(permit.payment.payAmount) < BigInt(requirements.amount))
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
findMechanism(network, scheme) {
|
|
273
|
+
return this.mechanisms.get(network)?.get(scheme) ?? null;
|
|
274
|
+
}
|
|
275
|
+
normalizeEvmRequirements(reqs) {
|
|
276
|
+
if (!reqs.network.startsWith('eip155:')) {
|
|
277
|
+
return reqs;
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
...reqs,
|
|
281
|
+
asset: checksumOrThrow(reqs.asset, 'asset'),
|
|
282
|
+
payTo: checksumOrThrow(reqs.payTo, 'payTo'),
|
|
283
|
+
extra: reqs.extra
|
|
284
|
+
? {
|
|
285
|
+
...reqs.extra,
|
|
286
|
+
...(reqs.extra.fee
|
|
287
|
+
? {
|
|
288
|
+
fee: {
|
|
289
|
+
...reqs.extra.fee,
|
|
290
|
+
feeTo: checksumOrThrow(reqs.extra.fee.feeTo, 'extra.fee.feeTo'),
|
|
291
|
+
...(reqs.extra.fee.caller
|
|
292
|
+
? { caller: checksumOrThrow(reqs.extra.fee.caller, 'extra.fee.caller') }
|
|
293
|
+
: {}),
|
|
294
|
+
},
|
|
295
|
+
}
|
|
296
|
+
: {}),
|
|
297
|
+
}
|
|
298
|
+
: reqs.extra,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
function checksumOrThrow(address, field) {
|
|
303
|
+
if (!isAddress(address, { strict: false })) {
|
|
304
|
+
throw new Error(`Invalid EVM address for ${field}: ${address}`);
|
|
305
|
+
}
|
|
306
|
+
return getAddress(address);
|
|
307
|
+
}
|
|
308
|
+
function generateNonce() {
|
|
309
|
+
// 16 random bytes, decimal-encoded — matches Python's str(uuid.uuid4().int) shape.
|
|
310
|
+
const bytes = new Uint8Array(16);
|
|
311
|
+
crypto.getRandomValues(bytes);
|
|
312
|
+
let nonce = 0n;
|
|
313
|
+
for (const byte of bytes) {
|
|
314
|
+
nonce = (nonce << 8n) | BigInt(byte);
|
|
315
|
+
}
|
|
316
|
+
return nonce.toString();
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=x402Server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402Server.js","sourceRoot":"","sources":["../../src/server/x402Server.ts"],"names":[],"mappings":"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"}
|
package/dist/tokens.d.ts
CHANGED
|
@@ -16,4 +16,33 @@ export declare function findByAddress(network: string, address: string): TokenIn
|
|
|
16
16
|
export declare function getNetworkTokens(network: string): Record<string, TokenInfo>;
|
|
17
17
|
/** Register a custom token */
|
|
18
18
|
export declare function registerToken(network: string, token: TokenInfo): void;
|
|
19
|
+
/** Parsed asset amount returned by {@link parsePrice}. */
|
|
20
|
+
export interface AssetAmount {
|
|
21
|
+
/** Amount in smallest unit (e.g. "1000000" for 1 USDT with 6 decimals). */
|
|
22
|
+
amount: string;
|
|
23
|
+
/** Token contract address on the network. */
|
|
24
|
+
asset: string;
|
|
25
|
+
/** Token decimals. */
|
|
26
|
+
decimals: number;
|
|
27
|
+
/** Token symbol (e.g. "USDT"). */
|
|
28
|
+
symbol: string;
|
|
29
|
+
/** Token display name. */
|
|
30
|
+
name: string;
|
|
31
|
+
/** EIP-712 / TIP-712 contract version (for permit) when applicable. */
|
|
32
|
+
version?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse a human-readable price string into a typed asset amount.
|
|
36
|
+
*
|
|
37
|
+
* @param price - `"<decimal-amount> <symbol>"` (e.g. `"1.25 USDT"` or `"100 USDC"`).
|
|
38
|
+
* Whitespace-tolerant. `<symbol>` lookup is case-insensitive.
|
|
39
|
+
* @param network - CAIP-2 network identifier (e.g. `"tron:nile"`, `"eip155:97"`).
|
|
40
|
+
*
|
|
41
|
+
* @throws if the price format is invalid, the amount cannot be parsed,
|
|
42
|
+
* the token is not registered on `network`, or the amount has more
|
|
43
|
+
* decimal places than the token supports.
|
|
44
|
+
*
|
|
45
|
+
* Mirrors `bankofai.x402.tokens.TokenRegistry.parse_price`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function parsePrice(price: string, network: string): AssetAmount;
|
|
19
48
|
//# sourceMappingURL=tokens.d.ts.map
|
package/dist/tokens.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkFD,2CAA2C;AAC3C,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE/E;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAKrF;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAE3E;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAKrE"}
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkFD,2CAA2C;AAC3C,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE/E;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAKrF;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAE3E;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAKrE;AAED,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAsCtE"}
|
package/dist/tokens.js
CHANGED
|
@@ -103,4 +103,48 @@ export function registerToken(network, token) {
|
|
|
103
103
|
}
|
|
104
104
|
TOKENS[network][token.symbol.toUpperCase()] = token;
|
|
105
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Parse a human-readable price string into a typed asset amount.
|
|
108
|
+
*
|
|
109
|
+
* @param price - `"<decimal-amount> <symbol>"` (e.g. `"1.25 USDT"` or `"100 USDC"`).
|
|
110
|
+
* Whitespace-tolerant. `<symbol>` lookup is case-insensitive.
|
|
111
|
+
* @param network - CAIP-2 network identifier (e.g. `"tron:nile"`, `"eip155:97"`).
|
|
112
|
+
*
|
|
113
|
+
* @throws if the price format is invalid, the amount cannot be parsed,
|
|
114
|
+
* the token is not registered on `network`, or the amount has more
|
|
115
|
+
* decimal places than the token supports.
|
|
116
|
+
*
|
|
117
|
+
* Mirrors `bankofai.x402.tokens.TokenRegistry.parse_price`.
|
|
118
|
+
*/
|
|
119
|
+
export function parsePrice(price, network) {
|
|
120
|
+
const parts = price.trim().split(/\s+/);
|
|
121
|
+
if (parts.length !== 2) {
|
|
122
|
+
throw new Error(`Invalid price format: "${price}". Expected "<amount> <symbol>" (e.g. "1.25 USDT").`);
|
|
123
|
+
}
|
|
124
|
+
const [amountStr, symbol] = parts;
|
|
125
|
+
if (!/^\d+(\.\d+)?$/.test(amountStr)) {
|
|
126
|
+
throw new Error(`Invalid amount in price "${price}": "${amountStr}" is not a non-negative decimal.`);
|
|
127
|
+
}
|
|
128
|
+
const token = getToken(network, symbol);
|
|
129
|
+
if (!token) {
|
|
130
|
+
throw new Error(`Unknown token "${symbol}" on network "${network}".`);
|
|
131
|
+
}
|
|
132
|
+
// BigInt-safe smallest-unit conversion. Reject precision overflow.
|
|
133
|
+
const [intPart, fracPart = ''] = amountStr.split('.');
|
|
134
|
+
if (fracPart.length > token.decimals) {
|
|
135
|
+
throw new Error(`Amount "${amountStr}" has more decimal places (${fracPart.length}) than ${symbol} supports (${token.decimals}).`);
|
|
136
|
+
}
|
|
137
|
+
const paddedFrac = fracPart.padEnd(token.decimals, '0');
|
|
138
|
+
// strip leading zeros to keep canonical numeric string
|
|
139
|
+
const combined = `${intPart}${paddedFrac}`.replace(/^0+(?=\d)/, '');
|
|
140
|
+
const amount = combined === '' ? '0' : combined;
|
|
141
|
+
return {
|
|
142
|
+
amount,
|
|
143
|
+
asset: token.address,
|
|
144
|
+
decimals: token.decimals,
|
|
145
|
+
symbol: token.symbol,
|
|
146
|
+
name: token.name,
|
|
147
|
+
...(token.version !== undefined ? { version: token.version } : {}),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
106
150
|
//# sourceMappingURL=tokens.js.map
|
package/dist/tokens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/encoding.d.ts
CHANGED
|
@@ -29,6 +29,13 @@ export declare function encodePaymentPayload(payload: unknown): string;
|
|
|
29
29
|
* Decode payment payload from base64 HTTP header
|
|
30
30
|
*/
|
|
31
31
|
export declare function decodePaymentPayload<T>(encoded: string): T;
|
|
32
|
+
/**
|
|
33
|
+
* Generate a random 16-byte payment ID, formatted as `0x` + 32 hex chars.
|
|
34
|
+
*
|
|
35
|
+
* Used by `X402Server.createPaymentRequiredResponse` when the caller doesn't
|
|
36
|
+
* supply an explicit `paymentId`. Mirrors Python `generate_payment_id`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function generatePaymentId(): string;
|
|
32
39
|
/**
|
|
33
40
|
* Convert hex string to Uint8Array
|
|
34
41
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAW9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAU5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAEnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAG7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAG1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAOlD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,UAAO,GAAG,MAAM,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAW9D"}
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAW9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAU5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAEnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAG7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAG1D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAOlD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,UAAO,GAAG,MAAM,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAW9D"}
|
package/dist/utils/encoding.js
CHANGED
|
@@ -65,6 +65,21 @@ export function decodePaymentPayload(encoded) {
|
|
|
65
65
|
const json = decodeBase64(encoded);
|
|
66
66
|
return JSON.parse(json);
|
|
67
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Generate a random 16-byte payment ID, formatted as `0x` + 32 hex chars.
|
|
70
|
+
*
|
|
71
|
+
* Used by `X402Server.createPaymentRequiredResponse` when the caller doesn't
|
|
72
|
+
* supply an explicit `paymentId`. Mirrors Python `generate_payment_id`.
|
|
73
|
+
*/
|
|
74
|
+
export function generatePaymentId() {
|
|
75
|
+
const bytes = new Uint8Array(16);
|
|
76
|
+
crypto.getRandomValues(bytes);
|
|
77
|
+
let hex = '';
|
|
78
|
+
for (const byte of bytes) {
|
|
79
|
+
hex += byte.toString(16).padStart(2, '0');
|
|
80
|
+
}
|
|
81
|
+
return `0x${hex}`;
|
|
82
|
+
}
|
|
68
83
|
/**
|
|
69
84
|
* Convert hex string to Uint8Array
|
|
70
85
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* Utility exports
|
|
3
3
|
*/
|
|
4
4
|
export * from './encoding.js';
|
|
5
|
-
export { encodeBase64, decodeBase64, decodeBase64ToBytes, hexToBytes, bytesToHex, paymentIdToBytes } from './encoding.js';
|
|
5
|
+
export { encodeBase64, decodeBase64, decodeBase64ToBytes, generatePaymentId, hexToBytes, bytesToHex, paymentIdToBytes, } from './encoding.js';
|
|
6
6
|
export * from './gasfree.js';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,cAAc,cAAc,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* Utility exports
|
|
3
3
|
*/
|
|
4
4
|
export * from './encoding.js';
|
|
5
|
-
export { encodeBase64, decodeBase64, decodeBase64ToBytes, hexToBytes, bytesToHex, paymentIdToBytes } from './encoding.js';
|
|
5
|
+
export { encodeBase64, decodeBase64, decodeBase64ToBytes, generatePaymentId, hexToBytes, bytesToHex, paymentIdToBytes, } from './encoding.js';
|
|
6
6
|
export * from './gasfree.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transaction Verification Utilities
|
|
3
|
+
*
|
|
4
|
+
* Generic functionality to verify blockchain transaction results after the
|
|
5
|
+
* facilitator reports settlement, ensuring on-chain transfers match expected
|
|
6
|
+
* parameters. Mirrors `bankofai.x402.utils.tx_verification`.
|
|
7
|
+
*
|
|
8
|
+
* This module provides the **base contracts**. Chain-specific implementations
|
|
9
|
+
* (TRON via tronweb, EVM via viem) subclass {@link BaseTransactionVerifier}
|
|
10
|
+
* and plug in via {@link getVerifierForNetwork}.
|
|
11
|
+
*/
|
|
12
|
+
import type { PaymentPayload, PaymentRequirements } from '../types/index.js';
|
|
13
|
+
/** A single token transfer event extracted from a transaction. */
|
|
14
|
+
export interface TransferEvent {
|
|
15
|
+
/** Token contract address. */
|
|
16
|
+
token: string;
|
|
17
|
+
/** Sender address. */
|
|
18
|
+
fromAddr: string;
|
|
19
|
+
/** Recipient address. */
|
|
20
|
+
toAddr: string;
|
|
21
|
+
/** Transfer amount in smallest unit (as a BigInt-safe string). */
|
|
22
|
+
amount: string;
|
|
23
|
+
}
|
|
24
|
+
/** Outcome of {@link TransactionVerifier.verifyTransaction}. */
|
|
25
|
+
export interface TransactionVerificationResult {
|
|
26
|
+
success: boolean;
|
|
27
|
+
txHash: string;
|
|
28
|
+
blockNumber?: string;
|
|
29
|
+
errorReason?: string;
|
|
30
|
+
transfers?: TransferEvent[];
|
|
31
|
+
/** Whether the on-chain transaction status was "success". */
|
|
32
|
+
statusVerified: boolean;
|
|
33
|
+
/** Whether the payment transfer (amount + recipient) was verified. */
|
|
34
|
+
paymentVerified: boolean;
|
|
35
|
+
/** Whether the facilitator fee transfer was verified (when applicable). */
|
|
36
|
+
feeVerified: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Interface for transaction verification implementations. One per chain family.
|
|
40
|
+
*
|
|
41
|
+
* Wraps the chain's transaction-info / transfer-events RPC and applies the
|
|
42
|
+
* canonical "did the right transfer happen" check.
|
|
43
|
+
*/
|
|
44
|
+
export interface TransactionVerifier {
|
|
45
|
+
verifyTransaction(txHash: string, payload: PaymentPayload, requirements: PaymentRequirements): Promise<TransactionVerificationResult>;
|
|
46
|
+
getTransactionTransfers(txHash: string, tokenAddress: string): Promise<TransferEvent[]>;
|
|
47
|
+
}
|
|
48
|
+
/** Generic transaction-info shape returned by chain-specific RPC adapters. */
|
|
49
|
+
export interface TransactionInfo {
|
|
50
|
+
status?: string | number;
|
|
51
|
+
blockNumber?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Abstract base class for transaction verifiers. Subclasses implement the
|
|
55
|
+
* chain-specific RPC calls; the canonical verification flow lives here.
|
|
56
|
+
*
|
|
57
|
+
* Mirrors Python `BaseTransactionVerifier`. Like the Python base, the default
|
|
58
|
+
* {@link verifyTransaction} only checks that the on-chain transaction
|
|
59
|
+
* succeeded — chain-specific subclasses MAY override for richer transfer +
|
|
60
|
+
* fee verification.
|
|
61
|
+
*/
|
|
62
|
+
export declare abstract class BaseTransactionVerifier implements TransactionVerifier {
|
|
63
|
+
/** Chain-specific: pull transaction info (status, blockNumber) from RPC. */
|
|
64
|
+
abstract getTransactionInfo(txHash: string): Promise<TransactionInfo>;
|
|
65
|
+
/** Chain-specific: pull token transfer events from the transaction. */
|
|
66
|
+
abstract getTransactionTransfers(txHash: string, tokenAddress: string): Promise<TransferEvent[]>;
|
|
67
|
+
/** Chain-specific: normalize an address for equality comparison. */
|
|
68
|
+
abstract normalizeAddress(address: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Canonical verification flow: pull transaction info, check status.
|
|
71
|
+
*
|
|
72
|
+
* Subclasses can override to additionally verify transfer amounts /
|
|
73
|
+
* fee transfers — set `paymentVerified` / `feeVerified` accordingly.
|
|
74
|
+
*/
|
|
75
|
+
verifyTransaction(txHash: string, _payload: PaymentPayload, _requirements: PaymentRequirements): Promise<TransactionVerificationResult>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Registry of (network-prefix → verifier factory) entries.
|
|
79
|
+
*
|
|
80
|
+
* Chain-specific verifiers register themselves at module load (e.g. a TRON
|
|
81
|
+
* verifier package would call `registerVerifierFactory('tron:', ...)`); the
|
|
82
|
+
* core `@bankofai/x402` package ships no concrete verifiers itself.
|
|
83
|
+
*/
|
|
84
|
+
type VerifierFactory = (network: string, opts?: {
|
|
85
|
+
rpcUrl?: string;
|
|
86
|
+
}) => TransactionVerifier;
|
|
87
|
+
/**
|
|
88
|
+
* Register a verifier factory for a network prefix (e.g. `"tron:"`, `"eip155:"`).
|
|
89
|
+
* Calls override any prior registration for the same prefix.
|
|
90
|
+
*/
|
|
91
|
+
export declare function registerVerifierFactory(prefix: string, factory: VerifierFactory): void;
|
|
92
|
+
/**
|
|
93
|
+
* Resolve a {@link TransactionVerifier} for a given network.
|
|
94
|
+
*
|
|
95
|
+
* Throws if no factory has been registered for the network's prefix. Callers
|
|
96
|
+
* that want optional verification (e.g. server middleware) should catch this
|
|
97
|
+
* and skip verification gracefully.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* try {
|
|
102
|
+
* const verifier = getVerifierForNetwork('tron:nile');
|
|
103
|
+
* const result = await verifier.verifyTransaction(txHash, payload, requirements);
|
|
104
|
+
* } catch {
|
|
105
|
+
* // No verifier registered → skip on-chain re-check (facilitator is trusted).
|
|
106
|
+
* }
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export declare function getVerifierForNetwork(network: string, opts?: {
|
|
110
|
+
rpcUrl?: string;
|
|
111
|
+
}): TransactionVerifier;
|
|
112
|
+
export {};
|
|
113
|
+
//# sourceMappingURL=tx_verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_verification.d.ts","sourceRoot":"","sources":["../../src/utils/tx_verification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7E,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,6DAA6D;IAC7D,cAAc,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,eAAe,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,CACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAC1C,uBAAuB,CACrB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC7B;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,8BAAsB,uBAAwB,YAAW,mBAAmB;IAC1E,4EAA4E;IAC5E,QAAQ,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAErE,uEAAuE;IACvE,QAAQ,CAAC,uBAAuB,CAC9B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,EAAE,CAAC;IAE3B,oEAAoE;IACpE,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAElD;;;;;OAKG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,EACxB,aAAa,EAAE,mBAAmB,GACjC,OAAO,CAAC,6BAA6B,CAAC;CAmC1C;AAED;;;;;;GAMG;AACH,KAAK,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,mBAAmB,CAAC;AAG5F;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAEtF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,mBAAmB,CAOrB"}
|