@dexterai/x402 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -257,15 +257,15 @@ function createX402Server(config) {
257
257
  if (!cachedExtra) {
258
258
  cachedExtra = await facilitator.getNetworkExtra(network);
259
259
  }
260
- if (!cachedExtra?.feePayer) {
260
+ const isSvm = network.startsWith("solana:");
261
+ if (isSvm && !cachedExtra?.feePayer) {
261
262
  throw new Error(`Facilitator does not provide feePayer for network "${network}"`);
262
263
  }
263
264
  return {
264
- feePayer: cachedExtra.feePayer,
265
- decimals: cachedExtra.decimals ?? asset.decimals,
266
- // Include any additional EIP-712 data for EVM chains
267
- name: cachedExtra.name,
268
- version: cachedExtra.version
265
+ ...cachedExtra?.feePayer ? { feePayer: cachedExtra.feePayer } : {},
266
+ decimals: cachedExtra?.decimals ?? asset.decimals,
267
+ name: cachedExtra?.name,
268
+ version: cachedExtra?.version
269
269
  };
270
270
  }
271
271
  async function buildPaymentAccept(resolvedPayTo, options) {
@@ -403,6 +403,14 @@ function x402Middleware(config) {
403
403
  const servers = /* @__PURE__ */ new Map();
404
404
  for (const net of configuredNetworks) {
405
405
  const netPayTo = resolvePayToForNetwork(payTo, net);
406
+ if (typeof netPayTo === "function" && netPayTo._stripeNetwork) {
407
+ const stripeNet = netPayTo._stripeNetwork;
408
+ if (net !== stripeNet) {
409
+ throw new Error(
410
+ `stripePayTo is configured for "${stripeNet}" but middleware includes network "${net}". Stripe only supports Base deposit addresses. Use a static payTo for other chains.`
411
+ );
412
+ }
413
+ }
406
414
  servers.set(net, createX402Server({
407
415
  payTo: netPayTo,
408
416
  network: net,
@@ -529,6 +537,9 @@ function x402Middleware(config) {
529
537
  }
530
538
 
531
539
  // src/server/browser-support.ts
540
+ function esc(s) {
541
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
542
+ }
532
543
  var USDC_ICON_SVG = `<svg width="18" height="18" viewBox="0 0 2000 2000" xmlns="http://www.w3.org/2000/svg"><path d="M1000 2000c554.17 0 1000-445.83 1000-1000S1554.17 0 1000 0 0 445.83 0 1000s445.83 1000 1000 1000z" fill="#2775ca"/><path d="M1275 1158.33c0-145.83-87.5-195.83-262.5-216.66-125-16.67-150-50-150-108.34s41.67-95.83 125-95.83c75 0 116.67 25 137.5 87.5 4.17 12.5 16.67 20.83 29.17 20.83h66.66c16.67 0 29.17-12.5 29.17-29.16v-4.17c-16.67-91.67-91.67-162.5-187.5-170.83v-100c0-16.67-12.5-29.17-33.33-33.34h-62.5c-16.67 0-29.17 12.5-33.34 33.34v95.83c-125 16.67-204.16 100-204.16 204.17 0 137.5 83.33 191.66 258.33 212.5 116.67 20.83 154.17 45.83 154.17 112.5s-58.34 112.5-137.5 112.5c-108.34 0-145.84-45.84-158.34-108.34-4.16-16.66-16.66-25-29.16-25h-70.84c-16.66 0-29.16 12.5-29.16 29.17v4.17c16.66 104.16 83.33 179.16 220.83 200v100c0 16.66 12.5 29.16 33.33 33.33h62.5c16.67 0 29.17-12.5 33.34-33.33v-100c125-20.84 208.33-108.34 208.33-220.84z" fill="#fff"/><path d="M787.5 1595.83c-325-116.66-491.67-479.16-370.83-800 62.5-175 200-308.33 370.83-370.83 16.67-8.33 25-20.83 25-41.67V325c0-16.67-8.33-29.17-25-33.33-4.17 0-12.5 0-16.67 4.16-395.83 125-612.5 545.84-487.5 941.67 75 233.33 254.17 412.5 487.5 487.5 16.67 8.33 33.34 0 37.5-16.67 4.17-4.16 4.17-8.33 4.17-16.66v-58.34c0-12.5-12.5-29.16-25-37.5zM1229.17 295.83c-16.67-8.33-33.34 0-37.5 16.67-4.17 4.17-4.17 8.33-4.17 16.67v58.33c0 16.67 12.5 33.33 25 41.67 325 116.66 491.67 479.16 370.83 800-62.5 175-200 308.33-370.83 370.83-16.67 8.33-25 20.83-25 41.67V1700c0 16.67 8.33 29.17 25 33.33 4.17 0 12.5 0 16.67-4.16 395.83-125 612.5-545.84 487.5-941.67-75-237.5-258.34-416.67-487.5-491.67z" fill="#fff"/></svg>`;
533
544
  var DEXTER_CREST_SVG = `<svg width="36" height="36" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"><g><path fill="#F2681A" d="m324.93,313.11c-115.5,0-231,0-350,0l350,0z"/><path fill="#FDFAF5" d="m230.43,50.62c1.1.85 2.19 1.7 3.32 2.57 6.02 4.8 11.77 9.88 17.46 15.07.92.84.92.84 1.86 1.69 1.82 1.69 3.59 3.42 5.35 5.16.61.56 1.22 1.13 1.84 1.71 5.66 5.76 6.18 10.43 6.13 18.3.02 1.16.04 2.32.06 3.52.06 3.83.06 7.65.07 11.48.02 2.68.05 5.35.08 8.03.05 5.6.09 11.21.1 16.81.02 7.15.09 14.31.17 21.46.06 5.53.1 11.05.13 16.58.02 2.64.04 5.27.07 7.91.18 17.58.12 32.82-11.24 47.32-7.35 7.27-16.54 12.06-25.42 17.22-1.97 1.16-3.94 2.33-5.91 3.49-7.16 4.24-14.34 8.44-21.53 12.62-4.8 2.79-9.59 5.6-14.38 8.42-1.25.73-2.5 1.47-3.79 2.23-2.32 1.36-4.64 2.73-6.96 4.1-27.47 16.09-27.47 16.09-42.16 12.93-8.06-2.28-14.94-5.82-22.16-10.02-1.17-.67-2.34-1.34-3.54-2.04-24.55-14.25-43.58-27.03-51.9-55.58-1.07-4.58-1.54-8.92-1.52-13.61.28-9.5.28-9.5-3.3-17.97-1.81-1.49-3.68-2.92-5.59-4.28-9.19-7.06-12.7-20.03-14.18-31.06-.54-5.77-.55-11.56-.6-17.35-.03-1.32-.07-2.63-.1-3.99-.01-1.26-.02-2.53-.03-3.83-.02-1.15-.03-2.29-.05-3.47.72-4.02 1.94-5.36 5.21-7.74 2.89-.53 2.89-.53 6.07-.46 1.71.02 1.71.02 3.46.05 1.19.04 2.37.08 3.59.12 1.2.02 2.41.04 3.65.06 2.97.05 5.93.13 8.9.23.14-1.35.29-2.7.43-4.08.63-5 1.78-9.74 3.14-14.58.22-.79.43-1.59.66-2.4.53-1.92 1.06-3.84 1.6-5.76-1.55-.45-1.55-.45-3.13-.9-9.52-3.52-17.1-10.95-21.37-20.1-3.81-9.26-3.87-20.34-.29-29.68 6.49-13.99 16.36-23.23 30.66-29.01 49.81-17.69 115.79 8.35 155.13 38.85z"/><path fill="#F2671A" d="m142.93,22.62c.86.19 1.73.39 2.62.59 36.12 8.21 68.79 24.98 95.38 50.75 1.02.98 2.03 1.97 3.08 2.98 10.84 10.66 10.84 10.66 11.05 14.62-2.06 3.55-5.44 4.18-9.17 5.3-.79.25-1.59.49-2.41.75-28.13 8.43-60.95 6.37-87.13-7.16-.86-.49-1.71-.97-2.6-1.48-7.37-4.05-12.59-3.36-20.59-1.54-22.76 4-48.47 1.53-68.69-9.74-4.88-3.88-8.23-8.29-10.21-14.22-.93-10.38-.67-18.44 5.83-26.83 19.57-23.38 55.99-20.36 82.83-14z"/><path fill="#F16619" d="m44.93,129.12c27.36-.03 54.72-.05 82.08-.06 12.7-.01 25.41-.01 38.11-.03 11.07-.01 22.14-.02 33.2-.02 5.86 0 11.73-.01 17.59-.01 5.51-.01 11.03-.01 16.54-.01 2.03 0 4.06 0 6.09-.01 2.76-.01 5.52 0 8.28 0 .81 0 1.63-.01 2.47-.01 5.51.02 5.51.02 6.81 1.32.22 3.43.22 3.43 0 7-2.75 2.75-3.42 2.66-7.15 2.82-1.41.07-1.41.07-2.85.14-1.47.05-1.47.05-2.98.11-1.49.07-1.49.07-3 .14-2.45.11-4.9.21-7.35.3-.2 1.3-.4 2.59-.6 3.93-2.57 16.08-5.93 29.89-18.89 40.86-10.35 7.28-21.87 8.49-34.17 7.71-13.11-2.33-22.52-9.19-30.33-19.83-4.49-7.64-4.8-17.05-5.83-25.67-4.24.39-8.47.77-12.83 1.17-.28 1.84-.28 1.84-.56 3.71-2.32 14.39-5.63 23.35-16.95 33.11-2.32 1.67-2.32 1.67-4.65 1.67 4 4.67 9.06 6.59 14.87 8.24 3.79 1.09 3.79 1.09 6.12 3.43-.65 5.31-.65 5.31-2.33 7-8.42-.27-15.13-2.29-22.17-7-1.09-1.21-2.17-2.43-3.25-3.65-2.72-2.81-4.45-3.84-8.36-4.16-1.67-.02-3.34-.02-5.01.01-1.77-.04-3.54-.09-5.3-.15-1.27-.04-1.27-.04-2.56-.08-9.26-.54-17.6-4.56-24.51-10.64-9.58-11.11-11.03-22.56-10.72-36.82.02-1.4.03-2.8.05-4.24.04-3.42.1-6.85.17-10.27z"/><path fill="#F26117" d="m172.68,203.08c7.27.09 13.23 1.97 18.87 6.65 2.88 3.07 3.86 5.12 4.25 9.32-.12 1.01-.24 2.02-.36 3.06-2.55.95-2.55.95-5.83 1.17-3.28-2.84-3.28-2.84-5.83-5.83-.36.58-.71 1.16-1.08 1.75-7.6 11.29-20.06 17.74-33.05 21.09-20.36 3.1-36.81-1.66-53.37-13.73-2.33-2.11-2.33-2.11-4.67-5.61.42-3.45.99-4.49 3.5-7 4.07.37 5.95 2.13 8.75 4.96 9.81 8.93 22.53 11.87 35.51 11.69 11.74-1.05 22.38-5.85 31.57-13.15 2.06-2.45 2.06-2.45 3.5-4.67-1.66.07-1.66.07-3.35.15-3.65-.15-3.65-.15-5.98-2.48.75-6.18 1.46-7.19 7.58-7.36z"/></g></svg>`;
534
545
  var DEXTER_STYLES = `
@@ -788,22 +799,22 @@ function generatePaywallHtml(paymentRequiredHeader, requestUrl, method, config,
788
799
  } catch {
789
800
  }
790
801
  const chainName = network.includes("solana") ? "Solana" : network.includes("eip155") ? "Base" : "";
791
- const endpointSection = config.showEndpoint ? `<div class="endpoint"><code>${method} ${requestUrl}</code></div>` : "";
802
+ const endpointSection = config.showEndpoint ? `<div class="endpoint"><code>${esc(method)} ${esc(requestUrl)}</code></div>` : "";
792
803
  return `<!DOCTYPE html>
793
804
  <html lang="en">
794
805
  <head>
795
806
  <meta charset="utf-8">
796
807
  <meta name="viewport" content="width=device-width,initial-scale=1">
797
- <title>${config.title} \u2014 ${price} USDC</title>
808
+ <title>${esc(config.title)} \u2014 ${esc(price)} USDC</title>
798
809
  <style>${DEXTER_STYLES}${PAY_BUTTON_STYLES}</style>
799
810
  </head>
800
811
  <body>
801
812
  <div class="card">
802
813
  <div class="crest">${DEXTER_CREST_SVG}</div>
803
- <h1>${config.title}</h1>
804
- <p class="desc">${description}</p>
805
- <div class="price">${USDC_ICON_SVG}<span id="price-value">${price}</span></div>
806
- <div class="chain">${chainName}${chainName ? " network" : ""}</div>
814
+ <h1>${esc(config.title)}</h1>
815
+ <p class="desc">${esc(description)}</p>
816
+ <div class="price">${USDC_ICON_SVG}<span id="price-value">${esc(price)}</span></div>
817
+ <div class="chain">${esc(chainName)}${chainName ? " network" : ""}</div>
807
818
  ${endpointSection}
808
819
 
809
820
  <div id="pay-section" class="pay-section" style="display:none">
@@ -937,11 +948,15 @@ function x402AccessPass(config) {
937
948
  facilitatorUrl,
938
949
  tiers: tierPrices,
939
950
  ratePerHour,
940
- secret = crypto.randomBytes(32),
951
+ secret: explicitSecret,
941
952
  issuer = "x402-access-pass",
942
953
  verbose = false,
943
954
  description
944
955
  } = config;
956
+ const secret = explicitSecret ?? crypto.randomBytes(32);
957
+ if (!explicitSecret) {
958
+ console.warn("[x402:access-pass] No secret provided \u2014 access passes will be invalidated on server restart. Set `secret` for production use.");
959
+ }
945
960
  if (!tierPrices && !ratePerHour) {
946
961
  throw new Error("x402AccessPass: at least one of `tiers` or `ratePerHour` is required");
947
962
  }
@@ -1975,6 +1990,7 @@ function stripePayTo(secretKeyOrConfig) {
1975
1990
  network: caip2Network,
1976
1991
  facilitatorUrl: "https://x402.dexter.cash"
1977
1992
  };
1993
+ provider._stripeNetwork = caip2Network;
1978
1994
  return provider;
1979
1995
  }
1980
1996
  export {