{"version":3,"sources":["../src/types/x402-protocol.ts","../src/utils/helpers.ts","../src/client/transaction-builder.ts","../src/client/payment-interceptor.ts","../src/client/index.ts","../src/server/facilitator-client.ts","../src/server/payment-handler.ts"],"names":[],"mappings":";;;;AAQO,IAAM,oBAAA,GACX;AACK,IAAM,mBAAA,GACX;AAgBK,SAAS,gBAAgB,OAAA,EAA2C;AACzE,EAAA,OACE,YAAY,QAAA,IACZ,OAAA,KAAY,eAAA,IACZ,OAAA,CAAQ,WAAW,SAAS,CAAA;AAEhC;AAKO,SAAS,gBAAgB,OAAA,EAA0B;AACxD,EAAA,OAAO,OAAA,KAAY,YAAY,OAAA,KAAY,oBAAA;AAC7C;AAKO,SAAS,eAAe,OAAA,EAA0B;AACvD,EAAA,OAAO,OAAA,KAAY,mBAAmB,OAAA,KAAY,mBAAA;AACpD;AAKO,SAAS,eAAe,OAAA,EAAuC;AACpE,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,eAAA;AACH,MAAA,OAAO,mBAAA;AAAA;AAEb;AAKO,SAAS,gBAAgB,OAAA,EAAsC;AACpE,EAAA,IAAI,OAAA,KAAY,oBAAA,IAAwB,OAAA,KAAY,QAAA,EAAU;AAC5D,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,eAAA;AACT;;;ACvDA,IAAM,YAAA,GAAe,8CAAA;AACrB,IAAM,WAAA,GAAc,8CAAA;AAWb,SAAS,oBAAA,CACd,WAAA,EACA,mBAAA,EACA,WAAA,EACQ;AAER,EAAA,MAAM,oBAAoB,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,CAAA,CAAE,QAAA;AAAA,IAC7D;AAAA,GACF;AAGA,EAAA,MAAM,cAAA,GAAiC;AAAA,IACrC,WAAA,EAAa,CAAA;AAAA,IACb,QAAA,EAAU;AAAA,MACR,GAAA,EAAK,WAAA;AAAA,MACL,WAAA,EAAc,mBAAA,CAAoB,KAAA,EAAO,WAAA,IAA0B,EAAA;AAAA,MACnE,QAAA,EACG,mBAAA,CAAoB,KAAA,EAAO,QAAA,IAAuB;AAAA,KACvD;AAAA,IACA,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,WAAA,EAAa;AAAA;AACf,GACF;AAGA,EAAA,MAAM,gBAAgB,MAAA,CAAO,IAAA,CAAK,KAAK,SAAA,CAAU,cAAc,CAAC,CAAA,CAAE,QAAA;AAAA,IAChE;AAAA,GACF;AAEA,EAAA,OAAO,aAAA;AACT;AAOO,SAAS,iBAAiB,OAAA,EAAyB;AACxD,EAAA,IAAI,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO,qCAAA;AAAA,EACT;AACA,EAAA,OAAO,+BAAA;AACT;AAOO,SAAS,oBAAoB,OAAA,EAAyB;AAC3D,EAAA,IAAI,YAAY,oBAAA,EAAsB;AACpC,IAAA,OAAO,qCAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAY,mBAAA,EAAqB;AACnC,IAAA,OAAO,+BAAA;AAAA,EACT;AAEA,EAAA,OAAO,+BAAA;AACT;AAOO,SAAS,qBAAqB,OAAA,EAA6B;AAChE,EAAA,IAAI,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,YAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,WAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;AAQO,SAAS,aAAA,CAAc,QAAgB,QAAA,EAA0B;AACtE,EAAA,OAAO,IAAA,CAAK,MAAM,MAAA,GAAS,IAAA,CAAK,IAAI,EAAA,EAAI,QAAQ,CAAC,CAAA,CAAE,QAAA,EAAS;AAC9D;AAQO,SAAS,eAAA,CACd,aACA,QAAA,EACQ;AACR,EAAA,OAAO,OAAO,WAAW,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAI,QAAQ,CAAA;AACpD;AC3GA,IAAM,0BAAA,GAA6B,GAAA;AACnC,IAAM,wCAAA,GAA2C,CAAA;AAUjD,eAAsB,8BAAA,CACpB,MAAA,EACA,mBAAA,EACA,MAAA,EAC+B;AAC/B,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,MAAA,EAAQ,WAAW,CAAA;AAGrD,EAAA,MAAM,QAAA,GAAW,oBAAoB,KAAA,EAAO,QAAA;AAC5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,cAAA,GAAiB,IAAI,SAAA,CAAU,QAAQ,CAAA;AAG7C,EAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,SAAA,EAAW,QAAA,MAAc,MAAA,EAAQ,OAAA;AAC/D,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,SAAA,CAAU,aAAa,CAAA;AAG9C,EAAA,IAAI,CAAC,oBAAoB,KAAA,EAAO;AAC9B,IAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,WAAA,GAAc,IAAI,SAAA,CAAU,mBAAA,CAAoB,KAAK,CAAA;AAG3D,EAAA,IAAI,CAAC,oBAAoB,KAAA,EAAO;AAC9B,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACvD;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,SAAA,CAAU,mBAAA,CAAoB,KAAK,CAAA;AAE1D,EAAA,MAAM,eAAyC,EAAC;AAGhD,EAAA,YAAA,CAAa,IAAA;AAAA,IACX,qBAAqB,mBAAA,CAAoB;AAAA,MACvC,KAAA,EAAO;AAAA,KACR;AAAA,GACH;AAEA,EAAA,YAAA,CAAa,IAAA;AAAA,IACX,qBAAqB,mBAAA,CAAoB;AAAA,MACvC,aAAA,EAAe;AAAA,KAChB;AAAA,GACH;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,cAAA,CAAe,YAAY,WAAW,CAAA;AACxE,EAAA,MAAM,SAAA,GACJ,UAAU,KAAA,EAAO,QAAA,OAAe,qBAAA,CAAsB,QAAA,KAClD,qBAAA,GACA,gBAAA;AAGN,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,QAAW,SAAS,CAAA;AAGvE,EAAA,MAAM,YAAY,MAAM,yBAAA;AAAA,IACtB,UAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,iBAAiB,MAAM,yBAAA;AAAA,IAC3B,UAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,aAAA,GAAgB,MAAM,UAAA,CAAW,cAAA,CAAe,WAAW,WAAW,CAAA;AAC5E,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mDAAA,EAAsD,oBAAoB,KAAK,CAAA,gEAAA;AAAA,KACjF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,UAAA,CAAW,cAAA;AAAA,IACnC,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,0DAAA,EAA6D,oBAAoB,KAAK,CAAA,yEAAA;AAAA,KACxF;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GACJ,mBAAA,CAAoB,MAAA,IACnB,mBAAA,CACE,iBAAA;AAEL,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AACA,EAAA,MAAM,MAAA,GAAS,OAAO,SAAS,CAAA;AAG/B,EAAA,YAAA,CAAa,IAAA;AAAA,IACX,gCAAA;AAAA,MACE,SAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,MACL,EAAC;AAAA,MACD;AAAA;AACF,GACF;AAGA,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,UAAA,CAAW,mBAAmB,WAAW,CAAA;AAErE,EAAA,MAAM,OAAA,GAAU,IAAI,kBAAA,CAAmB;AAAA,IACrC,QAAA,EAAU,cAAA;AAAA,IACV,eAAA,EAAiB,SAAA;AAAA,IACjB;AAAA,GACD,EAAE,kBAAA,EAAmB;AAGtB,EAAA,MAAM,WAAA,GAAc,IAAI,oBAAA,CAAqB,OAAO,CAAA;AAGpD,EAAA,IAAI,OAAO,MAAA,EAAQ,eAAA,KAAoB,UAAA,EAAY;AACjD,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,eAAA,CAAgB,WAAW,CAAA;AAE7D,EAAA,OAAO,YAAA;AACT;;;ACjJO,SAAS,kBAAA,CACd,SACA,MAAA,EACA,MAAA,EACA,WAAmB,MAAA,CAAO,CAAC,CAAA,EAC3B,OAAA,GAAmB,KAAA,EACnB;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,KAAoB;AAClC,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,GAAG,IAAI,CAAA;AAAA,EACnD,CAAA;AAEA,EAAA,OAAO,OAAO,OAAoB,IAAA,KAA0C;AAC1E,IAAA,MAAM,GAAA,GAAM,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,CAAM,GAAA;AACtD,IAAA,GAAA,CAAI,8BAA8B,GAAG,CAAA;AAGrC,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAC1C,IAAA,GAAA,CAAI,0BAAA,EAA4B,SAAS,MAAM,CAAA;AAG/C,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,GAAA,CAAI,0CAA0C,CAAA;AAG9C,IAAA,MAAM,WAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AACzC,IAAA,GAAA,CAAI,yBAAyB,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAC,CAAA;AAEjE,IAAA,MAAM,yBAAA,GACJ,WAAA,CAAY,OAAA,IAAW,EAAC;AAI1B,IAAA,MAAM,uBAAuB,yBAAA,CAA0B,IAAA;AAAA,MACrD,CAAC,GAAA,KACC,GAAA,CAAI,WAAW,OAAA,IAAW,eAAA,CAAgB,IAAI,OAAO;AAAA,KACzD;AAEA,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,2EAAA;AAAA,QACA,yBAAA,CAA0B,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,OAAO;AAAA,OACpD;AACA,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AAIA,IAAA,MAAM,aAAA,GAAgB,MAAA;AAAA,MACpB,oBAAA,CAAqB,MAAA,IAClB,oBAAA,CACE,iBAAA,IACH;AAAA,KACJ;AAEA,IAAA,IAAI,QAAA,GAAW,MAAA,CAAO,CAAC,CAAA,IAAK,gBAAgB,QAAA,EAAU;AACpD,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAGA,IAAA,MAAM,WAAA,GAAc,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,CAAM,GAAA;AAE9D,IAAA,GAAA,CAAI,gCAAgC,CAAA;AAGpC,IAAA,MAAM,oBAAoB,MAAM,8BAAA;AAAA,MAC9B,MAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,GAAA,CAAI,iCAAiC,CAAA;AAGrC,IAAA,MAAM,aAAA,GAAgB,oBAAA;AAAA,MACpB,iBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,GAAA,CAAI,iCAAA,EAAmC,cAAc,MAAM,CAAA;AAG3D,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAG,IAAA;AAAA,MACH,OAAA,EAAS;AAAA,QACP,GAAI,IAAA,EAAM,OAAA,IAAW,EAAC;AAAA,QACtB,mBAAA,EAAqB;AAAA;AACvB,KACF;AAEA,IAAA,GAAA,CAAI,mDAAmD,CAAA;AACvD,IAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAA;AAClD,IAAA,GAAA,CAAI,wBAAA,EAA0B,cAAc,MAAM,CAAA;AAElD,IAAA,OAAO,aAAA;AAAA,EACT,CAAA;AACF;;;AChHO,IAAM,aAAN,MAAiB;AAAA,EACd,YAAA;AAAA,EAER,YAAY,MAAA,EAA0B;AACpC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAI/D,IAAA,MAAM,UAAU,MAAA,CAAO,WAAA,IAAe,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,CAAA;AAEtE,IAAA,IAAA,CAAK,YAAA,GAAe,kBAAA;AAAA,MAClB,OAAA;AAAA,MACA,MAAA,CAAO,MAAA;AAAA,MACP,MAAA;AAAA,MACA,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,CAAC,CAAA;AAAA,MACzB,OAAO,OAAA,IAAW;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,KAAA,EAAoB,IAAA,EAAuC;AACrE,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,IAAI,CAAA;AAAA,EACtC;AACF;AAKO,SAAS,iBAAiB,MAAA,EAAsC;AACrE,EAAA,OAAO,IAAI,WAAW,MAAM,CAAA;AAC9B;;;AChBO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,cAAA,EAAwB;AAAxB,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EAAyB;AAAA;AAAA;AAAA;AAAA,EAK7C,MAAM,YAAA,GAA2C;AAC/C,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA,UAAA,CAAY,CAAA;AAC/D,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,OAAA,EAAkC;AAClD,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,YAAA,EAAa;AAG9C,IAAA,MAAM,cAAA,GAAkB,cAAc,KAAA,EAA2B,IAAA;AAAA,MAC/D,CAAC,IAAA,KACC,IAAA,CAAK,MAAA,KAAW,OAAA,IAChB,gBAAgB,IAAA,CAAK,OAAO,CAAA,IAC5B,eAAA,CAAgB,OAAO,CAAA;AAAA,OAEtB,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,KAAM,QAAQ,QAAA,CAAS,QAAQ,CAAA,IAC5D,IAAA,CAAK,OAAA,KAAY,OAAA;AAAA,KACvB;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB,KAAA,EAAO,QAAA,EAAU;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,yCAAyC,OAAO,CAAA,8CAAA;AAAA,OAClD;AAAA,IACF;AAEA,IAAA,OAAO,eAAe,KAAA,CAAM,QAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,aAAA,EACA,mBAAA,EACyB;AACzB,IAAA,IAAI;AAEF,MAAA,MAAM,iBAAiC,IAAA,CAAK,KAAA;AAAA,QAC1C,OAAO,IAAA,CAAK,aAAA,EAAe,QAAQ,CAAA,CAAE,SAAS,MAAM;AAAA,OACtD;AAEA,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,cAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA,OAAA,CAAA,EAAW;AAAA,QAC5D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,aAAa;AAAA,OACnC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,6BAAA,EAAgC,SAAS,MAAM,CAAA,CAAA,CAAA;AAAA,UAC/C;AAAA,SACF;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,aAAA,EAAe;AAAA,SACjB;AAAA,MACF;AAGA,MAAA,MAAM,mBAAA,GAAsC,MAAM,QAAA,CAAS,IAAA,EAAK;AAChE,MAAA,OAAO,mBAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,aAAA,EACA,mBAAA,EACyB;AACzB,IAAA,IAAI;AAEF,MAAA,MAAM,iBAAiC,IAAA,CAAK,KAAA;AAAA,QAC1C,OAAO,IAAA,CAAK,aAAA,EAAe,QAAQ,CAAA,CAAE,SAAS,MAAM;AAAA,OACtD;AAEA,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,cAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA,OAAA,CAAA,EAAW;AAAA,QAC5D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,aAAa;AAAA,OACnC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,6BAAA,EAAgC,SAAS,MAAM,CAAA,CAAA,CAAA;AAAA,UAC/C;AAAA,SACF;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,WAAA,EAAa,yBAAA;AAAA,UACb,WAAA,EAAa,EAAA;AAAA,UACb,SAAS,mBAAA,CAAoB;AAAA,SAC/B;AAAA,MACF;AAGA,MAAA,MAAM,mBAAA,GAAsC,MAAM,QAAA,CAAS,IAAA,EAAK;AAChE,MAAA,OAAO,mBAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,yBAAA;AAAA,QACb,WAAA,EAAa,EAAA;AAAA,QACb,SAAS,mBAAA,CAAoB;AAAA,OAC/B;AAAA,IACF;AAAA,EACF;AACF;;;AC9IO,IAAM,qBAAN,MAAyB;AAAA,EACtB,iBAAA;AAAA,EACA,MAAA;AAAA,EAER,YAAY,MAAA,EAA0B;AACpC,IAAA,MAAM,YAAA,GACJ,MAAA,CAAO,YAAA,IAAgB,oBAAA,CAAqB,OAAO,OAAO,CAAA;AAE5D,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAA,EAAS,cAAA,CAAe,MAAA,CAAO,OAAO,CAAA;AAAA,MACtC,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAAA,MACxD,YAAA;AAAA,MACA,kBAAA,EAAoB,OAAO,kBAAA,IAAsB,kBAAA;AAAA,MACjD,qBAAA,EAAuB,OAAO,qBAAA,IAAyB;AAAA,KACzD;AAEA,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,iBAAA,CAAkB,MAAA,CAAO,cAAc,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eACE,OAAA,EACe;AAEf,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAE9B,MAAA,OACE,QAAQ,GAAA,CAAI,mBAAmB,CAAA,IAAK,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAAA,IAEvE;AAIA,IAAA,MAAM,gBAAA,GACJ,OAAA,CAAQ,mBAAmB,CAAA,IAAK,QAAQ,mBAAmB,CAAA;AAC7D,IAAA,OAAO,KAAA,CAAM,QAAQ,gBAAgB,CAAA,GACjC,iBAAiB,CAAC,CAAA,IAAK,OACvB,gBAAA,IAAoB,IAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,yBAAA,CACJ,WAAA,EACA,WAAA,EAC8B;AAE9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,WAAA;AAAA,MAC5C,KAAK,MAAA,CAAO;AAAA,KACd;AAEA,IAAA,MAAM,mBAAA,GAA2C;AAAA,MAC/C,MAAA,EAAQ,OAAA;AAAA,MACR,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,KAAA,EAAO,KAAK,MAAA,CAAO,eAAA;AAAA,MACnB,iBAAA,EACE,WAAA,CAAY,iBAAA,IAAqB,IAAA,CAAK,MAAA,CAAO,qBAAA;AAAA,MAC/C,KAAA,EAAO,YAAY,KAAA,CAAM,OAAA;AAAA,MACzB,KAAA,EAAO;AAAA,QACL,QAAA;AAAA,QACA,WAAA,EAAa,WAAA,CAAY,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,kBAAA;AAAA,QACpD,QAAA,EAAU,YAAY,QAAA,IAAY,kBAAA;AAAA,QAClC,QAAA,EAAU;AAAA;AACZ,KACF;AAEA,IAAA,OAAO,mBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAA,CACE,cACA,WAAA,EAIA;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,CAAA;AAAA,QACb,QAAA,EAAU;AAAA,UACR,GAAA,EAAK,WAAA;AAAA,UACL,WAAA,EAAc,YAAA,CAAa,KAAA,EAAO,WAAA,IAA0B,EAAA;AAAA,UAC5D,QAAA,EACG,YAAA,CAAa,KAAA,EAAO,QAAA,IAAuB;AAAA,SAChD;AAAA,QACA,OAAA,EAAS,CAAC,YAAY,CAAA;AAAA,QACtB,KAAA,EAAO;AAAA;AACT,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,aAAA,EACA,mBAAA,EACyB;AACzB,IAAA,OAAO,KAAK,iBAAA,CAAkB,aAAA;AAAA,MAC5B,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,aAAA,EACA,mBAAA,EACyB;AACzB,IAAA,OAAO,KAAK,iBAAA,CAAkB,aAAA;AAAA,MAC5B,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,KAAK,MAAA,CAAO,eAAA;AAAA,EACrB;AACF","file":"index.mjs","sourcesContent":["import type { Network } from \"@payai/x402/types\";\n\n/**\n * Solana-specific x402 Protocol Types (v2)\n * These are Solana-only variants of x402 protocol types\n */\n\n// CAIP-2 network identifiers for Solana\nexport const SOLANA_MAINNET_CAIP2 =\n  \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\" as const;\nexport const SOLANA_DEVNET_CAIP2 =\n  \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\" as const;\n\n/**\n * Solana network type - supports both simple and CAIP-2 formats\n * Simple: \"solana\" | \"solana-devnet\" (for user-facing config)\n * CAIP-2: \"solana:chainId\" (used in protocol)\n */\nexport type SolanaNetworkSimple = \"solana\" | \"solana-devnet\";\nexport type SolanaNetworkCAIP2 =\n  | typeof SOLANA_MAINNET_CAIP2\n  | typeof SOLANA_DEVNET_CAIP2;\nexport type SolanaNetwork = SolanaNetworkSimple | SolanaNetworkCAIP2;\n\n/**\n * Check if a network string is a Solana network (any format)\n */\nexport function isSolanaNetwork(network: string): network is SolanaNetwork {\n  return (\n    network === \"solana\" ||\n    network === \"solana-devnet\" ||\n    network.startsWith(\"solana:\")\n  );\n}\n\n/**\n * Check if network is mainnet\n */\nexport function isSolanaMainnet(network: string): boolean {\n  return network === \"solana\" || network === SOLANA_MAINNET_CAIP2;\n}\n\n/**\n * Check if network is devnet\n */\nexport function isSolanaDevnet(network: string): boolean {\n  return network === \"solana-devnet\" || network === SOLANA_DEVNET_CAIP2;\n}\n\n/**\n * Convert simple network name to CAIP-2 format\n */\nexport function toCAIP2Network(network: SolanaNetworkSimple): Network {\n  switch (network) {\n    case \"solana\":\n      return SOLANA_MAINNET_CAIP2;\n    case \"solana-devnet\":\n      return SOLANA_DEVNET_CAIP2;\n  }\n}\n\n/**\n * Convert CAIP-2 network to simple name (for display/config)\n */\nexport function toSimpleNetwork(network: string): SolanaNetworkSimple {\n  if (network === SOLANA_MAINNET_CAIP2 || network === \"solana\") {\n    return \"solana\";\n  }\n  return \"solana-devnet\";\n}\n","import type { VersionedTransaction } from \"@solana/web3.js\";\nimport type { PaymentRequirements, PaymentPayload } from \"@payai/x402/types\";\nimport {\n  type TokenAsset,\n  SOLANA_MAINNET_CAIP2,\n  SOLANA_DEVNET_CAIP2,\n  isSolanaMainnet,\n} from \"../types\";\n\n/**\n * Helper utilities for x402 payment processing (v2)\n */\n\n// USDC token addresses\nconst USDC_MAINNET = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\nconst USDC_DEVNET = \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\";\n\n/**\n * Create v2 payment payload from a signed transaction\n * Encodes transaction and payment details for X-PAYMENT header\n *\n * @param transaction - Signed Solana VersionedTransaction\n * @param paymentRequirements - The accepted payment requirements\n * @param resourceUrl - URL of the protected resource\n * @returns Base64-encoded payment payload for X-PAYMENT header\n */\nexport function createPaymentPayload(\n  transaction: VersionedTransaction,\n  paymentRequirements: PaymentRequirements,\n  resourceUrl: string,\n): string {\n  // Serialize the signed transaction to base64\n  const base64Transaction = Buffer.from(transaction.serialize()).toString(\n    \"base64\",\n  );\n\n  // Create v2 payment payload\n  const paymentPayload: PaymentPayload = {\n    x402Version: 2,\n    resource: {\n      url: resourceUrl,\n      description: (paymentRequirements.extra?.description as string) || \"\",\n      mimeType:\n        (paymentRequirements.extra?.mimeType as string) || \"application/json\",\n    },\n    accepted: paymentRequirements,\n    payload: {\n      transaction: base64Transaction,\n    },\n  };\n\n  // Encode payment payload as base64 for X-PAYMENT header\n  const paymentHeader = Buffer.from(JSON.stringify(paymentPayload)).toString(\n    \"base64\",\n  );\n\n  return paymentHeader;\n}\n\n/**\n * Get default RPC URL for a given Solana network\n * @param network - Network in any format (simple or CAIP-2)\n * @returns Default RPC URL for the network\n */\nexport function getDefaultRpcUrl(network: string): string {\n  if (isSolanaMainnet(network)) {\n    return \"https://api.mainnet-beta.solana.com\";\n  }\n  return \"https://api.devnet.solana.com\";\n}\n\n/**\n * Get RPC URL for a CAIP-2 network identifier\n * @param network - Network in CAIP-2 format (e.g., \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\")\n * @returns RPC URL for the network\n */\nexport function getRpcUrlForNetwork(network: string): string {\n  if (network === SOLANA_MAINNET_CAIP2) {\n    return \"https://api.mainnet-beta.solana.com\";\n  }\n  if (network === SOLANA_DEVNET_CAIP2) {\n    return \"https://api.devnet.solana.com\";\n  }\n  // Fallback for unknown networks\n  return \"https://api.devnet.solana.com\";\n}\n\n/**\n * Get default USDC token asset for a given Solana network\n * @param network - Network in any format (simple or CAIP-2)\n * @returns USDC token asset configuration\n */\nexport function getDefaultTokenAsset(network: string): TokenAsset {\n  if (isSolanaMainnet(network)) {\n    return {\n      address: USDC_MAINNET,\n      decimals: 6,\n    };\n  }\n  return {\n    address: USDC_DEVNET,\n    decimals: 6,\n  };\n}\n\n/**\n * Convert human-readable amount to token's smallest unit (atomic units)\n * @param amount - Human-readable amount (e.g., 2.5 for 2.5 USDC)\n * @param decimals - Token decimals (e.g., 6 for USDC, 9 for SOL)\n * @returns Amount in atomic units as string\n */\nexport function toAtomicUnits(amount: number, decimals: number): string {\n  return Math.floor(amount * Math.pow(10, decimals)).toString();\n}\n\n/**\n * Convert token's atomic units to human-readable amount\n * @param atomicUnits - Token amount in smallest units (as string or bigint)\n * @param decimals - Token decimals (e.g., 6 for USDC, 9 for SOL)\n * @returns Human-readable amount\n */\nexport function fromAtomicUnits(\n  atomicUnits: string | bigint | number,\n  decimals: number,\n): number {\n  return Number(atomicUnits) / Math.pow(10, decimals);\n}\n","import {\n  PublicKey,\n  Connection,\n  TransactionMessage,\n  VersionedTransaction,\n  ComputeBudgetProgram,\n  type TransactionInstruction,\n} from \"@solana/web3.js\";\nimport {\n  getAssociatedTokenAddress,\n  createTransferCheckedInstruction,\n  getMint,\n  TOKEN_PROGRAM_ID,\n  TOKEN_2022_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport type { PaymentRequirements } from \"@payai/x402/types\";\nimport type { WalletAdapter } from \"../types\";\n\n// Constants for compute budget\nconst DEFAULT_COMPUTE_UNIT_LIMIT = 7_000; // Sufficient for SPL token transfer\nconst DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1; // Minimal price\n\n/**\n * Build and sign a Solana transaction for x402 payment (v2)\n *\n * @param wallet - Wallet adapter for signing\n * @param paymentRequirements - Payment requirements from server\n * @param rpcUrl - Solana RPC URL\n * @returns Signed VersionedTransaction ready to be serialized\n */\nexport async function createSolanaPaymentTransaction(\n  wallet: WalletAdapter,\n  paymentRequirements: PaymentRequirements,\n  rpcUrl: string,\n): Promise<VersionedTransaction> {\n  const connection = new Connection(rpcUrl, \"confirmed\");\n\n  // Extract fee payer from payment requirements\n  const feePayer = paymentRequirements.extra?.feePayer as string | undefined;\n  if (!feePayer) {\n    throw new Error(\n      \"Missing facilitator feePayer in payment requirements (extra.feePayer).\",\n    );\n  }\n  const feePayerPubkey = new PublicKey(feePayer);\n\n  // Get wallet address - support both Anza wallet-adapter (publicKey) and custom implementations (address)\n  const walletAddress = wallet?.publicKey?.toString() || wallet?.address;\n  if (!walletAddress) {\n    throw new Error(\"Missing connected Solana wallet address or publicKey\");\n  }\n  const userPubkey = new PublicKey(walletAddress);\n\n  // Get destination (payTo)\n  if (!paymentRequirements.payTo) {\n    throw new Error(\"Missing payTo in payment requirements\");\n  }\n  const destination = new PublicKey(paymentRequirements.payTo);\n\n  // Get token mint\n  if (!paymentRequirements.asset) {\n    throw new Error(\"Missing token mint for SPL transfer\");\n  }\n  const mintPubkey = new PublicKey(paymentRequirements.asset);\n\n  const instructions: TransactionInstruction[] = [];\n\n  // The facilitator REQUIRES ComputeBudget instructions in positions 0 and 1\n  instructions.push(\n    ComputeBudgetProgram.setComputeUnitLimit({\n      units: DEFAULT_COMPUTE_UNIT_LIMIT,\n    }),\n  );\n\n  instructions.push(\n    ComputeBudgetProgram.setComputeUnitPrice({\n      microLamports: DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n    }),\n  );\n\n  // Determine program (token vs token-2022) by reading mint owner\n  const mintInfo = await connection.getAccountInfo(mintPubkey, \"confirmed\");\n  const programId =\n    mintInfo?.owner?.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n      ? TOKEN_2022_PROGRAM_ID\n      : TOKEN_PROGRAM_ID;\n\n  // Fetch mint to get decimals\n  const mint = await getMint(connection, mintPubkey, undefined, programId);\n\n  // Derive source and destination ATAs\n  const sourceAta = await getAssociatedTokenAddress(\n    mintPubkey,\n    userPubkey,\n    false,\n    programId,\n  );\n  const destinationAta = await getAssociatedTokenAddress(\n    mintPubkey,\n    destination,\n    false,\n    programId,\n  );\n\n  // Check if source ATA exists (user must already have token account)\n  const sourceAtaInfo = await connection.getAccountInfo(sourceAta, \"confirmed\");\n  if (!sourceAtaInfo) {\n    throw new Error(\n      `User does not have an Associated Token Account for ${paymentRequirements.asset}. Please create one first or ensure you have the required token.`,\n    );\n  }\n\n  // Check if destination ATA exists (receiver must already have token account)\n  const destAtaInfo = await connection.getAccountInfo(\n    destinationAta,\n    \"confirmed\",\n  );\n  if (!destAtaInfo) {\n    throw new Error(\n      `Destination does not have an Associated Token Account for ${paymentRequirements.asset}. The receiver must create their token account before receiving payments.`,\n    );\n  }\n\n  // Get payment amount - v2 uses `amount`, support legacy `maxAmountRequired` for compatibility\n  const amountStr =\n    paymentRequirements.amount ||\n    (paymentRequirements as unknown as { maxAmountRequired?: string })\n      .maxAmountRequired;\n\n  if (!amountStr) {\n    throw new Error(\"Missing amount in payment requirements\");\n  }\n  const amount = BigInt(amountStr);\n\n  // TransferChecked instruction\n  instructions.push(\n    createTransferCheckedInstruction(\n      sourceAta,\n      mintPubkey,\n      destinationAta,\n      userPubkey,\n      amount,\n      mint.decimals,\n      [],\n      programId,\n    ),\n  );\n\n  // Get recent blockhash\n  const { blockhash } = await connection.getLatestBlockhash(\"confirmed\");\n\n  const message = new TransactionMessage({\n    payerKey: feePayerPubkey,\n    recentBlockhash: blockhash,\n    instructions,\n  }).compileToV0Message();\n\n  // Create transaction\n  const transaction = new VersionedTransaction(message);\n\n  // Sign with user's wallet\n  if (typeof wallet?.signTransaction !== \"function\") {\n    throw new Error(\"Connected wallet does not support signTransaction\");\n  }\n\n  const userSignedTx = await wallet.signTransaction(transaction);\n\n  return userSignedTx;\n}\n","import type { PaymentRequirements, PaymentRequired } from \"@payai/x402/types\";\nimport type { WalletAdapter } from \"../types\";\nimport { isSolanaNetwork } from \"../types\";\nimport { createSolanaPaymentTransaction } from \"./transaction-builder\";\nimport { createPaymentPayload } from \"../utils\";\n\n/**\n * x402 Response structure (v2)\n */\ninterface X402Response extends PaymentRequired {\n  accepts: PaymentRequirements[];\n}\n\n/**\n * Create a custom fetch function that automatically handles x402 payments (v2)\n *\n * @param fetchFn - Base fetch function to use\n * @param wallet - Wallet adapter for signing transactions\n * @param rpcUrl - Solana RPC URL\n * @param maxValue - Maximum payment amount in atomic units (0 = no limit)\n * @param verbose - Enable verbose logging (default: false)\n * @returns Wrapped fetch function with automatic payment handling\n */\nexport function createPaymentFetch(\n  fetchFn: typeof fetch,\n  wallet: WalletAdapter,\n  rpcUrl: string,\n  maxValue: bigint = BigInt(0),\n  verbose: boolean = false,\n) {\n  const log = (...args: unknown[]) => {\n    if (verbose) console.log(\"[x402-solana]\", ...args);\n  };\n\n  return async (input: RequestInfo, init?: RequestInit): Promise<Response> => {\n    const url = typeof input === \"string\" ? input : input.url;\n    log(\"Making initial request to:\", url);\n\n    // Make initial request\n    const response = await fetchFn(input, init);\n    log(\"Initial response status:\", response.status);\n\n    // If not 402, return as-is\n    if (response.status !== 402) {\n      return response;\n    }\n\n    log(\"Got 402, parsing payment requirements...\");\n\n    // Parse payment requirements from 402 response\n    const rawResponse = (await response.json()) as X402Response;\n    log(\"Payment requirements:\", JSON.stringify(rawResponse, null, 2));\n\n    const parsedPaymentRequirements: PaymentRequirements[] =\n      rawResponse.accepts || [];\n\n    // Select first suitable payment requirement for Solana\n    // Supports both simple format (\"solana\", \"solana-devnet\") and CAIP-2 format (\"solana:chainId\")\n    const selectedRequirements = parsedPaymentRequirements.find(\n      (req: PaymentRequirements) =>\n        req.scheme === \"exact\" && isSolanaNetwork(req.network),\n    );\n\n    if (!selectedRequirements) {\n      console.error(\n        \"❌ No suitable Solana payment requirements found. Available networks:\",\n        parsedPaymentRequirements.map((req) => req.network),\n      );\n      throw new Error(\"No suitable Solana payment requirements found\");\n    }\n\n    // Check amount against max value if specified\n    // v2 uses `amount`, but we also support legacy `maxAmountRequired` for backwards compatibility\n    const paymentAmount = BigInt(\n      selectedRequirements.amount ||\n        (selectedRequirements as unknown as { maxAmountRequired?: string })\n          .maxAmountRequired ||\n        \"0\",\n    );\n\n    if (maxValue > BigInt(0) && paymentAmount > maxValue) {\n      throw new Error(\"Payment amount exceeds maximum allowed\");\n    }\n\n    // Get the resource URL for the payment payload\n    const resourceUrl = typeof input === \"string\" ? input : input.url;\n\n    log(\"Creating signed transaction...\");\n\n    // Create signed transaction\n    const signedTransaction = await createSolanaPaymentTransaction(\n      wallet,\n      selectedRequirements,\n      rpcUrl,\n    );\n    log(\"Transaction signed successfully\");\n\n    // Create v2 payment payload with resource and accepted fields\n    const paymentHeader = createPaymentPayload(\n      signedTransaction,\n      selectedRequirements,\n      resourceUrl,\n    );\n    log(\"Payment header created, length:\", paymentHeader.length);\n\n    // Retry with V2 payment header\n    const newInit = {\n      ...init,\n      headers: {\n        ...(init?.headers || {}),\n        \"PAYMENT-SIGNATURE\": paymentHeader,\n      },\n    };\n\n    log(\"Retrying request with PAYMENT-SIGNATURE header...\");\n    const retryResponse = await fetchFn(input, newInit);\n    log(\"Retry response status:\", retryResponse.status);\n\n    return retryResponse;\n  };\n}\n","import type { X402ClientConfig } from \"../types\";\nimport { getDefaultRpcUrl } from \"../utils\";\nimport { createPaymentFetch } from \"./payment-interceptor\";\n\n/**\n * x402 Solana Client (v2)\n * Handles automatic payment for x402-protected endpoints\n */\nexport class X402Client {\n  private paymentFetch: ReturnType<typeof createPaymentFetch>;\n\n  constructor(config: X402ClientConfig) {\n    const rpcUrl = config.rpcUrl || getDefaultRpcUrl(config.network);\n\n    // Use custom fetch if provided, otherwise use native fetch\n    // globalThis.fetch works in both browser and Node.js (18+)\n    const fetchFn = config.customFetch || globalThis.fetch.bind(globalThis);\n\n    this.paymentFetch = createPaymentFetch(\n      fetchFn,\n      config.wallet,\n      rpcUrl,\n      config.amount || BigInt(0),\n      config.verbose || false,\n    );\n  }\n\n  /**\n   * Make a fetch request with automatic x402 payment handling.\n   * If a customFetch was provided in the config, it will be used for all requests.\n   */\n  async fetch(input: RequestInfo, init?: RequestInit): Promise<Response> {\n    return this.paymentFetch(input, init);\n  }\n}\n\n/**\n * Create an x402 client instance\n */\nexport function createX402Client(config: X402ClientConfig): X402Client {\n  return new X402Client(config);\n}\n\n// Re-export types for convenience\nexport type { X402ClientConfig, WalletAdapter } from \"../types\";\n","import type {\n  PaymentRequirements,\n  PaymentPayload,\n  VerifyResponse,\n  SettleResponse,\n  SupportedResponse,\n} from \"@payai/x402/types\";\nimport { isSolanaNetwork } from \"../types\";\n\n/**\n * Facilitator supported kind (from /supported endpoint)\n */\ninterface SupportedKind {\n  x402Version: number;\n  scheme: string;\n  network: string;\n  extra?: {\n    feePayer?: string;\n    [key: string]: unknown;\n  };\n}\n\n/**\n * Client for communicating with x402 facilitator service (v2)\n */\nexport class FacilitatorClient {\n  constructor(private facilitatorUrl: string) {}\n\n  /**\n   * Get supported payment kinds from facilitator\n   */\n  async getSupported(): Promise<SupportedResponse> {\n    const response = await fetch(`${this.facilitatorUrl}/supported`);\n    if (!response.ok) {\n      throw new Error(`Facilitator /supported returned ${response.status}`);\n    }\n    return response.json();\n  }\n\n  /**\n   * Get fee payer address for a Solana network\n   * @param network - Network in any format (simple or CAIP-2)\n   */\n  async getFeePayer(network: string): Promise<string> {\n    const supportedData = await this.getSupported();\n\n    // Look for network support - match by CAIP-2 prefix for Solana networks\n    const networkSupport = (supportedData.kinds as SupportedKind[])?.find(\n      (kind) =>\n        kind.scheme === \"exact\" &&\n        isSolanaNetwork(kind.network) &&\n        isSolanaNetwork(network) &&\n        // Match if both are same network type (mainnet or devnet)\n        (kind.network.includes(\"devnet\") === network.includes(\"devnet\") ||\n          kind.network === network),\n    );\n\n    if (!networkSupport?.extra?.feePayer) {\n      throw new Error(\n        `Facilitator does not support network \"${network}\" with scheme \"exact\" or feePayer not provided`,\n      );\n    }\n\n    return networkSupport.extra.feePayer;\n  }\n\n  /**\n   * Verify payment with facilitator\n   * @returns VerifyResponse with isValid and optional invalidReason\n   */\n  async verifyPayment(\n    paymentHeader: string,\n    paymentRequirements: PaymentRequirements,\n  ): Promise<VerifyResponse> {\n    try {\n      // Decode the base64 payment payload\n      const paymentPayload: PaymentPayload = JSON.parse(\n        Buffer.from(paymentHeader, \"base64\").toString(\"utf8\"),\n      );\n\n      const verifyPayload = {\n        paymentPayload,\n        paymentRequirements,\n      };\n\n      const response = await fetch(`${this.facilitatorUrl}/verify`, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n        },\n        body: JSON.stringify(verifyPayload),\n      });\n\n      if (!response.ok) {\n        const errorBody = await response.text();\n        console.error(\n          `Facilitator /verify returned ${response.status}:`,\n          errorBody,\n        );\n        return {\n          isValid: false,\n          invalidReason: \"unexpected_verify_error\",\n        };\n      }\n\n      // Facilitator returns VerifyResponse with status 200 even when validation fails\n      const facilitatorResponse: VerifyResponse = await response.json();\n      return facilitatorResponse;\n    } catch (error) {\n      console.error(\"Payment verification failed:\", error);\n      return {\n        isValid: false,\n        invalidReason: \"unexpected_verify_error\",\n      };\n    }\n  }\n\n  /**\n   * Settle payment with facilitator\n   * @returns SettleResponse with success status and optional errorReason\n   */\n  async settlePayment(\n    paymentHeader: string,\n    paymentRequirements: PaymentRequirements,\n  ): Promise<SettleResponse> {\n    try {\n      // Decode the base64 payment payload\n      const paymentPayload: PaymentPayload = JSON.parse(\n        Buffer.from(paymentHeader, \"base64\").toString(\"utf8\"),\n      );\n\n      const settlePayload = {\n        paymentPayload,\n        paymentRequirements,\n      };\n\n      const response = await fetch(`${this.facilitatorUrl}/settle`, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n        },\n        body: JSON.stringify(settlePayload),\n      });\n\n      if (!response.ok) {\n        const errorBody = await response.text();\n        console.error(\n          `Facilitator /settle returned ${response.status}:`,\n          errorBody,\n        );\n        return {\n          success: false,\n          errorReason: \"unexpected_settle_error\",\n          transaction: \"\",\n          network: paymentRequirements.network,\n        };\n      }\n\n      // Facilitator returns SettleResponse with status 200 even when settlement fails\n      const facilitatorResponse: SettleResponse = await response.json();\n      return facilitatorResponse;\n    } catch (error) {\n      console.error(\"Payment settlement failed:\", error);\n      return {\n        success: false,\n        errorReason: \"unexpected_settle_error\",\n        transaction: \"\",\n        network: paymentRequirements.network,\n      };\n    }\n  }\n}\n","import type {\n  PaymentRequirements,\n  PaymentRequired,\n  VerifyResponse,\n  SettleResponse,\n  Network,\n} from \"@payai/x402/types\";\nimport type { X402ServerConfig, RouteConfig, TokenAsset } from \"../types\";\nimport { toCAIP2Network } from \"../types\";\nimport { getDefaultRpcUrl, getDefaultTokenAsset } from \"../utils\";\nimport { FacilitatorClient } from \"./facilitator-client\";\n\n/**\n * Internal configuration with defaults resolved\n */\ninterface InternalConfig {\n  network: string; // CAIP-2 format\n  treasuryAddress: string;\n  facilitatorUrl: string;\n  rpcUrl: string;\n  defaultToken: TokenAsset;\n  defaultDescription: string;\n  defaultTimeoutSeconds: number;\n}\n\n/**\n * x402 Payment Handler for server-side payment processing (v2)\n * Framework agnostic - works with any Node.js HTTP framework\n */\nexport class X402PaymentHandler {\n  private facilitatorClient: FacilitatorClient;\n  private config: InternalConfig;\n\n  constructor(config: X402ServerConfig) {\n    const defaultToken =\n      config.defaultToken || getDefaultTokenAsset(config.network);\n\n    this.config = {\n      network: toCAIP2Network(config.network),\n      treasuryAddress: config.treasuryAddress,\n      facilitatorUrl: config.facilitatorUrl,\n      rpcUrl: config.rpcUrl || getDefaultRpcUrl(config.network),\n      defaultToken,\n      defaultDescription: config.defaultDescription || \"Payment required\",\n      defaultTimeoutSeconds: config.defaultTimeoutSeconds || 300,\n    };\n\n    this.facilitatorClient = new FacilitatorClient(config.facilitatorUrl);\n  }\n\n  /**\n   * Extract payment header from request headers (v2)\n   * Pass in headers object from any framework (Next.js, Express, etc.)\n   *\n   * Note: v2 uses PAYMENT-SIGNATURE header (v1 used X-PAYMENT)\n   */\n  extractPayment(\n    headers: Record<string, string | string[] | undefined> | Headers,\n  ): string | null {\n    // Handle Headers object (Next.js, Fetch API)\n    if (headers instanceof Headers) {\n      // v2 header (PAYMENT-SIGNATURE)\n      return (\n        headers.get(\"PAYMENT-SIGNATURE\") || headers.get(\"payment-signature\")\n      );\n    }\n\n    // Handle plain object (Express, Fastify, etc.)\n    // v2 header (PAYMENT-SIGNATURE)\n    const paymentSignature =\n      headers[\"PAYMENT-SIGNATURE\"] || headers[\"payment-signature\"];\n    return Array.isArray(paymentSignature)\n      ? paymentSignature[0] || null\n      : paymentSignature || null;\n  }\n\n  /**\n   * Create payment requirements for a protected resource\n   *\n   * @param routeConfig - Route-specific configuration\n   * @param resourceUrl - URL of the protected resource\n   * @returns Payment requirements object\n   */\n  async createPaymentRequirements(\n    routeConfig: RouteConfig,\n    resourceUrl: string,\n  ): Promise<PaymentRequirements> {\n    // Get fee payer from facilitator\n    const feePayer = await this.facilitatorClient.getFeePayer(\n      this.config.network,\n    );\n\n    const paymentRequirements: PaymentRequirements = {\n      scheme: \"exact\",\n      network: this.config.network as Network,\n      amount: routeConfig.amount,\n      payTo: this.config.treasuryAddress,\n      maxTimeoutSeconds:\n        routeConfig.maxTimeoutSeconds || this.config.defaultTimeoutSeconds,\n      asset: routeConfig.asset.address,\n      extra: {\n        feePayer,\n        description: routeConfig.description || this.config.defaultDescription,\n        mimeType: routeConfig.mimeType || \"application/json\",\n        resource: resourceUrl,\n      },\n    };\n\n    return paymentRequirements;\n  }\n\n  /**\n   * Create a 402 Payment Required response body (v2)\n   * Use this with your framework's response method\n   *\n   * @param requirements - Payment requirements (from createPaymentRequirements)\n   * @param resourceUrl - URL of the protected resource\n   */\n  create402Response(\n    requirements: PaymentRequirements,\n    resourceUrl: string,\n  ): {\n    status: 402;\n    body: PaymentRequired;\n  } {\n    return {\n      status: 402,\n      body: {\n        x402Version: 2,\n        resource: {\n          url: resourceUrl,\n          description: (requirements.extra?.description as string) || \"\",\n          mimeType:\n            (requirements.extra?.mimeType as string) || \"application/json\",\n        },\n        accepts: [requirements],\n        error: \"Payment required\",\n      },\n    };\n  }\n\n  /**\n   * Verify payment with facilitator\n   * @returns VerifyResponse with isValid and optional invalidReason\n   */\n  async verifyPayment(\n    paymentHeader: string,\n    paymentRequirements: PaymentRequirements,\n  ): Promise<VerifyResponse> {\n    return this.facilitatorClient.verifyPayment(\n      paymentHeader,\n      paymentRequirements,\n    );\n  }\n\n  /**\n   * Settle payment with facilitator\n   * @returns SettleResponse with success status and optional errorReason\n   */\n  async settlePayment(\n    paymentHeader: string,\n    paymentRequirements: PaymentRequirements,\n  ): Promise<SettleResponse> {\n    return this.facilitatorClient.settlePayment(\n      paymentHeader,\n      paymentRequirements,\n    );\n  }\n\n  /**\n   * Get the network in CAIP-2 format\n   */\n  getNetwork(): string {\n    return this.config.network;\n  }\n\n  /**\n   * Get the treasury address\n   */\n  getTreasuryAddress(): string {\n    return this.config.treasuryAddress;\n  }\n}\n"]}