@absol-labs/agent 0.10.0 → 0.11.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/README.md +107 -23
- package/dist/capability/invocation-capability.d.ts +18 -6
- package/dist/capability/invocation-capability.d.ts.map +1 -1
- package/dist/capability/invocation-capability.js.map +1 -1
- package/dist/cli/commands/claim.d.ts.map +1 -1
- package/dist/cli/commands/claim.js +20 -4
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.d.ts.map +1 -1
- package/dist/cli/commands/close.js +16 -4
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/invoke.d.ts.map +1 -1
- package/dist/cli/commands/invoke.js +1 -0
- package/dist/cli/commands/invoke.js.map +1 -1
- package/dist/cli/commands/open.d.ts.map +1 -1
- package/dist/cli/commands/open.js +63 -11
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/reclaim-unverified.d.ts.map +1 -1
- package/dist/cli/commands/reclaim-unverified.js +12 -4
- package/dist/cli/commands/reclaim-unverified.js.map +1 -1
- package/dist/cli/commands/reclaim.d.ts.map +1 -1
- package/dist/cli/commands/reclaim.js +16 -5
- package/dist/cli/commands/reclaim.js.map +1 -1
- package/dist/cli/commands/streams.js +1 -1
- package/dist/cli/commands/streams.js.map +1 -1
- package/dist/cli/deps.d.ts +53 -7
- package/dist/cli/deps.d.ts.map +1 -1
- package/dist/cli/deps.js +65 -15
- package/dist/cli/deps.js.map +1 -1
- package/dist/cli/privy.d.ts +83 -0
- package/dist/cli/privy.d.ts.map +1 -0
- package/dist/cli/privy.js +230 -0
- package/dist/cli/privy.js.map +1 -0
- package/dist/cli/spend-policy.d.ts +60 -0
- package/dist/cli/spend-policy.d.ts.map +1 -0
- package/dist/cli/spend-policy.js +65 -0
- package/dist/cli/spend-policy.js.map +1 -0
- package/dist/cli/wallet.d.ts +108 -39
- package/dist/cli/wallet.d.ts.map +1 -1
- package/dist/cli/wallet.js +108 -43
- package/dist/cli/wallet.js.map +1 -1
- package/dist/gateway/caller-auth-gateway.d.ts +38 -3
- package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
- package/dist/gateway/caller-auth-gateway.js +25 -1
- package/dist/gateway/caller-auth-gateway.js.map +1 -1
- package/dist/gateway/http-server.d.ts +53 -0
- package/dist/gateway/http-server.d.ts.map +1 -1
- package/dist/gateway/http-server.js +189 -4
- package/dist/gateway/http-server.js.map +1 -1
- package/dist/gateway/x402-mode.d.ts +123 -0
- package/dist/gateway/x402-mode.d.ts.map +1 -0
- package/dist/gateway/x402-mode.js +212 -0
- package/dist/gateway/x402-mode.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/mandates/env.d.ts +3 -2
- package/dist/mandates/env.d.ts.map +1 -1
- package/dist/mandates/env.js +3 -2
- package/dist/mandates/env.js.map +1 -1
- package/dist/mcp/server.d.ts +49 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +513 -24
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/service-invoker.d.ts +97 -0
- package/dist/mcp/service-invoker.d.ts.map +1 -0
- package/dist/mcp/service-invoker.js +167 -0
- package/dist/mcp/service-invoker.js.map +1 -0
- package/dist/sdk/invoke.d.ts +19 -4
- package/dist/sdk/invoke.d.ts.map +1 -1
- package/dist/sdk/invoke.js +69 -5
- package/dist/sdk/invoke.js.map +1 -1
- package/dist/x402/delivery-oracle.d.ts +108 -0
- package/dist/x402/delivery-oracle.d.ts.map +1 -0
- package/dist/x402/delivery-oracle.js +174 -0
- package/dist/x402/delivery-oracle.js.map +1 -0
- package/dist/x402/facilitator-server-entry.d.ts +3 -0
- package/dist/x402/facilitator-server-entry.d.ts.map +1 -0
- package/dist/x402/facilitator-server-entry.js +27 -0
- package/dist/x402/facilitator-server-entry.js.map +1 -0
- package/dist/x402/facilitator-server.d.ts +73 -0
- package/dist/x402/facilitator-server.d.ts.map +1 -0
- package/dist/x402/facilitator-server.js +305 -0
- package/dist/x402/facilitator-server.js.map +1 -0
- package/dist/x402/facilitator.d.ts +69 -17
- package/dist/x402/facilitator.d.ts.map +1 -1
- package/dist/x402/facilitator.js +76 -33
- package/dist/x402/facilitator.js.map +1 -1
- package/dist/x402/payment-requirements.d.ts +106 -0
- package/dist/x402/payment-requirements.d.ts.map +1 -0
- package/dist/x402/payment-requirements.js +138 -0
- package/dist/x402/payment-requirements.js.map +1 -0
- package/dist/x402/relayer.d.ts +41 -0
- package/dist/x402/relayer.d.ts.map +1 -0
- package/dist/x402/relayer.js +64 -0
- package/dist/x402/relayer.js.map +1 -0
- package/dist/x402/resource-index.d.ts +75 -0
- package/dist/x402/resource-index.d.ts.map +1 -0
- package/dist/x402/resource-index.js +126 -0
- package/dist/x402/resource-index.js.map +1 -0
- package/dist/x402/verified-delivery-facilitator.d.ts +285 -0
- package/dist/x402/verified-delivery-facilitator.d.ts.map +1 -0
- package/dist/x402/verified-delivery-facilitator.js +423 -0
- package/dist/x402/verified-delivery-facilitator.js.map +1 -0
- package/dist/zktls/t2-delivery-proof.d.ts +6 -6
- package/docs/agent-layer.md +12 -8
- package/docs/cli.md +158 -22
- package/docs/mcp-hosted.md +4 -3
- package/docs/mcp-reference.md +175 -0
- package/docs/quickstart.md +18 -4
- package/docs/threat-model.md +4 -3
- package/docs/x402.md +648 -0
- package/package.json +18 -7
- package/src/capability/invocation-capability.ts +17 -1
- package/src/cli/commands/claim.ts +30 -4
- package/src/cli/commands/close.ts +20 -4
- package/src/cli/commands/invoke.ts +1 -0
- package/src/cli/commands/open.ts +76 -10
- package/src/cli/commands/reclaim-unverified.ts +16 -4
- package/src/cli/commands/reclaim.ts +22 -5
- package/src/cli/commands/streams.ts +1 -1
- package/src/cli/deps.ts +115 -24
- package/src/cli/privy.ts +396 -0
- package/src/cli/spend-policy.ts +139 -0
- package/src/cli/wallet.ts +188 -57
- package/src/gateway/caller-auth-gateway.ts +77 -6
- package/src/gateway/http-server.ts +280 -6
- package/src/gateway/x402-mode.ts +350 -0
- package/src/index.ts +40 -5
- package/src/mandates/env.ts +3 -2
- package/src/mcp/server.ts +681 -29
- package/src/mcp/service-invoker.ts +285 -0
- package/src/sdk/invoke.ts +90 -12
- package/src/x402/delivery-oracle.ts +285 -0
- package/src/x402/facilitator-server-entry.ts +35 -0
- package/src/x402/facilitator-server.ts +445 -0
- package/src/x402/facilitator.ts +125 -46
- package/src/x402/payment-requirements.ts +231 -0
- package/src/x402/relayer.ts +122 -0
- package/src/x402/resource-index.ts +228 -0
- package/src/x402/verified-delivery-facilitator.ts +744 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { createServer, } from "node:http";
|
|
2
|
+
import { timingSafeEqual } from "node:crypto";
|
|
3
|
+
import { isAddress, isHex } from "viem";
|
|
4
|
+
import { createOracleDeliveryOracle, DEFAULT_DELIVERY_FRESHNESS_SECONDS, DEFAULT_METRIK_ORACLE_URL, } from "./delivery-oracle.js";
|
|
5
|
+
import { createRegistryResourceIndex } from "./resource-index.js";
|
|
6
|
+
import { createX402PaymentSettler, createX402PaymentVerifier, relayerAddress, } from "./relayer.js";
|
|
7
|
+
import { DEFAULT_SETTLEMENT_SCOPE, MetrikVerifiedDeliveryFacilitator, RelayerNotConfiguredError, } from "./verified-delivery-facilitator.js";
|
|
8
|
+
/**
|
|
9
|
+
* Reference HTTP server for Metrik's x402 facilitator: `POST /verify`,
|
|
10
|
+
* `POST /settle`, `GET /supported` — the three endpoints the x402 facilitator
|
|
11
|
+
* interface defines, with Metrik's verified-delivery gate wired into `/verify`.
|
|
12
|
+
*
|
|
13
|
+
* Point any x402 resource server at this with
|
|
14
|
+
* `facilitator: { url: "https://<host>" }` and it becomes a resource server
|
|
15
|
+
* whose payments stop when the seller stops delivering.
|
|
16
|
+
*/
|
|
17
|
+
const MAX_BODY_BYTES = 256 * 1024;
|
|
18
|
+
export function createMetrikFacilitatorServer(config) {
|
|
19
|
+
const httpServer = createServer((req, res) => {
|
|
20
|
+
handle(req, res, config).catch((error) => {
|
|
21
|
+
if (error instanceof RelayerNotConfiguredError) {
|
|
22
|
+
writeJson(res, 503, {
|
|
23
|
+
success: false,
|
|
24
|
+
errorReason: "unexpected_settle_error",
|
|
25
|
+
transaction: "",
|
|
26
|
+
error: error.message,
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
logError("unhandled request error", error);
|
|
31
|
+
writeJson(res, 500, { error: "internal-error" });
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
httpServer,
|
|
36
|
+
listen: (port, host = "0.0.0.0") => new Promise((resolve, reject) => {
|
|
37
|
+
const onError = (error) => reject(error);
|
|
38
|
+
httpServer.once("error", onError);
|
|
39
|
+
httpServer.listen(port, host, () => {
|
|
40
|
+
httpServer.removeListener("error", onError);
|
|
41
|
+
const address = httpServer.address();
|
|
42
|
+
resolve({ port: address.port, host });
|
|
43
|
+
});
|
|
44
|
+
}),
|
|
45
|
+
close: () => new Promise((resolve, reject) => {
|
|
46
|
+
httpServer.close((error) => (error ? reject(error) : resolve()));
|
|
47
|
+
}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async function handle(req, res, config) {
|
|
51
|
+
const url = new URL(req.url ?? "/", "http://localhost");
|
|
52
|
+
const path = url.pathname.replace(/\/+$/, "") || "/";
|
|
53
|
+
if (req.method === "GET" && (path === "/supported" || path === "/")) {
|
|
54
|
+
writeJson(res, 200, {
|
|
55
|
+
...config.facilitator.supported(),
|
|
56
|
+
settlementEnabled: config.settlementEnabled,
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (req.method !== "POST") {
|
|
61
|
+
writeJson(res, 405, { error: "method-not-allowed" });
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (path !== "/verify" && path !== "/settle") {
|
|
65
|
+
writeJson(res, 404, { error: "not-found" });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Authenticate BEFORE reading the body: an unauthenticated caller must not be
|
|
69
|
+
// able to make this process do work, parse input, or reach the chain.
|
|
70
|
+
if (path === "/settle" && !isAuthorizedSettle(req, config)) {
|
|
71
|
+
writeJson(res, 401, {
|
|
72
|
+
success: false,
|
|
73
|
+
errorReason: "invalid_payment",
|
|
74
|
+
transaction: "",
|
|
75
|
+
error: "POST /settle requires the facilitator's bearer token. It spends the operator's gas.",
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
let body;
|
|
80
|
+
try {
|
|
81
|
+
body = JSON.parse(await readBody(req));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
writeJson(res, 400, { error: "invalid-json" });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (path === "/verify") {
|
|
88
|
+
writeJson(res, 200, await config.facilitator.verify(body));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
writeJson(res, 200, await config.facilitator.settle(body));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Constant-time bearer check. A missing configured token denies, so a
|
|
95
|
+
* misconfiguration can never silently open the endpoint.
|
|
96
|
+
*/
|
|
97
|
+
function isAuthorizedSettle(req, config) {
|
|
98
|
+
const expected = config.settlementToken;
|
|
99
|
+
if (expected === undefined || expected.length === 0) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
const header = req.headers.authorization;
|
|
103
|
+
if (typeof header !== "string") {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const match = /^Bearer\s+(.+)$/i.exec(header.trim());
|
|
107
|
+
if (match === null) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
const presented = Buffer.from(match[1], "utf8");
|
|
111
|
+
const target = Buffer.from(expected, "utf8");
|
|
112
|
+
// `timingSafeEqual` throws on a length mismatch, which would itself leak the
|
|
113
|
+
// length, so compare a fixed-width digest-shaped pair instead: pad both to the
|
|
114
|
+
// longer length and AND in the length equality.
|
|
115
|
+
const width = Math.max(presented.length, target.length);
|
|
116
|
+
const a = Buffer.alloc(width);
|
|
117
|
+
const b = Buffer.alloc(width);
|
|
118
|
+
presented.copy(a);
|
|
119
|
+
target.copy(b);
|
|
120
|
+
return timingSafeEqual(a, b) && presented.length === target.length;
|
|
121
|
+
}
|
|
122
|
+
async function readBody(req) {
|
|
123
|
+
const chunks = [];
|
|
124
|
+
let size = 0;
|
|
125
|
+
for await (const chunk of req) {
|
|
126
|
+
const buffer = chunk;
|
|
127
|
+
size += buffer.length;
|
|
128
|
+
if (size > MAX_BODY_BYTES) {
|
|
129
|
+
throw new Error("request body too large");
|
|
130
|
+
}
|
|
131
|
+
chunks.push(buffer);
|
|
132
|
+
}
|
|
133
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
134
|
+
}
|
|
135
|
+
function writeJson(res, status, body) {
|
|
136
|
+
if (res.headersSent) {
|
|
137
|
+
res.end();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
res
|
|
141
|
+
.writeHead(status, { "Content-Type": "application/json" })
|
|
142
|
+
.end(JSON.stringify(body));
|
|
143
|
+
}
|
|
144
|
+
function logError(context, error) {
|
|
145
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
146
|
+
console.error(`[metrik-x402-facilitator] ${context}: ${message}`);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Env contract:
|
|
150
|
+
* - `METRIK_X402_RPC_URL` (required) — RPC for balance checks and, when a relayer
|
|
151
|
+
* is configured, for broadcasting.
|
|
152
|
+
* - `METRIK_X402_RELAYER_PRIVATE_KEY` (required unless
|
|
153
|
+
* `METRIK_X402_ALLOW_VERIFY_ONLY=true`) — the relayer that broadcasts EIP-3009
|
|
154
|
+
* transfers and pays gas.
|
|
155
|
+
* - `METRIK_X402_ALLOW_VERIFY_ONLY` (optional) — explicit opt-in to booting a
|
|
156
|
+
* verify-only facilitator. Without it, a missing relayer key is a STARTUP
|
|
157
|
+
* FAILURE rather than a server that silently never settles.
|
|
158
|
+
* - `METRIK_X402_CHAIN_ID` (optional) — default `84532`.
|
|
159
|
+
* - `METRIK_X402_ORACLE_URL` (optional) — default the public Metrik oracle.
|
|
160
|
+
* - `METRIK_X402_REGISTRY_URL` (optional) — listing source; default the oracle's
|
|
161
|
+
* public credential-free registry.
|
|
162
|
+
* - `METRIK_X402_FRESHNESS_SECONDS` (optional) — default
|
|
163
|
+
* {@link DEFAULT_DELIVERY_FRESHNESS_SECONDS}.
|
|
164
|
+
* - `METRIK_X402_INDETERMINATE_POLICY` (optional) — `allow` (default) or `deny`.
|
|
165
|
+
* - `PORT` / `METRIK_X402_PORT` (optional) — default `8788`.
|
|
166
|
+
* - `METRIK_X402_HOST` (optional) — default `0.0.0.0`.
|
|
167
|
+
*/
|
|
168
|
+
export function parseMetrikFacilitatorEnvConfig(env = process.env) {
|
|
169
|
+
const rpcUrl = env.METRIK_X402_RPC_URL;
|
|
170
|
+
if (rpcUrl === undefined || rpcUrl.trim().length === 0) {
|
|
171
|
+
throw new Error("METRIK_X402_RPC_URL is required (fail-closed)");
|
|
172
|
+
}
|
|
173
|
+
const rawKey = env.METRIK_X402_RELAYER_PRIVATE_KEY?.trim();
|
|
174
|
+
const allowVerifyOnly = env.METRIK_X402_ALLOW_VERIFY_ONLY === "true";
|
|
175
|
+
let relayerPrivateKey;
|
|
176
|
+
if (rawKey !== undefined && rawKey.length > 0) {
|
|
177
|
+
if (!isHex(rawKey, { strict: true }) || rawKey.length !== 66) {
|
|
178
|
+
throw new Error("METRIK_X402_RELAYER_PRIVATE_KEY must be a 32-byte 0x-prefixed hex private key");
|
|
179
|
+
}
|
|
180
|
+
relayerPrivateKey = rawKey;
|
|
181
|
+
}
|
|
182
|
+
else if (!allowVerifyOnly) {
|
|
183
|
+
throw new Error("METRIK_X402_RELAYER_PRIVATE_KEY is required to settle payments. " +
|
|
184
|
+
"This facilitator will NOT start without one, because a facilitator that " +
|
|
185
|
+
"accepts /settle and never broadcasts is worse than one that is absent. " +
|
|
186
|
+
"Set METRIK_X402_ALLOW_VERIFY_ONLY=true to deliberately run verify-only.");
|
|
187
|
+
}
|
|
188
|
+
// `/settle` makes the relayer sign and pay gas. An open one is a
|
|
189
|
+
// permissionless "broadcast for me" endpoint, so a settling facilitator
|
|
190
|
+
// cannot boot without a token. Fail closed at startup, not at request time.
|
|
191
|
+
const settlementToken = env.METRIK_X402_FACILITATOR_TOKEN?.trim();
|
|
192
|
+
if (relayerPrivateKey !== undefined) {
|
|
193
|
+
if (settlementToken === undefined || settlementToken.length < 32) {
|
|
194
|
+
throw new Error("METRIK_X402_FACILITATOR_TOKEN is required (at least 32 characters) whenever a " +
|
|
195
|
+
"settlement relayer is configured. POST /settle spends the operator's gas and " +
|
|
196
|
+
"binds 0.0.0.0; without a token anyone who can reach it can make the relayer " +
|
|
197
|
+
"broadcast and pay for it.");
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const rawAllowlist = (env.METRIK_X402_SETTLEMENT_ASSETS ?? "")
|
|
201
|
+
.split(",")
|
|
202
|
+
.map((value) => value.trim())
|
|
203
|
+
.filter((value) => value.length > 0);
|
|
204
|
+
for (const candidate of rawAllowlist) {
|
|
205
|
+
if (!isAddress(candidate)) {
|
|
206
|
+
throw new Error(`METRIK_X402_SETTLEMENT_ASSETS must contain only EVM addresses (got ${candidate})`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const rawScope = env.METRIK_X402_SETTLEMENT_SCOPE ?? DEFAULT_SETTLEMENT_SCOPE;
|
|
210
|
+
if (rawScope !== "tracked-resources" && rawScope !== "any-resource") {
|
|
211
|
+
throw new Error(`invalid METRIK_X402_SETTLEMENT_SCOPE: ${rawScope} (tracked-resources|any-resource)`);
|
|
212
|
+
}
|
|
213
|
+
const chainId = Number(env.METRIK_X402_CHAIN_ID ?? "84532");
|
|
214
|
+
if (!Number.isInteger(chainId) || chainId <= 0) {
|
|
215
|
+
throw new Error(`invalid METRIK_X402_CHAIN_ID: ${env.METRIK_X402_CHAIN_ID}`);
|
|
216
|
+
}
|
|
217
|
+
const freshnessWindowSeconds = Number(env.METRIK_X402_FRESHNESS_SECONDS ??
|
|
218
|
+
String(DEFAULT_DELIVERY_FRESHNESS_SECONDS));
|
|
219
|
+
if (!Number.isFinite(freshnessWindowSeconds) || freshnessWindowSeconds <= 0) {
|
|
220
|
+
throw new Error(`invalid METRIK_X402_FRESHNESS_SECONDS: ${env.METRIK_X402_FRESHNESS_SECONDS}`);
|
|
221
|
+
}
|
|
222
|
+
const rawPolicy = env.METRIK_X402_INDETERMINATE_POLICY ?? "allow";
|
|
223
|
+
if (rawPolicy !== "allow" && rawPolicy !== "deny") {
|
|
224
|
+
throw new Error(`invalid METRIK_X402_INDETERMINATE_POLICY: ${rawPolicy} (allow|deny)`);
|
|
225
|
+
}
|
|
226
|
+
const port = Number(env.METRIK_X402_PORT ?? env.PORT ?? "8788");
|
|
227
|
+
if (!Number.isInteger(port) || port < 0 || port > 65535) {
|
|
228
|
+
throw new Error(`invalid port: ${env.METRIK_X402_PORT ?? env.PORT}`);
|
|
229
|
+
}
|
|
230
|
+
const registryUrl = env.METRIK_X402_REGISTRY_URL;
|
|
231
|
+
return {
|
|
232
|
+
host: env.METRIK_X402_HOST ?? "0.0.0.0",
|
|
233
|
+
port,
|
|
234
|
+
chainId,
|
|
235
|
+
rpcUrl,
|
|
236
|
+
oracleUrl: env.METRIK_X402_ORACLE_URL ?? DEFAULT_METRIK_ORACLE_URL,
|
|
237
|
+
freshnessWindowSeconds,
|
|
238
|
+
indeterminatePolicy: rawPolicy,
|
|
239
|
+
settlementScope: rawScope,
|
|
240
|
+
...(rawAllowlist.length === 0
|
|
241
|
+
? {}
|
|
242
|
+
: { settlementAssetAllowlist: rawAllowlist }),
|
|
243
|
+
...(registryUrl === undefined ? {} : { registryUrl }),
|
|
244
|
+
...(relayerPrivateKey === undefined ? {} : { relayerPrivateKey }),
|
|
245
|
+
...(settlementToken === undefined || settlementToken.length === 0
|
|
246
|
+
? {}
|
|
247
|
+
: { settlementToken }),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
export function buildMetrikFacilitatorFromEnvConfig(config) {
|
|
251
|
+
return new MetrikVerifiedDeliveryFacilitator({
|
|
252
|
+
paymentVerifier: createX402PaymentVerifier({
|
|
253
|
+
chainId: config.chainId,
|
|
254
|
+
rpcUrl: config.rpcUrl,
|
|
255
|
+
}),
|
|
256
|
+
...(config.relayerPrivateKey === undefined
|
|
257
|
+
? {}
|
|
258
|
+
: {
|
|
259
|
+
paymentSettler: createX402PaymentSettler({
|
|
260
|
+
chainId: config.chainId,
|
|
261
|
+
rpcUrl: config.rpcUrl,
|
|
262
|
+
privateKey: config.relayerPrivateKey,
|
|
263
|
+
}),
|
|
264
|
+
}),
|
|
265
|
+
resourceIndex: createRegistryResourceIndex(config.registryUrl === undefined
|
|
266
|
+
? {}
|
|
267
|
+
: { discoverOptions: { registryUrl: config.registryUrl } }),
|
|
268
|
+
deliveryOracle: createOracleDeliveryOracle({
|
|
269
|
+
oracleUrl: config.oracleUrl,
|
|
270
|
+
freshnessWindowSeconds: config.freshnessWindowSeconds,
|
|
271
|
+
}),
|
|
272
|
+
indeterminatePolicy: config.indeterminatePolicy,
|
|
273
|
+
chainId: config.chainId,
|
|
274
|
+
settlementScope: config.settlementScope,
|
|
275
|
+
...(config.settlementAssetAllowlist === undefined
|
|
276
|
+
? {}
|
|
277
|
+
: { settlementAssetAllowlist: config.settlementAssetAllowlist }),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
export async function startMetrikFacilitatorServerFromEnv(env = process.env) {
|
|
281
|
+
const config = parseMetrikFacilitatorEnvConfig(env);
|
|
282
|
+
const facilitator = buildMetrikFacilitatorFromEnvConfig(config);
|
|
283
|
+
if (config.relayerPrivateKey === undefined) {
|
|
284
|
+
console.error("[metrik-x402-facilitator] SETTLEMENT DISABLED — no METRIK_X402_RELAYER_PRIVATE_KEY. " +
|
|
285
|
+
"/verify works; /settle will return 503 and broadcast nothing.");
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
console.error(`[metrik-x402-facilitator] settlement relayer ${relayerAddress(config.relayerPrivateKey)} — this address must hold native gas on chain ${config.chainId}.`);
|
|
289
|
+
}
|
|
290
|
+
console.error(`[metrik-x402-facilitator] delivery gate: oracle=${config.oracleUrl} ` +
|
|
291
|
+
`freshness=${config.freshnessWindowSeconds}s policy-on-no-evidence=${config.indeterminatePolicy}`);
|
|
292
|
+
console.error(`[metrik-x402-facilitator] settlement policy: scope=${config.settlementScope} ` +
|
|
293
|
+
`assets=${facilitator.allowedSettlementAssets.join(",")} — the relayer will not be ` +
|
|
294
|
+
"asked to call any other contract.");
|
|
295
|
+
const server = createMetrikFacilitatorServer({
|
|
296
|
+
facilitator,
|
|
297
|
+
settlementEnabled: config.relayerPrivateKey !== undefined,
|
|
298
|
+
...(config.settlementToken === undefined
|
|
299
|
+
? {}
|
|
300
|
+
: { settlementToken: config.settlementToken }),
|
|
301
|
+
});
|
|
302
|
+
const { port } = await server.listen(config.port, config.host);
|
|
303
|
+
return Object.assign(server, { boundPort: port });
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=facilitator-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facilitator-server.js","sourceRoot":"","sources":["../../src/x402/facilitator-server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAIb,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAY,MAAM,MAAM,CAAC;AAElD,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EAClC,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,wBAAwB,EACxB,iCAAiC,EACjC,yBAAyB,GAG1B,MAAM,oCAAoC,CAAC;AAE5C;;;;;;;;GAQG;AAEH,MAAM,cAAc,GAAG,GAAG,GAAG,IAAI,CAAC;AA2BlC,MAAM,UAAU,6BAA6B,CAC3C,MAAqC;IAErC,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACvC,IAAI,KAAK,YAAY,yBAAyB,EAAE,CAAC;gBAC/C,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;oBAClB,OAAO,EAAE,KAAK;oBACd,WAAW,EAAE,yBAAyB;oBACtC,WAAW,EAAE,EAAE;oBACf,KAAK,EAAE,KAAK,CAAC,OAAO;iBACrB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAC3C,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,UAAU;QACV,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,EAAE,CACjC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;gBACjC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAiB,CAAC;gBACpD,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACJ,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC;KACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,GAAoB,EACpB,GAAmB,EACnB,MAAqC;IAErC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IAErD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACpE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;YAClB,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE;YACjC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;SAC5C,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1B,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7C,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,8EAA8E;IAC9E,sEAAsE;IACtE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3D,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;YAClB,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,iBAAiB;YAC9B,WAAW,EAAE,EAAE;YACf,KAAK,EACH,qFAAqF;SACxF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IACD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CACzB,GAAoB,EACpB,MAAqC;IAErC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC;IACxC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IACzC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAW,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,6EAA6E;IAC7E,+EAA+E;IAC/E,gDAAgD;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAoB;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAe,CAAC;QAC/B,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC;QACtB,IAAI,IAAI,GAAG,cAAc,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IACnE,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,GAAG;SACA,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;SACzD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,KAAc;IAC/C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;AACpE,CAAC;AAsBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,+BAA+B,CAC7C,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,+BAA+B,EAAE,IAAI,EAAE,CAAC;IAC3D,MAAM,eAAe,GAAG,GAAG,CAAC,6BAA6B,KAAK,MAAM,CAAC;IACrE,IAAI,iBAAkC,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;QACJ,CAAC;QACD,iBAAiB,GAAG,MAAM,CAAC;IAC7B,CAAC;SAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,kEAAkE;YAChE,0EAA0E;YAC1E,yEAAyE;YACzE,yEAAyE,CAC5E,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,wEAAwE;IACxE,4EAA4E;IAC5E,MAAM,eAAe,GAAG,GAAG,CAAC,6BAA6B,EAAE,IAAI,EAAE,CAAC;IAClE,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CACb,gFAAgF;gBAC9E,+EAA+E;gBAC/E,8EAA8E;gBAC9E,2BAA2B,CAC9B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,6BAA6B,IAAI,EAAE,CAAC;SAC3D,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,sEAAsE,SAAS,GAAG,CACnF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,4BAA4B,IAAI,wBAAwB,CAAC;IAC9E,IAAI,QAAQ,KAAK,mBAAmB,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CACb,yCAAyC,QAAQ,mCAAmC,CACrF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,iCAAiC,GAAG,CAAC,oBAAoB,EAAE,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,sBAAsB,GAAG,MAAM,CACnC,GAAG,CAAC,6BAA6B;QAC/B,MAAM,CAAC,kCAAkC,CAAC,CAC7C,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,sBAAsB,IAAI,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CACb,0CAA0C,GAAG,CAAC,6BAA6B,EAAE,CAC9E,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,gCAAgC,IAAI,OAAO,CAAC;IAClE,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,6CAA6C,SAAS,eAAe,CACtE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,wBAAwB,CAAC;IAEjD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,gBAAgB,IAAI,SAAS;QACvC,IAAI;QACJ,OAAO;QACP,MAAM;QACN,SAAS,EAAE,GAAG,CAAC,sBAAsB,IAAI,yBAAyB;QAClE,sBAAsB;QACtB,mBAAmB,EAAE,SAAS;QAC9B,eAAe,EAAE,QAAQ;QACzB,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAC3B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,wBAAwB,EAAE,YAAY,EAAE,CAAC;QAC/C,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC;QACjE,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAC/D,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,MAAkC;IAElC,OAAO,IAAI,iCAAiC,CAAC;QAC3C,eAAe,EAAE,yBAAyB,CAAC;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,iBAAiB,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,cAAc,EAAE,wBAAwB,CAAC;oBACvC,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,UAAU,EAAE,MAAM,CAAC,iBAAiB;iBACrC,CAAC;aACH,CAAC;QACN,aAAa,EAAE,2BAA2B,CACxC,MAAM,CAAC,WAAW,KAAK,SAAS;YAC9B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,CAC7D;QACD,cAAc,EAAE,0BAA0B,CAAC;YACzC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;SACtD,CAAC;QACF,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,GAAG,CAAC,MAAM,CAAC,wBAAwB,KAAK,SAAS;YAC/C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,wBAAwB,EAAE,MAAM,CAAC,wBAAwB,EAAE,CAAC;KACnE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,MAAM,GAAG,+BAA+B,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,mCAAmC,CAAC,MAAM,CAAC,CAAC;IAEhE,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CACX,sFAAsF;YACpF,+DAA+D,CAClE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CACX,gDAAgD,cAAc,CAC5D,MAAM,CAAC,iBAAiB,CACzB,iDAAiD,MAAM,CAAC,OAAO,GAAG,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,KAAK,CACX,mDAAmD,MAAM,CAAC,SAAS,GAAG;QACpE,aAAa,MAAM,CAAC,sBAAsB,2BAA2B,MAAM,CAAC,mBAAmB,EAAE,CACpG,CAAC;IACF,OAAO,CAAC,KAAK,CACX,sDAAsD,MAAM,CAAC,eAAe,GAAG;QAC7E,UAAU,WAAW,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,6BAA6B;QACpF,mCAAmC,CACtC,CAAC;IAEF,MAAM,MAAM,GAAG,6BAA6B,CAAC;QAC3C,WAAW;QACX,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,KAAK,SAAS;QACzD,GAAG,CAAC,MAAM,CAAC,eAAe,KAAK,SAAS;YACtC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC;KACjD,CAAC,CAAC;IACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -1,9 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrik-native HTTP `402` challenge flow.
|
|
3
|
+
*
|
|
4
|
+
* This is NOT an implementation of the x402 protocol. It uses its own scheme
|
|
5
|
+
* string (`streamproof-verified-stream`), its own wire format, and its own
|
|
6
|
+
* request header (`x-metrik-payment`). It does not interoperate with
|
|
7
|
+
* `x402-fetch`, `x402-axios`, `x402-express`, or any other x402 client or
|
|
8
|
+
* facilitator. See `docs/x402.md` for the full explanation of why Metrik's
|
|
9
|
+
* metered-stream settlement does not fit any shipped x402 scheme.
|
|
10
|
+
*
|
|
11
|
+
* The `X402*` / `x402*` exports at the bottom of this file are deprecated
|
|
12
|
+
* aliases of the canonical names, kept so existing consumers keep working.
|
|
13
|
+
*/
|
|
1
14
|
import type { StreamProofClientConfig } from "@absol-labs/sdk";
|
|
2
15
|
import { z } from "zod";
|
|
3
16
|
import { type SignedSpendMandate } from "../mandates/mandate.js";
|
|
4
17
|
import { type VerifiedStreamAgentOpener } from "../sdk/client.js";
|
|
5
18
|
import { type ConsumerDeliveryProofService, type HttpsResponseMatch, type HttpsResponseRedaction, type VerifiedConsumedHttpsResponseProof } from "../zktls/reclaim.js";
|
|
6
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Immutable wire constant for the Metrik-native 402 scheme. The value is
|
|
21
|
+
* historical (`streamproof-*` predates the Metrik rename) and MUST NOT change:
|
|
22
|
+
* the live gateway and deployed callers depend on it.
|
|
23
|
+
*/
|
|
24
|
+
export declare const METRIK_STREAM_SCHEME: "streamproof-verified-stream";
|
|
25
|
+
/**
|
|
26
|
+
* Request header carrying the Metrik verified-stream payload. Deliberately NOT
|
|
27
|
+
* `x-payment`: that header belongs to the x402 protocol, which this flow does
|
|
28
|
+
* not implement.
|
|
29
|
+
*/
|
|
30
|
+
export declare const METRIK_PAYMENT_HEADER: "x-metrik-payment";
|
|
7
31
|
export declare const verifiedStreamRequirementsSchema: z.ZodObject<{
|
|
8
32
|
operator: z.ZodString;
|
|
9
33
|
serviceRef: z.ZodString;
|
|
@@ -31,7 +55,7 @@ export declare const verifiedStreamRequirementsSchema: z.ZodObject<{
|
|
|
31
55
|
}>;
|
|
32
56
|
export interface VerifiedStreamRequirements extends z.infer<typeof verifiedStreamRequirementsSchema> {
|
|
33
57
|
}
|
|
34
|
-
export declare const
|
|
58
|
+
export declare const streamChallengeSchema: z.ZodObject<{
|
|
35
59
|
scheme: z.ZodLiteral<"streamproof-verified-stream">;
|
|
36
60
|
requirements: z.ZodObject<{
|
|
37
61
|
operator: z.ZodString;
|
|
@@ -81,9 +105,9 @@ export declare const x402StreamChallengeSchema: z.ZodObject<{
|
|
|
81
105
|
maxBudgetUsdc: bigint;
|
|
82
106
|
};
|
|
83
107
|
}>;
|
|
84
|
-
export interface
|
|
108
|
+
export interface StreamChallenge extends z.infer<typeof streamChallengeSchema> {
|
|
85
109
|
}
|
|
86
|
-
export declare const
|
|
110
|
+
export declare const streamOpenPayloadSchema: z.ZodObject<{
|
|
87
111
|
challenge: z.ZodObject<{
|
|
88
112
|
scheme: z.ZodLiteral<"streamproof-verified-stream">;
|
|
89
113
|
requirements: z.ZodObject<{
|
|
@@ -248,19 +272,19 @@ export declare const x402OpenPayloadSchema: z.ZodObject<{
|
|
|
248
272
|
};
|
|
249
273
|
};
|
|
250
274
|
}>;
|
|
251
|
-
export interface
|
|
275
|
+
export interface StreamOpenPayload extends z.infer<typeof streamOpenPayloadSchema> {
|
|
252
276
|
}
|
|
253
|
-
export interface
|
|
277
|
+
export interface StreamFacilitator {
|
|
254
278
|
/** Build the 402 challenge a server returns to prompt a verified stream. */
|
|
255
|
-
challenge(req: VerifiedStreamRequirements):
|
|
279
|
+
challenge(req: VerifiedStreamRequirements): StreamChallenge;
|
|
256
280
|
/** Verify + open the stream from an agent's signed payment payload. */
|
|
257
281
|
open(payloadHeader: string): Promise<{
|
|
258
282
|
streamId: `0x${string}`;
|
|
259
283
|
}>;
|
|
260
284
|
/** Prove the HTTPS response consumed after opening a verified stream. */
|
|
261
|
-
proveConsumedHttpsResponse(input:
|
|
285
|
+
proveConsumedHttpsResponse(input: ConsumedHttpsResponseProofInput): Promise<VerifiedConsumedHttpsResponseProof>;
|
|
262
286
|
}
|
|
263
|
-
export interface
|
|
287
|
+
export interface ConsumedHttpsResponseProofInput {
|
|
264
288
|
readonly signedMandate: SignedSpendMandate;
|
|
265
289
|
readonly streamId?: `0x${string}`;
|
|
266
290
|
readonly operator?: `0x${string}`;
|
|
@@ -286,7 +310,7 @@ export interface VerifiedStreamFacilitatorOptions {
|
|
|
286
310
|
readonly resolveSpentSoFarUsdc?: (signedMandate: SignedSpendMandate) => bigint | Promise<bigint>;
|
|
287
311
|
readonly resolveRevokedMandateIds?: (signedMandate: SignedSpendMandate) => Iterable<`0x${string}`> | Promise<Iterable<`0x${string}`>>;
|
|
288
312
|
}
|
|
289
|
-
export declare class
|
|
313
|
+
export declare class StreamPayloadError extends Error {
|
|
290
314
|
constructor(message: string);
|
|
291
315
|
}
|
|
292
316
|
export declare class SettlementTargetMismatchError extends Error {
|
|
@@ -302,10 +326,10 @@ export declare class DeliveryProofUnavailableError extends Error {
|
|
|
302
326
|
* facilitator denies the open in this case (fail-closed, buyer-favoring) rather
|
|
303
327
|
* than proceeding on an unverified assumption of "0 spent / none revoked".
|
|
304
328
|
*/
|
|
305
|
-
export declare class
|
|
329
|
+
export declare class SpendControlUnavailableError extends Error {
|
|
306
330
|
constructor(message: string);
|
|
307
331
|
}
|
|
308
|
-
export declare class
|
|
332
|
+
export declare class VerifiedStreamFacilitator implements StreamFacilitator {
|
|
309
333
|
private readonly agentClient;
|
|
310
334
|
private readonly deliveryProofs;
|
|
311
335
|
private readonly sdkConfig;
|
|
@@ -313,13 +337,41 @@ export declare class VerifiedStreamX402Facilitator implements X402Facilitator {
|
|
|
313
337
|
private readonly resolveSpentSoFarUsdc;
|
|
314
338
|
private readonly resolveRevokedMandateIds;
|
|
315
339
|
constructor(options: VerifiedStreamFacilitatorOptions);
|
|
316
|
-
challenge(req: VerifiedStreamRequirements):
|
|
340
|
+
challenge(req: VerifiedStreamRequirements): StreamChallenge;
|
|
317
341
|
open(payloadHeader: string): Promise<{
|
|
318
342
|
streamId: `0x${string}`;
|
|
319
343
|
}>;
|
|
320
|
-
proveConsumedHttpsResponse(input:
|
|
344
|
+
proveConsumedHttpsResponse(input: ConsumedHttpsResponseProofInput): Promise<VerifiedConsumedHttpsResponseProof>;
|
|
321
345
|
}
|
|
322
|
-
export declare function
|
|
323
|
-
export declare function
|
|
324
|
-
export declare function
|
|
346
|
+
export declare function encodeStreamPayloadHeader(payload: StreamOpenPayload): string;
|
|
347
|
+
export declare function parseStreamChallengeJson(value: unknown): StreamChallenge;
|
|
348
|
+
export declare function parseStreamPayloadHeader(payloadHeader: string): StreamOpenPayload;
|
|
349
|
+
export {
|
|
350
|
+
/** @deprecated Use {@link METRIK_STREAM_SCHEME}. This flow is not x402. */
|
|
351
|
+
METRIK_STREAM_SCHEME as X402_SCHEME,
|
|
352
|
+
/** @deprecated Use {@link VerifiedStreamFacilitator}. This flow is not x402. */
|
|
353
|
+
VerifiedStreamFacilitator as VerifiedStreamX402Facilitator,
|
|
354
|
+
/** @deprecated Use {@link StreamPayloadError}. Same class object. */
|
|
355
|
+
StreamPayloadError as X402PayloadError,
|
|
356
|
+
/** @deprecated Use {@link SpendControlUnavailableError}. Same class object. */
|
|
357
|
+
SpendControlUnavailableError as X402SpendControlUnavailableError,
|
|
358
|
+
/** @deprecated Use {@link streamChallengeSchema}. */
|
|
359
|
+
streamChallengeSchema as x402StreamChallengeSchema,
|
|
360
|
+
/** @deprecated Use {@link streamOpenPayloadSchema}. */
|
|
361
|
+
streamOpenPayloadSchema as x402OpenPayloadSchema,
|
|
362
|
+
/** @deprecated Use {@link encodeStreamPayloadHeader}. */
|
|
363
|
+
encodeStreamPayloadHeader as encodeX402PayloadHeader,
|
|
364
|
+
/** @deprecated Use {@link parseStreamPayloadHeader}. */
|
|
365
|
+
parseStreamPayloadHeader as parseX402PayloadHeader,
|
|
366
|
+
/** @deprecated Use {@link parseStreamChallengeJson}. */
|
|
367
|
+
parseStreamChallengeJson as parseX402ChallengeJson, };
|
|
368
|
+
export type {
|
|
369
|
+
/** @deprecated Use {@link StreamFacilitator}. This flow is not x402. */
|
|
370
|
+
StreamFacilitator as X402Facilitator,
|
|
371
|
+
/** @deprecated Use {@link StreamChallenge}. */
|
|
372
|
+
StreamChallenge as X402StreamChallenge,
|
|
373
|
+
/** @deprecated Use {@link StreamOpenPayload}. */
|
|
374
|
+
StreamOpenPayload as X402OpenPayload,
|
|
375
|
+
/** @deprecated Use {@link ConsumedHttpsResponseProofInput}. */
|
|
376
|
+
ConsumedHttpsResponseProofInput as X402ConsumedHttpsResponseProofInput, };
|
|
325
377
|
//# sourceMappingURL=facilitator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../src/x402/facilitator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,kCAAkC,EACxC,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../src/x402/facilitator.ts"],"names":[],"mappings":"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"}
|