Sign In

paygate

Package Overview
Dependencies
Maintainers
1
Versions
20
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

paygate - npm Package Compare versions

Comparing version
5.5.0
to
5.6.0
+74
dist/manifest.d.ts
/**
* Capability manifest (`/.well-known/arispay.json`) — build + validate.
*
* The canonical shape is docs/paygate-v2.md §9, serialized by apps/api's
* `buildCapabilityManifest` for hosted merchants. This module mirrors that
* contract for ACCOUNT-FREE sellers (`paygate wrap`): the seller hosts its
* own manifest on its own origin. The shape is mirrored, not imported —
* paygate ships without workspace deps.
*
* v1 manifests are UNSIGNED. Signing rides the S1 artifact envelope
* (docs/specs/artifact-signing-v1.md) and lands with the discovery session;
* no seller keypair is generated here (M2M security invariant: no new
* payment-key generation, and no signing key until a spec needs one).
*/
export declare const USDC_BASE_MAINNET = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
export declare const USDC_BASE_SEPOLIA = "0x036CbD53842c5426634e7929541eC2318f3dCF7e";
export declare const EURC_BASE_MAINNET_ADDR = "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42";
export interface ManifestRail {
scheme: "x402";
/** CAIP-2, e.g. "eip155:8453". */
network: string;
/** Token contract address. */
asset: string;
assetName: string;
payTo: string;
facilitator: string;
}
export interface ManifestProduct {
path: string;
method: string;
priceCents: number;
description?: string;
}
export interface CapabilityManifestV1 {
version: "1";
merchant: {
slug: string;
name: string;
};
trust: {
minTier: "any" | "payagent-verified";
};
rails: ManifestRail[];
products?: ManifestProduct[];
updated: string;
}
export interface BuildSellerManifestOptions {
slug: string;
name: string;
wallet: string;
/** CAIP-2 network. */
network: string;
asset: string;
assetName: string;
facilitator: string;
products: ManifestProduct[];
/** Injected for reproducible builds; defaults to now. */
updated?: Date;
}
export declare function buildSellerManifest(opts: BuildSellerManifestOptions): CapabilityManifestV1;
export type ManifestValidation = {
ok: true;
manifest: CapabilityManifestV1;
} | {
ok: false;
errors: string[];
};
/**
* Strict structural validation against the canonical §9 contract. Unknown
* extra fields are tolerated (the hosted builder may add fields additively);
* required fields and shapes are not negotiable.
*/
export declare function validateCapabilityManifest(value: unknown): ManifestValidation;
//# sourceMappingURL=manifest.d.ts.map
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,iBAAiB,+CAA+C,CAAC;AAC9E,eAAO,MAAM,iBAAiB,+CAA+C,CAAC;AAC9E,eAAO,MAAM,sBAAsB,+CAA+C,CAAC;AAKnF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,KAAK,EAAE;QAAE,OAAO,EAAE,KAAK,GAAG,mBAAmB,CAAA;KAAE,CAAC;IAChD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,yDAAyD;IACzD,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,0BAA0B,GAAG,oBAAoB,CAkB1F;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAA;CAAE,GAC5C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEpC;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CA+E7E"}
/**
* Capability manifest (`/.well-known/arispay.json`) — build + validate.
*
* The canonical shape is docs/paygate-v2.md §9, serialized by apps/api's
* `buildCapabilityManifest` for hosted merchants. This module mirrors that
* contract for ACCOUNT-FREE sellers (`paygate wrap`): the seller hosts its
* own manifest on its own origin. The shape is mirrored, not imported —
* paygate ships without workspace deps.
*
* v1 manifests are UNSIGNED. Signing rides the S1 artifact envelope
* (docs/specs/artifact-signing-v1.md) and lands with the discovery session;
* no seller keypair is generated here (M2M security invariant: no new
* payment-key generation, and no signing key until a spec needs one).
*/
export const USDC_BASE_MAINNET = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
export const USDC_BASE_SEPOLIA = "0x036CbD53842c5426634e7929541eC2318f3dCF7e";
export const EURC_BASE_MAINNET_ADDR = "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42";
const WALLET_RE = /^0x[0-9a-fA-F]{40}$/;
const CAIP2_RE = /^eip155:\d+$/;
export function buildSellerManifest(opts) {
return {
version: "1",
merchant: { slug: opts.slug, name: opts.name },
trust: { minTier: "any" },
rails: [
{
scheme: "x402",
network: opts.network,
asset: opts.asset,
assetName: opts.assetName,
payTo: opts.wallet,
facilitator: opts.facilitator,
},
],
products: opts.products,
updated: (opts.updated ?? new Date()).toISOString(),
};
}
/**
* Strict structural validation against the canonical §9 contract. Unknown
* extra fields are tolerated (the hosted builder may add fields additively);
* required fields and shapes are not negotiable.
*/
export function validateCapabilityManifest(value) {
const errors = [];
const m = value;
if (!m || typeof m !== "object")
return { ok: false, errors: ["manifest is not a JSON object"] };
if (m.version !== "1")
errors.push(`version must be "1" (got ${JSON.stringify(m.version)})`);
if (!m.merchant || typeof m.merchant !== "object") {
errors.push("merchant is required");
}
else {
if (typeof m.merchant.slug !== "string" || m.merchant.slug.length === 0) {
errors.push("merchant.slug must be a non-empty string");
}
if (typeof m.merchant.name !== "string" || m.merchant.name.length === 0) {
errors.push("merchant.name must be a non-empty string");
}
}
if (!m.trust || typeof m.trust !== "object") {
errors.push("trust is required");
}
else if (m.trust.minTier !== "any" && m.trust.minTier !== "payagent-verified") {
errors.push(`trust.minTier must be "any" or "payagent-verified"`);
}
if (!Array.isArray(m.rails) || m.rails.length === 0) {
errors.push("rails must be a non-empty array");
}
else {
m.rails.forEach((rail, i) => {
if (!rail || typeof rail !== "object") {
errors.push(`rails[${i}] must be an object`);
return;
}
if (rail.scheme !== "x402")
errors.push(`rails[${i}].scheme must be "x402"`);
if (typeof rail.network !== "string" || !CAIP2_RE.test(rail.network)) {
errors.push(`rails[${i}].network must be CAIP-2 (eip155:<chainId>)`);
}
if (typeof rail.asset !== "string" || !WALLET_RE.test(rail.asset)) {
errors.push(`rails[${i}].asset must be a 0x40-hex contract address`);
}
if (typeof rail.assetName !== "string" || rail.assetName.length === 0) {
errors.push(`rails[${i}].assetName must be a non-empty string`);
}
if (typeof rail.payTo !== "string" || !WALLET_RE.test(rail.payTo)) {
errors.push(`rails[${i}].payTo must be a 0x40-hex address`);
}
if (typeof rail.facilitator !== "string" || !/^https:\/\//.test(rail.facilitator)) {
errors.push(`rails[${i}].facilitator must be an https URL`);
}
});
}
if (m.products !== undefined) {
if (!Array.isArray(m.products)) {
errors.push("products, when present, must be an array");
}
else {
m.products.forEach((p, i) => {
if (!p || typeof p !== "object") {
errors.push(`products[${i}] must be an object`);
return;
}
if (typeof p.path !== "string" || !p.path.startsWith("/")) {
errors.push(`products[${i}].path must start with "/"`);
}
if (typeof p.method !== "string" || p.method.length === 0) {
errors.push(`products[${i}].method is required`);
}
if (!Number.isInteger(p.priceCents) || p.priceCents < 1) {
errors.push(`products[${i}].priceCents must be an integer >= 1 (integer cents, never floats)`);
}
});
}
}
if (typeof m.updated !== "string" || Number.isNaN(Date.parse(m.updated))) {
errors.push("updated must be an ISO-8601 timestamp");
}
if (errors.length > 0)
return { ok: false, errors };
return { ok: true, manifest: m };
}
//# sourceMappingURL=manifest.js.map
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
/**
* `paygate register <url>` — announce a deployed, publicly-reachable gated
* endpoint to the facilitator's discovery catalog.
*
* Thin client of the facilitator's `POST /discovery/register`: the
* facilitator itself probes the URL (single unpaid GET) and catalogs only a
* live, well-formed 402 — so registration is structurally impossible before
* deploy. Errors pass through S2-structured.
*/
export interface RegisterIO {
stdout: (s: string) => void;
stderr: (s: string) => void;
}
export interface RegisterResult {
ok: boolean;
facilitator: string;
resource: string;
status?: number;
catalogKey?: string;
checks?: string[];
error?: {
code: string;
message: string;
retryable: boolean;
};
}
export declare const REGISTER_HELP_TEXT = "paygate register <https-url> [--facilitator <url>] [--json]\n\nRegisters a DEPLOYED gated endpoint with the facilitator's discovery catalog.\nThe facilitator probes the URL (one unpaid GET, never a payment) and lists it\nonly if it serves a valid x402 challenge. Ordering: wrap \u2192 deploy \u2192 register\n\u2192 verify.\n";
export declare function registerResource(resource: string, facilitator: string, fetchImpl?: typeof fetch): Promise<RegisterResult>;
export declare function runRegister(argv: string[], io?: RegisterIO, fetchImpl?: typeof fetch): Promise<number>;
//# sourceMappingURL=register.d.ts.map
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CAC/D;AAED,eAAO,MAAM,kBAAkB,0UAM9B,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,cAAc,CAAC,CAwCzB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,GAAE,UAA+F,EACnG,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
/**
* `paygate register <url>` — announce a deployed, publicly-reachable gated
* endpoint to the facilitator's discovery catalog.
*
* Thin client of the facilitator's `POST /discovery/register`: the
* facilitator itself probes the URL (single unpaid GET) and catalogs only a
* live, well-formed 402 — so registration is structurally impossible before
* deploy. Errors pass through S2-structured.
*/
const DEFAULT_FACILITATOR = "https://facilitator.arispay.app";
export const REGISTER_HELP_TEXT = `paygate register <https-url> [--facilitator <url>] [--json]
Registers a DEPLOYED gated endpoint with the facilitator's discovery catalog.
The facilitator probes the URL (one unpaid GET, never a payment) and lists it
only if it serves a valid x402 challenge. Ordering: wrap → deploy → register
→ verify.
`;
export async function registerResource(resource, facilitator, fetchImpl = fetch) {
const base = facilitator.replace(/\/$/, "");
try {
const res = await fetchImpl(`${base}/discovery/register`, {
method: "POST",
headers: { "content-type": "application/json", accept: "application/json" },
body: JSON.stringify({ resource }),
signal: AbortSignal.timeout(30_000),
});
const body = (await res.json().catch(() => null));
if (res.ok && body?.ok === true) {
return {
ok: true,
facilitator: base,
resource,
status: res.status,
catalogKey: typeof body.catalogKey === "string" ? body.catalogKey : undefined,
checks: Array.isArray(body.checks) ? body.checks : undefined,
};
}
const err = (body?.error ?? {});
return {
ok: false,
facilitator: base,
resource,
status: res.status,
error: {
code: typeof err.code === "string" ? err.code : "REGISTER_REJECTED",
message: typeof err.message === "string" ? err.message : `facilitator returned ${res.status}`,
retryable: err.retryable === true || res.status === 429 || res.status >= 500,
},
};
}
catch (error) {
return {
ok: false,
facilitator: base,
resource,
error: { code: "FACILITATOR_UNREACHABLE", message: String(error), retryable: true },
};
}
}
export async function runRegister(argv, io = { stdout: (s) => process.stdout.write(s), stderr: (s) => process.stderr.write(s) }, fetchImpl = fetch) {
if (argv.includes("--help") || argv.includes("-h")) {
io.stdout(REGISTER_HELP_TEXT);
return 0;
}
const json = argv.includes("--json");
const facIdx = argv.indexOf("--facilitator");
const facilitator = facIdx >= 0 ? argv[facIdx + 1] : undefined;
const positional = argv.filter((v, i) => !v.startsWith("-") && i !== facIdx + 1);
const url = positional[0];
if (!url || (facIdx >= 0 && !facilitator)) {
io.stderr(`${JSON.stringify({ error: { code: "MISSING_URL", message: "usage: paygate register <https-url> [--facilitator <url>] [--json]", retryable: false } })}\n`);
return 1;
}
const result = await registerResource(url, facilitator ?? DEFAULT_FACILITATOR, fetchImpl);
if (json) {
io.stdout(`${JSON.stringify(result, null, 2)}\n`);
}
else if (result.ok) {
io.stdout(`Registered with ${result.facilitator}: ${result.resource}\n${(result.checks ?? []).map((c) => ` PASS ${c}`).join("\n")}\nNext: npx paygate verify ${result.resource}\n`);
}
else {
io.stderr(`register failed [${result.error?.code}]: ${result.error?.message}${result.error?.retryable ? " (retryable)" : ""}\n`);
}
return result.ok ? 0 : 1;
}
//# sourceMappingURL=register.js.map
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"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"}
/**
* `paygate verify <url>` — the onboarding acceptance check + receipt.
*
* Read-only, network-agnostic (unlike `doctor`, which is a Base-mainnet
* readiness check): it validates whatever network the challenge declares.
* Four checks:
* 1. live-402 — unpaid GET answers a parseable x402 challenge
* 2. terms — the challenge carries scheme/network/payTo/amount
* 3. manifest — origin serves a VALID /.well-known/arispay.json
* 4. catalog — the facilitator's /discovery/resources lists the URL
* The receipt is a machine artifact: JSON to stdout (--json) and to
* --receipt <file> (default paygate-verify-receipt.json in cwd).
*/
export interface VerifyCheck {
id: "live-402" | "terms" | "manifest" | "catalog";
ok: boolean;
message: string;
}
export interface VerifyReceipt {
ok: boolean;
url: string;
facilitator: string;
verifiedAt: string;
checks: VerifyCheck[];
terms?: {
scheme?: string;
network?: string;
payTo?: string;
amount?: string;
asset?: string;
};
manifest?: {
slug?: string;
products?: number;
};
}
export interface VerifyIO {
stdout: (s: string) => void;
stderr: (s: string) => void;
}
export declare function verifyUrl(url: string, facilitator: string, fetchImpl?: typeof fetch, now?: () => Date): Promise<VerifyReceipt>;
export declare const VERIFY_HELP_TEXT = "paygate verify <https-url> [--facilitator <url>] [--receipt <file>] [--json]\n\nRead-only onboarding acceptance check. Validates: live 402 \u00B7 complete terms \u00B7\nvalid /.well-known/arispay.json manifest \u00B7 facilitator catalog listing.\nWrites a machine-readable receipt (default: paygate-verify-receipt.json).\nNever sends payment or auth headers.\n";
export declare function runVerify(argv: string[], io?: VerifyIO, fetchImpl?: typeof fetch): Promise<number>;
//# sourceMappingURL=verify.d.ts.map
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAClD,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/F,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAwBD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,OAAO,KAAa,EAC/B,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,aAAa,CAAC,CA6HxB;AAED,eAAO,MAAM,gBAAgB,6WAM5B,CAAC;AAEF,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,GAAE,QAA6F,EACjG,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
/**
* `paygate verify <url>` — the onboarding acceptance check + receipt.
*
* Read-only, network-agnostic (unlike `doctor`, which is a Base-mainnet
* readiness check): it validates whatever network the challenge declares.
* Four checks:
* 1. live-402 — unpaid GET answers a parseable x402 challenge
* 2. terms — the challenge carries scheme/network/payTo/amount
* 3. manifest — origin serves a VALID /.well-known/arispay.json
* 4. catalog — the facilitator's /discovery/resources lists the URL
* The receipt is a machine artifact: JSON to stdout (--json) and to
* --receipt <file> (default paygate-verify-receipt.json in cwd).
*/
import * as fs from "node:fs";
import { validateCapabilityManifest } from "./manifest.js";
const DEFAULT_FACILITATOR = "https://facilitator.arispay.app";
function decodeHeaderChallenge(value) {
const normalized = value.replace(/-/g, "+").replace(/_/g, "/");
return JSON.parse(Buffer.from(normalized, "base64").toString("utf8"));
}
async function fetchJson(fetchImpl, url) {
try {
const res = await fetchImpl(url, {
headers: { accept: "application/json" },
redirect: "manual",
signal: AbortSignal.timeout(15_000),
});
const body = await res.json().catch(() => null);
return { status: res.status, body, headers: res.headers };
}
catch (error) {
return { error: String(error) };
}
}
export async function verifyUrl(url, facilitator, fetchImpl = fetch, now = () => new Date()) {
const base = facilitator.replace(/\/$/, "");
const checks = [];
let terms;
let manifestInfo;
// 1+2 — live 402 + terms.
const res = await fetchJson(fetchImpl, url);
if ("error" in res) {
checks.push({ id: "live-402", ok: false, message: `fetch failed: ${res.error}` });
}
else {
let challenge = res.body;
if (!challenge || !Array.isArray(challenge.accepts)) {
const header = res.headers.get("payment-required") ?? res.headers.get("x-payment-required");
if (header) {
try {
challenge = decodeHeaderChallenge(header);
}
catch {
/* fall through to the checks below */
}
}
}
const accepts = Array.isArray(challenge?.accepts)
? challenge?.accepts
: [];
checks.push({
id: "live-402",
ok: res.status === 402 && accepts.length > 0,
message: res.status === 402
? accepts.length > 0
? "unpaid GET answered a parseable x402 challenge"
: "402 returned but the challenge has no accepts[]"
: `expected HTTP 402, got ${res.status}`,
});
const first = accepts[0];
const amount = typeof first?.amount === "string"
? first.amount
: typeof first?.maxAmountRequired === "string"
? first.maxAmountRequired
: undefined;
const termsOk = typeof first?.scheme === "string" &&
typeof first?.network === "string" &&
typeof first?.payTo === "string" &&
typeof amount === "string";
if (first) {
terms = {
scheme: first.scheme,
network: first.network,
payTo: first.payTo,
asset: first.asset,
amount,
};
}
checks.push({
id: "terms",
ok: Boolean(termsOk),
message: termsOk
? `terms complete: ${terms?.scheme} on ${terms?.network}, ${amount} base units to ${terms?.payTo}`
: "challenge is missing scheme/network/payTo/amount",
});
}
// 3 — manifest at the origin.
let origin;
try {
origin = new URL(url).origin;
}
catch {
/* live-402 already failed on an unparseable URL */
}
if (origin) {
const man = await fetchJson(fetchImpl, `${origin}/.well-known/arispay.json`);
if ("error" in man || man.status !== 200) {
checks.push({
id: "manifest",
ok: false,
message: `no manifest at ${origin}/.well-known/arispay.json (${"error" in man ? man.error : `HTTP ${man.status}`})`,
});
}
else {
const validation = validateCapabilityManifest(man.body);
checks.push({
id: "manifest",
ok: validation.ok,
message: validation.ok
? `manifest valid (slug "${validation.manifest.merchant.slug}", ${validation.manifest.products?.length ?? 0} product(s))`
: `manifest invalid: ${validation.errors.slice(0, 3).join("; ")}`,
});
if (validation.ok) {
manifestInfo = {
slug: validation.manifest.merchant.slug,
products: validation.manifest.products?.length ?? 0,
};
}
}
}
// 4 — facilitator catalog listing.
const cat = await fetchJson(fetchImpl, `${base}/discovery/resources?q=${encodeURIComponent(url)}`);
if ("error" in cat) {
checks.push({ id: "catalog", ok: false, message: `catalog query failed: ${cat.error}` });
}
else {
const items = Array.isArray(cat.body?.items)
? (cat.body.items)
: [];
const listed = items.some((item) => item.resource === url);
checks.push({
id: "catalog",
ok: listed,
message: listed
? `listed in ${base}/discovery/resources`
: `not listed at ${base} — run: npx paygate register ${url}`,
});
}
return {
ok: checks.every((c) => c.ok),
url,
facilitator: base,
verifiedAt: now().toISOString(),
checks,
...(terms ? { terms } : {}),
...(manifestInfo ? { manifest: manifestInfo } : {}),
};
}
export const VERIFY_HELP_TEXT = `paygate verify <https-url> [--facilitator <url>] [--receipt <file>] [--json]
Read-only onboarding acceptance check. Validates: live 402 · complete terms ·
valid /.well-known/arispay.json manifest · facilitator catalog listing.
Writes a machine-readable receipt (default: paygate-verify-receipt.json).
Never sends payment or auth headers.
`;
export async function runVerify(argv, io = { stdout: (s) => process.stdout.write(s), stderr: (s) => process.stderr.write(s) }, fetchImpl = fetch) {
if (argv.includes("--help") || argv.includes("-h")) {
io.stdout(VERIFY_HELP_TEXT);
return 0;
}
const json = argv.includes("--json");
const facIdx = argv.indexOf("--facilitator");
const recIdx = argv.indexOf("--receipt");
const skipIdx = new Set([facIdx + 1, recIdx + 1].filter((i) => i > 0));
const positional = argv.filter((v, i) => !v.startsWith("-") && !skipIdx.has(i));
const url = positional[0];
if (!url) {
io.stderr(`${JSON.stringify({ error: { code: "MISSING_URL", message: "usage: paygate verify <https-url> [--facilitator <url>] [--receipt <file>] [--json]", retryable: false } })}\n`);
return 1;
}
const receipt = await verifyUrl(url, (facIdx >= 0 && argv[facIdx + 1]) || DEFAULT_FACILITATOR, fetchImpl);
const receiptPath = (recIdx >= 0 && argv[recIdx + 1]) || "paygate-verify-receipt.json";
try {
fs.writeFileSync(receiptPath, `${JSON.stringify(receipt, null, 2)}\n`, "utf8");
}
catch (error) {
io.stderr(`warning: could not write receipt to ${receiptPath}: ${String(error)}\n`);
}
if (json) {
io.stdout(`${JSON.stringify(receipt, null, 2)}\n`);
}
else {
io.stdout(`Paygate verify: ${url}\n`);
for (const c of receipt.checks)
io.stdout(`${c.ok ? "PASS" : "FAIL"} [${c.id}] ${c.message}\n`);
io.stdout(`${receipt.ok ? "\nVerified" : "\nNot verified"}. Receipt: ${receiptPath}\n`);
}
return receipt.ok ? 0 : 1;
}
//# sourceMappingURL=verify.js.map
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"}
/**
* `paygate wrap` — template generation. Pure functions, no filesystem.
*
* Wrap gates an EXISTING upstream API: the generated project is an Express
* reverse proxy that (1) answers x402 402 challenges on the gated routes,
* (2) forwards paid (and ungated) traffic to UPSTREAM_URL, (3) serves the
* capability manifest at /.well-known/arispay.json and an agent-readable
* /llms.txt. Same account-free family as `paygate init` (upstream @x402/*
* packages, wallet receives funds directly, no ArisPay account).
*
* Determinism rule: every generated file is byte-deterministic for the same
* inputs, so idempotent re-runs diff cleanly (checkWritePlan). The manifest
* `updated` timestamp is therefore injected by the generated server at boot
* (last-deploy semantics), never baked into the file.
*/
import { type GeneratedFile, type InitCurrency, type InitNetwork } from "./init-templates.js";
export interface WrapRoute {
method: "GET" | "POST" | "PUT" | "DELETE";
/** Express-style path (OpenAPI `{param}` already converted to `:param`). */
path: string;
priceCents: number;
description?: string;
}
export interface WrapOptions {
upstream: string;
wallet: string;
network: InitNetwork;
currency: InitCurrency;
routes: WrapRoute[];
projectName: string;
slug: string;
/** Documented OpenAPI JSON (with 402 responses injected), when --from-openapi was used. */
openapiDocumented?: string;
}
export declare function assetFor(network: InitNetwork, currency: InitCurrency): {
address: string;
name: string;
};
/** Manifest file content — NO `updated` field (the server injects it at boot). */
export declare function wrapManifestBase(opts: WrapOptions): string;
export declare function generateWrapFiles(opts: WrapOptions): GeneratedFile[];
//# sourceMappingURL=wrap-templates.d.ts.map
{"version":3,"file":"wrap-templates.d.ts","sourceRoot":"","sources":["../src/wrap-templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAIjB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,GAAG;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAKA;AAuCD,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAwB1D;AAmKD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,EAAE,CAuCpE"}
/**
* `paygate wrap` — template generation. Pure functions, no filesystem.
*
* Wrap gates an EXISTING upstream API: the generated project is an Express
* reverse proxy that (1) answers x402 402 challenges on the gated routes,
* (2) forwards paid (and ungated) traffic to UPSTREAM_URL, (3) serves the
* capability manifest at /.well-known/arispay.json and an agent-readable
* /llms.txt. Same account-free family as `paygate init` (upstream @x402/*
* packages, wallet receives funds directly, no ArisPay account).
*
* Determinism rule: every generated file is byte-deterministic for the same
* inputs, so idempotent re-runs diff cleanly (checkWritePlan). The manifest
* `updated` timestamp is therefore injected by the generated server at boot
* (last-deploy semantics), never baked into the file.
*/
import { CAIP2, EURC_BASE_MAINNET, centsToAtomic, centsToMoneyString, defaultFacilitatorFor, } from "./init-templates.js";
import { USDC_BASE_MAINNET, USDC_BASE_SEPOLIA } from "./manifest.js";
export function assetFor(network, currency) {
if (currency === "EUR")
return { address: EURC_BASE_MAINNET, name: "EURC" };
return network === "base"
? { address: USDC_BASE_MAINNET, name: "USDC" }
: { address: USDC_BASE_SEPOLIA, name: "USDC" };
}
function priceExpr(route, currency) {
if (currency === "EUR") {
return `{ asset: '${EURC_BASE_MAINNET}', amount: '${centsToAtomic(route.priceCents)}', extra: { name: 'EURC', version: '2' } }`;
}
return `'${centsToMoneyString(route.priceCents)}'`;
}
function routeMapJs(opts) {
return opts.routes
.map((route) => {
const desc = (route.description ?? `Paid ${route.method} ${route.path}`).replace(/'/g, "");
// The bazaar extension MUST declare the method — the facilitator's
// register/catalog probe rejects method-less declarations. Query-style
// methods (GET/DELETE) and body-carrying methods (POST/PUT) use the
// extension's two declaration families.
const bodyMethod = route.method === "POST" || route.method === "PUT";
const declare = bodyMethod
? `declareDiscoveryExtension({ method: '${route.method}', bodyType: 'json', output: { example: { ok: true } } })`
: `declareDiscoveryExtension({ method: '${route.method}', output: { example: { ok: true } } })`;
return [
` '${route.method} ${route.path}': {`,
` accepts: {`,
` scheme: 'exact',`,
` price: ${priceExpr(route, opts.currency)},`,
` network: NETWORK_CAIP2,`,
` payTo: PAY_TO_ADDRESS,`,
` maxTimeoutSeconds: 60,`,
` },`,
` description: '${desc}',`,
` mimeType: 'application/json',`,
` extensions: ${declare},`,
` },`,
].join("\n");
})
.join("\n");
}
/** Manifest file content — NO `updated` field (the server injects it at boot). */
export function wrapManifestBase(opts) {
const asset = assetFor(opts.network, opts.currency);
const doc = {
version: "1",
merchant: { slug: opts.slug, name: opts.projectName },
trust: { minTier: "any" },
rails: [
{
scheme: "x402",
network: CAIP2[opts.network],
asset: asset.address,
assetName: asset.name,
payTo: opts.wallet,
facilitator: defaultFacilitatorFor(opts.network),
},
],
products: opts.routes.map((route) => ({
path: route.path,
method: route.method,
priceCents: route.priceCents,
...(route.description ? { description: route.description } : {}),
})),
};
return `${JSON.stringify(doc, null, 2)}\n`;
}
function llmsTxt(opts) {
const lines = [
`# ${opts.projectName}`,
``,
`x402-payable API gateway (generated by \`npx paygate wrap\`). Paid routes`,
`answer HTTP 402 with machine-readable payment requirements; pay with any`,
`x402 client (e.g. \`npx payagent pay <url>\`).`,
``,
`## Machine-readable surfaces`,
`- /.well-known/arispay.json — capability manifest (prices, payTo, facilitator)`,
`- /health — unpaid liveness`,
``,
`## Paid routes (integer cents)`,
...opts.routes.map((r) => `- ${r.method} ${r.path} — ${r.priceCents}¢ ${opts.currency}`),
``,
];
return `${lines.join("\n")}\n`;
}
function serverJs(opts) {
return `/**
* x402 gateway for ${opts.upstream} — generated by \`npx paygate wrap\`.
*
* Unpaid surfaces: /health, /.well-known/arispay.json, /llms.txt.
* Every other route proxies to UPSTREAM_URL; the routes listed in the
* payment map below require a valid X-PAYMENT first.
*/
import { readFileSync } from 'node:fs';
import express from 'express';
import { paymentMiddleware, x402ResourceServer } from '@x402/express';
import { HTTPFacilitatorClient } from '@x402/core/server';
import { ExactEvmScheme } from '@x402/evm/exact/server';
import { declareDiscoveryExtension } from '@x402/extensions/bazaar';
const PAY_TO_ADDRESS = process.env.PAY_TO_ADDRESS;
const UPSTREAM_URL = (process.env.UPSTREAM_URL || '${opts.upstream}').replace(/\\/$/, '');
const FACILITATOR_URL = process.env.FACILITATOR_URL || '${defaultFacilitatorFor(opts.network)}';
const NETWORK = process.env.NETWORK || '${opts.network}';
const PORT = parseInt(process.env.PORT || '3000', 10);
if (!PAY_TO_ADDRESS || !/^0x[0-9a-fA-F]{40}$/.test(PAY_TO_ADDRESS)) {
console.error('PAY_TO_ADDRESS env var is required and must be a 0x-prefixed EVM address');
process.exit(1);
}
const NETWORK_TO_CAIP2 = { 'base-sepolia': '${CAIP2["base-sepolia"]}', base: '${CAIP2.base}' };
const NETWORK_CAIP2 = NETWORK_TO_CAIP2[NETWORK] || NETWORK;
const SERVER_STARTED_AT = new Date().toISOString();
// Manifest: deterministic base file + boot-time \`updated\` (last deploy).
const manifestBase = JSON.parse(readFileSync(new URL('./arispay.manifest.json', import.meta.url), 'utf8'));
const manifest = { ...manifestBase, updated: SERVER_STARTED_AT };
const facilitatorClient = new HTTPFacilitatorClient({ url: FACILITATOR_URL });
const resourceServer = new x402ResourceServer(facilitatorClient).register(
NETWORK_CAIP2,
new ExactEvmScheme(),
);
const app = express();
app.set('trust proxy', 1);
app.disable('x-powered-by');
app.get('/health', (_req, res) => {
res.json({ ok: true, upstream: UPSTREAM_URL, network: NETWORK, facilitator: FACILITATOR_URL });
});
app.get('/.well-known/arispay.json', (_req, res) => {
res.set('cache-control', 'public, max-age=3600').json(manifest);
});
app.get('/llms.txt', (_req, res) => {
res.type('text/plain').send(readFileSync(new URL('./llms.txt', import.meta.url), 'utf8'));
});
// Paywall — requests matching this map must carry a valid X-PAYMENT header.
app.use(
paymentMiddleware(
{
${routeMapJs(opts)}
},
resourceServer,
),
);
// Reverse proxy — reached unpaid for ungated routes, post-payment for gated
// ones. Streams the upstream response; hop-by-hop headers are dropped.
const HOP_BY_HOP = new Set(['connection', 'keep-alive', 'transfer-encoding', 'upgrade', 'host', 'content-length']);
app.use(async (req, res) => {
try {
const headers = {};
for (const [key, value] of Object.entries(req.headers)) {
if (!HOP_BY_HOP.has(key.toLowerCase()) && typeof value === 'string') headers[key] = value;
}
const hasBody = !['GET', 'HEAD'].includes(req.method);
const upstream = await fetch(\`\${UPSTREAM_URL}\${req.originalUrl}\`, {
method: req.method,
headers,
...(hasBody ? { body: req, duplex: 'half' } : {}),
redirect: 'manual',
});
res.status(upstream.status);
upstream.headers.forEach((value, key) => {
if (!HOP_BY_HOP.has(key)) res.set(key, value);
});
res.send(Buffer.from(await upstream.arrayBuffer()));
} catch (err) {
res.status(502).json({
error: { code: 'UPSTREAM_UNREACHABLE', message: String(err), retryable: true },
});
}
});
app.listen(PORT, () => {
console.log(\`x402 gateway listening on :\${PORT} → \${UPSTREAM_URL}\`);
console.log(\`network=\${NETWORK} payTo=\${PAY_TO_ADDRESS} facilitator=\${FACILITATOR_URL}\`);
});
`;
}
const GITIGNORE = "node_modules/\n.env\n";
function envExample(opts) {
return [
`# ${opts.projectName} — generated by paygate wrap`,
`PAY_TO_ADDRESS=${opts.wallet}`,
`UPSTREAM_URL=${opts.upstream}`,
`FACILITATOR_URL=${defaultFacilitatorFor(opts.network)}`,
`NETWORK=${opts.network}`,
`PORT=3000`,
``,
].join("\n");
}
function readme(opts) {
return [
`# ${opts.projectName}`,
``,
`x402 payment gateway in front of \`${opts.upstream}\`, generated by`,
`\`npx paygate wrap\`. Account-free: the wallet in \`PAY_TO_ADDRESS\``,
`receives funds directly.`,
``,
"```bash",
`npm install`,
`cp .env.example .env`,
`npm start`,
"```",
``,
`Then, once this gateway is publicly reachable over HTTPS:`,
``,
"```bash",
`npx paygate register https://<your-domain>${opts.routes[0]?.path ?? "/"}`,
`npx paygate verify https://<your-domain>${opts.routes[0]?.path ?? "/"}`,
"```",
``,
`Ordering matters: wrap → deploy → register → verify. The facilitator`,
`probes the URL before cataloging, so register only after deploy.`,
``,
].join("\n");
}
const X402_EXPRESS_RANGE = "^2.8.0";
export function generateWrapFiles(opts) {
const files = [
{
path: "package.json",
content: `${JSON.stringify({
name: opts.projectName,
version: "0.1.0",
private: true,
type: "module",
description: `x402 gateway for ${opts.upstream} generated by paygate wrap`,
scripts: {
start: "node --env-file=.env server.js",
dev: "node --env-file=.env --watch server.js",
},
engines: { node: ">=20.6" },
dependencies: {
"@x402/core": X402_EXPRESS_RANGE,
"@x402/evm": X402_EXPRESS_RANGE,
"@x402/express": X402_EXPRESS_RANGE,
"@x402/extensions": X402_EXPRESS_RANGE,
express: "^4.21.2",
},
}, null, 2)}\n`,
},
{ path: "server.js", content: serverJs(opts) },
{ path: "arispay.manifest.json", content: wrapManifestBase(opts) },
{ path: "llms.txt", content: llmsTxt(opts) },
{ path: ".env.example", content: envExample(opts) },
{ path: ".gitignore", content: GITIGNORE },
{ path: "README.md", content: readme(opts) },
];
if (opts.openapiDocumented) {
files.push({ path: "openapi.json", content: opts.openapiDocumented });
}
return files;
}
//# sourceMappingURL=wrap-templates.js.map
{"version":3,"file":"wrap-templates.js","sourceRoot":"","sources":["../src/wrap-templates.ts"],"names":[],"mappings":"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"}
/**
* `paygate wrap` — gate an EXISTING upstream API behind x402, unattended.
*
* Flow (the M2M onboarding ordering): wrap → deploy → register → verify.
* This command does step 1 only: it derives the gating config (from flags or
* --from-openapi), and writes a deployable gateway project + manifest.
*
* Machine contract: zero prompts ever (unlike init there is no TTY prompt
* path — wrap is agent-first); all failures are S2-structured with --json
* (`{ error: { code, message, retryable } }`); re-runs are idempotent, and
* conflicting files produce a diff summary instead of silent refusal.
*/
import { type WrapOptions, type WrapRoute } from "./wrap-templates.js";
export interface WrapError {
code: string;
message: string;
retryable: boolean;
}
export interface WrapIO {
stdout: (s: string) => void;
stderr: (s: string) => void;
}
export interface OpenApiDerivation {
routes: WrapRoute[];
/** The spec with 402 responses documented on every gated operation. */
documented: string;
}
/**
* Derive gated routes from an OpenAPI 3.x JSON document and document the
* 402 response into each gated operation. Per-operation price override via
* the `x-arispay-price-cents` extension (integer cents); default otherwise.
*/
export declare function deriveFromOpenApi(raw: string, defaultPriceCents: number): {
ok: true;
value: OpenApiDerivation;
} | {
ok: false;
error: WrapError;
};
export interface WrapArgs {
upstream?: string;
wallet?: string;
price?: string;
currency?: string;
network?: string;
scheme?: string;
asset?: string;
route?: string;
method?: string;
fromOpenapi?: string;
directory?: string;
name?: string;
json: boolean;
dryRun: boolean;
help: boolean;
}
export declare function parseWrapArgv(argv: string[]): {
ok: true;
args: WrapArgs;
} | {
ok: false;
error: WrapError;
};
export declare function validateWrapArgs(args: WrapArgs, openapiRoutes?: WrapRoute[]): {
ok: true;
options: WrapOptions & {
directory: string;
dryRun: boolean;
};
} | {
ok: false;
error: WrapError;
};
/** First-differing-line summary per conflicting file — the re-run diff. */
export declare function diffSummary(directory: string, files: Array<{
path: string;
content: string;
}>, conflicts: string[]): string;
export declare const WRAP_HELP_TEXT = "paygate wrap \u2014 put an x402 paywall in front of an existing API.\n\nZero prompts, agent-first. Ordering: wrap \u2192 deploy \u2192 register \u2192 verify.\n\nUsage:\n npx paygate wrap --upstream https://api.example.com --wallet 0xYourAddress [options]\n\nOptions:\n --upstream <url> The API to gate (required; https, or http://localhost)\n --wallet <0x...> Receiving EVM address (required; public info, no key is generated)\n --price <cents> Default price per request in INTEGER cents (default: 1)\n --currency <cur> USD | EUR (default USD; EUR requires --network base)\n --network <net> base | base-sepolia (default base-sepolia)\n --scheme <s> x402 scheme; only \"exact\" is supported\n --asset <0x...> Override the settlement asset contract (advanced)\n --route <path> Single gated route (default: /* \u2014 gate everything)\n --method <verb> Method for --route (default GET)\n --from-openapi <src> Derive gated routes from an OpenAPI 3.x JSON URL or\n file; documents 402 responses into ./openapi.json.\n Per-op price override: x-arispay-price-cents.\n --directory <dir> Target directory (default ./<derived-name>)\n --name <name> Project/manifest name (default derived from upstream host)\n --json Machine output (S2 errors + result JSON)\n --dry-run Print the file plan, write nothing\n";
export declare function runWrap(argv: string[], io?: WrapIO, fetchImpl?: typeof fetch): Promise<number>;
//# sourceMappingURL=wrap.d.ts.map
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../src/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,SAAS,EAEf,MAAM,qBAAqB,CAAC;AAQ7B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAQD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,MAAM,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CA8E1E;AAID,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAuBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAmB5G;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,EACd,aAAa,CAAC,EAAE,SAAS,EAAE,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CA2E/G;AAID,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAiB3H;AAID,eAAO,MAAM,cAAc,i8CAwB1B,CAAC;AAEF,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,GAAE,MAA2F,EAC/F,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,MAAM,CAAC,CA0FjB"}
/**
* `paygate wrap` — gate an EXISTING upstream API behind x402, unattended.
*
* Flow (the M2M onboarding ordering): wrap → deploy → register → verify.
* This command does step 1 only: it derives the gating config (from flags or
* --from-openapi), and writes a deployable gateway project + manifest.
*
* Machine contract: zero prompts ever (unlike init there is no TTY prompt
* path — wrap is agent-first); all failures are S2-structured with --json
* (`{ error: { code, message, retryable } }`); re-runs are idempotent, and
* conflicting files produce a diff summary instead of silent refusal.
*/
import * as fs from "node:fs";
import * as path from "node:path";
import { WALLET_RE, checkWritePlan, writeFiles } from "./init.js";
import { generateWrapFiles, } from "./wrap-templates.js";
const NETWORKS = ["base", "base-sepolia"];
const CURRENCIES = ["USD", "EUR"];
const METHODS = new Set(["GET", "POST", "PUT", "DELETE"]);
const MAX_OPENAPI_ROUTES = 200;
const MAX_OPENAPI_BYTES = 2 * 1024 * 1024;
function fail(code, message, retryable = false) {
return { code, message, retryable };
}
/**
* Derive gated routes from an OpenAPI 3.x JSON document and document the
* 402 response into each gated operation. Per-operation price override via
* the `x-arispay-price-cents` extension (integer cents); default otherwise.
*/
export function deriveFromOpenApi(raw, defaultPriceCents) {
if (Buffer.byteLength(raw, "utf8") > MAX_OPENAPI_BYTES) {
return { ok: false, error: fail("OPENAPI_TOO_LARGE", `spec exceeds ${MAX_OPENAPI_BYTES} bytes`) };
}
let spec;
try {
spec = JSON.parse(raw);
}
catch {
return {
ok: false,
error: fail("OPENAPI_INVALID_JSON", "spec is not valid JSON (YAML specs are not supported in v1 — convert to JSON)"),
};
}
const paths = spec.paths;
if (!paths || typeof paths !== "object") {
return { ok: false, error: fail("OPENAPI_NO_PATHS", "spec has no paths object") };
}
const routes = [];
const documented = structuredClone(spec);
const docPaths = documented.paths;
for (const [rawPath, ops] of Object.entries(paths)) {
if (typeof ops !== "object" || ops === null)
continue;
for (const [verb, op] of Object.entries(ops)) {
const method = verb.toUpperCase();
if (!METHODS.has(method) || typeof op !== "object" || op === null)
continue;
const override = op["x-arispay-price-cents"];
let priceCents = defaultPriceCents;
if (override !== undefined) {
if (!Number.isInteger(override) || override < 1) {
return {
ok: false,
error: fail("OPENAPI_BAD_PRICE", `${method} ${rawPath}: x-arispay-price-cents must be an integer >= 1 (integer cents, never floats)`),
};
}
priceCents = override;
}
const expressPath = rawPath.replace(/\{([^}/]+)\}/g, ":$1");
if (!/^\/[A-Za-z0-9._~/:-]*$/.test(expressPath) || expressPath.includes("..")) {
return { ok: false, error: fail("OPENAPI_BAD_PATH", `unsupported path characters in ${rawPath}`) };
}
const summary = op.summary;
routes.push({
method: method,
path: expressPath,
priceCents,
description: typeof summary === "string" ? summary.slice(0, 200) : undefined,
});
// Document the 402 into the spec copy.
const docOp = docPaths[rawPath]?.[verb];
if (docOp) {
const responses = (docOp.responses ?? {});
responses["402"] = {
description: "Payment Required (x402). The body and the payment-required header carry machine-readable payment requirements; retry with a valid X-PAYMENT header.",
};
docOp.responses = responses;
}
if (routes.length > MAX_OPENAPI_ROUTES) {
return {
ok: false,
error: fail("OPENAPI_TOO_MANY_ROUTES", `more than ${MAX_OPENAPI_ROUTES} operations; gate a subset with --route`),
};
}
}
}
if (routes.length === 0) {
return { ok: false, error: fail("OPENAPI_NO_OPERATIONS", "spec has no gateable operations") };
}
documented["x-arispay"] = {
generator: "paygate wrap",
note: "402 responses documented per operation; see /.well-known/arispay.json for live terms",
};
return { ok: true, value: { routes, documented: `${JSON.stringify(documented, null, 2)}\n` } };
}
const VALUE_FLAGS = {
"--upstream": "upstream",
"--wallet": "wallet",
"--price": "price",
"--currency": "currency",
"--network": "network",
"--scheme": "scheme",
"--asset": "asset",
"--route": "route",
"--method": "method",
"--from-openapi": "fromOpenapi",
"--directory": "directory",
"--name": "name",
};
const BOOL_FLAGS = {
"--json": "json",
"--dry-run": "dryRun",
"--help": "help",
"-h": "help",
};
export function parseWrapArgv(argv) {
const args = { json: false, dryRun: false, help: false };
for (let i = 0; i < argv.length; i++) {
const token = argv[i];
const eq = token.indexOf("=");
const flag = eq > 0 ? token.slice(0, eq) : token;
if (BOOL_FLAGS[flag]) {
args[BOOL_FLAGS[flag]] = true;
continue;
}
const key = VALUE_FLAGS[flag];
if (!key)
return { ok: false, error: fail("UNKNOWN_FLAG", `unknown flag ${flag}`) };
const value = eq > 0 ? token.slice(eq + 1) : argv[++i];
if (value === undefined || value.startsWith("--")) {
return { ok: false, error: fail("MISSING_VALUE", `${flag} requires a value`) };
}
args[key] = value;
}
return { ok: true, args };
}
export function validateWrapArgs(args, openapiRoutes) {
if (!args.upstream) {
return { ok: false, error: fail("MISSING_UPSTREAM", "--upstream is required (the URL of the API to gate)") };
}
let upstream;
try {
upstream = new URL(args.upstream);
}
catch {
return { ok: false, error: fail("BAD_UPSTREAM", `--upstream is not a valid URL: ${args.upstream}`) };
}
const localhost = upstream.hostname === "localhost" || upstream.hostname === "127.0.0.1";
if (upstream.protocol !== "https:" && !(upstream.protocol === "http:" && localhost)) {
return { ok: false, error: fail("BAD_UPSTREAM", "--upstream must be https (http allowed for localhost only)") };
}
if (!args.wallet || !WALLET_RE.test(args.wallet)) {
return { ok: false, error: fail("MISSING_WALLET", "--wallet is required: the 0x EVM address that receives funds (no key generation — bring a receiving address)") };
}
if (args.scheme !== undefined && args.scheme !== "exact") {
return { ok: false, error: fail("UNSUPPORTED_SCHEME", `only scheme "exact" is supported (got "${args.scheme}")`) };
}
const network = (args.network ?? "base-sepolia");
if (!NETWORKS.includes(network)) {
return { ok: false, error: fail("BAD_NETWORK", `--network must be base or base-sepolia (got "${args.network}")`) };
}
const currency = (args.currency ?? "USD").toUpperCase();
if (!CURRENCIES.includes(currency)) {
return { ok: false, error: fail("BAD_CURRENCY", `--currency must be USD or EUR (got "${args.currency}")`) };
}
if (currency === "EUR" && network !== "base") {
return { ok: false, error: fail("EUR_REQUIRES_MAINNET", "--currency EUR requires --network base (no EURC testnet path)") };
}
if (args.asset !== undefined && !WALLET_RE.test(args.asset)) {
return { ok: false, error: fail("BAD_ASSET", "--asset must be a 0x40-hex token contract address") };
}
const rawPrice = args.price ?? "1";
if (!/^\d+$/.test(rawPrice.trim())) {
return { ok: false, error: fail("BAD_PRICE", `--price must be INTEGER cents (got "${rawPrice}"): for $0.10 pass --price 10 — never floats, never dollar strings`) };
}
const priceCents = Number.parseInt(rawPrice.trim(), 10);
if (priceCents < 1) {
return { ok: false, error: fail("BAD_PRICE", "--price must be >= 1 cent") };
}
let routes;
if (openapiRoutes) {
routes = openapiRoutes;
}
else {
const routePath = args.route ?? "/*";
if (!/^\/[A-Za-z0-9._~/:*-]*$/.test(routePath) || routePath.includes("..")) {
return { ok: false, error: fail("BAD_ROUTE", `--route must start with "/" and use URL-path characters (got "${routePath}")`) };
}
const method = (args.method ?? "GET").toUpperCase();
if (!METHODS.has(method)) {
return { ok: false, error: fail("BAD_METHOD", `--method must be GET|POST|PUT|DELETE (got "${args.method}")`) };
}
routes = [{ method: method, path: routePath, priceCents }];
}
const projectName = args.name ?? `x402-gateway-${upstream.hostname.replace(/[^a-z0-9-]/gi, "-").toLowerCase()}`;
const slug = projectName.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").slice(0, 60);
return {
ok: true,
options: {
upstream: upstream.href.replace(/\/$/, ""),
wallet: args.wallet,
network,
currency,
routes,
projectName,
slug,
directory: args.directory ?? `./${projectName}`,
dryRun: args.dryRun,
},
};
}
// ── Diff output for idempotent re-runs ─────────────────────────────────
/** First-differing-line summary per conflicting file — the re-run diff. */
export function diffSummary(directory, files, conflicts) {
const lines = [];
for (const conflictPath of conflicts) {
const planned = files.find((f) => f.path === conflictPath);
if (!planned)
continue;
const existing = fs.readFileSync(path.join(directory, conflictPath), "utf8");
const a = existing.split("\n");
const b = planned.content.split("\n");
let firstDiff = 0;
while (firstDiff < Math.min(a.length, b.length) && a[firstDiff] === b[firstDiff])
firstDiff++;
lines.push(` ${conflictPath}: differs from line ${firstDiff + 1} (existing ${a.length} lines / planned ${b.length} lines)`, ` - ${a[firstDiff]?.slice(0, 120) ?? "<eof>"}`, ` + ${b[firstDiff]?.slice(0, 120) ?? "<eof>"}`);
}
return lines.join("\n");
}
// ── Entry point ────────────────────────────────────────────────────────
export const WRAP_HELP_TEXT = `paygate wrap — put an x402 paywall in front of an existing API.
Zero prompts, agent-first. Ordering: wrap → deploy → register → verify.
Usage:
npx paygate wrap --upstream https://api.example.com --wallet 0xYourAddress [options]
Options:
--upstream <url> The API to gate (required; https, or http://localhost)
--wallet <0x...> Receiving EVM address (required; public info, no key is generated)
--price <cents> Default price per request in INTEGER cents (default: 1)
--currency <cur> USD | EUR (default USD; EUR requires --network base)
--network <net> base | base-sepolia (default base-sepolia)
--scheme <s> x402 scheme; only "exact" is supported
--asset <0x...> Override the settlement asset contract (advanced)
--route <path> Single gated route (default: /* — gate everything)
--method <verb> Method for --route (default GET)
--from-openapi <src> Derive gated routes from an OpenAPI 3.x JSON URL or
file; documents 402 responses into ./openapi.json.
Per-op price override: x-arispay-price-cents.
--directory <dir> Target directory (default ./<derived-name>)
--name <name> Project/manifest name (default derived from upstream host)
--json Machine output (S2 errors + result JSON)
--dry-run Print the file plan, write nothing
`;
export async function runWrap(argv, io = { stdout: (s) => process.stdout.write(s), stderr: (s) => process.stderr.write(s) }, fetchImpl = fetch) {
const emitError = (json, error) => {
const payload = `${JSON.stringify({ error }, null, json ? 2 : 0)}\n`;
if (json)
io.stdout(payload);
else
io.stderr(`error [${error.code}]: ${error.message}\n`);
return 1;
};
const parsed = parseWrapArgv(argv);
if (!parsed.ok)
return emitError(argv.includes("--json"), parsed.error);
const args = parsed.args;
if (args.help) {
io.stdout(WRAP_HELP_TEXT);
return 0;
}
// --from-openapi: URL or local file, JSON only.
let openapi;
if (args.fromOpenapi) {
let raw;
if (/^https?:\/\//.test(args.fromOpenapi)) {
try {
const res = await fetchImpl(args.fromOpenapi, {
headers: { accept: "application/json" },
redirect: "manual",
signal: AbortSignal.timeout(15_000),
});
if (!res.ok) {
return emitError(args.json, fail("OPENAPI_FETCH_FAILED", `GET ${args.fromOpenapi} returned ${res.status}`, true));
}
raw = await res.text();
}
catch (err) {
return emitError(args.json, fail("OPENAPI_FETCH_FAILED", `fetch failed: ${String(err)}`, true));
}
}
else {
try {
raw = fs.readFileSync(args.fromOpenapi, "utf8");
}
catch (err) {
return emitError(args.json, fail("OPENAPI_READ_FAILED", `cannot read ${args.fromOpenapi}: ${String(err)}`));
}
}
const derived = deriveFromOpenApi(raw, Number.parseInt(args.price ?? "1", 10) || 1);
if (!derived.ok)
return emitError(args.json, derived.error);
openapi = derived.value;
}
const validated = validateWrapArgs(args, openapi?.routes);
if (!validated.ok)
return emitError(args.json, validated.error);
const options = validated.options;
if (openapi)
options.openapiDocumented = openapi.documented;
const files = generateWrapFiles(options);
if (options.dryRun) {
const plan = files.map((f) => ({ path: f.path, bytes: Buffer.byteLength(f.content, "utf8") }));
io.stdout(args.json
? `${JSON.stringify({ dryRun: true, directory: options.directory, files: plan, routes: options.routes }, null, 2)}\n`
: `${plan.map((f) => `${f.path} (${f.bytes} bytes)`).join("\n")}\nDry run — nothing written. ${options.routes.length} gated route(s).\n`);
return 0;
}
const plan = checkWritePlan(options.directory, files);
if (plan.conflicts.length > 0) {
const diff = diffSummary(options.directory, files, plan.conflicts);
if (args.json) {
io.stdout(`${JSON.stringify({ error: fail("WRITE_CONFLICT", `${plan.conflicts.length} file(s) differ from the plan`), conflicts: plan.conflicts }, null, 2)}\n`);
}
else {
io.stderr(`Refusing to overwrite files that differ from the plan (re-running over an identical scaffold is fine):\n${diff}\n`);
}
return 1;
}
writeFiles(options.directory, plan.create);
const result = {
directory: options.directory,
created: plan.create.map((f) => f.path),
identical: plan.identical,
routes: options.routes,
manifest: "/.well-known/arispay.json",
nextSteps: [
`cd ${options.directory} && npm install && cp .env.example .env && npm start`,
"deploy publicly over HTTPS",
"npx paygate register <public-url-of-a-gated-route>",
"npx paygate verify <public-url-of-a-gated-route>",
],
};
io.stdout(args.json ? `${JSON.stringify(result, null, 2)}\n` : `Created ${plan.create.length} file(s) in ${options.directory}${plan.identical.length ? ` (${plan.identical.length} already up to date)` : ""}.\nGated ${options.routes.length} route(s); manifest at /.well-known/arispay.json.\nNext: ${result.nextSteps.join(" → ")}\n`);
return 0;
}
//# sourceMappingURL=wrap.js.map
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../src/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EAGL,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,QAAQ,GAA2B,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAClE,MAAM,UAAU,GAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC1D,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAa1C,SAAS,IAAI,CAAC,IAAY,EAAE,OAAe,EAAE,SAAS,GAAG,KAAK;IAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACtC,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,iBAAyB;IAEzB,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,iBAAiB,EAAE,CAAC;QACvD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,iBAAiB,QAAQ,CAAC,EAAE,CAAC;IACpG,CAAC;IACD,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI,CAAC,sBAAsB,EAAE,+EAA+E,CAAC;SACrH,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAA4D,CAAC;IAChF,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,EAAE,CAAC;IACpF,CAAC;IAED,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAgD,CAAC;IAE7E,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,SAAS;QACtD,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI;gBAAE,SAAS;YAC5E,MAAM,QAAQ,GAAI,EAA8B,CAAC,uBAAuB,CAAC,CAAC;YAC1E,IAAI,UAAU,GAAG,iBAAiB,CAAC;YACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAK,QAAmB,GAAG,CAAC,EAAE,CAAC;oBAC5D,OAAO;wBACL,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,IAAI,CACT,mBAAmB,EACnB,GAAG,MAAM,IAAI,OAAO,+EAA+E,CACpG;qBACF,CAAC;gBACJ,CAAC;gBACD,UAAU,GAAG,QAAkB,CAAC;YAClC,CAAC;YACD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,kCAAkC,OAAO,EAAE,CAAC,EAAE,CAAC;YACrG,CAAC;YACD,MAAM,OAAO,GAAI,EAA8B,CAAC,OAAO,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,MAA6B;gBACrC,IAAI,EAAE,WAAW;gBACjB,UAAU;gBACV,WAAW,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;aAC7E,CAAC,CAAC;YACH,uCAAuC;YACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAwC,CAAC;YAC/E,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAA4B,CAAC;gBACrE,SAAS,CAAC,KAAK,CAAC,GAAG;oBACjB,WAAW,EACT,qJAAqJ;iBACxJ,CAAC;gBACF,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;YAC9B,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;gBACvC,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,IAAI,CAAC,yBAAyB,EAAE,aAAa,kBAAkB,yCAAyC,CAAC;iBACjH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,iCAAiC,CAAC,EAAE,CAAC;IAChG,CAAC;IACA,UAAsC,CAAC,WAAW,CAAC,GAAG;QACrD,SAAS,EAAE,cAAc;QACzB,IAAI,EAAE,sFAAsF;KAC7F,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AACjG,CAAC;AAsBD,MAAM,WAAW,GAAmC;IAClD,YAAY,EAAE,UAAU;IACxB,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,OAAO;IAClB,YAAY,EAAE,UAAU;IACxB,WAAW,EAAE,SAAS;IACtB,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,OAAO;IAClB,UAAU,EAAE,QAAQ;IACpB,gBAAgB,EAAE,aAAa;IAC/B,aAAa,EAAE,WAAW;IAC1B,QAAQ,EAAE,MAAM;CACjB,CAAC;AACF,MAAM,UAAU,GAAmC;IACjD,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,QAAQ;IACrB,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,MAAM,IAAI,GAAa,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACjD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,IAA2C,CAAC,UAAU,CAAC,IAAI,CAAE,CAAC,GAAG,IAAI,CAAC;YACvE,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,IAAI,EAAE,CAAC,EAAE,CAAC;QACpF,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,mBAAmB,CAAC,EAAE,CAAC;QACjF,CAAC;QACA,IAA0C,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAc,EACd,aAA2B;IAE3B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,qDAAqD,CAAC,EAAE,CAAC;IAC/G,CAAC;IACD,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,kCAAkC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;IACvG,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,KAAK,WAAW,CAAC;IACzF,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC;QACpF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,4DAA4D,CAAC,EAAE,CAAC;IAClH,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,8GAA8G,CAAC,EAAE,CAAC;IACtK,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACzD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,0CAA0C,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IACrH,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,CAAgB,CAAC;IAChE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,gDAAgD,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;IACrH,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,WAAW,EAAkB,CAAC;IACxE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,uCAAuC,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;IAC9G,CAAC;IACD,IAAI,QAAQ,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,sBAAsB,EAAE,+DAA+D,CAAC,EAAE,CAAC;IAC7H,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,mDAAmD,CAAC,EAAE,CAAC;IACtG,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,uCAAuC,QAAQ,oEAAoE,CAAC,EAAE,CAAC;IACtK,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,2BAA2B,CAAC,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,MAAmB,CAAC;IACxB,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,GAAG,aAAa,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QACrC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,iEAAiE,SAAS,IAAI,CAAC,EAAE,CAAC;QACjI,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,8CAA8C,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACjH,CAAC;QACD,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,MAA6B,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;IAChH,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpG,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE;YACP,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;YACP,QAAQ;YACR,MAAM;YACN,WAAW;YACX,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,WAAW,EAAE;YAC/C,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;KACF,CAAC;AACJ,CAAC;AAED,0EAA0E;AAE1E,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,KAA+C,EAAE,SAAmB;IACjH,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7E,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OAAO,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;YAAE,SAAS,EAAE,CAAC;QAC9F,KAAK,CAAC,IAAI,CACR,KAAK,YAAY,uBAAuB,SAAS,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,oBAAoB,CAAC,CAAC,MAAM,SAAS,EAChH,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,EACjD,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAClD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,0EAA0E;AAE1E,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwB7B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAc,EACd,KAAa,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAC/F,YAA0B,KAAK;IAE/B,MAAM,SAAS,GAAG,CAAC,IAAa,EAAE,KAAgB,EAAU,EAAE;QAC5D,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,IAAI,IAAI;YAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;YACxB,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,gDAAgD;IAChD,IAAI,OAAsC,CAAC;IAC3C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,IAAI,GAAW,CAAC;QAChB,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE;oBAC5C,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;oBACvC,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;iBACpC,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,IAAI,CAAC,WAAW,aAAa,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;gBACpH,CAAC;gBACD,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,iBAAiB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,qBAAqB,EAAE,eAAe,IAAI,CAAC,WAAW,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5D,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IAClC,IAAI,OAAO;QAAE,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAE5D,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/F,EAAE,CAAC,MAAM,CACP,IAAI,CAAC,IAAI;YACP,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;YACrH,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC,OAAO,CAAC,MAAM,CAAC,MAAM,oBAAoB,CAC3I,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,+BAA+B,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACnK,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,2GAA2G,IAAI,IAAI,CAAC,CAAC;QACjI,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG;QACb,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,2BAA2B;QACrC,SAAS,EAAE;YACT,MAAM,OAAO,CAAC,SAAS,sDAAsD;YAC7E,4BAA4B;YAC5B,oDAAoD;YACpD,kDAAkD;SACnD;KACF,CAAC;IACF,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM,eAAe,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC,EAAE,YAAY,OAAO,CAAC,MAAM,CAAC,MAAM,4DAA4D,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3U,OAAO,CAAC,CAAC;AACX,CAAC"}
+5
-1

@@ -6,7 +6,11 @@ #!/usr/bin/env node

* npx paygate init [flags] scaffold a working x402 seller
* npx paygate wrap [flags] gate an EXISTING upstream API (agent-first)
* npx paygate register <url> announce a deployed endpoint to the facilitator
* npx paygate verify <url> onboarding acceptance check + receipt
* npx paygate doctor <url> validate Base mainnet readiness
*
* Zero runtime deps — see init.ts for the implementation.
* Onboarding ordering: wrap → deploy → register → verify.
* Zero runtime deps — see init.ts / wrap.ts for the implementation.
*/
export {};
//# sourceMappingURL=cli.d.ts.map
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}

