@dexterai/x402 3.18.1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,286 +1 @@
1
- "use strict";var At=Object.create;var te=Object.defineProperty;var Et=Object.getOwnPropertyDescriptor;var vt=Object.getOwnPropertyNames;var kt=Object.getPrototypeOf,Mt=Object.prototype.hasOwnProperty;var Ct=(e,t)=>{for(var n in t)te(e,n,{get:t[n],enumerable:!0})},Ce=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of vt(t))!Mt.call(e,o)&&o!==n&&te(e,o,{get:()=>t[o],enumerable:!(r=Et(t,o))||r.enumerable});return e};var Re=(e,t,n)=>(n=e!=null?At(kt(e)):{},Ce(t||!e||!e.__esModule?te(n,"default",{value:e,enumerable:!0}):n,e)),_t=e=>Ce(te({},"__esModule",{value:!0}),e);var ir={};Ct(ir,{BASE_MAINNET_NETWORK:()=>W,DEXTER_FACILITATOR_URL:()=>B,FacilitatorClient:()=>G,MODEL_PRICING:()=>U,MODEL_PRICING_MAP:()=>be,MODEL_REGISTRY:()=>I,SOLANA_MAINNET_NETWORK:()=>L,SPONSORED_ACCESS_EXTENSION_KEY:()=>wt.SPONSORED_ACCESS_EXTENSION_KEY,USDC_BASE:()=>le,USDC_MINT:()=>V,bazaarExtension:()=>et,countTokens:()=>Te,createDynamicPricing:()=>st,createTokenPricing:()=>Pt,createX402Server:()=>X,declareDiscoveryExtension:()=>tt,escapeHtml:()=>D,estimateCost:()=>gt,findModel:()=>ct,formatModelPricing:()=>ht,formatPricing:()=>it,formatTokenPricing:()=>Rt,getActiveModels:()=>mt,getAvailableModelIds:()=>ut,getAvailableModels:()=>Tt,getCheapestModel:()=>yt,getModel:()=>xe,getModelsByFamily:()=>dt,getModelsByTier:()=>lt,getTextModels:()=>ft,isValidModel:()=>St,isValidModelId:()=>pt,resolveDefaultAsset:()=>we,stripePayTo:()=>Le,x402AccessPass:()=>ot,x402BrowserSupport:()=>rt,x402Middleware:()=>Qe});module.exports=_t(ir);var L="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",_e="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",Oe="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z";var W="eip155:8453",re="eip155:84532",ne="eip155:42161",oe="eip155:137",se="eip155:10",ie="eip155:43114",ae="eip155:56",ce="eip155:1187947933",pe="eip155:324705682",ue="eip155:1";var V="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";var le="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",Ot="0x55d398326f99059fF775485246999027B3197955",Ne="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",De={[ae]:Ne,[W]:le,[re]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[ne]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[oe]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[se]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[ie]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[ce]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[pe]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[ue]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},Ie={[Ot]:{symbol:"USDT",decimals:18},[Ne]:{symbol:"USDC",decimals:18}},de=6;var cr={[ae]:56,[W]:8453,[re]:84532,[ne]:42161,[oe]:137,[se]:10,[ie]:43114,[ce]:1187947933,[pe]:324705682,[ue]:1},pr={[L]:"https://api.dexter.cash/api/solana/rpc",[_e]:"https://api.devnet.solana.com",[Oe]:"https://api.testnet.solana.com"},ur={[ae]:"https://api.dexter.cash/api/evm/bsc/rpc",[W]:"https://api.dexter.cash/api/base/rpc",[re]:"https://sepolia.base.org",[ne]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[oe]:"https://api.dexter.cash/api/evm/polygon/rpc",[se]:"https://api.dexter.cash/api/evm/optimism/rpc",[ie]:"https://api.dexter.cash/api/evm/avalanche/rpc",[ce]:"https://skale-base.skalenodes.com/v1/base",[pe]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[ue]:"https://eth.llamarpc.com"},B="https://x402.dexter.cash",me=L;function J(e,t){if(!Number.isFinite(e))throw new Error(`toAtomicUnits: amount must be finite, got ${e}`);if(e<0)throw new Error(`toAtomicUnits: amount must be non-negative, got ${e}`);if(!Number.isInteger(t)||t<0)throw new Error(`toAtomicUnits: decimals must be a non-negative integer, got ${t}`);let n=Nt(Math.abs(e)),[r,o=""]=n.split("."),s=o.slice(0,t).padEnd(t,"0");return BigInt(r+s).toString()}function Nt(e){let t=e.toString();if(!/[eE]/.test(t))return t;let[n,r]=t.split(/[eE]/),o=parseInt(r,10),s=n.startsWith("-"),p=s?n.slice(1):n,[y,g=""]=p.split("."),m=y+g,b=y.length+o,c;return b<=0?c="0."+"0".repeat(-b)+m:b>=m.length?c=m+"0".repeat(b-m.length):c=m.slice(0,b)+"."+m.slice(b),(s?"-":"")+c}function fe(e){return e.startsWith("solana:")||e==="solana"}function Dt(e){if(typeof Buffer<"u")return Buffer.from(e,"utf-8").toString("base64");let t=new TextEncoder().encode(e),n="";for(let r=0;r<t.length;r++)n+=String.fromCharCode(t[r]);return btoa(n)}function It(e){if(typeof Buffer<"u")return Buffer.from(e,"base64").toString("utf-8");let t=atob(e),n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return new TextDecoder().decode(n)}function K(e){return Dt(JSON.stringify(e))}function Q(e){return JSON.parse(It(e))}function Ut(e){if(e instanceof TypeError)return!0;if(e&&typeof e=="object"&&"status"in e){let t=e.status;return t>=500&&t<600}return!1}var Y=class extends Error{status;body;constructor(t,n){super(`HTTP ${t}`),this.status=t,this.body=n}},G=class{facilitatorUrl;cachedSupported=null;cacheTime=0;CACHE_TTL_MS=6e4;timeoutMs;maxRetries;retryBaseMs;constructor(t=B,n){this.facilitatorUrl=t.replace(/\/$/,""),this.timeoutMs=n?.timeoutMs??1e4,this.maxRetries=n?.maxRetries??3,this.retryBaseMs=n?.retryBaseMs??500}async fetchWithTimeout(t,n){let r=new AbortController,o=setTimeout(()=>r.abort(),this.timeoutMs);try{return await fetch(t,{...n,signal:r.signal})}finally{clearTimeout(o)}}async fetchWithRetry(t,n){let r;for(let o=0;o<this.maxRetries;o++)try{let s=await this.fetchWithTimeout(t,n);if(!s.ok&&s.status>=500)throw new Y(s.status,await s.text());return s}catch(s){if(r=s,o<this.maxRetries-1&&Ut(s)){let p=this.retryBaseMs*Math.pow(2,o);await new Promise(y=>setTimeout(y,p));continue}throw s}throw r}async getSupported(){let t=Date.now();if(this.cachedSupported&&t-this.cacheTime<this.CACHE_TTL_MS)return this.cachedSupported;let n=await this.fetchWithTimeout(`${this.facilitatorUrl}/supported`);if(!n.ok)throw new Error(`Facilitator /supported returned ${n.status}`);return this.cachedSupported=await n.json(),this.cacheTime=t,this.cachedSupported}async getFeePayer(t){let r=(await this.getSupported()).kinds.find(o=>o.x402Version===2&&(o.scheme==="exact"||o.scheme==="exact-approval")&&o.network===t);if(!r)throw new Error(`Facilitator does not support network "${t}" with a recognized scheme`);return r.extra?.feePayer}async getNetworkExtra(t){return(await this.getSupported()).kinds.find(o=>o.x402Version===2&&(o.scheme==="exact"||o.scheme==="exact-approval"||o.scheme==="batch-settlement")&&o.network===t)?.extra}async verifyPayment(t,n){try{let r=Q(t),o=await this.fetchWithRetry(`${this.facilitatorUrl}/verify`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({x402Version:2,paymentPayload:r,paymentRequirements:n})});return o.ok?await o.json():{isValid:!1,invalidReason:`facilitator_error_${o.status}`}}catch(r){return{isValid:!1,invalidReason:r instanceof Y?`facilitator_error_${r.status}`:r instanceof Error&&r.name==="AbortError"?"facilitator_timeout":r instanceof Error?r.message:"unexpected_verify_error"}}}async settlePayment(t,n){try{let r=Q(t),o=await this.fetchWithRetry(`${this.facilitatorUrl}/settle`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({x402Version:2,paymentPayload:r,paymentRequirements:n})});return o.ok?{...await o.json(),network:n.network}:{success:!1,network:n.network,errorReason:`facilitator_error_${o.status}`}}catch(r){let o=r instanceof Y?`facilitator_error_${r.status}`:r instanceof Error&&r.name==="AbortError"?"facilitator_timeout":r instanceof Error?r.message:"unexpected_settle_error";return{success:!1,network:n.network,errorReason:o}}}};function we(e){if(fe(e))return{address:V,decimals:6};let t=De[e];if(t){let n=Ie[t]?.decimals??6;return{address:t,decimals:n}}return{address:V,decimals:6}}function Ue(e){try{let t=Q(e);return t?.accepted?.amount??t?.accepted?.maxAmountRequired}catch{return}}function X(e){let{payTo:t,facilitatorUrl:n=B,network:r=L,defaultTimeoutSeconds:o=60}=e,s=e.asset??we(r),p=e.scheme??"exact";if(p==="tab"&&!fe(r))throw new Error(`scheme 'tab' is SVM-only; got network "${r}"`);let y=new G(n),g=null,m=new Map,b=3e4,c=Date.now();function a(u){let d=(u.maxTimeoutSeconds||o)*1e3;if(m.set(u.payTo,{accept:u,expiresAt:Date.now()+d}),Date.now()-c>b){let T=Date.now();for(let[E,_]of m)_.expiresAt<T&&m.delete(E);c=T}}function h(u){let d=m.get(u);if(d){if(d.expiresAt<Date.now()){m.delete(u);return}return d.accept}}async function l(u){return typeof t=="string"?t:t(u||{})}async function x(){if(g||(g=await y.getNetworkExtra(r)),fe(r)&&!g?.feePayer)throw new Error(`Facilitator does not provide feePayer for network "${r}"`);return{...g?.feePayer?{feePayer:g.feePayer}:{},decimals:g?.decimals??s.decimals,name:g?.name,version:g?.version,...p==="batch-settlement"&&g?.receiverAuthorizer?{receiverAuthorizer:g.receiverAuthorizer}:{},...p==="tab"?{voucherHeader:"x-tab-voucher",registrationEncoding:"base64(188-byte sessionRegisterMessage)"}:{}}}async function P(u,d){let{amountAtomic:T,timeoutSeconds:E=o}=d,_=await x(),O={scheme:p,network:r,amount:T,maxAmountRequired:T,asset:s.address,payTo:u,maxTimeoutSeconds:E,extra:_};return a(O),O}async function v(u){let d=await l({amountAtomic:u.amountAtomic,resourceUrl:u.resourceUrl});return P(d,u)}async function A(u){let{resourceUrl:d,description:T,mimeType:E="application/json"}=u,_={url:d,description:T,mimeType:E},O=await v(u);return{x402Version:2,resource:_,accepts:[O],error:"Payment required"}}function S(u){return K(u)}function i(u){return{status:402,headers:{"PAYMENT-REQUIRED":S(u)},body:{}}}async function f(u,d){if(!d){let T=await l({paymentHeader:u});d=h(T),d||(d=await P(T,{amountAtomic:Ue(u)??"0",resourceUrl:""}))}return y.verifyPayment(u,d)}async function w(u,d){if(!d){let T=await l({paymentHeader:u});d=h(T),d||(d=await P(T,{amountAtomic:Ue(u)??"0",resourceUrl:""}))}return y.settlePayment(u,d)}return{buildRequirements:A,encodeRequirements:S,create402Response:i,verifyPayment:f,settlePayment:w,getPaymentAccept:v,network:r,assetDecimals:s.decimals,facilitator:y}}var Be=new WeakMap;function $e(e){return Be.get(e)}var Bt={base:"base","base-sepolia":"base_sepolia"},$t={base:"eip155:8453","base-sepolia":"eip155:84532"};function Le(e){let t=typeof e=="string"?{secretKey:e}:e,n=t.network??"base",r=Bt[n]??"base",o=$t[n]??"eip155:8453",s=t.apiVersion??"2026-01-28.clover",p=null;async function y(){if(p)return p;try{let{default:m}=await import("stripe");return p=new m(t.secretKey,{apiVersion:s,appInfo:{name:"@dexterai/x402",url:"https://dexter.cash/sdk"}}),p}catch{throw new Error('The "stripe" package is required for stripePayTo(). Install it with: npm install stripe')}}let g=async m=>{if(m.paymentHeader){try{let v=JSON.parse(Buffer.from(m.paymentHeader,"base64").toString()),A=v.payload?.authorization?.to;if(A&&typeof A=="string")return A;let S=v.accepted?.payTo;if(S&&typeof S=="string")return S}catch{}throw new Error("Could not extract deposit address from payment header. Ensure the client is sending a valid x402 PAYMENT-SIGNATURE.")}let b=await y(),c=m.amountAtomic?parseInt(m.amountAtomic,10):1e4,a=Math.max(1,Math.round(c/Math.pow(10,de-2))),l=(await b.paymentIntents.create({amount:a,currency:"usd",payment_method_types:["crypto"],payment_method_data:{type:"crypto"},payment_method_options:{crypto:{mode:"custom"}},confirm:!0})).next_action;if(!l?.crypto_collect_deposit_details)throw new Error("Stripe PaymentIntent did not return crypto deposit details. Ensure your Stripe account has crypto payins enabled: https://support.stripe.com/questions/get-started-with-pay-with-crypto");let x=l.crypto_collect_deposit_details,P=x.deposit_addresses?.[r]?.address;if(!P)throw new Error(`No deposit address found for network "${r}". Available networks: ${Object.keys(x.deposit_addresses||{}).join(", ")}`);return P};return g._x402Defaults={network:o,facilitatorUrl:B},Be.set(g,o),g}var Ve=require("os"),Ge=require("path"),Xe=require("@x402/evm/batch-settlement/server");var ye=require("@x402/core/server"),qe=require("@x402/core/http"),Fe=require("@x402/evm/batch-settlement/server");function He(e){let t=e.verbose?console.log.bind(console,"[batch-settlement:seller]"):()=>{},n=new ye.HTTPFacilitatorClient({url:e.facilitatorUrl}),r=new Fe.BatchSettlementEvmScheme(e.payTo,{storage:e.channelStore}),o=new ye.x402ResourceServer(n).register(e.network,r),s=new qe.x402HTTPResourceServer(o,{[e.route]:{accepts:{scheme:"batch-settlement",payTo:e.payTo,price:e.price,network:e.network},description:"batch-settlement protected route",mimeType:"application/json"}}),p=null;function y(){if(p)return p;let c=s.initialize();return c.catch(a=>{p===c&&(p=null),e.verbose?t("resource server initialize() failed:",a):console.error("[batch-settlement:seller] resource server initialize() failed:",a)}),p=c,c}let g=y();function m(c,a){if(c.headersSent)return;for(let[l,x]of Object.entries(a.headers))c.setHeader(l,x);c.status(a.status);let{body:h}=a;h==null?c.end():typeof h=="string"?c.send(h):c.json(h)}return{scheme:r,facilitator:n,handler:async(c,a,h)=>{try{await y();let l=c.get("host")??"",x=`${c.baseUrl??""}${c.path}`||"/",P={getHeader:w=>c.headers[w.toLowerCase()],getMethod:()=>c.method,getPath:()=>x,getUrl:()=>`${c.protocol}://${l}${c.originalUrl}`,getAcceptHeader:()=>c.headers.accept??"",getUserAgent:()=>c.headers["user-agent"]??"",getBody:()=>c.body??{},getQueryParams:()=>c.query,getQueryParam:w=>{let u=c.query[w];if(typeof u=="string"||Array.isArray(u))return u}},v=c.headers["payment-signature"]??c.headers["x-payment"],A={adapter:P,path:x,method:c.method,paymentHeader:v},S=await s.processHTTPRequest(A);if(t("processHTTPRequest ->",S.type),S.type==="no-payment-required"){h();return}if(S.type==="payment-error"){m(a,S.response);return}let i={request:A,responseBody:Buffer.alloc(0)},f=await s.processSettlement(S.paymentPayload,S.paymentRequirements,S.declaredExtensions,i);if(t("processSettlement ->",f.success?"success":`failure:${f.errorReason}`),!f.success){m(a,f.response);return}for(let[w,u]of Object.entries(f.headers))a.headersSent||a.setHeader(w,u);h()}catch(l){t("handler error:",l),a.headersSent||a.status(500).json({error:"Payment processing error"})}},ready:g}}var Ae=require("viem"),We=6;async function Ee(e){let{manager:t,store:n,channelId:r}=e,o=await n.get(r),s=BigInt(o?.chargedCumulativeAmount??"0"),p=BigInt(o?.balance??"0"),y=p>s?p-s:0n,{claims:g,settle:m}=await t.claimAndSettle(),b=await t.refund([r]),c=b.find(a=>a.channel===r)??b[0];return{claimTx:g[0]?.transaction??"",settleTx:m?.transaction??"",refundTx:c?.transaction??"",settledAmount:(0,Ae.formatUnits)(s,We),refundedAmount:(0,Ae.formatUnits)(y,We)}}async function Ke(e){let t=await e.store.list(),n=[];for(let r of t)try{let o=await Ee({manager:e.manager,store:e.store,channelId:r.channelId});n.push({channelId:r.channelId,...o})}catch(o){n.push({channelId:r.channelId,error:o instanceof Error?o.message:String(o)})}return n}function je(e){let t=!1,n=async()=>{try{await e.claimAndSettle()}catch(o){e.onError?.(o)}},r=setInterval(()=>{t||n()},e.claimIntervalMs);return typeof r.unref=="function"&&r.unref(),{async stop(){t||(t=!0,clearInterval(r),await n())}}}var Lt="https://x402.dexter.cash",qt="GET /",ze=new Set(["eip155:8453","eip155:42161","eip155:137"]);function Ft(e){return e===!1?null:e===void 0||e===!0?3e5:(e.claimIntervalSecs??300)*1e3}function ve(e){if(!ze.has(e.network))throw new Error(`batch-settlement is not supported on network "${e.network}" \u2014 supported: ${[...ze].join(", ")}`);let t=e.facilitatorUrl??Lt,n=e.channelStore??new Xe.FileChannelStorage({directory:(0,Ge.join)((0,Ve.homedir)(),".dexter-x402","seller-channels")}),r=He({payTo:e.payTo,network:e.network,price:e.price,route:e.route??qt,facilitatorUrl:t,channelStore:n,verbose:e.verbose}),o=r.scheme.createChannelManager(r.facilitator,e.network),s=async()=>{await o.claimAndSettle()},p=Ft(e.autoSettle),y=null;p!==null&&(y=je({claimAndSettle:s,claimIntervalMs:p,onError:c=>console.error("[batch-settlement:seller] auto-loop claim pass failed",c)}));let g=n,m=(c,a,h)=>{r.handler(c,a,h)},b=m;return b.middleware=()=>m,b.closeChannel=c=>Ee({manager:o,store:g,channelId:c}),b.closeAll=()=>Ke({manager:o,store:g}),b.stop=async()=>{y&&await y.stop()},b}async function Je(e,t,n){let r={};for(let o of e)if(o.enrichPaymentRequiredResponse&&o.key in t)try{let s=await o.enrichPaymentRequiredResponse(t[o.key],n);s!==void 0&&(r[o.key]=s)}catch(s){console.warn(`[x402:extensions] extension "${o.key}" failed:`,s)}return Object.keys(r).length>0?r:void 0}function Ht(e,t){if(typeof e=="string"||typeof e=="function")return e;if(t in e)return e[t];let r=`${t.split(":")[0]}:*`;if(r in e)return e[r];if("*"in e)return e["*"];throw new Error(`No payTo configured for network "${t}"`)}function Qe(e){if(e.scheme==="batch-settlement"){let i=Array.isArray(e.network)?e.network[0]:e.network;if(!i)throw new Error('x402Middleware: scheme "batch-settlement" requires a network');let f=typeof e.payTo=="string"?e.payTo:void 0;if(!f)throw new Error('x402Middleware: scheme "batch-settlement" requires a string payTo address');return ve({payTo:f,network:i,price:e.amount,facilitatorUrl:e.facilitatorUrl,route:e.batchSettlement?.route,channelStore:e.batchSettlement?.channelStore,autoSettle:e.batchSettlement?.autoSettle,verbose:e.verbose})}let{payTo:t,amount:n,asset:r,description:o,resourceUrl:s,mimeType:p,timeoutSeconds:y,verbose:g=!1,getResourceUrl:m,getAmount:b,getDescription:c,extensions:a,declarations:h}=e,l=g?console.log.bind(console,"[x402:middleware]"):()=>{},x=typeof t=="function"?t._x402Defaults:void 0,P=e.facilitatorUrl??x?.facilitatorUrl,v=e.network?Array.isArray(e.network)?e.network:[e.network]:x?.network?[x.network]:[me],A=new Map;for(let i of v){let f=Ht(t,i);if(typeof f=="function"){let w=$e(f);if(w&&i!==w)throw new Error(`stripePayTo is configured for "${w}" but middleware includes network "${i}". Stripe only supports Base deposit addresses. Use a static payTo for other chains.`)}A.set(i,X({payTo:f,network:i,asset:r,facilitatorUrl:P,defaultTimeoutSeconds:y,scheme:e.scheme}))}let S=A.get(v[0]);return async(i,f,w)=>{try{let u=i.headers["payment-signature"];if(!u){l("No payment signature, returning 402");let F=m?.(i)??s??`${i.protocol}://${i.get("host")}${i.originalUrl}`,R=b?.(i)??n,C=c?.(i)??o,N=parseFloat(R),M=[],k=null;for(let[,H]of A)try{let Se={amountAtomic:J(N,H.assetDecimals),resourceUrl:F,description:C,mimeType:p,timeoutSeconds:y},Me=await H.buildRequirements(Se);M.push(...Me.accepts),k||(k=Me)}catch(Se){l("Failed to build requirements for a network:",Se)}if(!k||M.length===0){f.status(500).json({error:"Failed to build payment requirements"});return}if(k={...k,accepts:M},a&&a.length>0){let H=await Je(a,h??{},{response:k,request:{method:i.method,path:(i.baseUrl??"")+(i.route?.path??i.path),params:i.params}});H&&(k={...k,extensions:H})}let ee=S.encodeRequirements(k);f.setHeader("PAYMENT-REQUIRED",ee),f.status(402).json({error:"Payment required",accepts:k.accepts,resource:k.resource,...k.extensions?{extensions:k.extensions}:{}});return}l("Payment signature received, verifying...");let d=S;try{let R=JSON.parse(Buffer.from(u,"base64").toString())?.accepted?.network;R&&A.has(R)&&(d=A.get(R))}catch{}let T=await d.verifyPayment(u);if(!T.isValid){if(l("Payment verification failed:",T.invalidReason),e.onVerifyFailed)try{await e.onVerifyFailed({reason:T.invalidReason,resourceUrl:`${i.protocol}://${i.get("host")}${i.originalUrl}`})}catch{}f.status(402).json({error:"Payment verification failed",reason:T.invalidReason});return}l("Payment verified, settling...");let E=await d.settlePayment(u);if(!E.success){l("Payment settlement failed:",E.errorReason),f.status(402).json({error:"Payment settlement failed",reason:E.errorReason});return}l("Payment settled:",E.transaction);let _=E.network||v[0];if(e.onSettlement)try{await e.onSettlement({transaction:E.transaction,network:_,payer:T.payer??"",resourceUrl:`${i.protocol}://${i.get("host")}${i.originalUrl}`})}catch{}i.x402={transaction:E.transaction,payer:T.payer??"",network:_};let O={success:!0,transaction:E.transaction,network:_,payer:T.payer??""};if(E.extensions&&(O.extensions=E.extensions),f.setHeader("PAYMENT-RESPONSE",K(O)),e.sponsoredAccess&&E.extensions?.["sponsored-access"]){let F=E.extensions["sponsored-access"],R=F?.info?.recommendations??F?.recommendations;if(R&&R.length>0){if(l("Injecting sponsored-access recommendations into response"),typeof e.sponsoredAccess=="object"&&e.sponsoredAccess.onMatch)try{e.sponsoredAccess.onMatch(R,{transaction:E.transaction,network:_,payer:T.payer??""})}catch{}let C=f.json.bind(f);f.json=function(M){return typeof e.sponsoredAccess=="object"&&e.sponsoredAccess.inject?C(e.sponsoredAccess.inject(M,R)):M&&typeof M=="object"&&!Array.isArray(M)?C({_x402_sponsored:R,...M}):C(M)}}}w()}catch(u){l("Middleware error:",u),f.status(500).json({error:"Payment processing error"})}}}var Wt=/^\/[a-zA-Z0-9_/:.\-~%]+$/;function Ye(e){if(!e||!Wt.test(e))return!1;let t;try{t=decodeURIComponent(e)}catch{return!1}return!(t.includes("..")||t.includes("://"))}function Z(e){return e.method==="POST"||e.method==="PUT"||e.method==="PATCH"}var Kt=["GET","HEAD","DELETE"],jt=["POST","PUT","PATCH"];function Ze(e,t){let n=t.pathParams!==void 0&&Object.keys(t.pathParams).length>0,r={type:"http",method:e.method};Z(e)?(r.bodyType=e.bodyType,r.body=e.input??{}):e.input!==void 0&&(r.queryParams=e.input),n&&(r.pathParams=t.pathParams);let o=e.output?.example!==void 0?{type:"json",example:e.output.example}:void 0,s=Z(e)?jt:Kt,p={type:{type:"string",const:"http"},method:{type:"string",enum:s}};Z(e)?(p.bodyType={type:"string",enum:["json","form-data","text"]},p.body={type:"object",...e.inputSchema??{}}):e.inputSchema&&(p.queryParams={type:"object",...e.inputSchema}),e.pathParamsSchema&&(p.pathParams={type:"object",...e.pathParamsSchema});let y={input:{type:"object",properties:p,required:Z(e)?["type","method","bodyType","body"]:["type","method"],additionalProperties:!1}};o&&(y.output={type:"object",properties:{type:{type:"string"},example:{type:"object",...e.output?.schema??{}}},required:["type"]});let g={$schema:"https://json-schema.org/draft/2020-12/schema",type:"object",properties:y,required:["input"]},m={info:{input:r,...o?{output:o}:{}},schema:g};return Ye(t.routeTemplate)&&(m.routeTemplate=t.routeTemplate),m}var zt=["GET","HEAD","DELETE","POST","PUT","PATCH"];function et(){return{key:"bazaar",enrichPaymentRequiredResponse:(e,t)=>{if(e==null)return;let n=e,r=(n.method??t.request.method).toUpperCase();if(!zt.includes(r))return;let o={...n,method:r};return Ze(o,{pathParams:t.request.params,routeTemplate:t.request.path})}}}function tt(e){return{bazaar:e}}function D(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}var Vt='<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>',Gt='<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>',Xt=`
2
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Orbitron:wght@500;700&display=swap');
3
- *{margin:0;padding:0;box-sizing:border-box}
4
- body{font-family:'Inter',system-ui,-apple-system,sans-serif;background:#0a0a0a;color:#e2e8f0;min-height:100vh;display:flex;align-items:center;justify-content:center;padding:1rem}
5
- .card{max-width:460px;width:100%;background:rgba(20,20,20,.85);border:1px solid rgba(242,107,26,.12);border-radius:8px;padding:2rem 2rem 1.75rem;text-align:center;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}
6
- .crest{margin:0 auto .75rem}
7
- h1{font-family:'Orbitron',sans-serif;font-size:1.15rem;font-weight:700;color:#f1f5f9;letter-spacing:.04em;margin-bottom:.35rem}
8
- .desc{color:#94a3b8;font-size:.9rem;margin-bottom:1.25rem;line-height:1.5}
9
- .price{font-family:'Orbitron',sans-serif;font-size:1.6rem;font-weight:700;color:#F26B1A;margin:.75rem 0 .25rem;display:inline-flex;align-items:center;gap:.35rem}
10
- .price svg{width:1.3em;height:1.3em;flex-shrink:0}
11
- .chain{color:#525252;font-size:.75rem;margin-bottom:1.25rem;letter-spacing:.03em}
12
- .endpoint{background:rgba(242,107,26,.06);border:1px solid rgba(242,107,26,.12);border-radius:6px;padding:.5rem .75rem;margin-bottom:1.25rem}
13
- .endpoint code{font-family:'SF Mono',Monaco,Consolas,monospace;font-size:.8rem;color:#F26B1A}
14
- .info{background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.06);border-radius:6px;padding:.85rem 1rem;font-size:.82rem;color:#737373;line-height:1.6;text-align:left}
15
- .info strong{color:#a3a3a3}
16
- .info code{background:rgba(242,107,26,.08);padding:2px 5px;border-radius:3px;font-size:.78rem;color:#F26B1A;font-family:'SF Mono',Monaco,Consolas,monospace}
17
- .info a{color:#F26B1A;text-decoration:none;font-weight:600}
18
- .info a:hover{text-decoration:underline}
19
- .footer{margin-top:1.25rem;display:flex;align-items:center;justify-content:center;gap:.75rem;font-size:.7rem;color:#404040}
20
- .footer a{color:#525252;text-decoration:none}
21
- .footer a:hover{color:#737373}
22
- .sep{width:3px;height:3px;border-radius:50%;background:#333}
23
- `,Jt=`
24
- .pay-section{margin:1.25rem 0}
25
- .pay-btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;background:linear-gradient(135deg,#F26B1A,#D13F00);color:#fff;border:none;padding:.65rem 2rem;border-radius:6px;font-family:'Inter',sans-serif;font-size:.95rem;font-weight:600;cursor:pointer;transition:opacity .15s,transform .1s;min-width:180px}
26
- .pay-btn:hover:not(:disabled){opacity:.9;transform:translateY(-1px)}
27
- .pay-btn:active:not(:disabled){transform:translateY(0)}
28
- .pay-btn:disabled{opacity:.6;cursor:not-allowed}
29
- .pay-btn .spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .6s linear infinite}
30
- @keyframes spin{to{transform:rotate(360deg)}}
31
- .pay-status{font-size:.8rem;color:#737373;margin-top:.5rem;min-height:1.2em}
32
- .pay-status.error{color:#ef4444}
33
- .pay-status.success{color:#22c55e}
34
- .pay-alt{font-size:.78rem;color:#404040;margin-top:.75rem}
35
- .pay-alt a{color:#F26B1A;text-decoration:none}
36
- .result-box{background:rgba(34,197,94,.06);border:1px solid rgba(34,197,94,.15);border-radius:6px;padding:.75rem;margin-top:.75rem;text-align:left;font-size:.78rem;max-height:200px;overflow:auto}
37
- .result-box pre{color:#94a3b8;font-family:'SF Mono',Monaco,Consolas,monospace;white-space:pre-wrap;word-break:break-all}
38
- .no-wallet{font-size:.82rem;color:#737373;margin:1rem 0}
39
- `,Qt=`
40
- <script type="module">
41
- // Payment data is embedded in #x402-data attributes
42
- const dataEl = document.getElementById('x402-data');
43
- if (!dataEl) throw new Error('Missing payment data');
44
-
45
- const requirements = JSON.parse(atob(dataEl.dataset.requirements));
46
- const requestMethod = dataEl.dataset.method;
47
- const requestUrl = dataEl.dataset.url;
48
- const rpcUrl = dataEl.dataset.rpc || 'https://api.dexter.cash/api/solana/rpc';
49
-
50
- // Detect wallet provider
51
- function getWalletProvider() {
52
- if (window.phantom?.solana?.isPhantom) return { name: 'Phantom', provider: window.phantom.solana };
53
- if (window.solflare?.isSolflare) return { name: 'Solflare', provider: window.solflare };
54
- if (window.backpack) return { name: 'Backpack', provider: window.backpack };
55
- // Generic wallet-standard fallback
56
- if (window.solana) return { name: 'Wallet', provider: window.solana };
57
- return null;
58
- }
59
-
60
- const walletInfo = getWalletProvider();
61
- const btn = document.getElementById('pay-btn');
62
- const status = document.getElementById('pay-status');
63
- const section = document.getElementById('pay-section');
64
- const noWallet = document.getElementById('no-wallet');
65
-
66
- if (walletInfo && btn) {
67
- section.style.display = 'block';
68
- if (noWallet) noWallet.style.display = 'none';
69
- } else if (noWallet) {
70
- noWallet.style.display = 'block';
71
- if (section) section.style.display = 'none';
72
- }
73
-
74
- // Preload Solana libraries in background
75
- let solanaLibs = null;
76
- const preload = (async () => {
77
- try {
78
- const [web3, spl] = await Promise.all([
79
- import('https://esm.sh/@solana/web3.js@1.98.0'),
80
- import('https://esm.sh/@solana/spl-token@0.4.9'),
81
- ]);
82
- solanaLibs = { web3, spl };
83
- } catch (e) {
84
- console.warn('[x402] Failed to preload Solana libraries:', e);
85
- }
86
- })();
87
-
88
- function setStatus(msg, type) {
89
- if (!status) return;
90
- status.textContent = msg;
91
- status.className = 'pay-status' + (type ? ' ' + type : '');
92
- }
93
-
94
- function setBtnState(text, disabled, loading) {
95
- if (!btn) return;
96
- btn.disabled = disabled;
97
- btn.innerHTML = loading
98
- ? '<span class="spinner"></span>' + text
99
- : text;
100
- }
101
-
102
- if (btn) {
103
- btn.addEventListener('click', async () => {
104
- if (!walletInfo) return;
105
- const { provider } = walletInfo;
106
-
107
- try {
108
- // 1. Connect wallet
109
- setBtnState('Connecting...', true, true);
110
- setStatus('');
111
- await provider.connect();
112
-
113
- if (!provider.publicKey) {
114
- throw new Error('Wallet did not provide a public key');
115
- }
116
-
117
- // 2. Load Solana libraries (should already be cached from preload)
118
- setBtnState('Preparing...', true, true);
119
- await preload;
120
- if (!solanaLibs) {
121
- // Retry once
122
- const [web3, spl] = await Promise.all([
123
- import('https://esm.sh/@solana/web3.js@1.98.0'),
124
- import('https://esm.sh/@solana/spl-token@0.4.9'),
125
- ]);
126
- solanaLibs = { web3, spl };
127
- }
128
-
129
- const { web3, spl } = solanaLibs;
130
- const { PublicKey, Connection, TransactionMessage, VersionedTransaction, ComputeBudgetProgram } = web3;
131
- const { getAssociatedTokenAddress, createTransferCheckedInstruction, getMint, TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } = spl;
132
-
133
- // 3. Parse payment requirements
134
- const accept = requirements.accepts[0];
135
- if (!accept) throw new Error('No payment method available');
136
-
137
- const payTo = new PublicKey(accept.payTo);
138
- const amount = BigInt(accept.amount ?? accept.maxAmountRequired);
139
- const mintPubkey = new PublicKey(accept.asset);
140
- const feePayer = accept.extra?.feePayer ? new PublicKey(accept.extra.feePayer) : provider.publicKey;
141
- const userPubkey = provider.publicKey;
142
-
143
- // 4. Build transaction
144
- setBtnState('Building tx...', true, true);
145
- const connection = new Connection(rpcUrl, 'confirmed');
146
-
147
- const instructions = [];
148
-
149
- // ComputeBudget
150
- instructions.push(ComputeBudgetProgram.setComputeUnitLimit({ units: 12000 }));
151
- instructions.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 1 }));
152
-
153
- // Determine token program
154
- const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');
155
- if (!mintInfo) throw new Error('Token mint not found');
156
- const programId = mintInfo.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58() ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID;
157
-
158
- const mint = await getMint(connection, mintPubkey, undefined, programId);
159
-
160
- // ATAs
161
- const sourceAta = await getAssociatedTokenAddress(mintPubkey, userPubkey, false, programId);
162
- const destAta = await getAssociatedTokenAddress(mintPubkey, payTo, false, programId);
163
-
164
- // Verify source exists
165
- const sourceInfo = await connection.getAccountInfo(sourceAta, 'confirmed');
166
- if (!sourceInfo) throw new Error('No USDC token account found. Make sure you have USDC in your wallet.');
167
-
168
- // TransferChecked
169
- instructions.push(createTransferCheckedInstruction(sourceAta, mintPubkey, destAta, userPubkey, amount, mint.decimals, [], programId));
170
-
171
- const { blockhash } = await connection.getLatestBlockhash('confirmed');
172
- const message = new TransactionMessage({ payerKey: feePayer, recentBlockhash: blockhash, instructions }).compileToV0Message();
173
- const transaction = new VersionedTransaction(message);
174
-
175
- // 5. Sign
176
- setBtnState('Sign in wallet...', true, true);
177
- setStatus('Approve the transaction in your wallet');
178
- const signed = await provider.signTransaction(transaction);
179
- const serialized = signed.serialize();
180
-
181
- // Convert Uint8Array to base64
182
- let payload = '';
183
- const bytes = new Uint8Array(serialized);
184
- const chunk = 8192;
185
- for (let i = 0; i < bytes.length; i += chunk) {
186
- payload += String.fromCharCode.apply(null, bytes.slice(i, i + chunk));
187
- }
188
- payload = btoa(payload);
189
-
190
- // 6. Build payment-signature header (x402 v2 format)
191
- // Solana: payload must be { transaction: base64Tx } per SDK spec
192
- const paymentSignature = {
193
- x402Version: accept.x402Version ?? 2,
194
- resource: requirements.resource,
195
- accepted: accept,
196
- payload: { transaction: payload },
197
- };
198
- const paymentHeader = btoa(JSON.stringify(paymentSignature));
199
-
200
- // 7. Submit payment
201
- setBtnState('Verifying...', true, true);
202
- setStatus('Payment submitted, verifying...');
203
-
204
- // Use the original request body if available
205
- const originalBody = dataEl.dataset.body ? atob(dataEl.dataset.body) : '{}';
206
- const response = await fetch(requestUrl, {
207
- method: requestMethod,
208
- headers: {
209
- 'Content-Type': 'application/json',
210
- 'PAYMENT-SIGNATURE': paymentHeader,
211
- },
212
- body: requestMethod !== 'GET' ? originalBody : undefined,
213
- });
214
-
215
- if (response.ok) {
216
- const data = await response.json();
217
- setBtnState('Paid', true, false);
218
- setStatus('Payment successful', 'success');
219
- // Show response
220
- const resultBox = document.createElement('div');
221
- resultBox.className = 'result-box';
222
- resultBox.innerHTML = '<pre>' + JSON.stringify(data, null, 2).replace(/</g, '&lt;') + '</pre>';
223
- section.appendChild(resultBox);
224
- } else {
225
- const err = await response.json().catch(() => ({ error: 'Payment verification failed' }));
226
- throw new Error(err.error || err.reason || 'Payment failed');
227
- }
228
- } catch (err) {
229
- console.error('[x402] Payment error:', err);
230
- setBtnState('Pay ' + document.getElementById('price-value').textContent, false, false);
231
- setStatus(err.message || 'Payment failed', 'error');
232
- }
233
- });
234
- }
235
- </script>
236
- `;function Yt(e,t,n,r,o,s){let p="?",y="This resource requires payment",g="";try{let c=JSON.parse(Buffer.from(e,"base64").toString()),a=c.accepts?.[0];if(a){let h=a.amount??a.maxAmountRequired??"0",l=a.extra?.decimals||6;p=(Number(h)/Math.pow(10,l)).toFixed(l>4?4:2),g=a.network||""}c.resource?.description&&(y=c.resource.description)}catch{}let m=g.includes("solana")?"Solana":g.includes("eip155")?"Base":"",b=r.showEndpoint?`<div class="endpoint"><code>${D(n)} ${D(t)}</code></div>`:"";return`<!DOCTYPE html>
237
- <html lang="en">
238
- <head>
239
- <meta charset="utf-8">
240
- <meta name="viewport" content="width=device-width,initial-scale=1">
241
- <title>${D(r.title)} \u2014 ${D(p)} USDC</title>
242
- <style>${Xt}${Jt}</style>
243
- </head>
244
- <body>
245
- <div class="card">
246
- <div class="crest">${Gt}</div>
247
- <h1>${D(r.title)}</h1>
248
- <p class="desc">${D(y)}</p>
249
- <div class="price">${Vt}<span id="price-value">${D(p)}</span></div>
250
- <div class="chain">${D(m)}${m?" network":""}</div>
251
- ${b}
252
-
253
- <div id="pay-section" class="pay-section" style="display:none">
254
- <button id="pay-btn" class="pay-btn">Pay ${p}</button>
255
- <div id="pay-status" class="pay-status"></div>
256
- <div class="pay-alt">or use <a href="${r.sdkUrl}">x402 SDK</a> for programmatic access</div>
257
- </div>
258
-
259
- <div id="no-wallet" class="no-wallet" style="display:none">
260
- <div class="info">
261
- <strong>Access this endpoint:</strong><br><br>
262
- Use any x402-compatible client or a browser with a Solana wallet extension (Phantom, Solflare, Backpack).<br><br>
263
- <code>npm install @dexterai/x402</code><br><br>
264
- <a href="${r.sdkUrl}">x402 SDK docs &rarr;</a>
265
- </div>
266
- </div>
267
-
268
- <div class="footer">
269
- <a href="https://docs.dexter.cash/docs/sdk/">x402</a>
270
- <span class="sep"></span>
271
- <a href="https://dexter.cash">Dexter</a>
272
- </div>
273
- </div>
274
-
275
- <div id="x402-data" style="display:none"
276
- data-requirements="${e}"
277
- data-method="${n}"
278
- data-url="${t}"
279
- data-rpc="${o}"
280
- data-body="${s?Buffer.from(s).toString("base64"):""}"
281
- ></div>
282
- ${Qt}
283
- </body>
284
- </html>`}function rt(e={}){let t={title:e.title??"Payment Required",branding:e.branding??'Powered by <a href="https://docs.dexter.cash/docs/sdk/">Dexter x402</a>',sdkUrl:e.sdkUrl??"https://docs.dexter.cash/docs/sdk/",showEndpoint:e.showEndpoint??!0},n=e.rpcUrl??"https://api.dexter.cash/api/solana/rpc";return(r,o,s)=>{let p=o.json.bind(o);o.json=function(y){if(o.statusCode===402&&r.accepts("html")&&!r.headers["payment-signature"]){let g=o.getHeader("PAYMENT-REQUIRED")||o.getHeader("payment-required");if(g&&typeof g=="string"){let m;if(r.body&&typeof r.body=="object"&&Object.keys(r.body).length>0)try{m=JSON.stringify(r.body)}catch{}let b=Yt(g,r.originalUrl,r.method,t,n,m);return o.setHeader("Content-Security-Policy","default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; connect-src *; img-src data:; frame-ancestors 'none'"),o.setHeader("X-Content-Type-Options","nosniff"),o.status(402).type("html").send(b),o}}return p(y)},s()}}var ge=Re(require("crypto"),1),Zt=/^(\d+)(m|h|d|w)$/;function er(e){let t=e.match(Zt);if(!t)return null;let n=parseInt(t[1],10);switch(t[2]){case"m":return n*60;case"h":return n*3600;case"d":return n*86400;case"w":return n*604800;default:return null}}function nt(e){return e>=604800&&e%604800===0?`${e/604800} week${e/604800>1?"s":""}`:e>=86400&&e%86400===0?`${e/86400} day${e/86400>1?"s":""}`:e>=3600&&e%3600===0?`${e/3600} hour${e/3600>1?"s":""}`:e>=60&&e%60===0?`${e/60} minute${e/60>1?"s":""}`:`${e} second${e>1?"s":""}`}function tr(e,t){let n=Buffer.from(JSON.stringify({alg:"HS256",typ:"JWT"})).toString("base64url"),r=Buffer.from(JSON.stringify(e)).toString("base64url"),o=ge.default.createHmac("sha256",t).update(`${n}.${r}`).digest("base64url");return`${n}.${r}.${o}`}function rr(e,t){try{let n=e.split(".");if(n.length!==3)return null;let[r,o,s]=n,p=ge.default.createHmac("sha256",t).update(`${r}.${o}`).digest("base64url");if(s!==p)return null;let y=JSON.parse(Buffer.from(o,"base64url").toString());return y.exp&&Date.now()/1e3>y.exp||y.sub!=="x402-access-pass"?null:y}catch{return null}}function ot(e){let{payTo:t,network:n=me,asset:r,facilitatorUrl:o,tiers:s,ratePerHour:p,secret:y,issuer:g="x402-access-pass",verbose:m=!1,description:b}=e,c=y??ge.default.randomBytes(32);if(y||console.warn("[x402:access-pass] No secret provided \u2014 access passes will be invalidated on server restart. Set `secret` for production use."),!s&&!p)throw new Error("x402AccessPass: at least one of `tiers` or `ratePerHour` is required");let a=m?console.log.bind(console,"[x402:access-pass]"):()=>{},h=r?.decimals??de,l=[];if(s){for(let[i,f]of Object.entries(s)){let w=er(i);if(!w){console.warn(`x402AccessPass: skipping tier "${i}" \u2014 unrecognized duration format (use 5m, 1h, 24h, 7d)`);continue}l.push({id:i,label:nt(w),seconds:w,price:f,priceAtomic:J(parseFloat(f),h)})}l.sort((i,f)=>i.seconds-f.seconds)}let x=X({payTo:t,network:n,asset:r,facilitatorUrl:o}),P={tiers:l.length>0?l:void 0,ratePerHour:p||void 0,issuer:g},v=K(P);function A(i){if(!p)throw new Error("Custom durations not supported \u2014 no ratePerHour configured");let f=i/3600,w=(parseFloat(p)*f).toFixed(h>4?4:2);return{price:w,priceAtomic:J(parseFloat(w),h)}}function S(i){let f=i.query.tier,w=i.query.duration;if(f){let d=l.find(T=>T.id===f);if(d)return{tier:d.id,seconds:d.seconds,price:d.price,priceAtomic:d.priceAtomic,label:d.label}}if(w){let d=parseInt(w,10);if(d>0&&p){let T=A(d);return{tier:"custom",seconds:d,...T,label:nt(d)}}}if(l.length>0){let d=l[0];return{tier:d.id,seconds:d.seconds,price:d.price,priceAtomic:d.priceAtomic,label:d.label}}return{tier:"custom",seconds:3600,...A(3600),label:"1 hour"}}return async(i,f,w)=>{try{let u=i.headers.authorization;if(u?.startsWith("Bearer ")){let R=rr(u.slice(7),c);if(R)return a("Valid access pass:",R.tier,"| expires:",new Date(R.exp*1e3).toISOString()),i.accessPass={tier:R.tier,duration:R.duration,expiresAt:new Date(R.exp*1e3).toISOString(),payer:R.payer,network:R.network},w();a("Invalid or expired access pass token")}let d=i.headers["payment-signature"];if(d){a("Payment signature received, verifying for pass purchase...");let R=await x.verifyPayment(d);if(!R.isValid){a("Payment verification failed:",R.invalidReason),f.status(402).json({error:"Payment verification failed",reason:R.invalidReason});return}let C=await x.settlePayment(d);if(!C.success){a("Payment settlement failed:",C.errorReason),f.status(402).json({error:"Payment settlement failed",reason:C.errorReason});return}a("Payment settled:",C.transaction);let N=S(i),M=Math.floor(Date.now()/1e3),k={sub:"x402-access-pass",tier:N.tier,duration:N.seconds,iat:M,exp:M+N.seconds,payer:R.payer??"",network:n,iss:g},ee=tr(k,c);i.x402={transaction:C.transaction,payer:R.payer??"",network:n};let H={success:!0,transaction:C.transaction,network:n,payer:R.payer??""};f.setHeader("PAYMENT-RESPONSE",K(H)),f.setHeader("ACCESS-PASS",ee),f.json({accessPass:{token:ee,tier:N.tier,duration:N.label,durationSeconds:N.seconds,expiresAt:new Date((M+N.seconds)*1e3).toISOString(),usage:"Include on subsequent requests as: Authorization: Bearer <token>"},transaction:C.transaction,payer:R.payer});return}a("No access pass or payment, returning 402");let T=S(i),E=T.priceAtomic,_=`${i.protocol}://${i.get("host")}${i.originalUrl}`,O=await x.buildRequirements({amountAtomic:E,resourceUrl:_,description:b||`Access pass: ${T.label}`,mimeType:"application/json"}),F=x.encodeRequirements(O);f.setHeader("PAYMENT-REQUIRED",F),f.setHeader("X-ACCESS-PASS-TIERS",v),f.status(402).json({error:"Access pass required",message:"Purchase an access pass to unlock unlimited API access for a time window.",accepts:O.accepts,resource:O.resource,accessPass:{tiers:l.length>0?l:void 0,ratePerHour:p||void 0,usage:"Add ?tier=<id> or ?duration=<seconds> to your payment request to choose a pass duration."}})}catch(u){a("Access pass middleware error:",u),f.status(500).json({error:"Payment processing error",message:u instanceof Error?u.message:"Unknown error"})}}}var he=require("crypto"),nr=300;function st(e){let t={unitSize:e.unitSize,ratePerUnit:e.ratePerUnit,minUsd:e.minUsd??.01,maxUsd:e.maxUsd??1/0,roundingMode:e.roundingMode??"ceil",decimals:e.decimals??6},{unitSize:n,ratePerUnit:r,minUsd:o,maxUsd:s,roundingMode:p,decimals:y}=t;if(n<=0)throw new Error("unitSize must be positive");if(r<=0)throw new Error("ratePerUnit must be positive");if(o<0)throw new Error("minUsd cannot be negative");if(s<o)throw new Error("maxUsd must be >= minUsd");let g=(0,he.randomBytes)(32);function m(a,h){let l=JSON.stringify({unitSize:n,ratePerUnit:r,minUsd:o,maxUsd:s===1/0?"none":s,roundingMode:p}),x=`${a}|${l}|${h}`;return(0,he.createHmac)("sha256",g).update(x).digest("hex").slice(0,16)}function b(a){let h=a.length,l=h/n,x;switch(p){case"ceil":x=Math.ceil(l);break;case"floor":x=Math.floor(l);break;case"round":x=Math.round(l);break}h>0&&x===0&&(x=1);let P=x*r;P=Math.max(o,P),P=Math.min(s,P);let v=Math.pow(10,y),A=Math.floor(P*v).toString(),S=Math.floor(Date.now()/1e3),i=m(a,S),f=`${S}.${i}`;return{amountAtomic:A,usdAmount:P,quoteHash:f,units:x,inputLength:h}}function c(a,h){if(!h)return!1;let l=h.indexOf(".");if(l===-1)return!1;let x=parseInt(h.slice(0,l),10),P=h.slice(l+1);if(isNaN(x)||!P)return!1;let v=Math.floor(Date.now()/1e3)-x;if(v<0||v>nr)return!1;let A=m(a,x);if(P.length!==A.length)return!1;let S=0;for(let i=0;i<P.length;i++)S|=P.charCodeAt(i)^A.charCodeAt(i);return S===0}return{calculate:b,validateQuote:c,config:t}}function it(e){let t=e.ratePerUnit.toFixed(2),n=e.unitSize.toLocaleString();return`from $${t} per ${n} chars`}var bt=require("crypto");var $={usesMaxCompletionTokens:!1,supportsTemperature:!0,supportsTopP:!0,supportsFrequencyPenalty:!0,supportsPresencePenalty:!0,supportsReasoningEffort:!1,supportsStreaming:!0,supportsSystemMessage:!0,supportsTools:!0,supportsStructuredOutput:!0},j={usesMaxCompletionTokens:!0,supportsTemperature:!1,supportsTopP:!1,supportsFrequencyPenalty:!1,supportsPresencePenalty:!1,supportsReasoningEffort:!1,supportsStreaming:!0,supportsSystemMessage:!0,supportsTools:!0,supportsStructuredOutput:!0},q={usesMaxCompletionTokens:!0,supportsTemperature:!1,supportsTopP:!1,supportsFrequencyPenalty:!1,supportsPresencePenalty:!1,supportsReasoningEffort:!0,supportsStreaming:!0,supportsSystemMessage:!0,supportsTools:!0,supportsStructuredOutput:!0},at={...q,supportsStreaming:!1},I=[{id:"gpt-4o-mini",displayName:"GPT-4o Mini",family:"gpt-4o",tier:"fast",capabilityRank:3,modalities:["text","vision"],apiType:"chat",pricing:{input:.15,output:.6,cached:.075},contextWindow:128e3,defaultMaxOutput:4096,maxOutputTokens:16384,parameters:$,deprecated:!1,description:"Fast, affordable small model with vision support"},{id:"gpt-4.1-nano",displayName:"GPT-4.1 Nano",family:"gpt-4.1",tier:"fast",capabilityRank:2,modalities:["text"],apiType:"chat",pricing:{input:.1,output:.4,cached:.025},contextWindow:128e3,defaultMaxOutput:4096,maxOutputTokens:32768,parameters:$,deprecated:!1,description:"Smallest 4.1 model, very fast and cheap"},{id:"gpt-4.1-mini",displayName:"GPT-4.1 Mini",family:"gpt-4.1",tier:"fast",capabilityRank:4,modalities:["text"],apiType:"chat",pricing:{input:.4,output:1.6,cached:.1},contextWindow:128e3,defaultMaxOutput:4096,maxOutputTokens:32768,parameters:$,deprecated:!1,description:"Balanced 4.1 model, good price/performance"},{id:"gpt-5-nano",displayName:"GPT-5 Nano",family:"gpt-5",tier:"fast",capabilityRank:1,modalities:["text"],apiType:"chat",pricing:{input:.05,output:.4,cached:.005},contextWindow:128e3,defaultMaxOutput:4096,maxOutputTokens:16384,parameters:j,deprecated:!1,description:"Cheapest GPT-5 variant, extremely fast"},{id:"gpt-5-mini",displayName:"GPT-5 Mini",family:"gpt-5",tier:"fast",capabilityRank:5,modalities:["text"],apiType:"chat",pricing:{input:.25,output:2,cached:.025},contextWindow:128e3,defaultMaxOutput:8192,maxOutputTokens:32768,parameters:j,deprecated:!1,description:"Small but capable GPT-5, great value"},{id:"gpt-4o",displayName:"GPT-4o",family:"gpt-4o",tier:"standard",capabilityRank:5,modalities:["text","vision"],apiType:"chat",pricing:{input:2.5,output:10,cached:1.25},contextWindow:128e3,defaultMaxOutput:4096,maxOutputTokens:16384,parameters:$,deprecated:!1,description:"Flagship multimodal model with vision"},{id:"gpt-4.1",displayName:"GPT-4.1",family:"gpt-4.1",tier:"standard",capabilityRank:6,modalities:["text"],apiType:"chat",pricing:{input:2,output:8,cached:.5},contextWindow:1e6,defaultMaxOutput:8192,maxOutputTokens:32768,parameters:$,deprecated:!1,description:"Long context specialist, 1M token window"},{id:"gpt-5",displayName:"GPT-5",family:"gpt-5",tier:"standard",capabilityRank:7,modalities:["text"],apiType:"chat",pricing:{input:1.25,output:10,cached:.125},contextWindow:128e3,defaultMaxOutput:8192,maxOutputTokens:32768,parameters:j,deprecated:!1,description:"Base GPT-5, excellent all-around"},{id:"gpt-5.1",displayName:"GPT-5.1",family:"gpt-5",tier:"standard",capabilityRank:8,modalities:["text"],apiType:"chat",pricing:{input:1.25,output:10,cached:.125},contextWindow:128e3,defaultMaxOutput:8192,maxOutputTokens:32768,parameters:j,deprecated:!1,description:"Improved GPT-5 with better instruction following"},{id:"gpt-5.2",displayName:"GPT-5.2",family:"gpt-5",tier:"standard",capabilityRank:9,modalities:["text"],apiType:"chat",pricing:{input:1.75,output:14,cached:.175},contextWindow:128e3,defaultMaxOutput:8192,maxOutputTokens:32768,parameters:j,deprecated:!1,description:"Latest GPT-5, most capable standard model"},{id:"o1-mini",displayName:"o1 Mini",family:"o1",tier:"reasoning",capabilityRank:3,modalities:["text"],apiType:"chat",pricing:{input:1.1,output:4.4,cached:.55},contextWindow:128e3,defaultMaxOutput:16384,maxOutputTokens:65536,parameters:q,deprecated:!1,description:"Fast reasoning model, good for math/code"},{id:"o3-mini",displayName:"o3 Mini",family:"o3",tier:"reasoning",capabilityRank:4,modalities:["text"],apiType:"chat",pricing:{input:1.1,output:4.4,cached:.55},contextWindow:128e3,defaultMaxOutput:16384,maxOutputTokens:65536,parameters:q,deprecated:!1,description:"Improved mini reasoner with better efficiency"},{id:"o4-mini",displayName:"o4 Mini",family:"o4",tier:"reasoning",capabilityRank:5,modalities:["text"],apiType:"chat",pricing:{input:1.1,output:4.4,cached:.275},contextWindow:128e3,defaultMaxOutput:16384,maxOutputTokens:65536,parameters:q,deprecated:!1,description:"Latest mini reasoner, best reasoning per dollar"},{id:"o3",displayName:"o3",family:"o3",tier:"reasoning",capabilityRank:7,modalities:["text"],apiType:"chat",pricing:{input:2,output:8,cached:.5},contextWindow:2e5,defaultMaxOutput:32768,maxOutputTokens:1e5,parameters:q,deprecated:!1,description:"Full o3 reasoning model, excellent for complex problems"},{id:"o1",displayName:"o1",family:"o1",tier:"reasoning",capabilityRank:8,modalities:["text"],apiType:"chat",pricing:{input:15,output:60,cached:7.5},contextWindow:2e5,defaultMaxOutput:32768,maxOutputTokens:1e5,parameters:q,deprecated:!1,description:"Original full reasoning model, very capable"},{id:"gpt-5-pro",displayName:"GPT-5 Pro",family:"gpt-5",tier:"premium",capabilityRank:7,modalities:["text"],apiType:"chat",pricing:{input:15,output:120},contextWindow:128e3,defaultMaxOutput:16384,maxOutputTokens:32768,parameters:j,deprecated:!1,description:"Enhanced GPT-5 for demanding tasks"},{id:"gpt-5.2-pro",displayName:"GPT-5.2 Pro",family:"gpt-5",tier:"premium",capabilityRank:8,modalities:["text"],apiType:"chat",pricing:{input:21,output:168},contextWindow:128e3,defaultMaxOutput:16384,maxOutputTokens:32768,parameters:j,deprecated:!1,description:"Most capable standard model available"},{id:"o3-pro",displayName:"o3 Pro",family:"o3",tier:"premium",capabilityRank:9,modalities:["text"],apiType:"chat",pricing:{input:20,output:80},contextWindow:2e5,defaultMaxOutput:32768,maxOutputTokens:1e5,parameters:at,deprecated:!1,description:"Premium o3 with extended thinking time"},{id:"o1-pro",displayName:"o1 Pro",family:"o1",tier:"premium",capabilityRank:10,modalities:["text"],apiType:"chat",pricing:{input:150,output:600},contextWindow:2e5,defaultMaxOutput:32768,maxOutputTokens:1e5,parameters:at,deprecated:!1,description:"Most capable reasoning model, extended compute"},{id:"o3-deep-research",displayName:"o3 Deep Research",family:"o3",tier:"specialized",capabilityRank:8,modalities:["text"],apiType:"responses",pricing:{input:10,output:40,cached:2.5},contextWindow:2e5,defaultMaxOutput:32768,maxOutputTokens:1e5,parameters:{...q,supportsStreaming:!1},deprecated:!1,description:"Extended research sessions with web access"},{id:"o4-mini-deep-research",displayName:"o4 Mini Deep Research",family:"o4",tier:"specialized",capabilityRank:6,modalities:["text"],apiType:"responses",pricing:{input:2,output:8,cached:.5},contextWindow:128e3,defaultMaxOutput:16384,maxOutputTokens:65536,parameters:{...q,supportsStreaming:!1},deprecated:!1,description:"Affordable deep research with o4 mini"},{id:"computer-use-preview",displayName:"Computer Use Preview",family:"computer-use",tier:"specialized",capabilityRank:5,modalities:["text","vision"],apiType:"responses",pricing:{input:3,output:12},contextWindow:128e3,defaultMaxOutput:4096,maxOutputTokens:16384,parameters:{...$,supportsReasoningEffort:!1},deprecated:!1,description:"Can control computer interfaces via screenshots"},{id:"gpt-realtime",displayName:"GPT Realtime",family:"gpt-realtime",tier:"specialized",capabilityRank:7,modalities:["text","audio","realtime"],apiType:"chat",pricing:{input:4,output:16,cached:.4},contextWindow:128e3,defaultMaxOutput:4096,maxOutputTokens:4096,parameters:{...$,supportsReasoningEffort:!1},deprecated:!1,description:"Real-time audio conversation model"},{id:"gpt-realtime-mini",displayName:"GPT Realtime Mini",family:"gpt-realtime",tier:"specialized",capabilityRank:4,modalities:["text","audio","realtime"],apiType:"chat",pricing:{input:.6,output:2.4,cached:.06},contextWindow:128e3,defaultMaxOutput:4096,maxOutputTokens:4096,parameters:{...$,supportsReasoningEffort:!1},deprecated:!1,description:"Affordable real-time audio model"},{id:"gpt-4o-2024-05-13",displayName:"GPT-4o (May 2024)",family:"gpt-4o",tier:"standard",capabilityRank:4,modalities:["text","vision"],apiType:"chat",pricing:{input:5,output:15},contextWindow:128e3,defaultMaxOutput:4096,maxOutputTokens:4096,parameters:$,deprecated:!0,description:"Original GPT-4o snapshot, use gpt-4o instead"}],ke=new Map(I.map(e=>[e.id,e]));function xe(e){let t=ke.get(e);if(!t)throw new Error(`Unknown model: ${e}. Use getAvailableModelIds() to see valid options.`);return t}function ct(e){return ke.get(e)}function pt(e){return ke.has(e)}function ut(){return I.map(e=>e.id)}function lt(e){return I.filter(t=>t.tier===e&&!t.deprecated).sort((t,n)=>t.capabilityRank-n.capabilityRank)}function dt(e){return I.filter(t=>t.family===e).sort((t,n)=>t.capabilityRank-n.capabilityRank)}function mt(){let e={fast:1,standard:2,reasoning:3,premium:4,specialized:5};return I.filter(t=>!t.deprecated).sort((t,n)=>{let r=e[t.tier]-e[n.tier];return r!==0?r:t.capabilityRank-n.capabilityRank})}function ft(){return I.filter(e=>!e.deprecated&&e.modalities.includes("text")&&!e.modalities.includes("realtime")&&e.apiType!=="responses").sort((e,t)=>{let n={fast:1,standard:2,reasoning:3,premium:4,specialized:5},r=n[e.tier]-n[t.tier];return r!==0?r:e.capabilityRank-t.capabilityRank})}function yt(e="fast"){let t={fast:1,standard:2,reasoning:3,premium:4,specialized:5},n=t[e];return I.filter(o=>!o.deprecated&&t[o.tier]>=n).sort((o,s)=>o.pricing.input-s.pricing.input)[0]}function gt(e,t,n,r=!1){let o=xe(e),s=r&&o.pricing.cached?t/1e6*o.pricing.cached:t/1e6*o.pricing.input,p=n/1e6*o.pricing.output;return s+p}function ht(e){let t=xe(e);return`$${t.pricing.input.toFixed(2)} in / $${t.pricing.output.toFixed(2)} out per 1M tokens`}var be=Object.fromEntries(I.map(e=>[e.id,{input:e.pricing.input,output:e.pricing.output,cached:e.pricing.cached,maxTokens:e.defaultMaxOutput,tier:e.tier}]));var Pe=null;async function or(){if(Pe)return Pe;try{return Pe=await import("tiktoken"),Pe}catch{throw new Error('Token pricing requires the "tiktoken" package. Install with: npm install tiktoken')}}var U=be,z="gpt-4o-mini";async function sr(e){let t=await or();try{return t.encoding_for_model(e)}catch{return t.get_encoding("cl100k_base")}}async function Te(e,t=z){let n=await sr(t);try{return n.encode(e).length}finally{n.free()}}function xt(e,t,n,r){let o=JSON.stringify({model:t,rate:n,tokens:r});return(0,bt.createHash)("sha256").update(e+o).digest("hex").slice(0,16)}function Pt(e={}){let t=e.model??z,n=U[t],r={input:e.inputRate??n?.input??U[z].input,output:e.outputRate??n?.output??U[z].output,maxTokens:e.maxTokens??n?.maxTokens??4096,tier:e.tier??n?.tier??"custom"},o=e.tokenizer,s={model:t,inputRate:r.input,outputRate:r.output,maxTokens:r.maxTokens,tier:r.tier,tokenizer:o??(a=>Te(a,t)),minUsd:e.minUsd??.001,maxUsd:e.maxUsd??50,decimals:e.decimals??6},{minUsd:p,maxUsd:y,decimals:g}=s;async function m(a){return o?o(a):Te(a,t)}async function b(a,h){let l=h?`${h}
285
-
286
- ${a}`:a,x=await m(l),P=x/1e6*r.input;P=Math.max(P,p),P=Math.min(P,y);let v=Math.pow(10,g),A=Math.floor(P*v).toString(),S=xt(a,t,r.input,x);return{amountAtomic:A,usdAmount:P,inputTokens:x,model:t,tier:r.tier,inputRatePerMillion:r.input,outputRatePerMillion:r.output,maxOutputTokens:r.maxTokens,quoteHash:S}}async function c(a,h){if(!h)return!1;let l=await m(a);return xt(a,t,r.input,l)===h}return{calculate:b,validateQuote:c,countTokens:m,config:s,modelInfo:r}}function Tt(){return Object.entries(U).map(([e,t])=>({model:e,inputRate:t.input,outputRate:t.output,maxTokens:t.maxTokens,tier:t.tier})).sort((e,t)=>{let n={fast:0,standard:1,reasoning:2,premium:3},r=n[e.tier]-n[t.tier];return r!==0?r:e.inputRate-t.inputRate})}function St(e){return e in U}function Rt(e=z){let t=U[e]??U[z],n=U[e]?e:z;return`$${t.input.toFixed(2)} per 1M tokens (${n})`}var wt=require("@dexterai/x402-ads-types");0&&(module.exports={BASE_MAINNET_NETWORK,DEXTER_FACILITATOR_URL,FacilitatorClient,MODEL_PRICING,MODEL_PRICING_MAP,MODEL_REGISTRY,SOLANA_MAINNET_NETWORK,SPONSORED_ACCESS_EXTENSION_KEY,USDC_BASE,USDC_MINT,bazaarExtension,countTokens,createDynamicPricing,createTokenPricing,createX402Server,declareDiscoveryExtension,escapeHtml,estimateCost,findModel,formatModelPricing,formatPricing,formatTokenPricing,getActiveModels,getAvailableModelIds,getAvailableModels,getCheapestModel,getModel,getModelsByFamily,getModelsByTier,getTextModels,isValidModel,isValidModelId,resolveDefaultAsset,stripePayTo,x402AccessPass,x402BrowserSupport,x402Middleware});
1
+ "use strict";var se=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var $e=Object.prototype.hasOwnProperty;var Ke=(e,t)=>{for(var s in t)se(e,s,{get:t[s],enumerable:!0})},He=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of qe(t))!$e.call(e,n)&&n!==s&&se(e,n,{get:()=>t[n],enumerable:!(r=Le(t,n))||r.enumerable});return e};var Fe=e=>He(se({},"__esModule",{value:!0}),e);var st={};Ke(st,{BASE_MAINNET_NETWORK:()=>I,DEXTER_FACILITATOR_URL:()=>D,FacilitatorClient:()=>B,SOLANA_MAINNET_NETWORK:()=>N,SPONSORED_ACCESS_EXTENSION_KEY:()=>Be.SPONSORED_ACCESS_EXTENSION_KEY,USDC_BASE:()=>Q,USDC_MINT:()=>U,bazaarExtension:()=>Ie,createX402Server:()=>te,declareDiscoveryExtension:()=>Ue,resolveDefaultAsset:()=>oe,x402Middleware:()=>De});module.exports=Fe(st);var N="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",le="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",de="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z";var I="eip155:8453",F="eip155:84532",W="eip155:42161",j="eip155:137",V="eip155:10",X="eip155:43114",z="eip155:56",J="eip155:1187947933",Y="eip155:324705682",G="eip155:1";var U="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";var Q="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",We="0x55d398326f99059fF775485246999027B3197955",me="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",fe={[z]:me,[I]:Q,[F]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[W]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[j]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[V]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[X]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[J]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[Y]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[G]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},ye={[We]:{symbol:"USDT",decimals:18},[me]:{symbol:"USDC",decimals:18}};var it={[z]:56,[I]:8453,[F]:84532,[W]:42161,[j]:137,[V]:10,[X]:43114,[J]:1187947933,[Y]:324705682,[G]:1},at={[N]:"https://api.dexter.cash/api/solana/rpc",[le]:"https://api.devnet.solana.com",[de]:"https://api.testnet.solana.com"},ct={[z]:"https://api.dexter.cash/api/evm/bsc/rpc",[I]:"https://api.dexter.cash/api/base/rpc",[F]:"https://sepolia.base.org",[W]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[j]:"https://api.dexter.cash/api/evm/polygon/rpc",[V]:"https://api.dexter.cash/api/evm/optimism/rpc",[X]:"https://api.dexter.cash/api/evm/avalanche/rpc",[J]:"https://skale-base.skalenodes.com/v1/base",[Y]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[G]:"https://eth.llamarpc.com"},D="https://x402.dexter.cash",he=N;function ge(e,t){if(!Number.isFinite(e))throw new Error(`toAtomicUnits: amount must be finite, got ${e}`);if(e<0)throw new Error(`toAtomicUnits: amount must be non-negative, got ${e}`);if(!Number.isInteger(t)||t<0)throw new Error(`toAtomicUnits: decimals must be a non-negative integer, got ${t}`);let s=je(Math.abs(e)),[r,n=""]=s.split("."),a=n.slice(0,t).padEnd(t,"0");return BigInt(r+a).toString()}function je(e){let t=e.toString();if(!/[eE]/.test(t))return t;let[s,r]=t.split(/[eE]/),n=parseInt(r,10),a=s.startsWith("-"),p=a?s.slice(1):s,[m,f=""]=p.split("."),l=m+f,g=m.length+n,o;return g<=0?o="0."+"0".repeat(-g)+l:g>=l.length?o=l+"0".repeat(g-l.length):o=l.slice(0,g)+"."+l.slice(g),(a?"-":"")+o}function Z(e){return e.startsWith("solana:")||e==="solana"}function Ve(e){if(typeof Buffer<"u")return Buffer.from(e,"utf-8").toString("base64");let t=new TextEncoder().encode(e),s="";for(let r=0;r<t.length;r++)s+=String.fromCharCode(t[r]);return btoa(s)}function Xe(e){if(typeof Buffer<"u")return Buffer.from(e,"base64").toString("utf-8");let t=atob(e),s=new Uint8Array(t.length);for(let r=0;r<t.length;r++)s[r]=t.charCodeAt(r);return new TextDecoder().decode(s)}function ee(e){return Ve(JSON.stringify(e))}function $(e){return JSON.parse(Xe(e))}function ze(e){if(e instanceof TypeError)return!0;if(e&&typeof e=="object"&&"status"in e){let t=e.status;return t>=500&&t<600}return!1}var K=class extends Error{status;body;constructor(t,s){super(`HTTP ${t}`),this.status=t,this.body=s}},B=class{facilitatorUrl;cachedSupported=null;cacheTime=0;CACHE_TTL_MS=6e4;timeoutMs;maxRetries;retryBaseMs;constructor(t=D,s){this.facilitatorUrl=t.replace(/\/$/,""),this.timeoutMs=s?.timeoutMs??1e4,this.maxRetries=s?.maxRetries??3,this.retryBaseMs=s?.retryBaseMs??500}async fetchWithTimeout(t,s){let r=new AbortController,n=setTimeout(()=>r.abort(),this.timeoutMs);try{return await fetch(t,{...s,signal:r.signal})}finally{clearTimeout(n)}}async fetchWithRetry(t,s){let r;for(let n=0;n<this.maxRetries;n++)try{let a=await this.fetchWithTimeout(t,s);if(!a.ok&&a.status>=500)throw new K(a.status,await a.text());return a}catch(a){if(r=a,n<this.maxRetries-1&&ze(a)){let p=this.retryBaseMs*Math.pow(2,n);await new Promise(m=>setTimeout(m,p));continue}throw a}throw r}async getSupported(){let t=Date.now();if(this.cachedSupported&&t-this.cacheTime<this.CACHE_TTL_MS)return this.cachedSupported;let s=await this.fetchWithTimeout(`${this.facilitatorUrl}/supported`);if(!s.ok)throw new Error(`Facilitator /supported returned ${s.status}`);return this.cachedSupported=await s.json(),this.cacheTime=t,this.cachedSupported}async getFeePayer(t){let r=(await this.getSupported()).kinds.find(n=>n.x402Version===2&&(n.scheme==="exact"||n.scheme==="exact-approval")&&n.network===t);if(!r)throw new Error(`Facilitator does not support network "${t}" with a recognized scheme`);return r.extra?.feePayer}async getNetworkExtra(t){return(await this.getSupported()).kinds.find(n=>n.x402Version===2&&(n.scheme==="exact"||n.scheme==="exact-approval"||n.scheme==="batch-settlement")&&n.network===t)?.extra}async verifyPayment(t,s){try{let r=$(t),n=await this.fetchWithRetry(`${this.facilitatorUrl}/verify`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({x402Version:2,paymentPayload:r,paymentRequirements:s})});return n.ok?await n.json():{isValid:!1,invalidReason:`facilitator_error_${n.status}`}}catch(r){return{isValid:!1,invalidReason:r instanceof K?`facilitator_error_${r.status}`:r instanceof Error&&r.name==="AbortError"?"facilitator_timeout":r instanceof Error?r.message:"unexpected_verify_error"}}}async settlePayment(t,s){try{let r=$(t),n=await this.fetchWithRetry(`${this.facilitatorUrl}/settle`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({x402Version:2,paymentPayload:r,paymentRequirements:s})});return n.ok?{...await n.json(),network:s.network}:{success:!1,network:s.network,errorReason:`facilitator_error_${n.status}`}}catch(r){let n=r instanceof K?`facilitator_error_${r.status}`:r instanceof Error&&r.name==="AbortError"?"facilitator_timeout":r instanceof Error?r.message:"unexpected_settle_error";return{success:!1,network:s.network,errorReason:n}}}};function oe(e){if(Z(e))return{address:U,decimals:6};let t=fe[e];if(t){let s=ye[t]?.decimals??6;return{address:t,decimals:s}}return{address:U,decimals:6}}function xe(e){try{let t=$(e);return t?.accepted?.amount??t?.accepted?.maxAmountRequired}catch{return}}function te(e){let{payTo:t,facilitatorUrl:s=D,network:r=N,defaultTimeoutSeconds:n=60}=e,a=e.asset??oe(r),p=e.scheme??"exact";if(p==="tab"&&!Z(r))throw new Error(`scheme 'tab' is SVM-only; got network "${r}"`);let m=new B(s),f=null,l=new Map,g=3e4,o=Date.now();function y(i){let u=(i.maxTimeoutSeconds||n)*1e3;if(l.set(i.payTo,{accept:i,expiresAt:Date.now()+u}),Date.now()-o>g){let h=Date.now();for(let[S,_]of l)_.expiresAt<h&&l.delete(S);o=h}}function E(i){let u=l.get(i);if(u){if(u.expiresAt<Date.now()){l.delete(i);return}return u.accept}}async function x(i){return typeof t=="string"?t:t(i||{})}async function b(){if(f||(f=await m.getNetworkExtra(r)),Z(r)&&!f?.feePayer)throw new Error(`Facilitator does not provide feePayer for network "${r}"`);return{...f?.feePayer?{feePayer:f.feePayer}:{},decimals:f?.decimals??a.decimals,name:f?.name,version:f?.version,...p==="batch-settlement"&&f?.receiverAuthorizer?{receiverAuthorizer:f.receiverAuthorizer}:{},...p==="tab"?{voucherHeader:"x-tab-voucher",registrationEncoding:"base64(188-byte sessionRegisterMessage)"}:{}}}async function k(i,u){let{amountAtomic:h,timeoutSeconds:S=n}=u,_=await b(),O={scheme:p,network:r,amount:h,maxAmountRequired:h,asset:a.address,payTo:i,maxTimeoutSeconds:S,extra:_};return y(O),O}async function C(i){let u=await x({amountAtomic:i.amountAtomic,resourceUrl:i.resourceUrl});return k(u,i)}async function v(i){let{resourceUrl:u,description:h,mimeType:S="application/json"}=i,_={url:u,description:h,mimeType:S},O=await C(i);return{x402Version:2,resource:_,accepts:[O],error:"Payment required"}}function R(i){return ee(i)}function c(i){return{status:402,headers:{"PAYMENT-REQUIRED":R(i)},body:{}}}async function d(i,u){if(!u){let h=await x({paymentHeader:i});u=E(h),u||(u=await k(h,{amountAtomic:xe(i)??"0",resourceUrl:""}))}return m.verifyPayment(i,u)}async function A(i,u){if(!u){let h=await x({paymentHeader:i});u=E(h),u||(u=await k(h,{amountAtomic:xe(i)??"0",resourceUrl:""}))}return m.settlePayment(i,u)}return{buildRequirements:v,encodeRequirements:R,create402Response:c,verifyPayment:d,settlePayment:A,getPaymentAccept:C,network:r,assetDecimals:a.decimals,facilitator:m}}var Je=new WeakMap;function Se(e){return Je.get(e)}var _e=require("os"),we=require("path"),Ce=require("@x402/evm/batch-settlement/server");var re=require("@x402/core/server"),Ee=require("@x402/core/http"),Re=require("@x402/evm/batch-settlement/server");function Ae(e){let t=e.verbose?console.log.bind(console,"[batch-settlement:seller]"):()=>{},s=new re.HTTPFacilitatorClient({url:e.facilitatorUrl}),r=new Re.BatchSettlementEvmScheme(e.payTo,{storage:e.channelStore}),n=new re.x402ResourceServer(s).register(e.network,r),a=new Ee.x402HTTPResourceServer(n,{[e.route]:{accepts:{scheme:"batch-settlement",payTo:e.payTo,price:e.price,network:e.network},description:"batch-settlement protected route",mimeType:"application/json"}}),p=null;function m(){if(p)return p;let o=a.initialize();return o.catch(y=>{p===o&&(p=null),e.verbose?t("resource server initialize() failed:",y):console.error("[batch-settlement:seller] resource server initialize() failed:",y)}),p=o,o}let f=m();function l(o,y){if(o.headersSent)return;for(let[x,b]of Object.entries(y.headers))o.setHeader(x,b);o.status(y.status);let{body:E}=y;E==null?o.end():typeof E=="string"?o.send(E):o.json(E)}return{scheme:r,facilitator:s,handler:async(o,y,E)=>{try{await m();let x=o.get("host")??"",b=`${o.baseUrl??""}${o.path}`||"/",k={getHeader:A=>o.headers[A.toLowerCase()],getMethod:()=>o.method,getPath:()=>b,getUrl:()=>`${o.protocol}://${x}${o.originalUrl}`,getAcceptHeader:()=>o.headers.accept??"",getUserAgent:()=>o.headers["user-agent"]??"",getBody:()=>o.body??{},getQueryParams:()=>o.query,getQueryParam:A=>{let i=o.query[A];if(typeof i=="string"||Array.isArray(i))return i}},C=o.headers["payment-signature"]??o.headers["x-payment"],v={adapter:k,path:b,method:o.method,paymentHeader:C},R=await a.processHTTPRequest(v);if(t("processHTTPRequest ->",R.type),R.type==="no-payment-required"){E();return}if(R.type==="payment-error"){l(y,R.response);return}let c={request:v,responseBody:Buffer.alloc(0)},d=await a.processSettlement(R.paymentPayload,R.paymentRequirements,R.declaredExtensions,c);if(t("processSettlement ->",d.success?"success":`failure:${d.errorReason}`),!d.success){l(y,d.response);return}for(let[A,i]of Object.entries(d.headers))y.headersSent||y.setHeader(A,i);E()}catch(x){t("handler error:",x),y.headersSent||y.status(500).json({error:"Payment processing error"})}},ready:f}}var ie=require("viem"),Pe=6;async function ae(e){let{manager:t,store:s,channelId:r}=e,n=await s.get(r),a=BigInt(n?.chargedCumulativeAmount??"0"),p=BigInt(n?.balance??"0"),m=p>a?p-a:0n,{claims:f,settle:l}=await t.claimAndSettle(),g=await t.refund([r]),o=g.find(y=>y.channel===r)??g[0];return{claimTx:f[0]?.transaction??"",settleTx:l?.transaction??"",refundTx:o?.transaction??"",settledAmount:(0,ie.formatUnits)(a,Pe),refundedAmount:(0,ie.formatUnits)(m,Pe)}}async function Te(e){let t=await e.store.list(),s=[];for(let r of t)try{let n=await ae({manager:e.manager,store:e.store,channelId:r.channelId});s.push({channelId:r.channelId,...n})}catch(n){s.push({channelId:r.channelId,error:n instanceof Error?n.message:String(n)})}return s}function be(e){let t=!1,s=async()=>{try{await e.claimAndSettle()}catch(n){e.onError?.(n)}},r=setInterval(()=>{t||s()},e.claimIntervalMs);return typeof r.unref=="function"&&r.unref(),{async stop(){t||(t=!0,clearInterval(r),await s())}}}var Ye="https://x402.dexter.cash",Ge="GET /",ve=new Set(["eip155:8453","eip155:42161","eip155:137"]);function Qe(e){return e===!1?null:e===void 0||e===!0?3e5:(e.claimIntervalSecs??300)*1e3}function ce(e){if(!ve.has(e.network))throw new Error(`batch-settlement is not supported on network "${e.network}" \u2014 supported: ${[...ve].join(", ")}`);let t=e.facilitatorUrl??Ye,s=e.channelStore??new Ce.FileChannelStorage({directory:(0,we.join)((0,_e.homedir)(),".dexter-x402","seller-channels")}),r=Ae({payTo:e.payTo,network:e.network,price:e.price,route:e.route??Ge,facilitatorUrl:t,channelStore:s,verbose:e.verbose}),n=r.scheme.createChannelManager(r.facilitator,e.network),a=async()=>{await n.claimAndSettle()},p=Qe(e.autoSettle),m=null;p!==null&&(m=be({claimAndSettle:a,claimIntervalMs:p,onError:o=>console.error("[batch-settlement:seller] auto-loop claim pass failed",o)}));let f=s,l=(o,y,E)=>{r.handler(o,y,E)},g=l;return g.middleware=()=>l,g.closeChannel=o=>ae({manager:n,store:f,channelId:o}),g.closeAll=()=>Te({manager:n,store:f}),g.stop=async()=>{m&&await m.stop()},g}async function Ne(e,t,s){let r={};for(let n of e)if(n.enrichPaymentRequiredResponse&&n.key in t)try{let a=await n.enrichPaymentRequiredResponse(t[n.key],s);a!==void 0&&(r[n.key]=a)}catch(a){console.warn(`[x402:extensions] extension "${n.key}" failed:`,a)}return Object.keys(r).length>0?r:void 0}function Ze(e,t){if(typeof e=="string"||typeof e=="function")return e;if(t in e)return e[t];let r=`${t.split(":")[0]}:*`;if(r in e)return e[r];if("*"in e)return e["*"];throw new Error(`No payTo configured for network "${t}"`)}function De(e){if(e.scheme==="batch-settlement"){let c=Array.isArray(e.network)?e.network[0]:e.network;if(!c)throw new Error('x402Middleware: scheme "batch-settlement" requires a network');let d=typeof e.payTo=="string"?e.payTo:void 0;if(!d)throw new Error('x402Middleware: scheme "batch-settlement" requires a string payTo address');return ce({payTo:d,network:c,price:e.amount,facilitatorUrl:e.facilitatorUrl,route:e.batchSettlement?.route,channelStore:e.batchSettlement?.channelStore,autoSettle:e.batchSettlement?.autoSettle,verbose:e.verbose})}let{payTo:t,amount:s,asset:r,description:n,resourceUrl:a,mimeType:p,timeoutSeconds:m,verbose:f=!1,getResourceUrl:l,getAmount:g,getDescription:o,extensions:y,declarations:E}=e,x=f?console.log.bind(console,"[x402:middleware]"):()=>{},b=typeof t=="function"?t._x402Defaults:void 0,k=e.facilitatorUrl??b?.facilitatorUrl,C=e.network?Array.isArray(e.network)?e.network:[e.network]:b?.network?[b.network]:[he],v=new Map;for(let c of C){let d=Ze(t,c);if(typeof d=="function"){let A=Se(d);if(A&&c!==A)throw new Error(`stripePayTo is configured for "${A}" but middleware includes network "${c}". Stripe only supports Base deposit addresses. Use a static payTo for other chains.`)}v.set(c,te({payTo:d,network:c,asset:r,facilitatorUrl:k,defaultTimeoutSeconds:m,scheme:e.scheme}))}let R=v.get(C[0]);return async(c,d,A)=>{try{let i=c.headers["payment-signature"];if(!i){x("No payment signature, returning 402");let M=l?.(c)??a??`${c.protocol}://${c.get("host")}${c.originalUrl}`,T=g?.(c)??s,L=o?.(c)??n,pe=parseFloat(T),w=[],P=null;for(let[,q]of v)try{let ne={amountAtomic:ge(pe,q.assetDecimals),resourceUrl:M,description:L,mimeType:p,timeoutSeconds:m},ue=await q.buildRequirements(ne);w.push(...ue.accepts),P||(P=ue)}catch(ne){x("Failed to build requirements for a network:",ne)}if(!P||w.length===0){d.status(500).json({error:"Failed to build payment requirements"});return}if(P={...P,accepts:w},y&&y.length>0){let q=await Ne(y,E??{},{response:P,request:{method:c.method,path:(c.baseUrl??"")+(c.route?.path??c.path),params:c.params}});q&&(P={...P,extensions:q})}let Me=R.encodeRequirements(P);d.setHeader("PAYMENT-REQUIRED",Me),d.status(402).json({error:"Payment required",accepts:P.accepts,resource:P.resource,...P.extensions?{extensions:P.extensions}:{}});return}x("Payment signature received, verifying...");let u=R;try{let T=JSON.parse(Buffer.from(i,"base64").toString())?.accepted?.network;T&&v.has(T)&&(u=v.get(T))}catch{}let h=await u.verifyPayment(i);if(!h.isValid){if(x("Payment verification failed:",h.invalidReason),e.onVerifyFailed)try{await e.onVerifyFailed({reason:h.invalidReason,resourceUrl:`${c.protocol}://${c.get("host")}${c.originalUrl}`})}catch{}d.status(402).json({error:"Payment verification failed",reason:h.invalidReason});return}x("Payment verified, settling...");let S=await u.settlePayment(i);if(!S.success){x("Payment settlement failed:",S.errorReason),d.status(402).json({error:"Payment settlement failed",reason:S.errorReason});return}x("Payment settled:",S.transaction);let _=S.network||C[0];if(e.onSettlement)try{await e.onSettlement({transaction:S.transaction,network:_,payer:h.payer??"",resourceUrl:`${c.protocol}://${c.get("host")}${c.originalUrl}`})}catch{}c.x402={transaction:S.transaction,payer:h.payer??"",network:_};let O={success:!0,transaction:S.transaction,network:_,payer:h.payer??""};if(S.extensions&&(O.extensions=S.extensions),d.setHeader("PAYMENT-RESPONSE",ee(O)),e.sponsoredAccess&&S.extensions?.["sponsored-access"]){let M=S.extensions["sponsored-access"],T=M?.info?.recommendations??M?.recommendations;if(T&&T.length>0){if(x("Injecting sponsored-access recommendations into response"),typeof e.sponsoredAccess=="object"&&e.sponsoredAccess.onMatch)try{e.sponsoredAccess.onMatch(T,{transaction:S.transaction,network:_,payer:h.payer??""})}catch{}let L=d.json.bind(d);d.json=function(w){return typeof e.sponsoredAccess=="object"&&e.sponsoredAccess.inject?L(e.sponsoredAccess.inject(w,T)):w&&typeof w=="object"&&!Array.isArray(w)?L({_x402_sponsored:T,...w}):L(w)}}}A()}catch(i){x("Middleware error:",i),d.status(500).json({error:"Payment processing error"})}}}var et=/^\/[a-zA-Z0-9_/:.\-~%]+$/;function ke(e){if(!e||!et.test(e))return!1;let t;try{t=decodeURIComponent(e)}catch{return!1}return!(t.includes("..")||t.includes("://"))}function H(e){return e.method==="POST"||e.method==="PUT"||e.method==="PATCH"}var tt=["GET","HEAD","DELETE"],rt=["POST","PUT","PATCH"];function Oe(e,t){let s=t.pathParams!==void 0&&Object.keys(t.pathParams).length>0,r={type:"http",method:e.method};H(e)?(r.bodyType=e.bodyType,r.body=e.input??{}):e.input!==void 0&&(r.queryParams=e.input),s&&(r.pathParams=t.pathParams);let n=e.output?.example!==void 0?{type:"json",example:e.output.example}:void 0,a=H(e)?rt:tt,p={type:{type:"string",const:"http"},method:{type:"string",enum:a}};H(e)?(p.bodyType={type:"string",enum:["json","form-data","text"]},p.body={type:"object",...e.inputSchema??{}}):e.inputSchema&&(p.queryParams={type:"object",...e.inputSchema}),e.pathParamsSchema&&(p.pathParams={type:"object",...e.pathParamsSchema});let m={input:{type:"object",properties:p,required:H(e)?["type","method","bodyType","body"]:["type","method"],additionalProperties:!1}};n&&(m.output={type:"object",properties:{type:{type:"string"},example:{type:"object",...e.output?.schema??{}}},required:["type"]});let f={$schema:"https://json-schema.org/draft/2020-12/schema",type:"object",properties:m,required:["input"]},l={info:{input:r,...n?{output:n}:{}},schema:f};return ke(t.routeTemplate)&&(l.routeTemplate=t.routeTemplate),l}var nt=["GET","HEAD","DELETE","POST","PUT","PATCH"];function Ie(){return{key:"bazaar",enrichPaymentRequiredResponse:(e,t)=>{if(e==null)return;let s=e,r=(s.method??t.request.method).toUpperCase();if(!nt.includes(r))return;let n={...s,method:r};return Oe(n,{pathParams:t.request.params,routeTemplate:t.request.path})}}}function Ue(e){return{bazaar:e}}var Be=require("@dexterai/x402-ads-types");0&&(module.exports={BASE_MAINNET_NETWORK,DEXTER_FACILITATOR_URL,FacilitatorClient,SOLANA_MAINNET_NETWORK,SPONSORED_ACCESS_EXTENSION_KEY,USDC_BASE,USDC_MINT,bazaarExtension,createX402Server,declareDiscoveryExtension,resolveDefaultAsset,x402Middleware});