| /** | ||
| * 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"} |
+125
| /** | ||
| * 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"} |
+200
| /** | ||
| * `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"} |
+358
| /** | ||
| * `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":"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"} |
+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 +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"} |
+18
-2
@@ -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
@@ -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"} |
+6
-0
@@ -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"} |
+5
-0
@@ -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"} |
+8
-9
| { | ||
| "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/" | ||
| } | ||
| } | ||
| } |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
299525
51.49%59
51.28%4027
49.37%10
150%16
166.67%