@@ -6,8 +6,15 @@ #!/usr/bin/env node

* npx paygate init [flags] scaffold a working x402 seller
* npx paygate wrap [flags] gate an EXISTING upstream API (agent-first)
* npx paygate register <url> announce a deployed endpoint to the facilitator
* npx paygate verify <url> onboarding acceptance check + receipt
* npx paygate doctor <url> validate Base mainnet readiness
*
* Zero runtime deps — see init.ts for the implementation.
* Onboarding ordering: wrap → deploy → register → verify.
* Zero runtime deps — see init.ts / wrap.ts for the implementation.
*/
import { runDoctor } from "./doctor.js";
import { HELP_TEXT, runInit } from "./init.js";
import { runRegister } from "./register.js";
import { runVerify } from "./verify.js";
import { runWrap } from "./wrap.js";
async function main() {

@@ -18,2 +25,11 @@ const [command, ...rest] = process.argv.slice(2);

}
if (command === "wrap") {
return runWrap(rest);
}
if (command === "register") {
return runRegister(rest);
}
if (command === "verify") {
return runVerify(rest);
}
if (command === "doctor" || command === "check") {

@@ -23,3 +39,3 @@ return runDoctor(rest);

if (command === undefined || command === "--help" || command === "-h" || command === "help") {
process.stdout.write(`paygate — make your API payable in one command.\n\nCommands:\n init scaffold a working x402 seller\n doctor|check validate an unpaid Base mainnet x402 endpoint\n\n${HELP_TEXT}`);
process.stdout.write(`paygate — make your API payable in one command.\n\nCommands:\n init scaffold a working x402 seller\n wrap gate an EXISTING upstream API (agent-first, zero prompts)\n register announce a deployed endpoint to the facilitator catalog\n verify onboarding acceptance check (402 + manifest + catalog) + receipt\n doctor|check validate an unpaid Base mainnet x402 endpoint\n\nOnboarding ordering: wrap → deploy → register → verify.\n\n${HELP_TEXT}`);
return command === undefined ? 1 : 0;

@@ -26,0 +42,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEjD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5F,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kLAAkL,SAAS,EAAE,CAC9L,CAAC;QACF,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,uCAAuC,CAAC,CAAC;IACzF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,GAAG,EAAE,EAAE;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CACF,CAAC"}
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEjD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5F,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mdAAmd,SAAS,EAAE,CAC/d,CAAC;QACF,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,uCAAuC,CAAC,CAAC;IACzF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,GAAG,EAAE,EAAE;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CACF,CAAC"}

@@ -29,2 +29,8 @@ /**

export type { GhostPayPartnerConfig, GhostPaymentLink, GhostWebhookPayload, } from "./ghost-partner.js";
export { buildSellerManifest, validateCapabilityManifest, } from "./manifest.js";
export type { CapabilityManifestV1, ManifestProduct, ManifestRail, ManifestValidation, } from "./manifest.js";
export { registerResource } from "./register.js";
export type { RegisterResult } from "./register.js";
export { verifyUrl } from "./verify.js";
export type { VerifyCheck, VerifyReceipt } from "./verify.js";
//# sourceMappingURL=index.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChF,YAAY,EACV,aAAa,EACb,eAAe,EACf,UAAU,EACV,aAAa,EACb,wBAAwB,GACzB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChF,YAAY,EACV,aAAa,EACb,eAAe,EACf,UAAU,EACV,aAAa,EACb,wBAAwB,GACzB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}

@@ -31,2 +31,7 @@ /**

export { GhostPayPartner } from "./ghost-partner.js";
// Machine-executable onboarding (M2M Session 2): manifest utilities +
// programmatic register/verify. CLI verbs: wrap / register / verify.
export { buildSellerManifest, validateCapabilityManifest, } from "./manifest.js";
export { registerResource } from "./register.js";
export { verifyUrl } from "./verify.js";
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAShF,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE/D,oCAAoC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAShF,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE/D,oCAAoC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD,sEAAsE;AACtE,qEAAqE;AACrE,OAAO,EACL,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAOvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
{
"name": "paygate",
"version": "5.5.0",
"version": "5.6.0",
"description": "Accept payment from AI agents in two lines of code. Gate any Express or Fastify route with an x402 paywall — USD (USDC) or EUR (EURC) pricing, settled on Base mainnet via ArisPay's facilitator.",

@@ -25,9 +25,2 @@ "type": "module",

},
"scripts": {
"build": "tsc && chmod +x dist/cli.js",
"dev": "tsc --watch",
"type-check": "tsc --noEmit",
"test": "vitest run --root ../.. packages/paygate/src/",
"prepublishOnly": "pnpm build"
},
"dependencies": {},

@@ -99,3 +92,9 @@ "peerDependencies": {

"url": "https://github.com/arispay-inc/arispay-x402/issues"
},
"scripts": {
"build": "tsc && chmod +x dist/cli.js",
"dev": "tsc --watch",
"type-check": "tsc --noEmit",
"test": "vitest run --root ../.. packages/paygate/src/"
}
}
}