@cartridge/controller 0.7.2 → 0.7.3

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 +1 @@
1
- {"version":3,"sources":["../../src/utils.ts","../../src/errors.ts","../../src/types.ts","../../src/node/account.ts","../../src/constants.ts","../../package.json","../../src/icon.ts","../../src/mutex.ts","../../src/provider.ts","../../src/node/server.ts","../../src/node/backend.ts","../../src/node/provider.ts"],"names":["ResponseCodes","params","call"],"mappings":";;;;;;;;AAwCO,SAAS,eAAe,KAAsB,EAAA;AACnD,EAAA,OAAO,OAAQ,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA;AAClC,IAAO,OAAA;AAAA,MACL,YAAY,IAAK,CAAA,UAAA;AAAA,MACjB,eAAA,EAAiB,iBAAkB,CAAA,IAAA,CAAK,eAAe,CAAA;AAAA,MACvD,QAAU,EAAA,QAAA,CAAS,KAAM,CAAA,IAAA,CAAK,QAAQ;AAAA,KACxC;AAAA,GACD,CAAA;AACH;AA2CO,SAAS,eAAe,QAAgD,EAAA;AAC7E,EAAO,OAAA;AAAA,IACL,GAAG,MAAO,CAAA,OAAA,CAAQ,SAAS,SAAa,IAAA,EAAE,CAAE,CAAA,OAAA;AAAA,MAC1C,CAAC,CAAC,MAAQ,EAAA,EAAE,OAAQ,EAAC,CACnB,KAAA,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAI,CAAA,CAAC,CAAO,MAAA;AAAA,QAC3B,MAAA;AAAA,QACA,QAAQ,CAAE,CAAA,UAAA;AAAA,QACV,YAAY,CAAE,CAAA;AAAA,OACd,CAAA;AAAA,KACN;AAAA,IACA,IAAI,QAAS,CAAA,QAAA,IAAY,EAAI,EAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AACtC,MAAA,MAAM,aAAa,SAAU,CAAA,aAAA;AAAA,QAC3B,CAAE,CAAA,KAAA;AAAA,QACF,gBAAA;AAAA,QACA,CAAE,CAAA,MAAA;AAAA,QACF,iBAAkB,CAAA;AAAA,OACpB;AACA,MAAA,MAAM,WAAW,SAAU,CAAA,WAAA;AAAA,QACzB,CAAE,CAAA,KAAA;AAAA,QACF,CAAE,CAAA,WAAA;AAAA,QACF,iBAAkB,CAAA;AAAA,OACpB;AAEA,MAAO,OAAA;AAAA,QACL,UAAY,EAAA,IAAA,CAAK,mBAAoB,CAAA,UAAA,EAAY,QAAQ,CAAA;AAAA,QACzD,YAAY,CAAE,CAAA;AAAA,OAChB;AAAA,KACD;AAAA,GACH;AACF;AAEO,SAAS,QAAW,GAAmB,EAAA;AAC5C,EAAA,OAAO,MAAM,OAAQ,CAAA,GAAG,CAAI,GAAA,GAAA,GAAM,CAAC,GAAG,CAAA;AACxC;;;AC5Ha,IAAA,iBAAA,GAAN,MAAM,kBAAA,SAA0B,KAAM,CAAA;AAAA,EAC3C,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,sBAAsB,CAAA;AAE5B,IAAO,MAAA,CAAA,cAAA,CAAe,IAAM,EAAA,kBAAA,CAAkB,SAAS,CAAA;AAAA;AAE3D;;;ACqBY,IAAA,aAAA,qBAAAA,cAAL,KAAA;AACL,EAAAA,eAAA,SAAU,CAAA,GAAA,SAAA;AACV,EAAAA,eAAA,eAAgB,CAAA,GAAA,eAAA;AAChB,EAAAA,eAAA,OAAQ,CAAA,GAAA,OAAA;AACR,EAAAA,eAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,eAAA,2BAA4B,CAAA,GAAA,2BAAA;AALlB,EAAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;;;ACjBZ,IAAqB,cAAA,GAArB,cAA4C,aAAc,CAAA;AAAA,EACjD,UAAA;AAAA,EAEP,YACE,QACA,EAAA;AAAA,IACE,MAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GAUF,EAAA;AACA,IAAA,KAAA,CAAM,EAAE,OAAA,EAAS,MAAO,EAAA,EAAG,QAAQ,CAAA;AAEnC,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAA,IAAA,CAAK,aAAa,uBAAwB,CAAA,eAAA;AAAA,MACxC,MAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,QACE,SAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,QAAQ,KAAuD,EAAA;AACnE,IAAI,IAAA;AACF,MAAM,MAAA,GAAA,GAAM,MAAM,IAAA,CAAK,UAAW,CAAA,kBAAA;AAAA,QAChC,eAAe,KAAK;AAAA,OACtB;AAEA,MAAO,OAAA,GAAA;AAAA,aACA,CAAG,EAAA;AACV,MAAA,OAAO,IAAK,CAAA,UAAA,CAAW,OAAQ,CAAA,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA;AACtD;AAEJ,CAAA;;;ACvEO,IAAM,YAAe,GAAA,wBAAA;;;ACA5B,IAAA,eAAA,GAAA;AAAA,EACE,IAAQ,EAAA,uBAAA;AAAA,EACR,OAAW,EAAA,OAAA;AAAA,EACX,WAAe,EAAA,sBAAA;AAAA,EACf,MAAU,EAAA,eAAA;AAAA,EACV,KAAS,EAAA,iBAAA;AAAA,EACT,IAAQ,EAAA,QAAA;AAAA,EACR,OAAW,EAAA;AAAA,IACT,YAAc,EAAA,MAAA;AAAA,IACd,KAAS,EAAA,iBAAA;AAAA,IACT,MAAU,EAAA,gCAAA;AAAA,IACV,cAAgB,EAAA,gCAAA;AAAA,IAChB,IAAQ,EAAA,MAAA;AAAA,IACR,OAAW,EAAA;AAAA,GACb;AAAA,EACA,OAAW,EAAA;AAAA,IACT,GAAK,EAAA;AAAA,MACH,KAAS,EAAA,mBAAA;AAAA,MACT,MAAU,EAAA,iBAAA;AAAA,MACV,OAAW,EAAA;AAAA,KACb;AAAA,IACA,WAAa,EAAA;AAAA,MACX,KAAS,EAAA,2BAAA;AAAA,MACT,MAAU,EAAA,yBAAA;AAAA,MACV,OAAW,EAAA;AAAA,KACb;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,KAAS,EAAA,wBAAA;AAAA,MACT,MAAU,EAAA,sBAAA;AAAA,MACV,OAAW,EAAA;AAAA,KACb;AAAA,IACA,YAAc,EAAA;AAAA,MACZ,KAAS,EAAA,4BAAA;AAAA,MACT,MAAU,EAAA;AAAA,KACZ;AAAA,IACA,SAAW,EAAA;AAAA,MACT,KAAS,EAAA,yBAAA;AAAA,MACT,MAAU,EAAA;AAAA;AACZ,GACF;AAAA,EACA,IAAQ,EAAA;AAAA,IACN,KAAS,EAAA;AAAA,MACP,cAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAU,EAAA;AAAA,MACR,KAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAa,EAAA,KAAA;AAAA,IACb,SAAa,EAAA,IAAA;AAAA,IACb,KAAS,EAAA,IAAA;AAAA,IACT,GAAO,EAAA,IAAA;AAAA,IACP,SAAa,EAAA;AAAA,MACX,MAAU,EAAA;AAAA,KACZ;AAAA,IACA,OAAW,EAAA;AAAA,GACb;AAAA,EACA,gBAAoB,EAAA;AAAA,IAClB,QAAY,EAAA,UAAA;AAAA,IACZ,IAAQ,EAAA;AAAA,GACV;AAAA,EACA,YAAgB,EAAA;AAAA,IACd,yBAA2B,EAAA,aAAA;AAAA,IAC3B,mBAAqB,EAAA,UAAA;AAAA,IACrB,uBAAyB,EAAA,UAAA;AAAA,IACzB,oBAAsB,EAAA,QAAA;AAAA,IACtB,SAAa,EAAA,UAAA;AAAA,IACb,QAAU,EAAA,QAAA;AAAA,IACV,iBAAmB,EAAA;AAAA,GACrB;AAAA,EACA,eAAmB,EAAA;AAAA,IACjB,qBAAuB,EAAA,aAAA;AAAA,IACvB,aAAe,EAAA,UAAA;AAAA,IACf,aAAe,EAAA,UAAA;AAAA,IACf,IAAQ,EAAA,SAAA;AAAA,IACR,QAAY,EAAA,UAAA;AAAA,IACZ,SAAW,EAAA,SAAA;AAAA,IACX,IAAQ,EAAA,UAAA;AAAA,IACR,UAAc,EAAA;AAAA;AAElB,CAAA;;;ACpFO,IAAM,IACX,GAAA,4keAAA;;;ACDF,SAAS,WAAc,GAAA;AAAC;AAMjB,IAAM,QAAN,MAAY;AAAA,EACT,aAAA,GAA+B,QAAQ,OAAQ,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvD,MAAa,MAAO,CAAA,MAAA,GAAS,KAA4B,EAAA;AACvD,IAAA,IAAI,OAAU,GAAA,WAAA;AACd,IAAA,IAAI,QAAe,OAAA,OAAA;AACnB,IAAA,MAAM,cAAc,IAAK,CAAA,aAAA;AACzB,IAAA,IAAA,CAAK,gBAAgB,IAAI,OAAA,CAAc,CAAC,OAAA,KAAa,UAAU,OAAQ,CAAA;AACvE,IAAM,MAAA,WAAA;AACN,IAAO,OAAA,OAAA;AAAA;AAEX,CAAA;;;ACDA,IAAM,KAAA,GAAQ,IAAI,KAAM,EAAA;AAExB,IAA8B,eAA9B,MAA2E;AAAA,EAClE,EAAK,GAAA,YAAA;AAAA,EACL,IAAO,GAAA,YAAA;AAAA,EACP,UAAU,eAAS,CAAA,OAAA;AAAA,EACnB,IAAO,GAAA,IAAA;AAAA,EAEP,OAAA;AAAA,EACA,gBAAgC,EAAC;AAAA,EAEhC,aAA2D,GAAA,IAAA;AAAA,EAEnE,MAAgB,SAAgD,GAAA;AAE9D,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,OAAO,IAAK,CAAA,OAAA;AAAA;AAId,IAAA,IAAI,KAAK,aAAe,EAAA;AACtB,MAAA,OAAO,IAAK,CAAA,aAAA;AAAA;AAGd,IAAM,MAAA,OAAA,GAAU,MAAM,KAAA,CAAM,MAAO,EAAA;AACnC,IAAA,OAAO,MAAM,IAAI,OAAmC,CAAA,OAAO,OAAY,KAAA;AACrE,MAAI,IAAA;AACF,QAAK,IAAA,CAAA,aAAA,GAAgB,KAAK,KAAM,EAAA;AAChC,QAAM,MAAA,MAAA,GAAS,MAAM,IAAK,CAAA,aAAA;AAC1B,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,OACd,SAAA;AACA,QAAA,IAAA,CAAK,aAAgB,GAAA,IAAA;AAAA;AACvB,KACD,CAAE,CAAA,OAAA,CAAQ,MAAM;AACf,MAAQ,OAAA,EAAA;AAAA,KACT,CAAA;AAAA;AACH,EAEA,OAAA,GAAqB,OAAO,IAAS,KAAA;AACnC,IAAA,QAAQ,KAAK,IAAM;AAAA,MACjB,KAAK,uBAAA;AACH,QAAA,MAAM,KAAK,SAAU,EAAA;AAErB,QAAA,IAAI,KAAK,OAAS,EAAA;AAChB,UAAO,OAAA,CAAC,WAAW,QAAQ,CAAA;AAAA;AAG7B,QAAA,OAAO,EAAC;AAAA,MAEV,KAAK,wBAA0B,EAAA;AAC7B,QAAA,IAAI,KAAK,OAAS,EAAA;AAChB,UAAO,OAAA,CAAC,IAAK,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA;AAG9B,QAAA,MAAM,UACJ,GAAA,IAAA,CAAK,MAAW,IAAA,IAAA,CAAK,MAAqC,CAAA,WAAA;AAE5D,QAAK,IAAA,CAAA,OAAA,GAAU,MAAM,IAAA,CAAK,SAAU,EAAA;AAEpC,QAAA,IAAI,CAAC,IAAA,CAAK,OAAW,IAAA,CAAC,UAAY,EAAA;AAChC,UAAK,IAAA,CAAA,OAAA,GAAU,MAAM,IAAA,CAAK,OAAQ,EAAA;AAAA;AAGpC,QAAA,IAAI,KAAK,OAAS,EAAA;AAChB,UAAO,OAAA,CAAC,IAAK,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA;AAG9B,QAAA,OAAO,EAAC;AAAA;AACV,MAEA,KAAK,mBAAA;AACH,QAAM,MAAA;AAAA,UACJ,IAAM,EAAA,EAAA;AAAA,UACN,OAAS,EAAA,8BAAA;AAAA,UACT,IAAM,EAAA;AAAA,SACR;AAAA,MAEF,KAAK,yBAA2B,EAAA;AAC9B,QAAA,IAAIC,UAAS,IAAK,CAAA,MAAA;AAClB,QAAO,OAAA,IAAA,CAAK,iBAAiBA,OAAM,CAAA;AAAA;AACrC,MAEA,KAAK,4BAA8B,EAAA;AACjC,QAAA,IAAIA,UAAS,IAAK,CAAA,MAAA;AAClB,QAAO,OAAA,IAAA,CAAK,mBAAoBA,CAAAA,OAAAA,CAAO,OAAO,CAAA;AAAA;AAChD,MAEA,KAAK,uBAAA;AACH,QAAI,IAAA,CAAC,KAAK,OAAS,EAAA;AACjB,UAAM,MAAA;AAAA,YACJ,IAAM,EAAA,EAAA;AAAA,YACN,OAAS,EAAA,8BAAA;AAAA,YACT,IAAM,EAAA;AAAA,WACR;AAAA;AAGF,QAAO,OAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,UAAW,EAAA;AAAA,MAEvC,KAAK,uBAAA;AACH,QAAM,MAAA;AAAA,UACJ,IAAM,EAAA,EAAA;AAAA,UACN,OAAS,EAAA,8BAAA;AAAA,UACT,IAAM,EAAA;AAAA,SACR;AAAA,MAEF,KAAK,6BAAA;AACH,QAAI,IAAA,CAAC,KAAK,OAAS,EAAA;AACjB,UAAM,MAAA;AAAA,YACJ,IAAM,EAAA,EAAA;AAAA,YACN,OAAS,EAAA,8BAAA;AAAA,YACT,IAAM,EAAA;AAAA,WACR;AAAA;AAGF,QAAA,IAAI,SAAS,IAAK,CAAA,MAAA;AAClB,QAAO,OAAA,MAAM,KAAK,OAAQ,CAAA,OAAA;AAAA,UACxB,MAAO,CAAA,KAAA,CAAM,GAAI,CAAA,CAACC,KAAU,MAAA;AAAA,YAC1B,iBAAiBA,KAAK,CAAA,gBAAA;AAAA,YACtB,YAAYA,KAAK,CAAA,WAAA;AAAA,YACjB,UAAUA,KAAK,CAAA;AAAA,WACf,CAAA;AAAA,SACJ;AAAA,MAEF,KAAK,8BAAA;AACH,QAAM,MAAA;AAAA,UACJ,IAAM,EAAA,EAAA;AAAA,UACN,OAAS,EAAA,8BAAA;AAAA,UACT,IAAM,EAAA;AAAA,SACR;AAAA,MAEF,KAAK,sBAAwB,EAAA;AAC3B,QAAI,IAAA,CAAC,KAAK,OAAS,EAAA;AACjB,UAAM,MAAA;AAAA,YACJ,IAAM,EAAA,EAAA;AAAA,YACN,OAAS,EAAA,8BAAA;AAAA,YACT,IAAM,EAAA;AAAA,WACR;AAAA;AAGF,QAAA,OAAO,MAAM,IAAA,CAAK,OAAQ,CAAA,WAAA,CAAY,KAAK,MAAmB,CAAA;AAAA;AAChE,MAEA,KAAK,uBAAA;AACH,QAAA,OAAO,EAAC;AAAA,MACV,KAAK,2BAAA;AACH,QAAA,OAAO,EAAC;AAAA,MACV;AACE,QAAM,MAAA;AAAA,UACJ,IAAM,EAAA,EAAA;AAAA,UACN,OAAS,EAAA,8BAAA;AAAA,UACT,IAAA,EAAM,CAA0B,uBAAA,EAAA,IAAA,CAAK,IAAI,CAAA;AAAA,SAC3C;AAAA;AACJ,GACF;AAAA,EAEA,EAAA,GAA0B,CACxB,KAAA,EACA,OACS,KAAA;AACT,IAAI,IAAA,KAAA,KAAU,iBAAqB,IAAA,KAAA,KAAU,gBAAkB,EAAA;AAC7D,MAAA,MAAM,IAAI,KAAA,CAAM,CAAkB,eAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AAE3C,IAAA,IAAA,CAAK,cAAc,IAAK,CAAA,EAAE,IAAM,EAAA,KAAA,EAAO,SAAyB,CAAA;AAAA,GAClE;AAAA,EAEA,GAAA,GAA2B,CACzB,KAAA,EACA,OACS,KAAA;AACT,IAAI,IAAA,KAAA,KAAU,iBAAqB,IAAA,KAAA,KAAU,gBAAkB,EAAA;AAC7D,MAAA,MAAM,IAAI,KAAA,CAAM,CAAkB,eAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AAE3C,IAAM,MAAA,GAAA,GAAM,KAAK,aAAc,CAAA,SAAA;AAAA,MAC7B,CAAC,GAAQ,KAAA,GAAA,CAAI,IAAS,KAAA,KAAA,IAAS,IAAI,OAAY,KAAA;AAAA,KACjD;AACA,IAAA,IAAI,OAAO,CAAG,EAAA;AACZ,MAAK,IAAA,CAAA,aAAA,CAAc,MAAO,CAAA,GAAA,EAAK,CAAC,CAAA;AAAA;AAClC,GACF;AAAA,EAEU,mBAAmB,OAAiB,EAAA;AAC5C,IAAK,IAAA,CAAA,aAAA,CACF,MAAO,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,SAAS,gBAAgB,CAAA,CAC7C,OAAQ,CAAA,CAAC,GAAQ,KAAA;AAChB,MAAC,GAAA,CAAI,QAAkD,OAAO,CAAA;AAAA,KAC/D,CAAA;AAAA;AACL,EAEU,oBAAoB,QAAoB,EAAA;AAChD,IAAK,IAAA,CAAA,aAAA,CACF,MAAO,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,SAAS,iBAAiB,CAAA,CAC9C,OAAQ,CAAA,CAAC,GAAQ,KAAA;AAChB,MAAC,GAAA,CAAI,QAAmD,QAAQ,CAAA;AAAA,KACjE,CAAA;AAAA;AASP,CAAA;ACvNO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAc,GAAA;AACZ,IAAA,IAAA,CAAK,SAAc,IAAa,CAAA,YAAA,CAAA,IAAA,CAAK,aAAc,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAG7D,IAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAG,OAAS,EAAA,CAAC,KAAU,KAAA;AACjC,MAAQ,OAAA,CAAA,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,MAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,QAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA;AAC3B,KACD,CAAA;AAAA;AACH,EAEQ,OAAU,GAAA;AAChB,IAAA,IAAI,KAAK,SAAW,EAAA;AAClB,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAAA;AAE7B,IAAA,IAAA,CAAK,OAAO,KAAM,EAAA;AAAA;AACpB,EAEQ,aAAA,CAAc,KAA2B,GAAqB,EAAA;AACpE,IAAA,IAAI,CAAC,GAAA,CAAI,GAAK,EAAA,UAAA,CAAW,WAAW,CAAG,EAAA;AACrC,MAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,MAAA,GAAA,CAAI,GAAI,EAAA;AACR,MAAA;AAAA;AAGF,IAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,CAAA,GAAA,CAAI,IAAI,KAAM,CAAA,GAAG,CAAE,CAAA,CAAC,CAAC,CAAA;AACxD,IAAM,MAAA,OAAA,GAAU,MAAO,CAAA,GAAA,CAAI,UAAU,CAAA;AAErC,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAA,CAAQ,KAAK,wCAAwC,CAAA;AACrD,MAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,MAAA,GAAA,CAAI,IAAI,sBAAsB,CAAA;AAC9B,MAAA;AAAA;AAGF,IAAA,IAAI,KAAK,eAAiB,EAAA;AACxB,MAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA;AAG9B,IAAA,GAAA,CAAI,SAAU,CAAA,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,IAAI,GAAA,CAAA,GAAA;AAAA,MACF;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,OAAQ,EAAA;AAAA;AACf,EAEA,MAAM,MAA0B,GAAA;AAC9B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,MAAA,IAAA,CAAK,MAAO,CAAA,MAAA,CAAO,CAAG,EAAA,WAAA,EAAa,MAAM;AACvC,QAAM,MAAA,OAAA,GAAU,IAAK,CAAA,MAAA,CAAO,OAAQ,EAAA;AACpC,QAAM,MAAA,GAAA,GAAM,CAAoB,iBAAA,EAAA,OAAA,CAAQ,IAAI,CAAA,SAAA,CAAA;AAC5C,QAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,OACZ,CAAA;AAED,MAAK,IAAA,CAAA,MAAA,CAAO,EAAG,CAAA,OAAA,EAAS,MAAM,CAAA;AAAA,KAC/B,CAAA;AAAA;AACH,EAEA,MAAM,eAAmC,GAAA;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,MAAA,IAAA,CAAK,eAAkB,GAAA,OAAA;AACvB,MAAA,IAAA,CAAK,cAAiB,GAAA,MAAA;AAEtB,MAAA,IAAA,CAAK,SAAY,GAAA,UAAA;AAAA,QACf,MAAM;AACJ,UAAA,OAAA,CAAQ,KAAK,0BAA0B,CAAA;AACvC,UAAO,MAAA,CAAA,IAAI,KAAM,CAAA,kCAAkC,CAAC,CAAA;AACpD,UAAA,IAAA,CAAK,OAAQ,EAAA;AAAA,SACf;AAAA,QACA,IAAI,EAAK,GAAA;AAAA,OACX;AAAA,KACD,CAAA;AAAA;AAEL,CAAA;;;AC3DO,IAAM,cAAN,MAAkB;AAAA,EACf,QAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAoB,EAAC;AAAA,EACrB,cAAA;AAAA,EAER,YAAY,QAAkB,EAAA;AAC5B,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAM,MAAA,IAAI,MAAM,sCAAsC,CAAA;AAAA;AAExD,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAChB,IAAA,IAAA,CAAK,WAAmB,GAAA,IAAA,CAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,cAAc,CAAA;AAAA;AAC5D,EAEA,MAAc,qBAAuC,GAAA;AACnD,IAAI,IAAA;AACF,MAAS,MAAA,EAAA,CAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,KACvB,CAAA,MAAA;AACN,MAAI,IAAA;AACF,QAAA,MAAS,SAAM,IAAK,CAAA,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,eAC1C,KAAY,EAAA;AACnB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAA8B,2BAAA,EAAA,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA;AAAA,SAC/D;AAAA;AACF;AACF;AACF,EAEA,MAAc,QAA0B,GAAA;AACtC,IAAI,IAAA;AACF,MAAA,MAAM,OAAU,GAAA,MAAS,EAAS,CAAA,QAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAC3D,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA;AAEjC,MAAA,IAAI,OAAO,MAAA,KAAW,QAAY,IAAA,MAAA,KAAW,IAAM,EAAA;AACjD,QAAM,MAAA,IAAI,MAAM,6BAA6B,CAAA;AAAA;AAG/C,MAAA,IAAA,CAAK,IAAO,GAAA,MAAA;AAAA,aACL,KAAgB,EAAA;AACvB,MAAA,IAAI,iBAAiB,KAAO,EAAA;AAC1B,QAAK,IAAA,KAAA,CAAgC,SAAS,QAAU,EAAA;AACtD,UAAA,MAAM,IAAI,KAAA,CAAM,CAAgC,6BAAA,EAAA,KAAA,CAAM,OAAO,CAAE,CAAA,CAAA;AAAA;AACjE;AAEF,MAAA,IAAA,CAAK,OAAO,EAAC;AAAA;AACf;AACF,EAEA,MAAc,QAA0B,GAAA;AACtC,IAAI,IAAA;AACF,MAAA,MAAM,KAAK,qBAAsB,EAAA;AACjC,MAAS,MAAA,EAAA,CAAA,SAAA;AAAA,QACP,IAAK,CAAA,WAAA;AAAA,QACL,IAAK,CAAA,SAAA,CAAU,IAAK,CAAA,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACjC;AAAA,OACF;AAAA,aACO,KAAgB,EAAA;AACvB,MAAA,IAAI,iBAAiB,KAAO,EAAA;AAC1B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAgC,6BAAA,EAAA,KAAA,CAAM,OAAO,CAAE,CAAA,CAAA;AAAA;AAEjE,MAAM,MAAA,KAAA;AAAA;AACR;AACF,EAEA,MAAM,IAAI,GAAqC,EAAA;AAC7C,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA;AAAA;AAGnC,IAAA,MAAM,KAAK,QAAS,EAAA;AACpB,IAAO,OAAA,IAAA,CAAK,IAAK,CAAA,GAAG,CAAI,GAAA,IAAA,CAAK,UAAU,IAAK,CAAA,IAAA,CAAK,GAAG,CAAC,CAAI,GAAA,IAAA;AAAA;AAC3D,EAEA,MAAM,GAAI,CAAA,GAAA,EAAa,KAA8B,EAAA;AACnD,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA;AAAA;AAEnC,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAM,MAAA,IAAI,MAAM,mBAAmB,CAAA;AAAA;AAGrC,IAAA,MAAM,KAAK,QAAS,EAAA;AACpB,IAAI,IAAA;AACF,MAAA,IAAA,CAAK,IAAK,CAAA,GAAG,CAAI,GAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AACjC,MAAA,MAAM,KAAK,QAAS,EAAA;AAAA,aACb,KAAgB,EAAA;AACvB,MAAA,IAAI,iBAAiB,KAAO,EAAA;AAC1B,QAAA,MAAM,IAAI,KAAM,CAAA,CAAA,cAAA,EAAiB,GAAG,CAAK,EAAA,EAAA,KAAA,CAAM,OAAO,CAAE,CAAA,CAAA;AAAA;AAE1D,MAAM,MAAA,KAAA;AAAA;AACR;AACF,EAEA,MAAM,OAAO,GAA4B,EAAA;AACvC,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA;AAAA;AAGnC,IAAA,MAAM,KAAK,QAAS,EAAA;AACpB,IAAO,OAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACpB,IAAA,MAAM,KAAK,QAAS,EAAA;AAAA;AACtB,EAEA,MAAM,cAAkC,GAAA;AACtC,IAAI,IAAA;AACF,MAAK,IAAA,CAAA,cAAA,GAAiB,IAAI,cAAe,EAAA;AACzC,MAAO,OAAA,MAAM,IAAK,CAAA,cAAA,CAAe,MAAO,EAAA;AAAA,aACjC,KAAgB,EAAA;AACvB,MAAA,IAAI,iBAAiB,KAAO,EAAA;AAC1B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAoC,iCAAA,EAAA,KAAA,CAAM,OAAO,CAAE,CAAA,CAAA;AAAA;AAErE,MAAM,MAAA,KAAA;AAAA;AACR;AACF,EAEA,MAAM,eAA0C,GAAA;AAC9C,IAAI,IAAA,CAAC,KAAK,cAAgB,EAAA;AACxB,MAAM,MAAA,IAAI,MAAM,iCAAiC,CAAA;AAAA;AAEnD,IAAO,OAAA,MAAM,IAAK,CAAA,cAAA,CAAe,eAAgB,EAAA;AAAA;AACnD,EAEA,SAAS,GAAmB,EAAA;AAC1B,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA;AAAA;AAGnC,IAAA,OAAA,CAAQ,GAAI,CAAA;AAAA,iCAAA,EAAuC,GAAG,CAAE,CAAA,CAAA;AAAA;AAE5D,CAAA;;;AC3IqB,IAAA,eAAA,GAArB,cAA6C,YAAa,CAAA;AAAA,EACjD,EAAK,GAAA,oBAAA;AAAA,EACL,IAAO,GAAA,oBAAA;AAAA,EAEJ,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EAEV,WAAY,CAAA;AAAA,IACV,GAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACiB,EAAA;AACjB,IAAM,KAAA,EAAA;AAEN,IAAA,IAAA,CAAK,SAAY,GAAA;AAAA,MACf,QAAU,EAAA,KAAA;AAAA,MACV,SAAA,EAAW,QAAS,CAAA,SAAA,GAChB,MAAO,CAAA,WAAA;AAAA,QACL,MAAA,CAAO,OAAQ,CAAA,QAAA,CAAS,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,OAAS,EAAA,QAAQ,CAAM,KAAA;AAAA,UAC9D,OAAA;AAAA,UACA;AAAA,YACE,GAAG,QAAA;AAAA,YACH,OAAS,EAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,CAAC,MAAY,MAAA;AAAA,cACzC,GAAG,MAAA;AAAA,cACH,UAAY,EAAA;AAAA,aACZ,CAAA;AAAA;AACJ,SACD;AAAA,OAEH,GAAA,SAAA;AAAA,MACJ,QAAU,EAAA,QAAA,CAAS,QAAU,EAAA,GAAA,CAAI,CAAC,OAAa,MAAA;AAAA,QAC7C,GAAG,OAAA;AAAA,QACH,UAAY,EAAA;AAAA,OACZ,CAAA;AAAA,KACJ;AAEA,IAAA,IAAA,CAAK,OAAU,GAAA,GAAA;AACf,IAAA,IAAA,CAAK,QAAW,GAAA,OAAA;AAChB,IAAA,IAAA,CAAK,eAAe,WAAe,IAAA,YAAA;AACnC,IAAK,IAAA,CAAA,QAAA,GAAW,IAAI,WAAA,CAAY,QAAQ,CAAA;AAAA;AAC1C,EAEA,MAAM,QAAW,GAAA;AACf,IAAA,MAAM,UAAa,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,IAAI,SAAS,CAAA;AACpD,IAAA,IAAI,UAAY,EAAA;AACd,MAAM,MAAA,OAAA,GAAU,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA;AACrC,MAAA,OAAO,OAAQ,CAAA,QAAA;AAAA;AAEjB,IAAO,OAAA,SAAA;AAAA;AACT,EAEA,MAAM,KAA4C,GAAA;AAChD,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,OAAO,IAAK,CAAA,OAAA;AAAA;AAGd,IAAA,MAAM,CAAC,UAAY,EAAA,SAAS,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,MAChD,IAAA,CAAK,QAAS,CAAA,GAAA,CAAI,SAAS,CAAA;AAAA,MAC3B,IAAA,CAAK,QAAS,CAAA,GAAA,CAAI,QAAQ;AAAA,KAC3B,CAAA;AAED,IAAI,IAAA,CAAC,UAAc,IAAA,CAAC,SAAW,EAAA;AAC7B,MAAO,OAAA,SAAA;AAAA;AAGT,IAAM,MAAA,OAAA,GAAU,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA;AACrC,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,SAAS,CAAA;AAGnC,IAAA,MAAM,cAAiB,GAAA,QAAA,CAAS,OAAQ,CAAA,SAAS,CAAI,GAAA,GAAA;AACrD,IAAI,IAAA,IAAA,CAAK,GAAI,EAAA,IAAK,cAAgB,EAAA;AAChC,MAAA,MAAM,KAAK,UAAW,EAAA;AACtB,MAAO,OAAA,SAAA;AAAA;AAGT,IAAA,IAAA,CAAK,YAAY,OAAQ,CAAA,QAAA;AACzB,IAAK,IAAA,CAAA,OAAA,GAAU,IAAI,cAAA,CAAe,IAAM,EAAA;AAAA,MACtC,QAAQ,IAAK,CAAA,OAAA;AAAA,MACb,YAAY,MAAO,CAAA,OAAA;AAAA,MACnB,SAAS,OAAQ,CAAA,OAAA;AAAA,MACjB,WAAW,OAAQ,CAAA,SAAA;AAAA,MACnB,SAAS,IAAK,CAAA,QAAA;AAAA,MACd,SAAA,EAAW,QAAS,CAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,MACrC,QAAA,EAAU,cAAe,CAAA,IAAA,CAAK,SAAS;AAAA,KACxC,CAAA;AAED,IAAA,OAAO,IAAK,CAAA,OAAA;AAAA;AACd,EAEA,MAAM,OAA8C,GAAA;AAClD,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,OAAO,IAAK,CAAA,OAAA;AAAA;AAGd,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,KAAM,EAAA;AACjC,IAAA,IAAI,OAAS,EAAA;AACX,MAAO,OAAA,OAAA;AAAA;AAGT,IAAM,MAAA,EAAA,GAAK,MAAM,aAAc,EAAA;AAC/B,IAAA,MAAM,SAAY,GAAA,EAAA,CAAG,UAAW,CAAA,WAAA,CAAY,EAAE,CAAA;AAE9C,IAAA,MAAM,KAAK,QAAS,CAAA,GAAA;AAAA,MAClB,QAAA;AAAA,MACA,KAAK,SAAU,CAAA;AAAA,QACb,OAAS,EAAA,EAAA;AAAA,QACT,MAAQ,EAAA;AAAA,OACT;AAAA,KACH;AAGA,IAAA,MAAM,WAAc,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,cAAe,EAAA;AAEvD,IAAM,MAAA,GAAA,GAAM,GACV,IAAK,CAAA,YACP,uBAAuB,kBAAmB,CAAA,SAAS,CAAC,CAAiB,cAAA,EAAA,kBAAA;AAAA,MACnE;AAAA,KACD,CAA0C,uCAAA,EAAA,kBAAA;AAAA,MACzC,IAAA,CAAK,SAAU,CAAA,IAAA,CAAK,SAAS;AAAA,KAC9B,CAAA,SAAA,EAAY,kBAAmB,CAAA,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAE7C,IAAK,IAAA,CAAA,QAAA,CAAS,SAAS,GAAG,CAAA;AAG1B,IAAA,MAAM,WAAc,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,eAAgB,EAAA;AACxD,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,MAAM,mBAAsB,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,WAAW,CAAC,CAAA;AAExD,MAAoB,mBAAA,CAAA,OAAA,GAAU,mBAAoB,CAAA,OAAA,CAAQ,WAAY,EAAA;AACtE,MAAoB,mBAAA,CAAA,SAAA,GAClB,mBAAoB,CAAA,SAAA,CAAU,WAAY,EAAA;AAC5C,MAAA,MAAM,KAAK,QAAS,CAAA,GAAA,CAAI,WAAW,IAAK,CAAA,SAAA,CAAU,mBAAmB,CAAC,CAAA;AACtE,MAAA,OAAO,KAAK,KAAM,EAAA;AAAA;AAGpB,IAAO,OAAA,SAAA;AAAA;AACT,EAEA,MAAM,UAA4B,GAAA;AAChC,IAAM,MAAA,IAAA,CAAK,QAAS,CAAA,MAAA,CAAO,QAAQ,CAAA;AACnC,IAAM,MAAA,IAAA,CAAK,QAAS,CAAA,MAAA,CAAO,SAAS,CAAA;AACpC,IAAA,IAAA,CAAK,OAAU,GAAA,SAAA;AACf,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAAA;AACnB,EAEA,oBAAoB,QAAoC,EAAA;AACtD,IAAM,MAAA,IAAI,MAAM,qCAAqC,CAAA;AAAA;AACvD,EAEA,iBAAiB,MAAsD,EAAA;AACrE,IAAM,MAAA,IAAI,MAAM,kCAAkC,CAAA;AAAA;AAEtD","file":"index.js","sourcesContent":["import {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport wasm from \"@cartridge/account-wasm/controller\";\nimport { Policies, SessionPolicies } from \"@cartridge/presets\";\nimport { ChainId } from \"@starknet-io/types-js\";\nimport { ParsedSessionPolicies } from \"./policies\";\n\n// Whitelist of allowed property names to prevent prototype pollution\nconst ALLOWED_PROPERTIES = new Set([\n \"contracts\",\n \"messages\",\n \"target\",\n \"method\",\n \"name\",\n \"description\",\n \"types\",\n \"domain\",\n \"primaryType\",\n]);\n\nfunction validatePropertyName(prop: string): void {\n if (!ALLOWED_PROPERTIES.has(prop)) {\n throw new Error(`Invalid property name: ${prop}`);\n }\n}\n\nfunction safeObjectAccess<T>(obj: any, prop: string): T {\n validatePropertyName(prop);\n return obj[prop];\n}\n\nexport function normalizeCalls(calls: Call | Call[]) {\n return toArray(calls).map((call) => {\n return {\n entrypoint: call.entrypoint,\n contractAddress: addAddressPadding(call.contractAddress),\n calldata: CallData.toHex(call.calldata),\n };\n });\n}\n\nexport function toSessionPolicies(policies: Policies): SessionPolicies {\n return Array.isArray(policies)\n ? policies.reduce<SessionPolicies>(\n (prev, p) => {\n if (safeObjectAccess<string>(p, \"target\")) {\n const target = getChecksumAddress(\n safeObjectAccess<string>(p, \"target\"),\n );\n const entrypoint = safeObjectAccess<string>(p, \"method\");\n const contracts = safeObjectAccess<Record<string, any>>(\n prev,\n \"contracts\",\n );\n const item = {\n name: humanizeString(entrypoint),\n entrypoint: entrypoint,\n description: safeObjectAccess<string>(p, \"description\"),\n };\n\n if (target in contracts) {\n const methods = toArray(contracts[target].methods);\n contracts[target] = {\n methods: [...methods, item],\n };\n } else {\n contracts[target] = {\n methods: [item],\n };\n }\n } else {\n const messages = safeObjectAccess<any[]>(prev, \"messages\");\n messages.push(p);\n }\n\n return prev;\n },\n { contracts: {}, messages: [] },\n )\n : policies;\n}\n\nexport function toWasmPolicies(policies: ParsedSessionPolicies): wasm.Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {}).flatMap(\n ([target, { methods }]) =>\n toArray(methods).map((m) => ({\n target,\n method: m.entrypoint,\n authorized: m.authorized,\n })),\n ),\n ...(policies.messages ?? []).map((p) => {\n const domainHash = typedData.getStructHash(\n p.types,\n \"StarknetDomain\",\n p.domain,\n TypedDataRevision.ACTIVE,\n );\n const typeHash = typedData.getTypeHash(\n p.types,\n p.primaryType,\n TypedDataRevision.ACTIVE,\n );\n\n return {\n scope_hash: hash.computePoseidonHash(domainHash, typeHash),\n authorized: p.authorized,\n };\n }),\n ];\n}\n\nexport function toArray<T>(val: T | T[]): T[] {\n return Array.isArray(val) ? val : [val];\n}\n\nexport function humanizeString(str: string): string {\n return (\n str\n // Convert from camelCase or snake_case\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase to spaces\n .replace(/_/g, \" \") // snake_case to spaces\n .toLowerCase()\n // Capitalize first letter\n .replace(/^\\w/, (c) => c.toUpperCase())\n );\n}\n\nexport function parseChainId(url: URL): ChainId {\n const parts = url.pathname.split(\"/\");\n\n if (parts.includes(\"starknet\")) {\n if (parts.includes(\"mainnet\")) {\n return constants.StarknetChainId.SN_MAIN;\n } else if (parts.includes(\"sepolia\")) {\n return constants.StarknetChainId.SN_SEPOLIA;\n }\n } else if (parts.length >= 3) {\n const projectName = parts[2];\n if (parts.includes(\"katana\")) {\n return shortString.encodeShortString(\n `WP_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n } else if (parts.includes(\"mainnet\")) {\n return shortString.encodeShortString(\n `GG_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n }\n }\n\n throw new Error(`Chain ${url.toString()} not supported`);\n}\n","export class NotReadyToConnect extends Error {\n constructor() {\n super(\"Not ready to connect\");\n\n Object.setPrototypeOf(this, NotReadyToConnect.prototype);\n }\n}\n","import {\n constants,\n BigNumberish,\n Call,\n Abi,\n InvocationsDetails,\n} from \"starknet\";\nimport {\n AddInvokeTransactionResult,\n ChainId,\n Signature,\n TypedData,\n} from \"@starknet-io/types-js\";\nimport { KeychainIFrame, ProfileIFrame } from \"./iframe\";\nimport { Policy, SessionPolicies } from \"@cartridge/presets\";\n\nexport type Session = {\n chainId: constants.StarknetChainId;\n policies: Policy[];\n maxFee: BigNumberish;\n expiresAt: bigint;\n credentials: {\n authorization: string[];\n privateKey: string;\n };\n};\n\nexport enum ResponseCodes {\n SUCCESS = \"SUCCESS\",\n NOT_CONNECTED = \"NOT_CONNECTED\",\n ERROR = \"ERROR\",\n CANCELED = \"CANCELED\",\n USER_INTERACTION_REQUIRED = \"USER_INTERACTION_REQUIRED\",\n}\n\nexport type ConnectError = {\n code: ResponseCodes;\n message: string;\n error?: ControllerError;\n};\n\nexport type ControllerError = {\n code: Number;\n message: string;\n data?: any;\n};\n\nexport type ConnectReply = {\n code: ResponseCodes.SUCCESS;\n address: string;\n policies?: SessionPolicies;\n};\n\nexport type ExecuteReply =\n | (AddInvokeTransactionResult & {\n code: ResponseCodes.SUCCESS;\n })\n | {\n code: ResponseCodes.USER_INTERACTION_REQUIRED;\n };\n\nexport type ProbeReply = {\n code: ResponseCodes.SUCCESS;\n address: string;\n rpcUrl?: string;\n};\n\nexport type DeployReply = {\n code: ResponseCodes.SUCCESS;\n transaction_hash: string;\n};\n\nexport type IFrames = {\n keychain: KeychainIFrame;\n profile?: ProfileIFrame;\n version?: number;\n};\n\nexport interface LookupRequest {\n usernames?: string[];\n addresses?: string[];\n}\n\nexport interface LookupResult {\n username: string;\n addresses: string[];\n}\n\nexport interface LookupResponse {\n results: LookupResult[];\n}\n\ntype ContractAddress = string;\ntype CartridgeID = string;\nexport type ControllerAccounts = Record<ContractAddress, CartridgeID>;\n\nexport interface Keychain {\n probe(rpcUrl: string): Promise<ProbeReply | ConnectError>;\n connect(\n policies: SessionPolicies,\n rpcUrl: string,\n ): Promise<ConnectReply | ConnectError>;\n disconnect(): void;\n\n reset(): void;\n revoke(origin: string): void;\n\n deploy(): Promise<DeployReply | ConnectError>;\n execute(\n calls: Call | Call[],\n abis?: Abi[],\n transactionsDetail?: InvocationsDetails,\n sync?: boolean,\n paymaster?: any,\n error?: ControllerError,\n ): Promise<ExecuteReply | ConnectError>;\n signMessage(\n typedData: TypedData,\n account: string,\n async?: boolean,\n ): Promise<Signature | ConnectError>;\n logout(): Promise<void>;\n openSettings(): Promise<void | ConnectError>;\n session(): Promise<Session>;\n sessions(): Promise<{\n [key: string]: Session;\n }>;\n delegateAccount(): string;\n username(): string;\n openPurchaseCredits(): void;\n openExecute(calls: Call[]): Promise<void>;\n switchChain(rpcUrl: string): Promise<void>;\n}\n\nexport interface Profile {\n navigate(path: string): void;\n}\n\nexport interface Modal {\n open: () => void;\n close: () => void;\n}\n\n/**\n * Options for configuring the controller\n */\nexport type ControllerOptions = ProviderOptions &\n KeychainOptions &\n ProfileOptions;\n\nexport type IFrameOptions = {\n /** The ID of the starter pack to use */\n starterPackId?: string;\n /** The preset to use */\n preset?: string;\n};\n\nexport type Chain = {\n rpcUrl: string;\n};\n\nexport type ProviderOptions = {\n defaultChainId: ChainId;\n chains: Chain[];\n};\n\nexport type KeychainOptions = IFrameOptions & {\n policies?: SessionPolicies;\n /** The URL of keychain */\n url?: string;\n /** The origin of keychain */\n origin?: string;\n /** Propagate transaction errors back to caller instead of showing modal */\n propagateSessionErrors?: boolean;\n};\n\nexport type ProfileOptions = IFrameOptions & {\n /** The URL of profile. Mainly for internal development purpose */\n profileUrl?: string;\n /** The project name of Slot instance. */\n slot?: string;\n /** The namespace to use to fetch trophies data from indexer. Will be mandatory once profile page is in production */\n namespace?: string;\n /** The tokens to be listed on Inventory modal */\n tokens?: Tokens;\n};\n\nexport type ProfileContextTypeVariant =\n | \"inventory\"\n | \"trophies\"\n | \"achievements\"\n | \"activity\";\n\nexport type Tokens = {\n erc20?: string[];\n};\n","import { Policy } from \"@cartridge/account-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/account-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n },\n ) {\n super({ nodeUrl: rpcUrl }, provider);\n\n this.address = address;\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n },\n );\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n *\n * @returns response from addTransaction\n */\n async execute(calls: Call | Call[]): Promise<InvokeFunctionResponse> {\n try {\n const res = await this.controller.executeFromOutside(\n normalizeCalls(calls),\n );\n\n return res;\n } catch (e) {\n return this.controller.execute(normalizeCalls(calls));\n }\n }\n}\n","export const KEYCHAIN_URL = \"https://x.cartridge.gg\";\nexport const PROFILE_URL = \"https://profile.cartridge.gg\";\nexport const API_URL = \"https://api.cartridge.gg\";\n","{\n \"name\": \"@cartridge/controller\",\n \"version\": \"0.7.2\",\n \"description\": \"Cartridge Controller\",\n \"module\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"build:deps\": \"tsup\",\n \"build\": \"pnpm build:deps\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.ts\\\"\",\n \"test\": \"jest\",\n \"version\": \"pnpm pkg get version\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./session\": {\n \"types\": \"./dist/session/index.d.ts\",\n \"import\": \"./dist/session/index.js\",\n \"require\": \"./dist/session/index.cjs\"\n },\n \"./session/node\": {\n \"types\": \"./dist/node/index.d.ts\",\n \"import\": \"./dist/node/index.js\",\n \"require\": \"./dist/node/index.cjs\"\n },\n \"./provider\": {\n \"types\": \"./dist/provider/index.d.ts\",\n \"import\": \"./dist/provider/index.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types/index.d.ts\",\n \"import\": \"./dist/types/index.js\"\n }\n },\n \"tsup\": {\n \"entry\": [\n \"src/index.ts\",\n \"src/controller.ts\",\n \"src/lookup.ts\",\n \"src/session/index.ts\",\n \"src/node/index.ts\"\n ],\n \"format\": [\n \"esm\",\n \"cjs\"\n ],\n \"splitting\": false,\n \"sourcemap\": true,\n \"clean\": true,\n \"dts\": true,\n \"treeshake\": {\n \"preset\": \"recommended\"\n },\n \"exports\": \"named\"\n },\n \"peerDependencies\": {\n \"starknet\": \"catalog:\",\n \"open\": \"^10.1.0\"\n },\n \"dependencies\": {\n \"@cartridge/account-wasm\": \"workspace:*\",\n \"@cartridge/penpal\": \"catalog:\",\n \"@starknet-io/types-js\": \"catalog:\",\n \"@telegram-apps/sdk\": \"^2.4.0\",\n \"base64url\": \"catalog:\",\n \"cbor-x\": \"^1.5.0\",\n \"fast-deep-equal\": \"catalog:\"\n },\n \"devDependencies\": {\n \"@cartridge/tsconfig\": \"workspace:*\",\n \"@types/jest\": \"^29.5.14\",\n \"@types/node\": \"catalog:\",\n \"jest\": \"^29.7.0\",\n \"prettier\": \"catalog:\",\n \"ts-jest\": \"^29.2.5\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\"\n }\n}\n","export const icon =\n \"data:image/png;base64,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\";\n","function releaseStub() {}\n\n/**\n * A simple mutual exclusion lock. It allows you to obtain and release a lock,\n * ensuring that only one task can access a critical section at a time.\n */\nexport class Mutex {\n private m_lastPromise: Promise<void> = Promise.resolve();\n\n /**\n * Acquire lock\n * @param [bypass=false] option to skip lock acquisition\n */\n public async obtain(bypass = false): Promise<() => void> {\n let release = releaseStub;\n if (bypass) return release;\n const lastPromise = this.m_lastPromise;\n this.m_lastPromise = new Promise<void>((resolve) => (release = resolve));\n await lastPromise;\n return release;\n }\n}\n","import { WalletAccount } from \"starknet\";\nimport {\n AddInvokeTransactionParameters,\n AddStarknetChainParameters,\n Errors,\n Permission,\n RequestAccountsParameters,\n RequestFn,\n StarknetWindowObject,\n SwitchStarknetChainParameters,\n TypedData,\n WalletEventHandlers,\n WalletEventListener,\n WalletEvents,\n} from \"@starknet-io/types-js\";\nimport manifest from \"../package.json\";\n\nimport { icon } from \"./icon\";\nimport { Mutex } from \"./mutex\";\n\nconst mutex = new Mutex();\n\nexport default abstract class BaseProvider implements StarknetWindowObject {\n public id = \"controller\";\n public name = \"Controller\";\n public version = manifest.version;\n public icon = icon;\n\n public account?: WalletAccount;\n public subscriptions: WalletEvents[] = [];\n\n private _probePromise: Promise<WalletAccount | undefined> | null = null;\n\n protected async safeProbe(): Promise<WalletAccount | undefined> {\n // If we already have an account, return it\n if (this.account) {\n return this.account;\n }\n\n // If we're already probing, wait for the existing probe\n if (this._probePromise) {\n return this._probePromise;\n }\n\n const release = await mutex.obtain();\n return await new Promise<WalletAccount | undefined>(async (resolve) => {\n try {\n this._probePromise = this.probe();\n const result = await this._probePromise;\n resolve(result);\n } finally {\n this._probePromise = null;\n }\n }).finally(() => {\n release();\n });\n }\n\n request: RequestFn = async (call) => {\n switch (call.type) {\n case \"wallet_getPermissions\":\n await this.safeProbe();\n\n if (this.account) {\n return [Permission.ACCOUNTS];\n }\n\n return [];\n\n case \"wallet_requestAccounts\": {\n if (this.account) {\n return [this.account.address];\n }\n\n const silentMode =\n call.params && (call.params as RequestAccountsParameters).silent_mode;\n\n this.account = await this.safeProbe();\n\n if (!this.account && !silentMode) {\n this.account = await this.connect();\n }\n\n if (this.account) {\n return [this.account.address];\n }\n\n return [];\n }\n\n case \"wallet_watchAsset\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_watchAsset not implemented\",\n } as Errors.UNEXPECTED_ERROR;\n\n case \"wallet_addStarknetChain\": {\n let params = call.params as AddStarknetChainParameters;\n return this.addStarknetChain(params);\n }\n\n case \"wallet_switchStarknetChain\": {\n let params = call.params as SwitchStarknetChainParameters;\n return this.switchStarknetChain(params.chainId);\n }\n\n case \"wallet_requestChainId\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as Errors.UNEXPECTED_ERROR;\n }\n\n return await this.account.getChainId();\n\n case \"wallet_deploymentData\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_deploymentData not implemented\",\n } as Errors.UNEXPECTED_ERROR;\n\n case \"wallet_addInvokeTransaction\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as Errors.UNEXPECTED_ERROR;\n }\n\n let params = call.params as AddInvokeTransactionParameters;\n return await this.account.execute(\n params.calls.map((call) => ({\n contractAddress: call.contract_address,\n entrypoint: call.entry_point,\n calldata: call.calldata,\n })),\n );\n\n case \"wallet_addDeclareTransaction\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_addDeclareTransaction not implemented\",\n } as Errors.UNEXPECTED_ERROR;\n\n case \"wallet_signTypedData\": {\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as Errors.UNEXPECTED_ERROR;\n }\n\n return await this.account.signMessage(call.params as TypedData);\n }\n\n case \"wallet_supportedSpecs\":\n return [];\n case \"wallet_supportedWalletApi\":\n return [];\n default:\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: `Unknown RPC call type: ${call.type}`,\n } as Errors.UNEXPECTED_ERROR;\n }\n };\n\n on: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n this.subscriptions.push({ type: event, handler } as WalletEvents);\n };\n\n off: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n const idx = this.subscriptions.findIndex(\n (sub) => sub.type === event && sub.handler === handler,\n );\n if (idx >= 0) {\n this.subscriptions.splice(idx, 1);\n }\n };\n\n protected emitNetworkChanged(chainId: string) {\n this.subscriptions\n .filter((sub) => sub.type === \"networkChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"networkChanged\"])(chainId);\n });\n }\n\n protected emitAccountsChanged(accounts: string[]) {\n this.subscriptions\n .filter((sub) => sub.type === \"accountsChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"accountsChanged\"])(accounts);\n });\n }\n\n abstract probe(): Promise<WalletAccount | undefined>;\n abstract connect(): Promise<WalletAccount | undefined>;\n abstract switchStarknetChain(chainId: string): Promise<boolean>;\n abstract addStarknetChain(\n chain: AddStarknetChainParameters,\n ): Promise<boolean>;\n}\n","import * as http from \"http\";\nimport { AddressInfo } from \"net\";\n\ntype ServerResponse = http.ServerResponse<http.IncomingMessage> & {\n req: http.IncomingMessage;\n};\n\nexport class CallbackServer {\n private server: http.Server;\n private resolveCallback?: (data: string) => void;\n private rejectCallback?: (error: Error) => void;\n private timeoutId?: NodeJS.Timeout;\n\n constructor() {\n this.server = http.createServer(this.handleRequest.bind(this));\n\n // Handle server errors\n this.server.on(\"error\", (error) => {\n console.error(\"Server error:\", error);\n if (this.rejectCallback) {\n this.rejectCallback(error);\n }\n });\n }\n\n private cleanup() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.server.close();\n }\n\n private handleRequest(req: http.IncomingMessage, res: ServerResponse) {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const params = new URLSearchParams(req.url.split(\"?\")[1]);\n const session = params.get(\"startapp\");\n\n if (!session) {\n console.warn(\"Received callback without session data\");\n res.writeHead(400);\n res.end(\"Missing session data\");\n return;\n }\n\n if (this.resolveCallback) {\n this.resolveCallback(session);\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><script>window.close();</script>Session registered successfully. You can close this window.</body></html>\",\n );\n\n this.cleanup();\n }\n\n async listen(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.server.listen(0, \"localhost\", () => {\n const address = this.server.address() as AddressInfo;\n const url = `http://localhost:${address.port}/callback`;\n resolve(url);\n });\n\n this.server.on(\"error\", reject);\n });\n }\n\n async waitForCallback(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n\n this.timeoutId = setTimeout(\n () => {\n console.warn(\"Callback timeout reached\");\n reject(new Error(\"Callback timeout after 5 minutes\"));\n this.cleanup();\n },\n 5 * 60 * 1000,\n );\n });\n }\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { CallbackServer } from \"./server\";\n\ninterface SessionSigner {\n privKey: string;\n pubKey: string;\n}\n\ninterface SessionInfo {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n}\n\ninterface SessionData {\n signer?: SessionSigner;\n session?: SessionInfo;\n policies?: any;\n lastUsedConnector?: string;\n [key: string]: any;\n}\n\n/**\n * Implements a file system backend.\n * This is designed for Node.js environments to store session data on the filesystem.\n */\nexport class NodeBackend {\n private basePath: string;\n private sessionFile: string;\n private data: SessionData = {};\n private callbackServer?: CallbackServer;\n\n constructor(basePath: string) {\n if (!basePath) {\n throw new Error(\"basePath is required for NodeBackend\");\n }\n this.basePath = basePath;\n this.sessionFile = path.join(this.basePath, \"session.json\");\n }\n\n private async ensureDirectoryExists(): Promise<void> {\n try {\n await fs.access(this.basePath);\n } catch {\n try {\n await fs.mkdir(this.basePath, { recursive: true });\n } catch (error: any) {\n throw new Error(\n `Failed to create directory ${this.basePath}: ${error.message}`,\n );\n }\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n const content = await fs.readFile(this.sessionFile, \"utf-8\");\n const parsed = JSON.parse(content);\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Invalid session data format\");\n }\n\n this.data = parsed;\n } catch (error: unknown) {\n if (error instanceof Error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw new Error(`Failed to load session data: ${error.message}`);\n }\n }\n this.data = {};\n }\n }\n\n private async saveData(): Promise<void> {\n try {\n await this.ensureDirectoryExists();\n await fs.writeFile(\n this.sessionFile,\n JSON.stringify(this.data, null, 2),\n \"utf-8\",\n );\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to save session data: ${error.message}`);\n }\n throw error;\n }\n }\n\n async get(key: string): Promise<string | null> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n return this.data[key] ? JSON.stringify(this.data[key]) : null;\n }\n\n async set(key: string, value: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n if (!value) {\n throw new Error(\"Value is required\");\n }\n\n await this.loadData();\n try {\n this.data[key] = JSON.parse(value);\n await this.saveData();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to set ${key}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async delete(key: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n delete this.data[key];\n await this.saveData();\n }\n\n async getRedirectUri(): Promise<string> {\n try {\n this.callbackServer = new CallbackServer();\n return await this.callbackServer.listen();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to start callback server: ${error.message}`);\n }\n throw error;\n }\n }\n\n async waitForCallback(): Promise<string | null> {\n if (!this.callbackServer) {\n throw new Error(\"Callback server not initialized\");\n }\n return await this.callbackServer.waitForCallback();\n }\n\n openLink(url: string): void {\n if (!url) {\n throw new Error(\"URL is required\");\n }\n\n console.log(`\\n\\t Open url to authorize session: ${url}`);\n }\n}\n","import { ec, stark, WalletAccount } from \"starknet\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\n\nimport SessionAccount from \"./account\";\nimport { KEYCHAIN_URL } from \"../constants\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport { NodeBackend } from \"./backend\";\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n basePath: string;\n keychainUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _backend: NodeBackend;\n\n constructor({\n rpc,\n chainId,\n policies,\n basePath,\n keychainUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._backend = new NodeBackend(basePath);\n }\n\n async username() {\n const sessionStr = await this._backend.get(\"session\");\n if (sessionStr) {\n const session = JSON.parse(sessionStr);\n return session.username;\n }\n return undefined;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const [sessionStr, signerStr] = await Promise.all([\n this._backend.get(\"session\"),\n this._backend.get(\"signer\"),\n ]);\n\n if (!sessionStr || !signerStr) {\n return undefined;\n }\n\n const session = JSON.parse(sessionStr);\n const signer = JSON.parse(signerStr);\n\n // Check expiration\n const expirationTime = parseInt(session.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n await this.disconnect();\n return undefined;\n }\n\n this._username = session.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: session.address,\n ownerGuid: session.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(session.expiresAt),\n policies: toWasmPolicies(this._policies),\n });\n\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const account = await this.probe();\n if (account) {\n return account;\n }\n\n const pk = stark.randomAddress();\n const publicKey = ec.starkCurve.getStarkKey(pk);\n\n await this._backend.set(\n \"signer\",\n JSON.stringify({\n privKey: pk,\n pubKey: publicKey,\n }),\n );\n\n // Get redirect URI from local server\n const redirectUri = await this._backend.getRedirectUri();\n\n const url = `${\n this._keychainUrl\n }/session?public_key=${encodeURIComponent(publicKey)}&redirect_uri=${encodeURIComponent(\n redirectUri,\n )}&redirect_query_name=startapp&policies=${encodeURIComponent(\n JSON.stringify(this._policies),\n )}&rpc_url=${encodeURIComponent(this._rpcUrl)}`;\n\n this._backend.openLink(url);\n\n // Wait for callback with session data\n const sessionData = await this._backend.waitForCallback();\n if (sessionData) {\n const sessionRegistration = JSON.parse(atob(sessionData));\n // Ensure addresses are properly formatted\n sessionRegistration.address = sessionRegistration.address.toLowerCase();\n sessionRegistration.ownerGuid =\n sessionRegistration.ownerGuid.toLowerCase();\n await this._backend.set(\"session\", JSON.stringify(sessionRegistration));\n return this.probe();\n }\n\n return undefined;\n }\n\n async disconnect(): Promise<void> {\n await this._backend.delete(\"signer\");\n await this._backend.delete(\"session\");\n this.account = undefined;\n this._username = undefined;\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils.ts","../../src/errors.ts","../../src/types.ts","../../src/node/account.ts","../../src/constants.ts","../../package.json","../../src/icon.ts","../../src/mutex.ts","../../src/provider.ts","../../src/node/server.ts","../../src/node/backend.ts","../../src/node/provider.ts"],"names":["ResponseCodes","params","call"],"mappings":"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","file":"index.js","sourcesContent":["import {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport wasm from \"@cartridge/account-wasm/controller\";\nimport { Policies, SessionPolicies } from \"@cartridge/presets\";\nimport { ChainId } from \"@starknet-io/types-js\";\nimport { ParsedSessionPolicies } from \"./policies\";\n\n// Whitelist of allowed property names to prevent prototype pollution\nconst ALLOWED_PROPERTIES = new Set([\n \"contracts\",\n \"messages\",\n \"target\",\n \"method\",\n \"name\",\n \"description\",\n \"types\",\n \"domain\",\n \"primaryType\",\n]);\n\nfunction validatePropertyName(prop: string): void {\n if (!ALLOWED_PROPERTIES.has(prop)) {\n throw new Error(`Invalid property name: ${prop}`);\n }\n}\n\nfunction safeObjectAccess<T>(obj: any, prop: string): T {\n validatePropertyName(prop);\n return obj[prop];\n}\n\nexport function normalizeCalls(calls: Call | Call[]) {\n return toArray(calls).map((call) => {\n return {\n entrypoint: call.entrypoint,\n contractAddress: addAddressPadding(call.contractAddress),\n calldata: CallData.toHex(call.calldata),\n };\n });\n}\n\nexport function toSessionPolicies(policies: Policies): SessionPolicies {\n return Array.isArray(policies)\n ? policies.reduce<SessionPolicies>(\n (prev, p) => {\n if (safeObjectAccess<string>(p, \"target\")) {\n const target = getChecksumAddress(\n safeObjectAccess<string>(p, \"target\"),\n );\n const entrypoint = safeObjectAccess<string>(p, \"method\");\n const contracts = safeObjectAccess<Record<string, any>>(\n prev,\n \"contracts\",\n );\n const item = {\n name: humanizeString(entrypoint),\n entrypoint: entrypoint,\n description: safeObjectAccess<string>(p, \"description\"),\n };\n\n if (target in contracts) {\n const methods = toArray(contracts[target].methods);\n contracts[target] = {\n methods: [...methods, item],\n };\n } else {\n contracts[target] = {\n methods: [item],\n };\n }\n } else {\n const messages = safeObjectAccess<any[]>(prev, \"messages\");\n messages.push(p);\n }\n\n return prev;\n },\n { contracts: {}, messages: [] },\n )\n : policies;\n}\n\nexport function toWasmPolicies(policies: ParsedSessionPolicies): wasm.Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {}).flatMap(\n ([target, { methods }]) =>\n toArray(methods).map((m) => ({\n target,\n method: m.entrypoint,\n authorized: m.authorized,\n })),\n ),\n ...(policies.messages ?? []).map((p) => {\n const domainHash = typedData.getStructHash(\n p.types,\n \"StarknetDomain\",\n p.domain,\n TypedDataRevision.ACTIVE,\n );\n const typeHash = typedData.getTypeHash(\n p.types,\n p.primaryType,\n TypedDataRevision.ACTIVE,\n );\n\n return {\n scope_hash: hash.computePoseidonHash(domainHash, typeHash),\n authorized: p.authorized,\n };\n }),\n ];\n}\n\nexport function toArray<T>(val: T | T[]): T[] {\n return Array.isArray(val) ? val : [val];\n}\n\nexport function humanizeString(str: string): string {\n return (\n str\n // Convert from camelCase or snake_case\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase to spaces\n .replace(/_/g, \" \") // snake_case to spaces\n .toLowerCase()\n // Capitalize first letter\n .replace(/^\\w/, (c) => c.toUpperCase())\n );\n}\n\nexport function parseChainId(url: URL): ChainId {\n const parts = url.pathname.split(\"/\");\n\n if (parts.includes(\"starknet\")) {\n if (parts.includes(\"mainnet\")) {\n return constants.StarknetChainId.SN_MAIN;\n } else if (parts.includes(\"sepolia\")) {\n return constants.StarknetChainId.SN_SEPOLIA;\n }\n } else if (parts.length >= 3) {\n const projectName = parts[2];\n if (parts.includes(\"katana\")) {\n return shortString.encodeShortString(\n `WP_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n } else if (parts.includes(\"mainnet\")) {\n return shortString.encodeShortString(\n `GG_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n }\n }\n\n throw new Error(`Chain ${url.toString()} not supported`);\n}\n","export class NotReadyToConnect extends Error {\n constructor() {\n super(\"Not ready to connect\");\n\n Object.setPrototypeOf(this, NotReadyToConnect.prototype);\n }\n}\n","import {\n constants,\n BigNumberish,\n Call,\n Abi,\n InvocationsDetails,\n} from \"starknet\";\nimport {\n AddInvokeTransactionResult,\n ChainId,\n Signature,\n TypedData,\n} from \"@starknet-io/types-js\";\nimport { KeychainIFrame, ProfileIFrame } from \"./iframe\";\nimport { Policy, SessionPolicies } from \"@cartridge/presets\";\n\nexport type Session = {\n chainId: constants.StarknetChainId;\n policies: Policy[];\n maxFee: BigNumberish;\n expiresAt: bigint;\n credentials: {\n authorization: string[];\n privateKey: string;\n };\n};\n\nexport enum ResponseCodes {\n SUCCESS = \"SUCCESS\",\n NOT_CONNECTED = \"NOT_CONNECTED\",\n ERROR = \"ERROR\",\n CANCELED = \"CANCELED\",\n USER_INTERACTION_REQUIRED = \"USER_INTERACTION_REQUIRED\",\n}\n\nexport type ConnectError = {\n code: ResponseCodes;\n message: string;\n error?: ControllerError;\n};\n\nexport type ControllerError = {\n code: Number;\n message: string;\n data?: any;\n};\n\nexport type ConnectReply = {\n code: ResponseCodes.SUCCESS;\n address: string;\n policies?: SessionPolicies;\n};\n\nexport type ExecuteReply =\n | (AddInvokeTransactionResult & {\n code: ResponseCodes.SUCCESS;\n })\n | {\n code: ResponseCodes.USER_INTERACTION_REQUIRED;\n };\n\nexport type ProbeReply = {\n code: ResponseCodes.SUCCESS;\n address: string;\n rpcUrl?: string;\n};\n\nexport type DeployReply = {\n code: ResponseCodes.SUCCESS;\n transaction_hash: string;\n};\n\nexport type IFrames = {\n keychain: KeychainIFrame;\n profile?: ProfileIFrame;\n version?: number;\n};\n\nexport interface LookupRequest {\n usernames?: string[];\n addresses?: string[];\n}\n\nexport interface LookupResult {\n username: string;\n addresses: string[];\n}\n\nexport interface LookupResponse {\n results: LookupResult[];\n}\n\ntype ContractAddress = string;\ntype CartridgeID = string;\nexport type ControllerAccounts = Record<ContractAddress, CartridgeID>;\n\nexport interface Keychain {\n probe(rpcUrl: string): Promise<ProbeReply | ConnectError>;\n connect(\n policies: SessionPolicies,\n rpcUrl: string,\n ): Promise<ConnectReply | ConnectError>;\n disconnect(): void;\n\n reset(): void;\n revoke(origin: string): void;\n\n deploy(): Promise<DeployReply | ConnectError>;\n execute(\n calls: Call | Call[],\n abis?: Abi[],\n transactionsDetail?: InvocationsDetails,\n sync?: boolean,\n paymaster?: any,\n error?: ControllerError,\n ): Promise<ExecuteReply | ConnectError>;\n signMessage(\n typedData: TypedData,\n account: string,\n async?: boolean,\n ): Promise<Signature | ConnectError>;\n logout(): Promise<void>;\n openSettings(): Promise<void | ConnectError>;\n session(): Promise<Session>;\n sessions(): Promise<{\n [key: string]: Session;\n }>;\n delegateAccount(): string;\n username(): string;\n openPurchaseCredits(): void;\n openExecute(calls: Call[]): Promise<void>;\n switchChain(rpcUrl: string): Promise<void>;\n}\n\nexport interface Profile {\n navigate(path: string): void;\n}\n\nexport interface Modal {\n open: () => void;\n close: () => void;\n}\n\n/**\n * Options for configuring the controller\n */\nexport type ControllerOptions = ProviderOptions &\n KeychainOptions &\n ProfileOptions;\n\nexport type IFrameOptions = {\n /** The ID of the starter pack to use */\n starterPackId?: string;\n /** The preset to use */\n preset?: string;\n};\n\nexport type Chain = {\n rpcUrl: string;\n};\n\nexport type ProviderOptions = {\n defaultChainId: ChainId;\n chains: Chain[];\n};\n\nexport type KeychainOptions = IFrameOptions & {\n policies?: SessionPolicies;\n /** The URL of keychain */\n url?: string;\n /** The origin of keychain */\n origin?: string;\n /** Propagate transaction errors back to caller instead of showing modal */\n propagateSessionErrors?: boolean;\n};\n\nexport type ProfileOptions = IFrameOptions & {\n /** The URL of profile. Mainly for internal development purpose */\n profileUrl?: string;\n /** The project name of Slot instance. */\n slot?: string;\n /** The namespace to use to fetch trophies data from indexer. Will be mandatory once profile page is in production */\n namespace?: string;\n /** The tokens to be listed on Inventory modal */\n tokens?: Tokens;\n};\n\nexport type ProfileContextTypeVariant =\n | \"inventory\"\n | \"trophies\"\n | \"achievements\"\n | \"activity\";\n\nexport type Tokens = {\n erc20?: string[];\n};\n","import { Policy } from \"@cartridge/account-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/account-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n },\n ) {\n super({ nodeUrl: rpcUrl }, provider);\n\n this.address = address;\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n },\n );\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n *\n * @returns response from addTransaction\n */\n async execute(calls: Call | Call[]): Promise<InvokeFunctionResponse> {\n try {\n const res = await this.controller.executeFromOutside(\n normalizeCalls(calls),\n );\n\n return res;\n } catch (e) {\n return this.controller.execute(normalizeCalls(calls));\n }\n }\n}\n","export const KEYCHAIN_URL = \"https://x.cartridge.gg\";\nexport const PROFILE_URL = \"https://profile.cartridge.gg\";\nexport const API_URL = \"https://api.cartridge.gg\";\n","{\n \"name\": \"@cartridge/controller\",\n \"version\": \"0.7.3\",\n \"description\": \"Cartridge Controller\",\n \"module\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"build:deps\": \"tsup\",\n \"build\": \"pnpm build:deps\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.ts\\\"\",\n \"test\": \"jest\",\n \"version\": \"pnpm pkg get version\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./session\": {\n \"types\": \"./dist/session/index.d.ts\",\n \"import\": \"./dist/session/index.js\",\n \"require\": \"./dist/session/index.cjs\"\n },\n \"./session/node\": {\n \"types\": \"./dist/node/index.d.ts\",\n \"import\": \"./dist/node/index.js\",\n \"require\": \"./dist/node/index.cjs\"\n },\n \"./provider\": {\n \"types\": \"./dist/provider/index.d.ts\",\n \"import\": \"./dist/provider/index.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types/index.d.ts\",\n \"import\": \"./dist/types/index.js\"\n }\n },\n \"tsup\": {\n \"entry\": [\n \"src/index.ts\",\n \"src/controller.ts\",\n \"src/lookup.ts\",\n \"src/session/index.ts\",\n \"src/node/index.ts\"\n ],\n \"format\": [\n \"esm\",\n \"cjs\"\n ],\n \"splitting\": false,\n \"sourcemap\": true,\n \"clean\": true,\n \"dts\": true,\n \"treeshake\": {\n \"preset\": \"recommended\"\n },\n \"exports\": \"named\"\n },\n \"peerDependencies\": {\n \"starknet\": \"catalog:\",\n \"open\": \"^10.1.0\"\n },\n \"dependencies\": {\n \"@cartridge/account-wasm\": \"workspace:*\",\n \"@cartridge/penpal\": \"catalog:\",\n \"@starknet-io/types-js\": \"catalog:\",\n \"@telegram-apps/sdk\": \"^2.4.0\",\n \"base64url\": \"catalog:\",\n \"cbor-x\": \"^1.5.0\",\n \"fast-deep-equal\": \"catalog:\"\n },\n \"devDependencies\": {\n \"@cartridge/tsconfig\": \"workspace:*\",\n \"@types/jest\": \"^29.5.14\",\n \"@types/node\": \"catalog:\",\n \"jest\": \"^29.7.0\",\n \"prettier\": \"catalog:\",\n \"ts-jest\": \"^29.2.5\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\"\n }\n}\n","export const icon =\n \"data:image/png;base64,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\";\n","function releaseStub() {}\n\n/**\n * A simple mutual exclusion lock. It allows you to obtain and release a lock,\n * ensuring that only one task can access a critical section at a time.\n */\nexport class Mutex {\n private m_lastPromise: Promise<void> = Promise.resolve();\n\n /**\n * Acquire lock\n * @param [bypass=false] option to skip lock acquisition\n */\n public async obtain(bypass = false): Promise<() => void> {\n let release = releaseStub;\n if (bypass) return release;\n const lastPromise = this.m_lastPromise;\n this.m_lastPromise = new Promise<void>((resolve) => (release = resolve));\n await lastPromise;\n return release;\n }\n}\n","import { WalletAccount } from \"starknet\";\nimport {\n AddInvokeTransactionParameters,\n AddStarknetChainParameters,\n Errors,\n Permission,\n RequestAccountsParameters,\n RequestFn,\n StarknetWindowObject,\n SwitchStarknetChainParameters,\n TypedData,\n WalletEventHandlers,\n WalletEventListener,\n WalletEvents,\n} from \"@starknet-io/types-js\";\nimport manifest from \"../package.json\";\n\nimport { icon } from \"./icon\";\nimport { Mutex } from \"./mutex\";\n\nconst mutex = new Mutex();\n\nexport default abstract class BaseProvider implements StarknetWindowObject {\n public id = \"controller\";\n public name = \"Controller\";\n public version = manifest.version;\n public icon = icon;\n\n public account?: WalletAccount;\n public subscriptions: WalletEvents[] = [];\n\n private _probePromise: Promise<WalletAccount | undefined> | null = null;\n\n protected async safeProbe(): Promise<WalletAccount | undefined> {\n // If we already have an account, return it\n if (this.account) {\n return this.account;\n }\n\n // If we're already probing, wait for the existing probe\n if (this._probePromise) {\n return this._probePromise;\n }\n\n const release = await mutex.obtain();\n return await new Promise<WalletAccount | undefined>(async (resolve) => {\n try {\n this._probePromise = this.probe();\n const result = await this._probePromise;\n resolve(result);\n } finally {\n this._probePromise = null;\n }\n }).finally(() => {\n release();\n });\n }\n\n request: RequestFn = async (call) => {\n switch (call.type) {\n case \"wallet_getPermissions\":\n await this.safeProbe();\n\n if (this.account) {\n return [Permission.ACCOUNTS];\n }\n\n return [];\n\n case \"wallet_requestAccounts\": {\n if (this.account) {\n return [this.account.address];\n }\n\n const silentMode =\n call.params && (call.params as RequestAccountsParameters).silent_mode;\n\n this.account = await this.safeProbe();\n\n if (!this.account && !silentMode) {\n this.account = await this.connect();\n }\n\n if (this.account) {\n return [this.account.address];\n }\n\n return [];\n }\n\n case \"wallet_watchAsset\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_watchAsset not implemented\",\n } as Errors.UNEXPECTED_ERROR;\n\n case \"wallet_addStarknetChain\": {\n let params = call.params as AddStarknetChainParameters;\n return this.addStarknetChain(params);\n }\n\n case \"wallet_switchStarknetChain\": {\n let params = call.params as SwitchStarknetChainParameters;\n return this.switchStarknetChain(params.chainId);\n }\n\n case \"wallet_requestChainId\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as Errors.UNEXPECTED_ERROR;\n }\n\n return await this.account.getChainId();\n\n case \"wallet_deploymentData\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_deploymentData not implemented\",\n } as Errors.UNEXPECTED_ERROR;\n\n case \"wallet_addInvokeTransaction\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as Errors.UNEXPECTED_ERROR;\n }\n\n let params = call.params as AddInvokeTransactionParameters;\n return await this.account.execute(\n params.calls.map((call) => ({\n contractAddress: call.contract_address,\n entrypoint: call.entry_point,\n calldata: call.calldata,\n })),\n );\n\n case \"wallet_addDeclareTransaction\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_addDeclareTransaction not implemented\",\n } as Errors.UNEXPECTED_ERROR;\n\n case \"wallet_signTypedData\": {\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as Errors.UNEXPECTED_ERROR;\n }\n\n return await this.account.signMessage(call.params as TypedData);\n }\n\n case \"wallet_supportedSpecs\":\n return [];\n case \"wallet_supportedWalletApi\":\n return [];\n default:\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: `Unknown RPC call type: ${call.type}`,\n } as Errors.UNEXPECTED_ERROR;\n }\n };\n\n on: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n this.subscriptions.push({ type: event, handler } as WalletEvents);\n };\n\n off: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n const idx = this.subscriptions.findIndex(\n (sub) => sub.type === event && sub.handler === handler,\n );\n if (idx >= 0) {\n this.subscriptions.splice(idx, 1);\n }\n };\n\n protected emitNetworkChanged(chainId: string) {\n this.subscriptions\n .filter((sub) => sub.type === \"networkChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"networkChanged\"])(chainId);\n });\n }\n\n protected emitAccountsChanged(accounts: string[]) {\n this.subscriptions\n .filter((sub) => sub.type === \"accountsChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"accountsChanged\"])(accounts);\n });\n }\n\n abstract probe(): Promise<WalletAccount | undefined>;\n abstract connect(): Promise<WalletAccount | undefined>;\n abstract switchStarknetChain(chainId: string): Promise<boolean>;\n abstract addStarknetChain(\n chain: AddStarknetChainParameters,\n ): Promise<boolean>;\n}\n","import * as http from \"http\";\nimport { AddressInfo } from \"net\";\n\ntype ServerResponse = http.ServerResponse<http.IncomingMessage> & {\n req: http.IncomingMessage;\n};\n\nexport class CallbackServer {\n private server: http.Server;\n private resolveCallback?: (data: string) => void;\n private rejectCallback?: (error: Error) => void;\n private timeoutId?: NodeJS.Timeout;\n\n constructor() {\n this.server = http.createServer(this.handleRequest.bind(this));\n\n // Handle server errors\n this.server.on(\"error\", (error) => {\n console.error(\"Server error:\", error);\n if (this.rejectCallback) {\n this.rejectCallback(error);\n }\n });\n }\n\n private cleanup() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.server.close();\n }\n\n private handleRequest(req: http.IncomingMessage, res: ServerResponse) {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const params = new URLSearchParams(req.url.split(\"?\")[1]);\n const session = params.get(\"startapp\");\n\n if (!session) {\n console.warn(\"Received callback without session data\");\n res.writeHead(400);\n res.end(\"Missing session data\");\n return;\n }\n\n if (this.resolveCallback) {\n this.resolveCallback(session);\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><script>window.close();</script>Session registered successfully. You can close this window.</body></html>\",\n );\n\n this.cleanup();\n }\n\n async listen(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.server.listen(0, \"localhost\", () => {\n const address = this.server.address() as AddressInfo;\n const url = `http://localhost:${address.port}/callback`;\n resolve(url);\n });\n\n this.server.on(\"error\", reject);\n });\n }\n\n async waitForCallback(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n\n this.timeoutId = setTimeout(\n () => {\n console.warn(\"Callback timeout reached\");\n reject(new Error(\"Callback timeout after 5 minutes\"));\n this.cleanup();\n },\n 5 * 60 * 1000,\n );\n });\n }\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { CallbackServer } from \"./server\";\n\ninterface SessionSigner {\n privKey: string;\n pubKey: string;\n}\n\ninterface SessionInfo {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n}\n\ninterface SessionData {\n signer?: SessionSigner;\n session?: SessionInfo;\n policies?: any;\n lastUsedConnector?: string;\n [key: string]: any;\n}\n\n/**\n * Implements a file system backend.\n * This is designed for Node.js environments to store session data on the filesystem.\n */\nexport class NodeBackend {\n private basePath: string;\n private sessionFile: string;\n private data: SessionData = {};\n private callbackServer?: CallbackServer;\n\n constructor(basePath: string) {\n if (!basePath) {\n throw new Error(\"basePath is required for NodeBackend\");\n }\n this.basePath = basePath;\n this.sessionFile = path.join(this.basePath, \"session.json\");\n }\n\n private async ensureDirectoryExists(): Promise<void> {\n try {\n await fs.access(this.basePath);\n } catch {\n try {\n await fs.mkdir(this.basePath, { recursive: true });\n } catch (error: any) {\n throw new Error(\n `Failed to create directory ${this.basePath}: ${error.message}`,\n );\n }\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n const content = await fs.readFile(this.sessionFile, \"utf-8\");\n const parsed = JSON.parse(content);\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Invalid session data format\");\n }\n\n this.data = parsed;\n } catch (error: unknown) {\n if (error instanceof Error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw new Error(`Failed to load session data: ${error.message}`);\n }\n }\n this.data = {};\n }\n }\n\n private async saveData(): Promise<void> {\n try {\n await this.ensureDirectoryExists();\n await fs.writeFile(\n this.sessionFile,\n JSON.stringify(this.data, null, 2),\n \"utf-8\",\n );\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to save session data: ${error.message}`);\n }\n throw error;\n }\n }\n\n async get(key: string): Promise<string | null> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n return this.data[key] ? JSON.stringify(this.data[key]) : null;\n }\n\n async set(key: string, value: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n if (!value) {\n throw new Error(\"Value is required\");\n }\n\n await this.loadData();\n try {\n this.data[key] = JSON.parse(value);\n await this.saveData();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to set ${key}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async delete(key: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n delete this.data[key];\n await this.saveData();\n }\n\n async getRedirectUri(): Promise<string> {\n try {\n this.callbackServer = new CallbackServer();\n return await this.callbackServer.listen();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to start callback server: ${error.message}`);\n }\n throw error;\n }\n }\n\n async waitForCallback(): Promise<string | null> {\n if (!this.callbackServer) {\n throw new Error(\"Callback server not initialized\");\n }\n return await this.callbackServer.waitForCallback();\n }\n\n openLink(url: string): void {\n if (!url) {\n throw new Error(\"URL is required\");\n }\n\n console.log(`\\n\\t Open url to authorize session: ${url}`);\n }\n}\n","import { ec, stark, WalletAccount } from \"starknet\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\n\nimport SessionAccount from \"./account\";\nimport { KEYCHAIN_URL } from \"../constants\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport { NodeBackend } from \"./backend\";\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n basePath: string;\n keychainUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _backend: NodeBackend;\n\n constructor({\n rpc,\n chainId,\n policies,\n basePath,\n keychainUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._backend = new NodeBackend(basePath);\n }\n\n async username() {\n const sessionStr = await this._backend.get(\"session\");\n if (sessionStr) {\n const session = JSON.parse(sessionStr);\n return session.username;\n }\n return undefined;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const [sessionStr, signerStr] = await Promise.all([\n this._backend.get(\"session\"),\n this._backend.get(\"signer\"),\n ]);\n\n if (!sessionStr || !signerStr) {\n return undefined;\n }\n\n const session = JSON.parse(sessionStr);\n const signer = JSON.parse(signerStr);\n\n // Check expiration\n const expirationTime = parseInt(session.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n await this.disconnect();\n return undefined;\n }\n\n this._username = session.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: session.address,\n ownerGuid: session.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(session.expiresAt),\n policies: toWasmPolicies(this._policies),\n });\n\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const account = await this.probe();\n if (account) {\n return account;\n }\n\n const pk = stark.randomAddress();\n const publicKey = ec.starkCurve.getStarkKey(pk);\n\n await this._backend.set(\n \"signer\",\n JSON.stringify({\n privKey: pk,\n pubKey: publicKey,\n }),\n );\n\n // Get redirect URI from local server\n const redirectUri = await this._backend.getRedirectUri();\n\n const url = `${\n this._keychainUrl\n }/session?public_key=${encodeURIComponent(publicKey)}&redirect_uri=${encodeURIComponent(\n redirectUri,\n )}&redirect_query_name=startapp&policies=${encodeURIComponent(\n JSON.stringify(this._policies),\n )}&rpc_url=${encodeURIComponent(this._rpcUrl)}`;\n\n this._backend.openLink(url);\n\n // Wait for callback with session data\n const sessionData = await this._backend.waitForCallback();\n if (sessionData) {\n const sessionRegistration = JSON.parse(atob(sessionData));\n // Ensure addresses are properly formatted\n sessionRegistration.address = sessionRegistration.address.toLowerCase();\n sessionRegistration.ownerGuid =\n sessionRegistration.ownerGuid.toLowerCase();\n await this._backend.set(\"session\", JSON.stringify(sessionRegistration));\n return this.probe();\n }\n\n return undefined;\n }\n\n async disconnect(): Promise<void> {\n await this._backend.delete(\"signer\");\n await this._backend.delete(\"session\");\n this.account = undefined;\n this._username = undefined;\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n}\n"]}
@@ -115,7 +115,7 @@ var KEYCHAIN_URL = "https://x.cartridge.gg";
115
115
  // package.json
116
116
  var package_default = {
117
117
  name: "@cartridge/controller",
118
- version: "0.7.2",
118
+ version: "0.7.3",
119
119
  description: "Cartridge Controller",
120
120
  module: "dist/index.js",
121
121
  types: "dist/index.d.ts",