sphere-connect 1.0.5 → 1.0.7

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/core/EventEmitter.ts","../src/types/index.ts","../src/wallet/SphereWallet.ts","../src/auth/GoogleAuthProvider.ts","../src/storage/SecureStorage.ts","../src/auth/KeyDerivation.ts","../src/core/constants.ts","../src/SphereAccountAbstraction.ts","../src/react/SphereProvider.tsx","../src/react/SphereModal.tsx","../src/react/SphereAvatar.tsx"],"names":["ErrorCode","CedraNetwork","nonce","CryptoJS","Account","CedraConfig","Cedra","wallet","useState","useEffect","jsx"],"mappings":";;;;;;;;AAIO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACH,IAAA,IAAA,CAAQ,SAAA,uBAAyC,GAAA,EAAI;AAAA,EAAA;AAAA,EAErD,EAAA,CAAG,OAAe,QAAA,EAA0B;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,KAAK,QAAQ,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,GAAA,CAAI,OAAe,QAAA,EAA0B;AACzC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC/C,IAAA,IAAI,cAAA,EAAgB;AAChB,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAC7C,MAAA,IAAI,UAAU,EAAA,EAAI;AACd,QAAA,cAAA,CAAe,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MAClC;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,IAAA,CAAK,UAAkB,IAAA,EAAsB;AACzC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC/C,IAAA,IAAI,cAAA,IAAkB,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC7C,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAA,QAAA,KAAY,QAAA,CAAS,GAAG,IAAI,CAAC,CAAA;AACpD,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,mBAAmB,KAAA,EAAsB;AACrC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC/B,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACzB;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ,CAAA;;;ACiMO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AACH,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AACzB,EAAAA,WAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,WAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,WAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,WAAA,qBAAA,CAAA,GAAsB,qBAAA;AACtB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,WAAA,gBAAA,CAAA,GAAiB,gBAAA;AAZT,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AAgBL,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACtC,WAAA,CACW,IAAA,EACP,OAAA,EACO,OAAA,EACT;AACE,IAAA,KAAA,CAAM,OAAO,CAAA;AAJN,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EAChB;AACJ;;;ACvOO,IAAM,eAAN,MAAkD;AAAA,EAQrD,WAAA,CAAY,WAAA,EAA6B,mBAAA,EAAwC,iBAAA,EAAsC,aAAsB,UAAA,EAAqB;AAHlK,IAAA,IAAA,CAAQ,aAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,WAAA,GAA6B,IAAA;AAGjC,IAAA,IAAI;AACA,MAAA,IAAI,uBAAuB,KAAA,EAAO;AAE9B,QAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,QAAA,IAAA,CAAK,aAAA,GAAgB,mBAAA;AACrB,QAAA,MAAM,GAAA,GAAM,iBAAA;AACZ,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAA,IAAO,SAAS,CAAA;AAC/C,QAAA,IAAA,CAAK,cAAc,WAAA,IAAe,IAAA;AAElC,QAAA,MAAM,eAAe,UAAA,CAAW,gBAAA,CAAiB,IAAA,CAAK,aAAA,EAAe,mBAAmB,OAAO,CAAA;AAC/F,QAAA,MAAM,UAAA,GAAa,IAAI,iBAAA,CAAkB,YAAY,CAAA;AACrD,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,cAAA,CAAe,EAAE,YAAY,CAAA;AAAA,MACxD,CAAA,MAAO;AAEH,QAAA,IAAA,CAAK,aAAA,GAAgB,WAAA;AACrB,QAAA,MAAM,GAAA,GAAM,mBAAA;AACZ,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,GAAA,IAAO,SAAS,CAAA;AAC/C,QAAA,MAAM,WAAW,WAAA,IAAgB,iBAAA;AAEjC,QAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY;AAAA,UAC3B,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,QAAA,EAAU;AAAA,SACb,CAAA;AACD,QAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,MAAM,CAAA;AAC9B,QAAA,IAAA,CAAK,cAAc,UAAA,IAAc,IAAA;AAEjC,QAAA,MAAM,eAAe,UAAA,CAAW,gBAAA,CAAiB,IAAA,CAAK,aAAA,EAAe,mBAAmB,OAAO,CAAA;AAC/F,QAAA,MAAM,UAAA,GAAa,IAAI,iBAAA,CAAkB,YAAY,CAAA;AACrD,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,cAAA,CAAe,EAAE,YAAY,CAAA;AAAA,MACxD;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,wBAAA;AAAA,QAEN,yBAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,UAAA,GAAqB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,QAAA,EAAS;AAAA,EAChD;AAAA,EAEA,YAAA,GAAuB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAS;AAAA,EAC3C;AAAA,EAEA,aAAA,GAA+B;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA,EAEA,MAAM,aAAA,GAAkC;AACpC,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,CAAK,OAAO,cAAA,CAAe;AAAA,QAC7B,cAAA,EAAgB,KAAK,OAAA,CAAQ;AAAA,OAChC,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACX,SAAS,KAAA,EAAO;AACZ,MAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAM,WAAW,QAAA,EAAyC;AACtD,IAAA,MAAM,eAAA,GAAkB,4BAAA;AACxB,IAAA,MAAM,iBAAiB,QAAA,IAAY,eAAA;AAEnC,IAAA,IAAI;AAEA,MAAA,IAAI,cAAA,CAAe,WAAW,IAAI,CAAA,IAAK,CAAC,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAAG;AACnE,QAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,UACrC,OAAA,EAAS;AAAA,YACL,QAAA,EAAU,sCAAA;AAAA,YACV,aAAA,EAAe,CAAC,+BAA+B,CAAA;AAAA,YAC/C,iBAAA,EAAmB,CAAC,IAAA,CAAK,UAAA,IAAc,cAAc;AAAA;AACzD,SACH,CAAA;AACD,QAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,UACtC,OAAA,EAAS;AAAA,YACL,QAAA,EAAU,+BAAA;AAAA,YACV,aAAA,EAAe,CAAC,+BAA+B,CAAA;AAAA,YAC/C,iBAAA,EAAmB,CAAC,cAAc;AAAA;AACtC,SACH,CAAA;AAED,QAAA,MAAM,SAAA,GAAY,OAAA,EAAS,QAAA,EAAS,IAAK,GAAA;AACzC,QAAA,MAAM,WAAA,GAAc,QAAA,GAAW,MAAA,CAAO,QAAQ,CAAA,GAAI,CAAA;AAClD,QAAA,OAAO;AAAA,UACH,QAAA,EAAU,cAAA;AAAA,UACV,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU,WAAA;AAAA,UACV,SAAA,EAAA,CAAY,MAAA,CAAO,SAAS,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,EAAI,WAAW,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,CAAC,CAAC;AAAA,SAC/F;AAAA,MACJ;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB;AAAA,QAClD,cAAA,EAAgB,KAAK,OAAA,CAAQ,cAAA;AAAA,QAC7B,QAAA,EAAU;AAAA,OACb,CAAA;AAED,MAAA,OAAO;AAAA,QACH,QAAA,EAAU,cAAA;AAAA,QACV,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,QACxB,QAAA,EAAU,CAAA;AAAA,QACV,YAAY,MAAA,CAAO,MAAM,CAAA,GAAI,GAAA,EAAK,QAAQ,CAAC;AAAA,OAC/C;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAO;AAAA,QACH,QAAA,EAAU,cAAA;AAAA,QACV,MAAA,EAAQ,GAAA;AAAA,QACR,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW;AAAA,OACf;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,cAAA,GAAyC;AAC3C,IAAA,OAAO,CAAC,MAAM,IAAA,CAAK,UAAA,EAAY,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,eAAA,CAAgB,OAAA,EAA6B,QAAA,GAAoB,IAAA,EAAkC;AACrG,IAAA,IAAI;AACA,MAAA,MAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAU,YAAA,EAAc,cAAa,GAAI,OAAA;AAE7D,MAAA,MAAM,cAAc,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,MAAM,MAAA,CAAO;AAAA,QAC3D,MAAA,EAAQ,KAAK,OAAA,CAAQ,cAAA;AAAA,QACrB,IAAA,EAAM;AAAA,UACF,QAAA,EAAW,QAAA,EAAU,UAAA,CAAW,IAAI,CAAA,IAAK,CAAC,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,GAC1D,uCAAA,GACA,8BAAA;AAAA,UACN,aAAA,EAAgB,QAAA,EAAU,UAAA,CAAW,IAAI,CAAA,IAAK,CAAC,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,GAC/D,CAAC,+BAA+B,IAChC,EAAC;AAAA,UACP,mBAAoB,QAAA,EAAU,UAAA,CAAW,IAAI,CAAA,IAAK,CAAC,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,GACnE,CAAC,QAAA,EAAU,EAAA,EAAI,MAAM,CAAA,GACrB,CAAC,IAAI,MAAM;AAAA,SACrB;AAAA,QACA,OAAA,EAAS;AAAA,UACL,cAAc,YAAA,IAAgB,GAAA;AAAA,UAC9B;AAAA;AACJ,OACH,CAAA;AAED,MAAA,IAAI,QAAA,EAAU;AACV,QAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,KAAK,MAAA,CAAO,WAAA,CAAY,SAAS,MAAA,CAAO;AAAA,UACxD,eAAA,EAAiB,KAAK,OAAA,CAAQ,SAAA;AAAA,UAC9B;AAAA,SACH,CAAA;AACD,QAAA,IAAI,CAAC,IAAI,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,GAAA,CAAI,SAAS,CAAA,CAAE,CAAA;AAAA,MAC3E;AAEA,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,MAAA,CAAO,YAAY,IAAA,CAAK;AAAA,QACrD,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb;AAAA,OACH,CAAA;AAED,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAO,MAAA,CAAO;AAAA,QACxD,WAAA;AAAA,QACA,mBAAA,EAAqB;AAAA,OACxB,CAAA;AAED,MAAA,OAAO,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA;AAAA,IACrD,SAAS,KAAA,EAAY;AACjB,MAAA,MAAM,IAAI,cAAA,CAAA,oBAAA,2BAA6C,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAAA,IAC/E;AAAA,EACJ;AAAA,EAEA,MAAM,mBAAmB,IAAA,EAA0C;AAC/D,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,MAAA,CAAO,mBAAmB,EAAE,eAAA,EAAiB,MAAM,CAAA;AACzE,IAAA,OAAO;AAAA,MACH,IAAA;AAAA,MACA,SAAS,EAAA,CAAG,OAAA;AAAA,MACZ,UAAU,EAAA,CAAG,SAAA;AAAA,MACb,SAAS,EAAA,CAAG,QAAA;AAAA,MACZ,SAAS,EAAA,CAAG;AAAA,KAChB;AAAA,EACJ;AAAA,EAEA,MAAM,WAAA,GAA+B;AACjC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AACpD,IAAA,OAAO,GAAA,CAAI,YAAA;AAAA,EACf;AAAA,EAEA,MAAM,qBAAA,GAA2D;AAC7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,sBAAA,CAAuB;AAAA,MACjD,cAAA,EAAgB,KAAK,OAAA,CAAQ;AAAA,KAChC,CAAA;AAED,IAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,MAAa;AAAA,MACzB,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,SAAS,EAAA,CAAG,OAAA;AAAA,MACZ,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,QAAA,EAAU,EAAA,CAAG,OAAA,EAAS,iBAAA,GAAoB,CAAC,CAAA;AAAA,MAC3C,MAAA,EAAQ,EAAA,CAAG,OAAA,EAAS,iBAAA,GAAoB,CAAC,CAAA;AAAA,MACzC,SAAA,EAAW,QAAA,CAAS,EAAA,CAAG,SAAA,IAAa,GAAG,CAAA,GAAI,GAAA;AAAA,MAC3C,SAAS,EAAA,CAAG;AAAA,KAChB,CAAE,CAAA;AAAA,EACN;AAAA,EAEA,MAAM,oBAAoB,OAAA,EAA6B;AACnD,IAAA,MAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,YAAA,EAAc,cAAa,GAAI,OAAA;AACnD,IAAA,MAAM,cAAc,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,MAAM,MAAA,CAAO;AAAA,MAC3D,MAAA,EAAQ,KAAK,OAAA,CAAQ,cAAA;AAAA,MACrB,IAAA,EAAM;AAAA,QACF,QAAA,EAAU,8BAAA;AAAA,QACV,iBAAA,EAAmB,CAAC,EAAA,EAAI,MAAM;AAAA,OAClC;AAAA,MACA,OAAA,EAAS;AAAA,QACL,cAAc,YAAA,IAAgB,GAAA;AAAA,QAC9B;AAAA;AACJ,KACH,CAAA;AAED,IAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,KAAK,MAAA,CAAO,WAAA,CAAY,SAAS,MAAA,CAAO;AAAA,MACxD,eAAA,EAAiB,KAAK,OAAA,CAAQ,SAAA;AAAA,MAC9B;AAAA,KACH,CAAA;AAED,IAAA,OAAO;AAAA,MACH,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,SAAS,GAAA,CAAI,QAAA;AAAA,MACb,cAAc,GAAA,CAAI,cAAA;AAAA,MAClB,cAAc,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA,CAAO,IAAI,cAAc,CAAA;AAAA,MAC9D,UAAU,GAAA,CAAI;AAAA,KAClB;AAAA,EACJ;AAAA,EAEA,MAAM,YAAY,OAAA,EAAkC;AAChD,IAAA,MAAM,GAAA,GAAM,KAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAC/D,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACxB;AAAA,EAEA,MAAM,cAAA,GAAsC;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,EAAE,cAAA,EAAgB,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,CAAA;AAC7F,IAAA,OAAO;AAAA,MACH,OAAA,EAAS,KAAK,UAAA,EAAW;AAAA,MACzB,SAAA,EAAW,KAAK,YAAA,EAAa;AAAA,MAC7B,aAAA,EAAe,IAAA;AAAA,MACf,gBAAgB,IAAA,CAAK,eAAA;AAAA,MACrB,SAAS,IAAA,CAAK;AAAA,KAClB;AAAA,EACJ;AAAA,EAEA,MAAM,UAAA,GAA4B;AAE9B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACnB;AAAA,EAEA,aAAA,CAAc,SAAkB,WAAA,EAA2B;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,IAAI,WAAA,CAAY,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,CAAC,CAAA;AAAA,EAC7F;AAAA,EAEQ,WAAW,OAAA,EAA+B;AAC9C,IAAA,QAAQ,OAAA,CAAQ,aAAY;AAAG,MAC3B,KAAK,SAAA;AAAW,QAAA,OAAOC,OAAA,CAAa,OAAA;AAAA,MACpC,KAAK,SAAA;AAAW,QAAA,OAAOA,OAAA,CAAa,OAAA;AAAA,MACpC,KAAK,QAAA;AAAU,QAAA,OAAOA,OAAA,CAAa,MAAA;AAAA,MACnC;AAAS,QAAA,OAAOA,OAAA,CAAa,OAAA;AAAA;AACjC,EACJ;AAAA,EAEA,UAAA,GAAsB;AAAE,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAAS;AAAA,EAC7C,SAAA,GAAmB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA,EACzC,gBAAA,GAA2B;AAAE,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAAe;AAAA,EACxD,iBAAiB,MAAA,EAA6B;AAAE,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AAAA,EAAQ;AAAA,EAC7E,SAAA,GAAqB;AAAE,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,aAAA;AAAA,EAAe;AACxD;ACnSO,IAAM,qBAAN,MAAyB;AAAA,EAI5B,YAAY,MAAA,EAA0B;AAClC,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAM,KAAA,EAA6C;AACrD,IAAA,IAAI;AAEA,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,QAAA,MAAM,IAAI,cAAA;AAAA,UAAA,uBAAA;AAAA,UAEN;AAAA,SACJ;AAAA,MACJ;AAGA,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAEpC,QAAA,IAAA,CAAK,wBAAA,EAAyB,CACzB,IAAA,CAAK,MAAM;AACR,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,GAAc,UAAA,GAAa,OAAA;AAE/C,UAAA,IAAI,WAAW,UAAA,EAAY;AAEvB,YAAA,MAAMC,MAAAA,GAAQ,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AAG9E,YAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,cAC/B,WAAW,IAAA,CAAK,QAAA;AAAA,cAChB,cAAc,IAAA,CAAK,WAAA;AAAA,cACnB,aAAA,EAAe,UAAA;AAAA,cACf,KAAA,EAAO,sBAAA;AAAA,cACP,KAAA,EAAOA,MAAAA;AAAA,cACP,MAAA,EAAQ;AAAA,aACX,CAAA;AAED,YAAA,MAAM,OAAA,GAAU,CAAA,6CAAA,EAAgD,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAGjF,YAAA,MAAA,CAAO,SAAS,IAAA,GAAO,OAAA;AAAA,UAI3B,CAAA,MAAO;AAGH,YAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,eAAA,CAAgB;AAAA,cAClD,WAAW,IAAA,CAAK,QAAA;AAAA,cAChB,KAAA,EAAO,sBAAA;AAAA,cACP,KAAA;AAAA;AAAA,cACA,QAAA,EAAU,OAAO,aAAA,KAAuB;AACpC,gBAAA,IAAI,cAAc,KAAA,EAAO;AACrB,kBAAA,MAAA,CAAO,IAAI,cAAA;AAAA,oBAAA,uBAAA;AAAA,oBAEP,CAAA,qBAAA,EAAwB,aAAA,CAAc,iBAAA,IAAqB,aAAA,CAAc,KAAK,CAAA;AAAA,mBACjF,CAAA;AACD,kBAAA;AAAA,gBACJ;AAEA,gBAAA,IAAI,aAAA,IAAiB,cAAc,YAAA,EAAc;AAC7C,kBAAA,IAAI;AAEA,oBAAA,MAAM,gBAAA,GAAmB,MAAM,KAAA,CAAM,+CAAA,EAAiD;AAAA,sBAClF,OAAA,EAAS;AAAA,wBACL,eAAA,EAAiB,CAAA,OAAA,EAAU,aAAA,CAAc,YAAY,CAAA;AAAA;AACzD,qBACH,CAAA;AAED,oBAAA,IAAI,CAAC,iBAAiB,EAAA,EAAI;AACtB,sBAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,oBAC3D;AAEA,oBAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAiB,IAAA,EAAK;AAE5C,oBAAA,MAAM,YAAA,GAAmC;AAAA,sBACrC,SAAS,aAAA,CAAc,YAAA;AAAA;AAAA,sBACvB,OAAO,OAAA,CAAQ,KAAA;AAAA,sBACf,MAAM,OAAA,CAAQ,IAAA;AAAA,sBACd,SAAS,OAAA,CAAQ,OAAA;AAAA,sBACjB,KAAK,OAAA,CAAQ;AAAA,qBACjB;AAEA,oBAAA,OAAA,CAAQ,YAAY,CAAA;AAAA,kBACxB,SAAS,KAAA,EAAO;AACZ,oBAAA,MAAA,CAAO,IAAI,cAAA;AAAA,sBAAA,uBAAA;AAAA,sBAEP,6CAAA;AAAA,sBACA;AAAA,qBACH,CAAA;AAAA,kBACL;AAAA,gBACJ;AAAA,cACJ;AAAA,aACH,CAAA;AAGD,YAAA,MAAA,CAAO,kBAAA,EAAmB;AAAA,UAC9B;AAAA,QACJ,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,CAAA;AAAA,MACrB,CAAC,CAAA;AAAA,IACL,SAAS,KAAA,EAAO;AACZ,MAAA,IAAI,iBAAiB,cAAA,EAAgB;AACjC,QAAA,MAAM,KAAA;AAAA,MACV;AACA,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,uBAAA;AAAA,QAEN,iCAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CAAW,QAAA,EAAsD,KAAA,EAA+B;AAClG,IAAA,MAAM,KAAK,wBAAA,EAAyB;AAEpC,IAAA,MAAA,CAAO,QAAA,CAAS,GAAG,UAAA,CAAW;AAAA,MAC1B,WAAW,IAAA,CAAK,QAAA;AAAA,MAChB,QAAA;AAAA,MACA;AAAA,KACH,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,yBACT,UAAA,EAC2B;AAC3B,IAAA,IAAI;AAEA,MAAA,MAAM,OAAA,GAAU,UAAU,UAAU,CAAA;AAGpC,MAAA,MAAM,YAAA,GAAmC;AAAA,QACrC,OAAA,EAAS,UAAA;AAAA,QACT,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,KAAK,OAAA,CAAQ;AAAA,OACjB;AAGA,MAAA,IAAI,CAAC,YAAA,CAAa,KAAA,IAAS,CAAC,aAAa,GAAA,EAAK;AAC1C,QAAA,MAAM,IAAI,cAAA;AAAA,UAAA,uBAAA;AAAA,UAEN;AAAA,SACJ;AAAA,MACJ;AAEA,MAAA,OAAO,YAAA;AAAA,IACX,SAAS,KAAA,EAAO;AACZ,MAAA,IAAI,iBAAiB,cAAA,EAAgB;AACjC,QAAA,MAAM,KAAA;AAAA,MACV;AACA,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,uBAAA;AAAA,QAEN,qCAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,OAAA,EAAmC;AACjD,IAAA,IAAI;AAEA,MAAA,MAAM,QAAA,GAAW,4CAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAQ,CAAA;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAGjC,MAAA,MAAM,SAAA,CAAU,SAAS,YAAY;AAGjC,QAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACtB,CAAC,CAAA;AAED,MAAA,OAAO,IAAA;AAAA,IACX,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAA,GAA0C;AAC9C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAGpC,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,QAAA,EAAU;AAClD,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,MAAA,CAAO,GAAA,GAAM,wCAAA;AACb,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AAEf,MAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,MAAA,MAAA,CAAO,UAAU,MACb,MAAA;AAAA,QACI,IAAI,cAAA;AAAA,UAAA,uBAAA;AAAA,UAEA;AAAA;AACJ,OACJ;AAEJ,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAAwB;AAC1B,IAAA,IAAI;AAEA,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,QAAA,EAAU;AAElD,QAAA,MAAA,CAAO,QAAA,CAAS,GAAG,iBAAA,EAAkB;AAAA,MACzC;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAAA,IAE/C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,CACF,SAAA,EACA,OAAA,EASa;AACb,IAAA,MAAM,KAAK,wBAAA,EAAyB;AAEpC,IAAA,IAAI,SAAS,QAAA,EAAU;AAEnB,MAAA,MAAA,CAAO,QAAA,CAAS,GAAG,UAAA,CAAW;AAAA,QAC1B,WAAW,IAAA,CAAK,QAAA;AAAA,QAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,OAAO,OAAA,CAAQ;AAAA;AAAA,OAClB,CAAA;AAAA,IACL;AAGA,IAAA,MAAA,CAAO,SAAS,EAAA,CAAG,YAAA,CAAa,QAAA,CAAS,cAAA,CAAe,SAAS,CAAA,EAAG;AAAA,MAChE,KAAA,EAAO,SAAS,KAAA,IAAS,SAAA;AAAA,MACzB,IAAA,EAAM,SAAS,IAAA,IAAQ,OAAA;AAAA,MACvB,IAAA,EAAM,SAAS,IAAA,IAAQ,aAAA;AAAA,MACvB,KAAA,EAAO,SAAS,KAAA,IAAS,aAAA;AAAA,MACzB,OAAO,OAAA,EAAS;AAAA;AAAA,KACnB,CAAA;AAAA,EACL;AACJ;ACnSO,IAAM,gBAAN,MAA+C;AAAA,EAIlD,WAAA,CAAY,aAAA,EAAwB,aAAA,GAAgB,YAAA,EAAc;AAE9D,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA,IAAiB,IAAA,CAAK,qBAAA,EAAsB;AACjE,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,GAAA,EAAqC;AAC/C,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,KAAK,aAAA,GAAgB,GAAA;AACrC,MAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,OAAA,CAAQ,OAAO,CAAA;AAElD,MAAA,IAAI,CAAC,aAAA,EAAe;AAChB,QAAA,OAAO,IAAA;AAAA,MACX;AAGA,MAAA,MAAM,QAAQC,SAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,KAAK,aAAa,CAAA;AAEpE,MAAA,IAAI;AACA,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,CAASA,SAAA,CAAS,IAAI,IAAI,CAAA;AAElD,QAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,QAAA,OAAO,SAAA;AAAA,MACX,SAAS,CAAA,EAAG;AAER,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kCAAA,EAAqC,GAAG,CAAA,yBAAA,CAA2B,CAAA;AAChF,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAO,IAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACrD,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,KAAK,aAAA,GAAgB,GAAA;AAGrC,MAAA,MAAM,SAAA,GAAYA,UAAS,GAAA,CAAI,OAAA;AAAA,QAC3B,KAAA;AAAA,QACA,IAAA,CAAK;AAAA,QACP,QAAA,EAAS;AAEX,MAAA,YAAA,CAAa,OAAA,CAAQ,SAAS,SAAS,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,eAAA;AAAA,QAEN,sBAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,GAAA,EAA4B;AACzC,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,KAAK,aAAA,GAAgB,GAAA;AACrC,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,eAAA;AAAA,QAEN,oCAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AACzB,IAAA,IAAI;AAEA,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA;AACrC,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,QAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,aAAa,CAAA,EAAG;AACpC,UAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,QAC/B;AAAA,MACJ;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,eAAA;AAAA,QAEN,yBAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,qBAAA,GAAgC;AACpC,IAAA,MAAM,WAAA,GAAc;AAAA,MAChB,SAAA,CAAU,SAAA;AAAA,MACV,SAAA,CAAU,QAAA;AAAA,MAAA,iBACV,IAAI,IAAA,EAAK,EAAE,iBAAA,EAAkB;AAAA,MAC7B,MAAA,CAAO,KAAA;AAAA,MACP,MAAA,CAAO,MAAA;AAAA,MACP;AAAA;AAAA,KACJ,CAAE,KAAK,GAAG,CAAA;AAEV,IAAA,OAAOA,SAAA,CAAS,MAAA,CAAO,WAAW,CAAA,CAAE,QAAA,EAAS;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAA,GAAuB;AAC1B,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,GAAO,kBAAA;AACb,MAAA,YAAA,CAAa,OAAA,CAAQ,MAAM,IAAI,CAAA;AAC/B,MAAA,YAAA,CAAa,WAAW,IAAI,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACX,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACJ;AACJ;AAMO,IAAM,iBAAN,MAAqB;AAAA,EAOxB,WAAA,CAAY,OAAA,EAA0B,oBAAA,GAAuB,EAAA,EAAI;AALjE,IAAA,IAAA,CAAQ,UAAA,GAAa,iBAAA;AAGrB;AAAA,IAAA,IAAA,CAAQ,aAAA,GAAoC,IAAA;AAGxC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,eAAA,GAAkB,oBAAA,GAAuB,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAuC;AACnC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,IAAA,EAAqD;AACnE,IAAA,IAAI;AACA,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC7B,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK;AAAA,OACjC;AAEA,MAAA,IAAA,CAAK,aAAA,GAAgB,WAAA;AACrB,MAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,QACf,IAAA,CAAK,UAAA;AAAA,QACL,IAAA,CAAK,UAAU,WAAW;AAAA,OAC9B;AAAA,IACJ,SAAS,KAAA,EAAY;AACjB,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,uBAAA;AAAA,QAEN,CAAA,8BAAA,EAAiC,MAAM,OAAO,CAAA;AAAA,OAClD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,GAA0C;AAC5C,IAAA,IAAI;AACA,MAAA,MAAM,aAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,UAAU,CAAA;AAE7D,MAAA,IAAI,CAAC,UAAA,EAAY;AACb,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,MAAM,OAAA,GAAuB,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAClD,MAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AAGrB,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,SAAA,EAAW;AAChC,QAAA,MAAM,KAAK,YAAA,EAAa;AACxB,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,OAAO,OAAA;AAAA,IACX,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,IAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA8B;AAChC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAmC;AACrC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,OAAO,OAAA,KAAY,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAgC;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,MAAM,KAAK,WAAA,CAAY;AAAA,QACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,QACzB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,cAAc,OAAA,CAAQ;AAAA,OACzB,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,GAAiD;AACnD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AAC9C,IAAA,OAAO,QAAA,GAAW,IAAI,QAAA,GAAW,CAAA;AAAA,EACrC;AACJ;AC5PO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASvB,OAAO,iBAAiB,OAAA,EAAuC;AAC3D,IAAA,IAAI;AACA,MAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,UAAA,GAAa,IAAA,CAAK,oBAAmB,GAAI,OAAA;AAG/D,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,cAAA;AAAA,UAAA,uBAAA;AAAA,UAEN;AAAA,SACJ;AAAA,MACJ;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI;AAC3B,QAAA,MAAM,IAAI,cAAA;AAAA,UAAA,uBAAA;AAAA,UAEN;AAAA,SACJ;AAAA,MACJ;AAIA,MAAA,MAAM,UAAA,GAAaA,SAAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM;AAAA,QAC7C,OAAA,EAAS,KAAK,UAAA,GAAa,CAAA;AAAA;AAAA,QAC3B,UAAA;AAAA,QACA,MAAA,EAAQA,UAAS,IAAA,CAAK;AAAA,OACzB,CAAA;AAGD,MAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,QAAA,CAASA,SAAAA,CAAS,IAAI,GAAG,CAAA;AAG1D,MAAA,IAAI,aAAA,CAAc,WAAW,EAAA,EAAI;AAC7B,QAAA,MAAM,IAAI,cAAA;AAAA,UAAA,uBAAA;AAAA,UAEN;AAAA,SACJ;AAAA,MACJ;AAEA,MAAA,OAAO,aAAA;AAAA,IACX,SAAS,KAAA,EAAO;AACZ,MAAA,IAAI,iBAAiB,cAAA,EAAgB;AACjC,QAAA,MAAM,KAAA;AAAA,MACV;AACA,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,uBAAA;AAAA,QAEN,8BAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,yBAAA,CAA0B,OAAA,EAAiB,SAAA,EAA2B;AAEzE,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,IAAA,EAAK,CAAE,WAAA,EAAY;AACjD,IAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,IAAA,EAAK,CAAE,WAAA,EAAY;AAGrD,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,eAAe,CAAA,iBAAA,CAAA;AAGpD,IAAA,MAAM,IAAA,GAAOA,SAAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AACrC,IAAA,OAAO,IAAA,CAAK,QAAA,CAASA,SAAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,kBAAkB,UAAA,EAA6B;AAElD,IAAA,MAAM,QAAA,GAAW,mBAAA;AACjB,IAAA,OAAO,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,mBAAmB,IAAA,EAAoB;AAI1C,IAAA,IAAI,IAAA,EAAM;AAEN,MAAC,IAAA,GAAe,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,wBAAA,GAAoC;AACvC,IAAA,OAAOC,QAAQ,QAAA,EAAS;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,YAAA,CAAa,SAAA,EAAmB,QAAA,EAAkB,SAAiB,CAAA,EAAW;AAGjF,IAAA,MAAM,WAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,IAAI,MAAM,CAAA,CAAA;AACnD,IAAA,MAAM,IAAA,GAAOD,SAAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AACrC,IAAA,OAAO,IAAA,CAAK,QAAA,CAASA,SAAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAAA,EACzC;AACJ;AA/Ha,aAAA,CACe,kBAAA,GAAqB,GAAA;AADpC,aAAA,CAEe,UAAA,GAAa,EAAA;;;ACRlC,IAAM,gBAAA,GAAmB,gBAAA;AAGzB,IAAM,mBAAA,GAAsB,8BAAA;ACW5B,IAAM,wBAAA,GAAN,cAAuC,YAAA,CAA8C;AAAA,EAWxF,YAAY,MAAA,EAAmB;AAC3B,IAAA,KAAA,EAAM;AANV,IAAA,IAAA,CAAQ,aAAA,GAAqC,IAAA;AAC7C,IAAA,IAAA,CAAQ,WAAA,GAAuB,KAAA;AAC/B,IAAA,IAAA,CAAiB,OAAA,GAAkB,gBAAA;AACnC,IAAA,IAAA,CAAiB,UAAA,GAAqB,mBAAA;AAIlC,IAAA,IAAI,CAAC,OAAO,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,uBAAA;AAAA,QAEN;AAAA,OACJ;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,OAAA,EAAS,OAAO,OAAA,IAAW,SAAA;AAAA,MAC3B,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,aAAa,MAAA,CAAO;AAAA,KACxB;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,WAAA;AACxB,IAAA,MAAM,WAAA,GAAc,IAAIE,WAAAA,CAAY;AAAA,MAChC,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,QAAA,EAAU;AAAA,KACb,CAAA;AAED,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,KAAAA,CAAM,WAAW,CAAA;AAClC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,kBAAA,CAAmB;AAAA,MACvC,QAAA,EAAU,KAAK,MAAA,CAAO,cAAA;AAAA,MACtB,WAAA,EAAa,KAAK,MAAA,CAAO;AAAA,KAC5B,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,UAAA,GAA4B;AAC9B,IAAA,IAAI,KAAK,WAAA,EAAa;AAEtB,IAAA,IAAI;AACA,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA,IAC3B,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACvB;AAAA,EACJ;AAAA,EAEA,MAAM,eAAA,GAAgD;AAClD,IAAA,IAAI;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAM,KAAK,UAAA,EAAW;AAE7C,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA,CAAa,KAAA,EAAM;AAEjD,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,WAAW,GAAA,IAAO,CAAC,WAAW,KAAA,EAAO;AAGrD,QAAA,OAAO,IAAA;AAAA,MACX;AAGA,MAAA,MAAM,OAAO,aAAA,CAAc,yBAAA,CAA0B,IAAA,CAAK,OAAA,EAAS,WAAW,KAAK,CAAA;AACnF,MAAA,MAAM,aAAA,GAAgB,cAAc,gBAAA,CAAiB;AAAA,QACjD,QAAQ,UAAA,CAAW,GAAA;AAAA,QACnB,IAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACf,CAAA;AAED,MAAA,MAAM,SAAS,IAAI,YAAA;AAAA,QACf,IAAA,CAAK,KAAA;AAAA,QACL,aAAA;AAAA,QACA,KAAK,MAAA,CAAO,OAAA;AAAA,QACZ,KAAK,MAAA,CAAO,WAAA;AAAA,QACZ,KAAK,MAAA,CAAO;AAAA,OAChB;AAGA,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,iBAAA,CAAkB,aAAa,CAAA;AAG5D,MAAA,MAAM,IAAA,CAAK,eAAe,WAAA,CAAY;AAAA,QAClC,eAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACN,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,SAAS,UAAA,CAAW;AAAA;AACxB,OACH,CAAA;AAED,MAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,CAAA;AACtD,MAAA,OAAO,MAAA;AAAA,IACX,SAAS,KAAA,EAAY;AACjB,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,uBAAA;AAAA,QAEN,CAAA,8BAAA,EAAiC,MAAM,OAAO,CAAA;AAAA,OAClD;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,cAAA,GAAsD;AACxD,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,cAAA,CAAe,UAAA,EAAW;AACrD,MAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,KAAI,EAAG;AAC3C,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,eAAe,CAAA;AACpE,QAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,QAAA,MAAM,SAAS,IAAI,YAAA;AAAA,UACf,IAAA,CAAK,KAAA;AAAA,UACL,aAAA;AAAA,UACA,KAAK,MAAA,CAAO,OAAA;AAAA,UACZ,KAAK,MAAA,CAAO,WAAA;AAAA,UACZ,KAAK,MAAA,CAAO;AAAA,SAChB;AACA,QAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,QAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,YAAY,CAAA;AACxD,QAAA,OAAO,MAAA;AAAA,MACX;AAAA,IACJ,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,MAAM,qBAAqB,UAAA,EAAkD;AACzE,IAAA,IAAI;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAM,KAAK,UAAA,EAAW;AAE7C,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA,CAAa,yBAAyB,UAAU,CAAA;AAG9E,MAAA,MAAM,OAAO,aAAA,CAAc,yBAAA,CAA0B,IAAA,CAAK,OAAA,EAAS,WAAW,KAAK,CAAA;AACnF,MAAA,MAAM,aAAA,GAAgB,cAAc,gBAAA,CAAiB;AAAA,QACjD,QAAQ,UAAA,CAAW,GAAA;AAAA,QACnB,IAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACf,CAAA;AAED,MAAA,MAAM,SAAS,IAAI,YAAA;AAAA,QACf,IAAA,CAAK,KAAA;AAAA,QACL,aAAA;AAAA,QACA,KAAK,MAAA,CAAO,OAAA;AAAA,QACZ,KAAK,MAAA,CAAO,WAAA;AAAA,QACZ,KAAK,MAAA,CAAO;AAAA,OAChB;AAGA,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,iBAAA,CAAkB,aAAa,CAAA;AAG5D,MAAA,MAAM,IAAA,CAAK,eAAe,WAAA,CAAY;AAAA,QAClC,eAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACN,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,SAAS,UAAA,CAAW;AAAA;AACxB,OACH,CAAA;AAED,MAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,MAAA,IAAA,CAAK,KAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA,EAAM,YAAY,CAAA;AACtD,MAAA,OAAO,MAAA;AAAA,IACX,SAAS,KAAA,EAAY;AACjB,MAAA,MAAM,IAAI,cAAA;AAAA,QAAA,uBAAA;AAAA,QAEN,CAAA,kCAAA,EAAqC,MAAM,OAAO,CAAA;AAAA,OACtD;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC1B,IAAA,MAAM,IAAA,CAAK,aAAa,MAAA,EAAO;AAC/B,IAAA,MAAM,IAAA,CAAK,eAAe,YAAA,EAAa;AACvC,IAAA,IAAI,KAAK,aAAA,EAAe;AACpB,MAAA,MAAM,IAAA,CAAK,cAAc,UAAA,EAAW;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,EACtB;AAAA,EAEA,eAAA,GAA2B;AACvB,IAAA,OAAO,KAAK,aAAA,KAAkB,IAAA;AAAA,EAClC;AAAA,EAEA,gBAAA,GAA+C;AAC3C,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAChB;AAAA,EAEA,YAAA,GAA8B;AAC1B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,gBAAA,EAAiB;AACrD,IAAA,OAAO,OAAA,EAAS,SAAS,KAAA,IAAS,IAAA;AAAA,EACtC;AAAA,EAEA,WAAA,GAA6B;AACzB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,gBAAA,EAAiB;AACrD,IAAA,OAAO,OAAA,EAAS,SAAS,IAAA,IAAQ,IAAA;AAAA,EACrC;AAAA,EAEA,cAAA,GAAgC;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,gBAAA,EAAiB;AACrD,IAAA,OAAO,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,EACxC;AAAA,EAEA,qBAAA,GAAuC;AAEnC,IAAA,OAAO,IAAA,CAAK,aAAA,EAAe,YAAA,EAAa,IAAK,IAAA;AAAA,EACjD;AAAA,EAEA,MAAM,aAAA,CAAc,OAAA,EAAkB,WAAA,EAAoC;AACtE,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,OAAA;AACtB,IAAA,IAAA,CAAK,OAAO,WAAA,GAAc,WAAA;AAE1B,IAAA,MAAM,WAAA,GAAc,IAAID,WAAAA,CAAY;AAAA,MAChC,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACb,CAAA;AAED,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,KAAAA,CAAM,WAAW,CAAA;AAElC,IAAA,IAAI,KAAK,aAAA,EAAe;AACpB,MAAA,IAAA,CAAK,aAAA,CAAc,aAAA,CAAc,OAAA,EAAS,WAAW,CAAA;AAAA,IACzD;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,EAAE,OAAA,EAAS,aAAa,CAAA;AAAA,EACzD;AAAA,EAEA,aAAA,GAAoC;AAChC,IAAA,OAAO,KAAK,MAAA,CAAO,UAAA;AAAA,EACvB;AAAA;AAAA,EAGQ,kBAAkB,aAAA,EAA+B;AACrD,IAAA,OAAOH,UAAS,GAAA,CAAI,OAAA,CAAQ,eAAe,IAAA,CAAK,UAAU,EAAE,QAAA,EAAS;AAAA,EACzE;AAAA,EAEQ,kBAAkB,aAAA,EAA+B;AACrD,IAAA,IAAI;AACA,MAAA,MAAM,QAAQA,SAAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,KAAK,UAAU,CAAA;AACjE,MAAA,OAAO,KAAA,CAAM,QAAA,CAASA,SAAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAK,wCAAwC,CAAA;AACrD,MAAA,OAAO,EAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA,EAGA,EAAA,CAAG,OAAe,QAAA,EAA0C;AACxD,IAAA,OAAO,KAAA,CAAM,EAAA,CAAG,KAAA,EAAO,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,GAAA,CAAI,OAAe,QAAA,EAA0C;AACzD,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,EACpC;AACJ;ACjQA,IAAM,aAAA,GAAgB,cAA6C,MAAS,CAAA;AAOrE,IAAM,cAAA,GAAgD,CAAC,EAAE,QAAA,EAAU,QAAO,KAAM;AACnF,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,QAAA,CAAS,MAAM,IAAI,wBAAA,CAAyB,MAAM,CAAC,CAAA;AACjE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAqC,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAA4B,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA6B,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAO,YAAA,KAAsC;AACzE,IAAA,IAAI;AACA,MAAA,MAAM,CAAC,IAAA,EAAM,GAAG,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAClC,aAAa,cAAA,EAAe;AAAA,QAC5B,aAAa,UAAA;AAAW,OAC3B,CAAA;AACD,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,UAAA,CAAW,GAAG,CAAA;AAAA,IAClB,SAAS,GAAA,EAAK;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,GAAG,CAAA;AAAA,IAChD;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,MAAA,GAAS,CAAC,EAAE,MAAA,EAAAI,SAAO,KAAuC;AAC5D,MAAA,SAAA,CAAUA,OAAM,CAAA;AAChB,MAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,EAAa;AAC/B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA;AAC7B,MAAA,cAAA,CAAe,GAAA,CAAI,gBAAgB,CAAA;AACnC,MAAA,WAAA,CAAYA,OAAM,CAAA;AAAA,IACtB,CAAA;AAEA,IAAA,MAAM,WAAW,MAAM;AACnB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACnB,CAAA;AAGA,IAAA,GAAA,CAAI,EAAA,CAAG,gBAAgB,MAAM,CAAA;AAC7B,IAAA,GAAA,CAAI,EAAA,CAAG,UAAU,QAAQ,CAAA;AAEzB,IAAA,MAAM,OAAO,YAAY;AACrB,MAAA,IAAI;AACA,QAAA,MAAM,IAAI,UAAA,EAAW;AACrB,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,cAAA,EAAe;AAC1C,QAAA,IAAI,QAAA,EAAU;AACV,UAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,UAAA,YAAA,CAAa,GAAA,CAAI,cAAc,CAAA;AAC/B,UAAA,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA;AAC7B,UAAA,cAAA,CAAe,GAAA,CAAI,gBAAgB,CAAA;AACnC,UAAA,MAAM,YAAY,QAAQ,CAAA;AAAA,QAC9B;AAAA,MACJ,SAAS,GAAA,EAAU;AACf,QAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AACpC,QAAA,QAAA,CAAS,GAAA,CAAI,WAAW,uBAAuB,CAAA;AAAA,MACnD,CAAA,SAAE;AACE,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACtB;AAAA,IACJ,CAAA;AACA,IAAA,IAAA,EAAK;AAEL,IAAA,OAAO,MAAM;AACT,MAAA,GAAA,CAAI,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAC9B,MAAA,GAAA,CAAI,GAAA,CAAI,UAAU,QAAQ,CAAA;AAAA,IAC9B,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,GAAA,EAAK,WAAW,CAAC,CAAA;AAGrB,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AAEpB,IAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACnC,MAAA,WAAA,CAAY,MAAM,CAAA;AAAA,IACtB,GAAG,GAAK,CAAA;AAER,IAAA,OAAO,MAAM,cAAc,YAAY,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAExB,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,OAAO,SAAA,KAAmC;AAC5E,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,MAAM,YAAY,SAAS,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,QAAQ,YAAY;AACtB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACA,MAAA,MAAM,IAAI,eAAA,EAAgB;AAAA,IAC9B,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,GAAG,CAAA;AACxC,MAAA,QAAA,CAAS,GAAA,CAAI,WAAW,cAAc,CAAA;AACtC,MAAA,MAAM,GAAA;AAAA,IACV;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,SAAS,YAAY;AACvB,IAAA,IAAI;AACA,MAAA,MAAM,IAAI,MAAA,EAAO;AAAA,IACrB,SAAS,GAAA,EAAU;AACf,MAAA,QAAA,CAAS,GAAA,CAAI,WAAW,eAAe,CAAA;AACvC,MAAA,MAAM,GAAA;AAAA,IACV;AAAA,EACJ,CAAA;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,aAAA,CAAc,QAAA;AAAA,IAAd;AAAA,MACG,KAAA,EAAO;AAAA,QACH,GAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA,EAAO,SAAA;AAAA;AAAA,QACP,SAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA,EAAY,IAAI,aAAA,EAAc;AAAA,QAC9B,eAAA,EAAiB,CAAC,CAAC,MAAA;AAAA,QACnB,SAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAa,YAAY;AACrB,UAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,MAAM,CAAA;AAAA,QACxC,CAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEC;AAAA;AAAA,GACL;AAER;AAEO,IAAM,YAAY,MAAM;AAC3B,EAAA,MAAM,OAAA,GAAU,WAAW,aAAa,CAAA;AACxC,EAAA,IAAI,YAAY,MAAA,EAAW;AACvB,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,OAAA;AACX;ACxKO,IAAM,WAAA,GAA0C,CAAC,EAAE,MAAA,EAAQ,SAAQ,KAAM;AAC5E,EAAA,MAAM,EAAE,KAAA,EAAO,eAAA,EAAiB,SAAA,EAAW,KAAA,KAAU,SAAA,EAAU;AAC/D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,SAAS,KAAK,CAAA;AAEtD,EAAAC,UAAU,MAAM;AACZ,IAAA,IAAI,eAAA,EAAiB;AACjB,MAAA,OAAA,EAAQ;AAAA,IACZ;AAAA,EACJ,CAAA,EAAG,CAAC,eAAA,EAAiB,OAAO,CAAC,CAAA;AAE7B,EAAA,MAAM,cAAc,YAAY;AAC5B,IAAA,IAAI;AACA,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,MAAM,KAAA,EAAM;AAAA,IAChB,SAAS,GAAA,EAAK;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,GAAG,CAAA;AAAA,IAC5C,CAAA,SAAE;AACE,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACzB;AAAA,EACJ,CAAA;AAEA,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACIC,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,MAAA,CAAO,OAAA,EAAS,SAAS,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,CAAA,CAAE,iBAAiB,OAAA,EAAQ,EAChF,+BAAC,KAAA,EAAA,EAAI,KAAA,EAAO,OAAO,KAAA,EACf,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,MAAA,EACf,QAAA,EAAA;AAAA,sBAAAA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,IAAG,EAAG,CAAA;AAAA,MAAE,GAAA;AAAA,sBAC7BA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,MAAA,CAAO,OAAO,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,sBACzCA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAO,MAAA,CAAO,UAAU,OAAA,EAAS,OAAA,EAAS,YAAA,EAAW,OAAA,EAAQ,QAAA,EAAA,MAAA,EAAC;AAAA,KAAA,EAC1E,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,OAAA,EACf,QAAA,EAAA;AAAA,sBAAA,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACG,KAAA,EAAO;AAAA,YACH,GAAG,MAAA,CAAO,YAAA;AAAA,YACV,OAAA,EAAU,SAAA,IAAa,YAAA,GAAgB,GAAA,GAAM,CAAA;AAAA,YAC7C,MAAA,EAAS,SAAA,IAAa,YAAA,GAAgB,aAAA,GAAgB,SAAA;AAAA,YACtD,YAAA,EAAc;AAAA,WAClB;AAAA,UACA,OAAA,EAAS,WAAA;AAAA,UACT,UAAU,SAAA,IAAa,YAAA;AAAA,UAErB,QAAA,EAAA;AAAA,YAAA,SAAA,IAAa,YAAA,mBACXA,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,MAAA,CAAO,OAAA,EAAS,oBAE5BA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACG,GAAA,EAAI,iIAAA;AAAA,gBACJ,GAAA,EAAI,QAAA;AAAA,gBACJ,OAAO,MAAA,CAAO;AAAA;AAAA,aAClB;AAAA,4BAEJA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,YAAY,QAAA,EAAA,QAAA,EAAM;AAAA;AAAA;AAAA,OAC1C;AAAA,MAEC,yBACGA,GAAAA,CAAC,SAAI,KAAA,EAAO,MAAA,CAAO,aACd,QAAA,EAAA,KAAA,EACL;AAAA,KAAA,EAER,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,QAAA,EAAA;AAAA,MAAA,eAAA;AAAA,sBACVA,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,QAAA,EAAM;AAAA,KAAA,EAC/B,CAAA;AAAA,oBAEAA,IAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,CAAA,EAKN;AAAA,GAAA,EACN,CAAA,EACJ,CAAA;AAER;AAEA,IAAM,MAAA,GAA8C;AAAA,EAChD,OAAA,EAAS;AAAA,IACL,QAAA,EAAU,OAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,eAAA,EAAiB,aAAA;AAAA,IACjB,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACH,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,KAAA;AAAA,IACP,QAAA,EAAU,OAAA;AAAA,IACV,WAAA,EAAa,KAAA;AAAA,IACb,YAAA,EAAc,GAAA;AAAA,IACd,QAAA,EAAU,UAAA;AAAA,IACV,SAAA,EAAW,gDAAA;AAAA,IACX,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,6CAAA;AAAA,IACZ,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,OAAA,EAAS,MAAA;AAAA,IACT,SAAA,EAAW,YAAA;AAAA,IACX,cAAA,EAAgB;AAAA,GACpB;AAAA,EACA,MAAA,EAAQ;AAAA,IACJ,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB,eAAA;AAAA,IAChB,UAAA,EAAY,QAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACH,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,SAAA,EAAW,QAAA;AAAA,IACX,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACV;AAAA,EACA,QAAA,EAAU;AAAA,IACN,UAAA,EAAY,2BAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,MAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB;AAAA,GACpB;AAAA,EACA,OAAA,EAAS;AAAA,IACL,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACV;AAAA,EACA,YAAA,EAAc;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,eAAA,EAAiB,aAAA;AAAA,IACjB,MAAA,EAAQ,gBAAA;AAAA,IACR,YAAA,EAAc,GAAA;AAAA,IACd,OAAA,EAAS,QAAA;AAAA,IACT,YAAA,EAAc,MAAA;AAAA,IACd,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,MAAA;AAAA,IACP,SAAA,EAAW,YAAA;AAAA,IACX,UAAA,EAAY;AAAA,GAChB;AAAA,EACA,UAAA,EAAY;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACZ;AAAA,EACA,UAAA,EAAY;AAAA,IACR,UAAA,EAAY,MAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GAChB;AAAA,EACA,WAAA,EAAa;AAAA,IACT,eAAA,EAAiB,wBAAA;AAAA,IACjB,MAAA,EAAQ,kCAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,WAAA;AAAA,IACT,YAAA,EAAc,MAAA;AAAA,IACd,QAAA,EAAU,MAAA;AAAA,IACV,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,QAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,oCAAA;AAAA,IACR,SAAA,EAAW,mBAAA;AAAA,IACX,YAAA,EAAc,KAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACJ,SAAA,EAAW,QAAA;AAAA,IACX,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO;AAAA;AAEf,CAAA;AC7LO,IAAM,eAA4C,CAAC;AAAA,EACtD,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,EAAA;AAAA,EACP,KAAA;AAAA,EACA;AACJ,CAAA,KAAM;AACF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIF,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,cAAA,GAAsC;AAAA,IACxC,KAAA,EAAO,GAAG,IAAI,CAAA,EAAA,CAAA;AAAA,IACd,MAAA,EAAQ,GAAG,IAAI,CAAA,EAAA,CAAA;AAAA,IACf,YAAA,EAAc,KAAA;AAAA,IACd,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,QAAA,EAAU,QAAA;AAAA,IACV,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAA,EAAO,OAAA;AAAA,IACP,UAAA,EAAY,KAAA;AAAA,IACZ,QAAA,EAAU,CAAA,EAAG,IAAA,GAAO,GAAG,CAAA,EAAA,CAAA;AAAA,IACvB,UAAA,EAAY,MAAA;AAAA,IACZ,GAAG;AAAA,GACP;AAEA,EAAA,MAAM,WAAW,IAAA,GAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,GAAA;AAEvD,EAAA,IAAI,GAAA,IAAO,CAAC,UAAA,EAAY;AACpB,IAAA,uBACIE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,gBAC9B,QAAA,kBAAAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,GAAA;AAAA,QACA,KAAK,IAAA,IAAQ,QAAA;AAAA,QACb,cAAA,EAAe,aAAA;AAAA,QACf,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,QACjC,KAAA,EAAO;AAAA,UACH,KAAA,EAAO,MAAA;AAAA,UACP,MAAA,EAAQ,MAAA;AAAA,UACR,SAAA,EAAW;AAAA;AACf;AAAA,KACJ,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,uBACIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,gBAC7B,QAAA,EAAA,QAAA,EACL,CAAA;AAER","file":"index.mjs","sourcesContent":["/**\r\n * Simple, browser-compatible EventEmitter implementation\r\n * Removes dependency on Node.js 'events' module\r\n */\r\nexport class EventEmitter {\r\n private listeners: Map<string, Function[]> = new Map();\r\n\r\n on(event: string, listener: Function): this {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, []);\r\n }\r\n this.listeners.get(event)!.push(listener);\r\n return this;\r\n }\r\n\r\n off(event: string, listener: Function): this {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n const index = eventListeners.indexOf(listener);\r\n if (index !== -1) {\r\n eventListeners.splice(index, 1);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n emit(event: string, ...args: any[]): boolean {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners && eventListeners.length > 0) {\r\n eventListeners.forEach(listener => listener(...args));\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n removeAllListeners(event?: string): this {\r\n if (event) {\r\n this.listeners.delete(event);\r\n } else {\r\n this.listeners.clear();\r\n }\r\n return this;\r\n }\r\n}\r\n","/**\r\n * Type definitions for Sphere Account Abstraction SDK\r\n */\r\n\r\nexport type Network = 'mainnet' | 'testnet' | 'devnet';\r\n\r\nexport interface SDKConfig {\r\n /** Sphere network to connect to */\r\n network?: Network;\r\n /** Google OAuth Client ID */\r\n googleClientId?: string;\r\n /** Custom RPC endpoint */\r\n rpcEndpoint?: string;\r\n /** GraphQL indexer endpoint for querying blockchain data */\r\n indexerUrl?: string;\r\n /** Redirect URI for OAuth flows (optional) */\r\n redirectUri?: string;\r\n}\r\n\r\nexport interface GoogleAuthResponse {\r\n /** Google ID token (JWT) */\r\n idToken: string;\r\n /** User's email address */\r\n email: string;\r\n /** User's display name */\r\n name?: string;\r\n /** User's profile picture URL */\r\n picture?: string;\r\n /** Google user ID */\r\n sub: string;\r\n}\r\n\r\nexport interface WalletInfo {\r\n /** Cedra wallet address (32 bytes hex) */\r\n address: string;\r\n /** Public key (hex) */\r\n publicKey: string;\r\n /** Whether the account exists on-chain */\r\n existsOnChain: boolean;\r\n /** Current sequence number (nonce) */\r\n sequenceNumber: string;\r\n /** Authentication key */\r\n authKey: string;\r\n}\r\n\r\nexport interface TransactionOptions {\r\n /** Recipient address */\r\n to: string;\r\n /** Amount to send (in smallest unit, e.g., 100000000 = 1 CED) */\r\n amount: number;\r\n /** Optional coin type (defaults to CedraCoin) */\r\n coinType?: string;\r\n /** Optional max gas amount */\r\n maxGasAmount?: number;\r\n /** Optional gas unit price */\r\n gasUnitPrice?: number;\r\n}\r\n\r\nexport interface TransactionResult {\r\n /** Transaction hash */\r\n hash: string;\r\n /** Whether transaction was successful (Executed) */\r\n success: boolean;\r\n /** If aborted, this contains the VM status/error */\r\n vmStatus?: string;\r\n /** Gas used */\r\n gasUsed: string;\r\n /** Block height */\r\n version: string;\r\n}\r\n\r\nexport interface TransactionHistoryItem {\r\n hash: string;\r\n success: boolean;\r\n type: string;\r\n sender: string;\r\n receiver?: string;\r\n amount?: string;\r\n timestamp: number;\r\n version: string;\r\n}\r\n\r\nexport interface FungibleAssetMetadata {\r\n asset_type: string;\r\n creator_address: string;\r\n decimals: number;\r\n icon_uri?: string;\r\n name: string;\r\n project_uri?: string;\r\n symbol: string;\r\n token_standard: string;\r\n}\r\n\r\nexport interface BalanceInfo {\r\n /** Coin type identifier */\r\n coinType: string;\r\n /** Balance amount (in smallest unit) */\r\n amount: string;\r\n /** Decimals for this coin */\r\n decimals: number;\r\n /** Human-readable balance */\r\n formatted: string;\r\n /** Token metadata (if available) */\r\n metadata?: FungibleAssetMetadata;\r\n}\r\n\r\nexport interface KeylessConfig {\r\n /** Google ID token (JWT) used for keyless proof */\r\n idToken: string;\r\n /** Ephemeral Key Pair (Ed25519) - Runtime only */\r\n ephemeralKeyPair?: any;\r\n /** Ephemeral Private Key Hex - Storage only */\r\n ephemeralPrivateKey?: string;\r\n /** Nonce blinding factor used during login */\r\n nonceBlinding: string;\r\n /** Expiry of the ephemeral session */\r\n expiresAt: number;\r\n}\r\n\r\nexport interface SessionData {\r\n /** Encrypted wallet data (deterministic private key) */\r\n encryptedWallet: string;\r\n /** Session expiration timestamp */\r\n expiresAt: number;\r\n /** Google refresh token (encrypted) */\r\n refreshToken?: string;\r\n /** Keyless session data (Petra way) */\r\n keyless?: KeylessConfig;\r\n /** User info */\r\n userInfo: {\r\n email: string;\r\n name?: string;\r\n picture?: string;\r\n };\r\n}\r\n\r\nexport interface StorageProvider {\r\n /** Get item from storage */\r\n getItem(key: string): Promise<string | null>;\r\n /** Set item in storage */\r\n setItem(key: string, value: string): Promise<void>;\r\n /** Remove item from storage */\r\n removeItem(key: string): Promise<void>;\r\n /** Clear all storage */\r\n clear(): Promise<void>;\r\n}\r\n\r\nexport interface KeyDerivationOptions {\r\n /** User identifier (e.g., Google sub) */\r\n userId: string;\r\n /** Application-specific salt */\r\n salt: string;\r\n /** Number of iterations for key derivation */\r\n iterations?: number;\r\n}\r\n\r\nexport interface SphereWalletMethods {\r\n /** Get wallet address */\r\n getAddress(): string;\r\n /** Get public key */\r\n getPublicKey(): string;\r\n /** Check if account exists on-chain */\r\n existsOnChain(): Promise<boolean>;\r\n /** Get account balance */\r\n getBalance(coinType?: string): Promise<BalanceInfo>;\r\n /** Get all token balances */\r\n getAllBalances(): Promise<BalanceInfo[]>;\r\n /** Send transaction */\r\n sendTransaction(options: TransactionOptions, simulate?: boolean): Promise<TransactionResult>;\r\n /** Update network and RPC endpoint */\r\n updateNetwork(network: Network, rpcEndpoint: string): void;\r\n /** Simulate transaction without submitting */\r\n simulateTransaction(options: TransactionOptions): Promise<{\r\n success: boolean;\r\n gasUsed: string;\r\n gasUnitPrice: string;\r\n totalGasCost: number;\r\n vmStatus: string;\r\n }>;\r\n /** Sign message */\r\n signMessage(message: string): Promise<string>;\r\n /** Get account info */\r\n getAccountInfo(): Promise<WalletInfo>;\r\n /** Wait for a transaction to be confirmed */\r\n waitForTransaction(hash: string): Promise<TransactionResult>;\r\n /** Get current network gas price */\r\n getGasPrice(): Promise<number>;\r\n /** Get transaction history */\r\n getTransactionHistory(): Promise<TransactionHistoryItem[]>;\r\n /** Disconnect wallet */\r\n disconnect(): Promise<void>;\r\n}\r\n\r\nexport interface AccountAbstractionSDK {\r\n /** Initialize SDK */\r\n initialize(): Promise<void>;\r\n /** Login with Google OAuth */\r\n loginWithGoogle(): Promise<SphereWalletMethods>;\r\n /** Handle Google OAuth response (for redirects) */\r\n handleGoogleResponse(credential: string): Promise<SphereWalletMethods>;\r\n /** Restore session if available */\r\n restoreSession(): Promise<SphereWalletMethods | null>;\r\n /** Logout and clear session */\r\n logout(): Promise<void>;\r\n /** Check if user is authenticated */\r\n isAuthenticated(): boolean;\r\n /** Get current wallet (if authenticated) */\r\n getCurrentWallet(): SphereWalletMethods | null;\r\n /** Get current user email (if authenticated) */\r\n getUserEmail(): string | null;\r\n /** Get current user name (if authenticated) */\r\n getUserName(): string | null;\r\n /** Get current user picture URL (if authenticated) */\r\n getUserPicture(): string | null;\r\n /** Get the ephemeral public key for the current session */\r\n getEphemeralPublicKey(): string | null;\r\n /** Update network and RPC endpoint */\r\n updateNetwork(network: Network, rpcEndpoint: string): Promise<void>;\r\n getIndexerUrl(): string | undefined;\r\n /** Subscribe to SDK events */\r\n on(event: string, callback: (data: any) => void): void;\r\n /** Unsubscribe from SDK events */\r\n off(event: string, callback: (data: any) => void): void;\r\n}\r\n\r\n\r\nexport interface ErrorResponse {\r\n /** Error code */\r\n code: string;\r\n /** Error message */\r\n message: string;\r\n /** Additional error details */\r\n details?: unknown;\r\n}\r\n\r\n// Error codes\r\nexport enum ErrorCode {\r\n AUTHENTICATION_FAILED = 'AUTHENTICATION_FAILED',\r\n WALLET_CREATION_FAILED = 'WALLET_CREATION_FAILED',\r\n TRANSACTION_FAILED = 'TRANSACTION_FAILED',\r\n INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE',\r\n NETWORK_ERROR = 'NETWORK_ERROR',\r\n INVALID_ADDRESS = 'INVALID_ADDRESS',\r\n SESSION_EXPIRED = 'SESSION_EXPIRED',\r\n STORAGE_ERROR = 'STORAGE_ERROR',\r\n KEY_DERIVATION_FAILED = 'KEY_DERIVATION_FAILED',\r\n TRANSACTION_ABORTED = 'TRANSACTION_ABORTED',\r\n DISCARDED_TRANSACTION = 'DISCARDED_TRANSACTION',\r\n INVALID_CONFIG = 'INVALID_CONFIG',\r\n}\r\n\r\n// Custom error class\r\nexport class SphereSDKError extends Error {\r\n constructor(\r\n public code: ErrorCode,\r\n message: string,\r\n public details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'SphereSDKError';\r\n }\r\n}\r\n","/**\r\n * Sphere Wallet Implementation\r\n */\r\n\r\nimport {\r\n Account,\r\n Ed25519PrivateKey,\r\n PrivateKey,\r\n PrivateKeyVariants,\r\n Cedra,\r\n CedraConfig,\r\n Network as CedraNetwork,\r\n} from '@cedra-labs/ts-sdk';\r\nimport {\r\n SphereWalletMethods,\r\n TransactionOptions,\r\n TransactionResult,\r\n TransactionHistoryItem,\r\n BalanceInfo,\r\n WalletInfo,\r\n SphereSDKError,\r\n ErrorCode,\r\n Network,\r\n KeylessConfig,\r\n} from '../types';\r\n\r\n/**\r\n * Sphere Wallet class\r\n * Manages wallet operations and blockchain interactions\r\n */\r\nexport class SphereWallet implements SphereWalletMethods {\r\n private account: Account;\r\n private client: Cedra;\r\n private network: CedraNetwork;\r\n private privateKeyHex: string;\r\n private keylessConfig: KeylessConfig | null = null;\r\n private _indexerUrl: string | null = null;\r\n\r\n constructor(clientOrKey: Cedra | string, privateKeyOrNetwork?: string | Network, networkOrEndpoint?: Network | string, rpcEndpoint?: string, indexerUrl?: string) {\r\n try {\r\n if (clientOrKey instanceof Cedra) {\r\n // Constructor overload for internal use\r\n this.client = clientOrKey;\r\n this.privateKeyHex = privateKeyOrNetwork as string;\r\n const net = networkOrEndpoint as Network;\r\n this.network = this.mapNetwork(net || 'testnet');\r\n this._indexerUrl = rpcEndpoint || null; // indexerUrl shifted in this signature\r\n\r\n const formattedKey = PrivateKey.formatPrivateKey(this.privateKeyHex, PrivateKeyVariants.Ed25519);\r\n const privateKey = new Ed25519PrivateKey(formattedKey);\r\n this.account = Account.fromPrivateKey({ privateKey });\r\n } else {\r\n // Standard constructor\r\n this.privateKeyHex = clientOrKey;\r\n const net = privateKeyOrNetwork as Network;\r\n this.network = this.mapNetwork(net || 'testnet');\r\n const endpoint = rpcEndpoint || (networkOrEndpoint as string);\r\n\r\n const config = new CedraConfig({\r\n network: this.network,\r\n fullnode: endpoint\r\n });\r\n this.client = new Cedra(config);\r\n this._indexerUrl = indexerUrl || null;\r\n\r\n const formattedKey = PrivateKey.formatPrivateKey(this.privateKeyHex, PrivateKeyVariants.Ed25519);\r\n const privateKey = new Ed25519PrivateKey(formattedKey);\r\n this.account = Account.fromPrivateKey({ privateKey });\r\n }\r\n } catch (error) {\r\n throw new SphereSDKError(\r\n ErrorCode.WALLET_CREATION_FAILED,\r\n 'Failed to create wallet',\r\n error\r\n );\r\n }\r\n }\r\n\r\n getAddress(): string {\r\n return this.account.accountAddress.toString();\r\n }\r\n\r\n getPublicKey(): string {\r\n return this.account.publicKey.toString();\r\n }\r\n\r\n getIndexerUrl(): string | null {\r\n return this._indexerUrl;\r\n }\r\n\r\n async existsOnChain(): Promise<boolean> {\r\n try {\r\n await this.client.getAccountInfo({\r\n accountAddress: this.account.accountAddress,\r\n });\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n }\r\n\r\n async getBalance(coinType?: string): Promise<BalanceInfo> {\r\n const defaultCoinType = '0x1::cedra_coin::CedraCoin';\r\n const targetCoinType = coinType || defaultCoinType;\r\n\r\n try {\r\n // FA Check\r\n if (targetCoinType.startsWith('0x') && !targetCoinType.includes('::')) {\r\n const [balance] = await this.client.view({\r\n payload: {\r\n function: '0x1::primary_fungible_store::balance',\r\n typeArguments: ['0x1::fungible_asset::Metadata'],\r\n functionArguments: [this.getAddress(), targetCoinType],\r\n }\r\n });\r\n const [decimals] = await this.client.view({\r\n payload: {\r\n function: '0x1::fungible_asset::decimals',\r\n typeArguments: ['0x1::fungible_asset::Metadata'],\r\n functionArguments: [targetCoinType],\r\n }\r\n });\r\n\r\n const amountVal = balance?.toString() || '0';\r\n const decimalsVal = decimals ? Number(decimals) : 8;\r\n return {\r\n coinType: targetCoinType,\r\n amount: amountVal,\r\n decimals: decimalsVal,\r\n formatted: (Number(amountVal) / Math.pow(10, decimalsVal)).toFixed(Math.min(decimalsVal, 8))\r\n };\r\n }\r\n\r\n // Legacy Coin\r\n const amount = await this.client.getAccountCoinAmount({\r\n accountAddress: this.account.accountAddress,\r\n coinType: targetCoinType as `${string}::${string}::${string}`,\r\n });\r\n\r\n return {\r\n coinType: targetCoinType,\r\n amount: amount.toString(),\r\n decimals: 8,\r\n formatted: (Number(amount) / 1e8).toFixed(8)\r\n };\r\n } catch (error) {\r\n return {\r\n coinType: targetCoinType,\r\n amount: '0',\r\n decimals: 8,\r\n formatted: '0.00000000',\r\n };\r\n }\r\n }\r\n\r\n async getAllBalances(): Promise<BalanceInfo[]> {\r\n return [await this.getBalance()];\r\n }\r\n\r\n async sendTransaction(options: TransactionOptions, simulate: boolean = true): Promise<TransactionResult> {\r\n try {\r\n const { to, amount, coinType, maxGasAmount, gasUnitPrice } = options;\r\n\r\n const transaction = await this.client.transaction.build.simple({\r\n sender: this.account.accountAddress,\r\n data: {\r\n function: (coinType?.startsWith('0x') && !coinType.includes('::'))\r\n ? '0x1::primary_fungible_store::transfer'\r\n : '0x1::cedra_account::transfer' as any,\r\n typeArguments: (coinType?.startsWith('0x') && !coinType.includes('::'))\r\n ? ['0x1::fungible_asset::Metadata']\r\n : [],\r\n functionArguments: (coinType?.startsWith('0x') && !coinType.includes('::'))\r\n ? [coinType, to, amount]\r\n : [to, amount],\r\n },\r\n options: {\r\n maxGasAmount: maxGasAmount || 20000,\r\n gasUnitPrice: gasUnitPrice,\r\n },\r\n });\r\n\r\n if (simulate) {\r\n const [sim] = await this.client.transaction.simulate.simple({\r\n signerPublicKey: this.account.publicKey,\r\n transaction,\r\n });\r\n if (!sim.success) throw new Error(`Simulation failed: ${sim.vm_status}`);\r\n }\r\n\r\n const authenticator = await this.client.transaction.sign({\r\n signer: this.account,\r\n transaction,\r\n });\r\n\r\n const pending = await this.client.transaction.submit.simple({\r\n transaction,\r\n senderAuthenticator: authenticator,\r\n });\r\n\r\n return await this.waitForTransaction(pending.hash);\r\n } catch (error: any) {\r\n throw new SphereSDKError(ErrorCode.TRANSACTION_FAILED, error.message, error);\r\n }\r\n }\r\n\r\n async waitForTransaction(hash: string): Promise<TransactionResult> {\r\n const tx = await this.client.waitForTransaction({ transactionHash: hash });\r\n return {\r\n hash: hash,\r\n success: tx.success,\r\n vmStatus: tx.vm_status,\r\n gasUsed: tx.gas_used,\r\n version: tx.version,\r\n };\r\n }\r\n\r\n async getGasPrice(): Promise<number> {\r\n const res = await this.client.getGasPriceEstimation();\r\n return res.gas_estimate;\r\n }\r\n\r\n async getTransactionHistory(): Promise<TransactionHistoryItem[]> {\r\n const txs = await this.client.getAccountTransactions({\r\n accountAddress: this.account.accountAddress,\r\n });\r\n\r\n return txs.map((tx: any) => ({\r\n hash: tx.hash,\r\n success: tx.success,\r\n type: tx.type,\r\n sender: tx.sender,\r\n receiver: tx.payload?.functionArguments?.[0],\r\n amount: tx.payload?.functionArguments?.[1],\r\n timestamp: parseInt(tx.timestamp || '0') / 1000,\r\n version: tx.version,\r\n }));\r\n }\r\n\r\n async simulateTransaction(options: TransactionOptions) {\r\n const { to, amount, maxGasAmount, gasUnitPrice } = options;\r\n const transaction = await this.client.transaction.build.simple({\r\n sender: this.account.accountAddress,\r\n data: {\r\n function: '0x1::cedra_account::transfer',\r\n functionArguments: [to, amount],\r\n },\r\n options: {\r\n maxGasAmount: maxGasAmount || 20000,\r\n gasUnitPrice: gasUnitPrice,\r\n },\r\n });\r\n\r\n const [res] = await this.client.transaction.simulate.simple({\r\n signerPublicKey: this.account.publicKey,\r\n transaction,\r\n });\r\n\r\n return {\r\n success: res.success,\r\n gasUsed: res.gas_used,\r\n gasUnitPrice: res.gas_unit_price,\r\n totalGasCost: Number(res.gas_used) * Number(res.gas_unit_price),\r\n vmStatus: res.vm_status,\r\n };\r\n }\r\n\r\n async signMessage(message: string): Promise<string> {\r\n const sig = this.account.sign(new TextEncoder().encode(message));\r\n return sig.toString();\r\n }\r\n\r\n async getAccountInfo(): Promise<WalletInfo> {\r\n const info = await this.client.getAccountInfo({ accountAddress: this.account.accountAddress });\r\n return {\r\n address: this.getAddress(),\r\n publicKey: this.getPublicKey(),\r\n existsOnChain: true,\r\n sequenceNumber: info.sequence_number,\r\n authKey: info.authentication_key,\r\n };\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n // @ts-expect-error\r\n this.account = null;\r\n }\r\n\r\n updateNetwork(network: Network, rpcEndpoint: string): void {\r\n this.network = this.mapNetwork(network);\r\n this.client = new Cedra(new CedraConfig({ network: this.network, fullnode: rpcEndpoint }));\r\n }\r\n\r\n private mapNetwork(network: string): CedraNetwork {\r\n switch (network.toLowerCase()) {\r\n case 'mainnet': return CedraNetwork.MAINNET;\r\n case 'testnet': return CedraNetwork.TESTNET;\r\n case 'devnet': return CedraNetwork.DEVNET;\r\n default: return CedraNetwork.TESTNET;\r\n }\r\n }\r\n\r\n getAccount(): Account { return this.account; }\r\n getClient(): Cedra { return this.client; }\r\n getPrivateKeyHex(): string { return this.privateKeyHex; }\r\n setKeylessConfig(config: KeylessConfig): void { this.keylessConfig = config; }\r\n isKeyless(): boolean { return !!this.keylessConfig; }\r\n}\r\n","/**\r\n * Google OAuth Authentication Provider\r\n * Handles Google Sign-In flow and token validation\r\n */\r\n\r\nimport { jwtVerify, decodeJwt } from 'jose';\r\nimport { GoogleAuthResponse, SphereSDKError, ErrorCode } from '../types';\r\n\r\nexport interface GoogleAuthConfig {\r\n clientId: string;\r\n redirectUri?: string;\r\n}\r\n\r\n/**\r\n * Google OAuth Provider for authentication\r\n */\r\nexport class GoogleAuthProvider {\r\n private clientId: string;\r\n private redirectUri?: string;\r\n\r\n constructor(config: GoogleAuthConfig) {\r\n this.clientId = config.clientId;\r\n this.redirectUri = config.redirectUri;\r\n }\r\n\r\n /**\r\n * Initiate Google OAuth login flow\r\n * Opens Google Sign-In popup\r\n * @param nonce Optional OIDC nonce for keyless binding\r\n */\r\n async login(nonce?: string): Promise<GoogleAuthResponse> {\r\n try {\r\n // Check if we're in a browser environment\r\n if (typeof window === 'undefined') {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Google OAuth requires a browser environment'\r\n );\r\n }\r\n\r\n // Use Google Identity Services (GIS) - the modern approach\r\n return new Promise((resolve, reject) => {\r\n // Load Google Identity Services script if not already loaded\r\n this.loadGoogleIdentityScript()\r\n .then(() => {\r\n const uxMode = this.redirectUri ? 'redirect' : 'popup';\r\n\r\n if (uxMode === 'redirect') {\r\n // Generate a nonce for security\r\n const nonce = Math.random().toString(36).substring(2) + Date.now().toString(36);\r\n\r\n // Construct the Google OAuth2 URL for a full-page redirect\r\n const params = new URLSearchParams({\r\n client_id: this.clientId,\r\n redirect_uri: this.redirectUri!,\r\n response_type: 'id_token',\r\n scope: 'openid email profile',\r\n nonce: nonce,\r\n prompt: 'select_account'\r\n });\r\n\r\n const authUrl = `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`;\r\n\r\n // Redirect the entire page\r\n window.location.href = authUrl;\r\n\r\n // Do not resolve/reject - the page is navigating away.\r\n // This prevents the calling code from proceeding with empty data.\r\n } else {\r\n // Use OAuth2 Token Client for a pure popup flow (Zero Frames in page)\r\n // @ts-expect-error - google is loaded from external script\r\n const client = google.accounts.oauth2.initTokenClient({\r\n client_id: this.clientId,\r\n scope: 'email profile openid',\r\n nonce: nonce, // Bind the ephemeral key pair via nonce\r\n callback: async (tokenResponse: any) => {\r\n if (tokenResponse.error) {\r\n reject(new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n `Google login failed: ${tokenResponse.error_description || tokenResponse.error}`\r\n ));\r\n return;\r\n }\r\n\r\n if (tokenResponse && tokenResponse.access_token) {\r\n try {\r\n // Fetch user info using the access token\r\n const userInfoResponse = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {\r\n headers: {\r\n 'Authorization': `Bearer ${tokenResponse.access_token}`\r\n }\r\n });\r\n\r\n if (!userInfoResponse.ok) {\r\n throw new Error('Failed to fetch user info from Google');\r\n }\r\n\r\n const payload = await userInfoResponse.json();\r\n\r\n const authResponse: GoogleAuthResponse = {\r\n idToken: tokenResponse.access_token, // Use access token\r\n email: payload.email as string,\r\n name: payload.name as string,\r\n picture: payload.picture as string,\r\n sub: payload.sub as string,\r\n };\r\n\r\n resolve(authResponse);\r\n } catch (error) {\r\n reject(new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Failed to retrieve user profile after login',\r\n error\r\n ));\r\n }\r\n }\r\n },\r\n });\r\n\r\n // Request the token (triggers the popup window, NO IFRAMES on page)\r\n client.requestAccessToken();\r\n }\r\n })\r\n .catch(reject);\r\n });\r\n } catch (error) {\r\n if (error instanceof SphereSDKError) {\r\n throw error;\r\n }\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Failed to initiate Google login',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Initialize Google Identity Services\r\n * @param callback Credential handler\r\n * @param nonce Optional OIDC nonce for binding\r\n */\r\n async initialize(callback: (response: { credential: string }) => void, nonce?: string): Promise<void> {\r\n await this.loadGoogleIdentityScript();\r\n // @ts-expect-error - google is loaded from external script\r\n google.accounts.id.initialize({\r\n client_id: this.clientId,\r\n callback: callback,\r\n nonce: nonce,\r\n });\r\n }\r\n\r\n /**\r\n * Handle the credential response from Google\r\n */\r\n public async handleCredentialResponse(\r\n credential: string\r\n ): Promise<GoogleAuthResponse> {\r\n try {\r\n // Decode the JWT token (without verification for now)\r\n const payload = decodeJwt(credential);\r\n\r\n // Extract user information\r\n const authResponse: GoogleAuthResponse = {\r\n idToken: credential,\r\n email: payload.email as string,\r\n name: payload.name as string,\r\n picture: payload.picture as string,\r\n sub: payload.sub as string,\r\n };\r\n\r\n // Validate required fields\r\n if (!authResponse.email || !authResponse.sub) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Invalid Google credential: missing required fields'\r\n );\r\n }\r\n\r\n return authResponse;\r\n } catch (error) {\r\n if (error instanceof SphereSDKError) {\r\n throw error;\r\n }\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Failed to process Google credential',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Verify Google ID token (optional, for enhanced security)\r\n * This should ideally be done server-side\r\n */\r\n async verifyToken(idToken: string): Promise<boolean> {\r\n try {\r\n // Fetch Google's public keys\r\n const JWKS_URI = 'https://www.googleapis.com/oauth2/v3/certs';\r\n const response = await fetch(JWKS_URI);\r\n const jwks = await response.json();\r\n\r\n // Verify the token\r\n await jwtVerify(idToken, async () => {\r\n // This is a simplified version\r\n // In production, properly implement JWKS key selection\r\n return jwks.keys[0];\r\n });\r\n\r\n return true;\r\n } catch (error) {\r\n console.error('Token verification failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Load Google Identity Services script\r\n */\r\n private loadGoogleIdentityScript(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n // Check if already loaded\r\n // @ts-expect-error - google is loaded from external script\r\n if (typeof google !== 'undefined' && google.accounts) {\r\n resolve();\r\n return;\r\n }\r\n\r\n // Create script element\r\n const script = document.createElement('script');\r\n script.src = 'https://accounts.google.com/gsi/client';\r\n script.async = true;\r\n script.defer = true;\r\n\r\n script.onload = () => resolve();\r\n script.onerror = () =>\r\n reject(\r\n new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Failed to load Google Identity Services'\r\n )\r\n );\r\n\r\n document.head.appendChild(script);\r\n });\r\n }\r\n\r\n /**\r\n * Sign out from Google\r\n */\r\n async logout(): Promise<void> {\r\n try {\r\n // @ts-expect-error - google is loaded from external script\r\n if (typeof google !== 'undefined' && google.accounts) {\r\n // @ts-expect-error - google is loaded from external script\r\n google.accounts.id.disableAutoSelect();\r\n }\r\n } catch (error) {\r\n console.error('Google logout error:', error);\r\n // Don't throw - logout should be best effort\r\n }\r\n }\r\n\r\n /**\r\n * Render Google Sign-In button\r\n * @param elementId ID of the container element\r\n * @param options Button customization options\r\n * @param options Button customization options\r\n */\r\n async renderButton(\r\n elementId: string,\r\n options?: {\r\n theme?: 'outline' | 'filled_blue' | 'filled_black';\r\n size?: 'large' | 'medium' | 'small';\r\n text?: 'signin_with' | 'signup_with' | 'continue_with';\r\n shape?: 'rectangular' | 'pill' | 'circle' | 'square';\r\n width?: string | number;\r\n nonce?: string; // Optional nonce for keyless\r\n callback?: (response: { credential: string }) => void;\r\n }\r\n ): Promise<void> {\r\n await this.loadGoogleIdentityScript();\r\n\r\n if (options?.callback) {\r\n // @ts-expect-error - google is loaded from external script\r\n google.accounts.id.initialize({\r\n client_id: this.clientId,\r\n callback: options.callback,\r\n nonce: options.nonce, // Pass nonce to button initialization\r\n });\r\n }\r\n\r\n // @ts-expect-error - google is loaded from external script\r\n google.accounts.id.renderButton(document.getElementById(elementId), {\r\n theme: options?.theme || 'outline',\r\n size: options?.size || 'large',\r\n text: options?.text || 'signin_with',\r\n shape: options?.shape || 'rectangular',\r\n width: options?.width, // Google API accepts pixels as number or string\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Example usage:\r\n * \r\n * const authProvider = new GoogleAuthProvider({\r\n * clientId: 'YOUR_GOOGLE_CLIENT_ID'\r\n * });\r\n * \r\n * // Method 1: Programmatic login\r\n * const authResponse = await authProvider.login();\r\n * console.log('Logged in as:', authResponse.email);\r\n * \r\n * // Method 2: Render button\r\n * await authProvider.renderButton('google-signin-button', {\r\n * theme: 'filled_blue',\r\n * size: 'large'\r\n * });\r\n */\r\n\r\n","/**\r\n * Secure Storage Module\r\n * Handles encrypted storage of sensitive wallet data\r\n */\r\n\r\nimport CryptoJS from 'crypto-js';\r\nimport { StorageProvider, SessionData, SphereSDKError, ErrorCode } from '../types';\r\n\r\n/**\r\n * Browser-based secure storage implementation\r\n */\r\nexport class SecureStorage implements StorageProvider {\r\n private encryptionKey: string;\r\n private storagePrefix: string;\r\n\r\n constructor(encryptionKey?: string, storagePrefix = 'cedra_sdk_') {\r\n // Use provided key or generate from browser fingerprint\r\n this.encryptionKey = encryptionKey || this.generateEncryptionKey();\r\n this.storagePrefix = storagePrefix;\r\n }\r\n\r\n /**\r\n * Get item from storage and decrypt\r\n */\r\n async getItem(key: string): Promise<string | null> {\r\n try {\r\n const fullKey = this.storagePrefix + key;\r\n const encryptedData = localStorage.getItem(fullKey);\r\n\r\n if (!encryptedData) {\r\n return null;\r\n }\r\n\r\n // Decrypt the data\r\n const bytes = CryptoJS.AES.decrypt(encryptedData, this.encryptionKey);\r\n\r\n try {\r\n const decrypted = bytes.toString(CryptoJS.enc.Utf8);\r\n // If decryption failed or produced junk, it might return empty or throw\r\n if (!decrypted) return null;\r\n return decrypted;\r\n } catch (e) {\r\n // This happens if the key is wrong (e.g. malformed UTF-8)\r\n console.warn(`[SecureStorage] Failed to decrypt ${key}. Key might have changed.`);\r\n return null;\r\n }\r\n } catch (error) {\r\n console.error('Storage get error:', error);\r\n // We return null here too to prevent SDK from breaking on corrupted data\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Encrypt and store item\r\n */\r\n async setItem(key: string, value: string): Promise<void> {\r\n try {\r\n const fullKey = this.storagePrefix + key;\r\n\r\n // Encrypt the data\r\n const encrypted = CryptoJS.AES.encrypt(\r\n value,\r\n this.encryptionKey\r\n ).toString();\r\n\r\n localStorage.setItem(fullKey, encrypted);\r\n } catch (error) {\r\n console.error('Storage set error:', error);\r\n throw new SphereSDKError(\r\n ErrorCode.STORAGE_ERROR,\r\n 'Failed to store data',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Remove item from storage\r\n */\r\n async removeItem(key: string): Promise<void> {\r\n try {\r\n const fullKey = this.storagePrefix + key;\r\n localStorage.removeItem(fullKey);\r\n } catch (error) {\r\n console.error('Storage remove error:', error);\r\n throw new SphereSDKError(\r\n ErrorCode.STORAGE_ERROR,\r\n 'Failed to remove data from storage',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Clear all SDK storage\r\n */\r\n async clear(): Promise<void> {\r\n try {\r\n // Remove all items with our prefix\r\n const keys = Object.keys(localStorage);\r\n for (const key of keys) {\r\n if (key.startsWith(this.storagePrefix)) {\r\n localStorage.removeItem(key);\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Storage clear error:', error);\r\n throw new SphereSDKError(\r\n ErrorCode.STORAGE_ERROR,\r\n 'Failed to clear storage',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Generate encryption key from browser fingerprint\r\n * This provides basic encryption without requiring user input\r\n * Note: Not cryptographically secure, but better than plaintext\r\n */\r\n private generateEncryptionKey(): string {\r\n const fingerprint = [\r\n navigator.userAgent,\r\n navigator.language,\r\n new Date().getTimezoneOffset(),\r\n screen.width,\r\n screen.height,\r\n 'cedra-sdk-v1', // Version salt\r\n ].join('|');\r\n\r\n return CryptoJS.SHA256(fingerprint).toString();\r\n }\r\n\r\n /**\r\n * Check if storage is available\r\n */\r\n static isAvailable(): boolean {\r\n try {\r\n const test = '__storage_test__';\r\n localStorage.setItem(test, test);\r\n localStorage.removeItem(test);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Session Manager\r\n * Manages user sessions with automatic expiration\r\n */\r\nexport class SessionManager {\r\n private storage: StorageProvider;\r\n private sessionKey = 'current_session';\r\n private sessionDuration: number; // in milliseconds\r\n\r\n private cachedSession: SessionData | null = null;\r\n\r\n constructor(storage: StorageProvider, sessionDurationHours = 24) {\r\n this.storage = storage;\r\n this.sessionDuration = sessionDurationHours * 60 * 60 * 1000;\r\n }\r\n\r\n /**\r\n * Get cached session data (synchronous)\r\n */\r\n getCachedSession(): SessionData | null {\r\n return this.cachedSession;\r\n }\r\n\r\n /**\r\n * Save session data\r\n */\r\n async saveSession(data: Omit<SessionData, 'expiresAt'>): Promise<void> {\r\n try {\r\n const sessionData: SessionData = {\r\n ...data,\r\n expiresAt: Date.now() + this.sessionDuration,\r\n };\r\n\r\n this.cachedSession = sessionData;\r\n await this.storage.setItem(\r\n this.sessionKey,\r\n JSON.stringify(sessionData)\r\n );\r\n } catch (error: any) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n `Google authentication failed: ${error.message}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get current session\r\n * Returns null if session doesn't exist or is expired\r\n */\r\n async getSession(): Promise<SessionData | null> {\r\n try {\r\n const sessionStr = await this.storage.getItem(this.sessionKey);\r\n\r\n if (!sessionStr) {\r\n return null;\r\n }\r\n\r\n const session: SessionData = JSON.parse(sessionStr);\r\n this.cachedSession = session;\r\n\r\n // Check if session is expired\r\n if (Date.now() > session.expiresAt) {\r\n await this.clearSession();\r\n return null;\r\n }\r\n\r\n return session;\r\n } catch (error) {\r\n console.error('Failed to get session:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Clear current session\r\n */\r\n async clearSession(): Promise<void> {\r\n this.cachedSession = null;\r\n await this.storage.removeItem(this.sessionKey);\r\n }\r\n\r\n /**\r\n * Check if session is valid\r\n */\r\n async isSessionValid(): Promise<boolean> {\r\n const session = await this.getSession();\r\n return session !== null;\r\n }\r\n\r\n /**\r\n * Refresh session expiration\r\n */\r\n async refreshSession(): Promise<void> {\r\n const session = await this.getSession();\r\n if (session) {\r\n await this.saveSession({\r\n encryptedWallet: session.encryptedWallet,\r\n userInfo: session.userInfo,\r\n refreshToken: session.refreshToken,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get time until session expires (in milliseconds)\r\n */\r\n async getTimeUntilExpiration(): Promise<number | null> {\r\n const session = await this.getSession();\r\n if (!session) {\r\n return null;\r\n }\r\n\r\n const timeLeft = session.expiresAt - Date.now();\r\n return timeLeft > 0 ? timeLeft : 0;\r\n }\r\n}\r\n\r\n/**\r\n * Example usage:\r\n * \r\n * // Initialize storage\r\n * const storage = new SecureStorage('my-encryption-key');\r\n * \r\n * // Initialize session manager\r\n * const sessionManager = new SessionManager(storage, 24); // 24 hour sessions\r\n * \r\n * // Save session\r\n * await sessionManager.saveSession({\r\n * encryptedWallet: 'encrypted-wallet-data',\r\n * userInfo: {\r\n * email: 'user@example.com',\r\n * name: 'John Doe'\r\n * }\r\n * });\r\n * \r\n * // Get session\r\n * const session = await sessionManager.getSession();\r\n * if (session) {\r\n * console.log('Session valid until:', new Date(session.expiresAt));\r\n * }\r\n * \r\n * // Clear session\r\n * await sessionManager.clearSession();\r\n */\r\n","/**\r\n * Key Derivation Module\r\n * Implements secure, deterministic key derivation from Google OAuth credentials\r\n */\r\n\r\nimport CryptoJS from 'crypto-js';\r\nimport { Account } from '@cedra-labs/ts-sdk';\r\nimport { KeyDerivationOptions, SphereSDKError, ErrorCode } from '../types';\r\n\r\n/**\r\n * Derives a deterministic private key from user credentials\r\n * Uses HKDF (HMAC-based Key Derivation Function) for security\r\n */\r\nexport class KeyDerivation {\r\n private static readonly DEFAULT_ITERATIONS = 100000;\r\n private static readonly KEY_LENGTH = 32; // 256 bits for Ed25519\r\n\r\n /**\r\n * Derive a private key from user ID and salt\r\n * @param options Key derivation options\r\n * @returns Hex-encoded private key (64 characters)\r\n */\r\n static derivePrivateKey(options: KeyDerivationOptions): string {\r\n try {\r\n const { userId, salt, iterations = this.DEFAULT_ITERATIONS } = options;\r\n\r\n // Validate inputs\r\n if (!userId || userId.length === 0) {\r\n throw new SphereSDKError(\r\n ErrorCode.KEY_DERIVATION_FAILED,\r\n 'User ID is required for key derivation'\r\n );\r\n }\r\n\r\n if (!salt || salt.length < 16) {\r\n throw new SphereSDKError(\r\n ErrorCode.KEY_DERIVATION_FAILED,\r\n 'Salt must be at least 16 characters'\r\n );\r\n }\r\n\r\n // Use PBKDF2 (Password-Based Key Derivation Function 2)\r\n // This is deterministic - same inputs always produce same output\r\n const derivedKey = CryptoJS.PBKDF2(userId, salt, {\r\n keySize: this.KEY_LENGTH / 4, // CryptoJS uses 32-bit words\r\n iterations: iterations,\r\n hasher: CryptoJS.algo.SHA256,\r\n });\r\n\r\n // Convert to hex string\r\n const privateKeyHex = derivedKey.toString(CryptoJS.enc.Hex);\r\n\r\n // Ensure it's exactly 64 characters (32 bytes)\r\n if (privateKeyHex.length !== 64) {\r\n throw new SphereSDKError(\r\n ErrorCode.KEY_DERIVATION_FAILED,\r\n 'Derived key has invalid length'\r\n );\r\n }\r\n\r\n return privateKeyHex;\r\n } catch (error) {\r\n if (error instanceof SphereSDKError) {\r\n throw error;\r\n }\r\n throw new SphereSDKError(\r\n ErrorCode.KEY_DERIVATION_FAILED,\r\n 'Failed to derive private key',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Generate a deterministic salt from app name and user email\r\n * This ensures the same user gets the same wallet across devices\r\n * @param appName Application name\r\n * @param userEmail User's email address\r\n * @returns Deterministic salt string\r\n */\r\n static generateDeterministicSalt(appName: string, userEmail: string): string {\r\n // Normalize inputs to ensure consistent derivation\r\n const normalizedApp = appName.trim().toLowerCase();\r\n const normalizedEmail = userEmail.trim().toLowerCase();\r\n\r\n // Combine app name and email with a fixed separator\r\n const combined = `${normalizedApp}:${normalizedEmail}:sphere-wallet-v1`;\r\n\r\n // Hash to create a consistent salt\r\n const hash = CryptoJS.SHA256(combined);\r\n return hash.toString(CryptoJS.enc.Hex);\r\n }\r\n\r\n /**\r\n * Validate a private key format\r\n * @param privateKey Hex-encoded private key\r\n * @returns True if valid\r\n */\r\n static isValidPrivateKey(privateKey: string): boolean {\r\n // Must be 64 hex characters (32 bytes)\r\n const hexRegex = /^[0-9a-fA-F]{64}$/;\r\n return hexRegex.test(privateKey);\r\n }\r\n\r\n /**\r\n * Securely clear sensitive data from memory\r\n * @param data Sensitive string to clear\r\n */\r\n static clearSensitiveData(data: string): void {\r\n // Overwrite the string in memory (best effort in JavaScript)\r\n // Note: This is not guaranteed in JavaScript due to string immutability\r\n // but it's a best practice\r\n if (data) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (data as any) = '0'.repeat(data.length);\r\n }\r\n }\r\n\r\n /**\r\n * Generates a temporary ephemeral key pair for the session\r\n * @returns A fresh Ed25519 account/keypair\r\n */\r\n static generateEphemeralKeyPair(): Account {\r\n return Account.generate();\r\n }\r\n\r\n /**\r\n * Computes an OIDC-compliant nonce hash to bind the session key\r\n * @param publicKey Ephemeral Public Key (hex or string)\r\n * @param blinding A random blinding factor (hex)\r\n * @param expiry Expiration timestamp (optional)\r\n * @returns SHA256 hash of the nonce commitment\r\n */\r\n static computeNonce(publicKey: string, blinding: string, expiry: number = 0): string {\r\n // Nonce structure: hash(EPK | blinding | expiry)\r\n // This is a standard pattern in Keyless architectures to prevent replay attacks\r\n const combined = `${publicKey}:${blinding}:${expiry}`;\r\n const hash = CryptoJS.SHA256(combined);\r\n return hash.toString(CryptoJS.enc.Hex);\r\n }\r\n}\r\n\r\n/**\r\n * Example usage:\r\n * \r\n * const salt = KeyDerivation.generateDeterministicSalt('MyApp', 'user@example.com');\r\n * const privateKey = KeyDerivation.derivePrivateKey({\r\n * userId: 'google-user-id-12345',\r\n * salt: salt,\r\n * iterations: 100000\r\n * });\r\n * \r\n * // Use privateKey to create Cedra account\r\n * // ...\r\n * \r\n * // Clear sensitive data when done\r\n * KeyDerivation.clearSensitiveData(privateKey);\r\n */\r\n\r\n","/**\r\n * SDK Internal Constants\r\n * Default values for the SDK. Developers should provide their own values\r\n * via the config object during initialization.\r\n */\r\n\r\n// Default application name\r\nexport const DEFAULT_APP_NAME = 'Sphere Connect';\r\n\r\n// Default storage encryption key\r\nexport const DEFAULT_STORAGE_KEY = 'sphere-connect-v1-secure-key';\r\n","import { EventEmitter } from './core/EventEmitter';\r\nimport { Cedra, CedraConfig, Network as CedraNetwork } from '@cedra-labs/ts-sdk';\r\nimport { SphereWallet } from './wallet/SphereWallet';\r\nimport { GoogleAuthProvider } from './auth/GoogleAuthProvider';\r\nimport { SecureStorage, SessionManager } from './storage/SecureStorage';\r\nimport { KeyDerivation } from './auth/KeyDerivation';\r\nimport {\r\n SDKConfig,\r\n SphereWalletMethods,\r\n AccountAbstractionSDK,\r\n ErrorCode,\r\n SphereSDKError,\r\n Network,\r\n Network as SphereNetwork\r\n} from './types';\r\nimport { DEFAULT_APP_NAME, DEFAULT_STORAGE_KEY } from './core/constants';\r\nimport CryptoJS from 'crypto-js';\r\n\r\n/**\r\n * Main SDK class for Sphere Account Abstraction\r\n */\r\nexport class SphereAccountAbstraction extends EventEmitter implements AccountAbstractionSDK {\r\n private cedra: Cedra;\r\n private config: SDKConfig;\r\n private authProvider: GoogleAuthProvider;\r\n private storage: SecureStorage;\r\n private sessionManager: SessionManager;\r\n private currentWallet: SphereWallet | null = null;\r\n private initialized: boolean = false;\r\n private readonly appName: string = DEFAULT_APP_NAME;\r\n private readonly storageKey: string = DEFAULT_STORAGE_KEY;\r\n\r\n constructor(config: SDKConfig) {\r\n super();\r\n if (!config.googleClientId) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Google Client ID is required for initializing the Sphere SDK'\r\n );\r\n }\r\n\r\n this.config = {\r\n network: config.network || 'testnet',\r\n googleClientId: config.googleClientId,\r\n rpcEndpoint: config.rpcEndpoint,\r\n indexerUrl: config.indexerUrl,\r\n redirectUri: config.redirectUri,\r\n };\r\n\r\n const rpc = this.config.rpcEndpoint;\r\n const cedraConfig = new CedraConfig({\r\n network: this.config.network as CedraNetwork,\r\n fullnode: rpc\r\n });\r\n\r\n this.cedra = new Cedra(cedraConfig);\r\n this.authProvider = new GoogleAuthProvider({\r\n clientId: this.config.googleClientId as string,\r\n redirectUri: this.config.redirectUri,\r\n });\r\n this.storage = new SecureStorage(this.storageKey);\r\n this.sessionManager = new SessionManager(this.storage, 24);\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n if (this.initialized) return;\r\n\r\n try {\r\n await this.restoreSession();\r\n this.initialized = true;\r\n this.emit('initialized');\r\n } catch (error) {\r\n console.error('Sphere SDK initialization error:', error);\r\n this.initialized = true;\r\n }\r\n }\r\n\r\n async loginWithGoogle(): Promise<SphereWalletMethods> {\r\n try {\r\n if (!this.initialized) await this.initialize();\r\n\r\n const googleUser = await this.authProvider.login();\r\n\r\n if (!googleUser || !googleUser.sub || !googleUser.email) {\r\n // If we are in redirect mode, this point should not be reached as the page unloads.\r\n // However, if it returns empty data, we should stop here.\r\n return null as any;\r\n }\r\n\r\n // Derive deterministic key from Google sub\r\n const salt = KeyDerivation.generateDeterministicSalt(this.appName, googleUser.email);\r\n const privateKeyHex = KeyDerivation.derivePrivateKey({\r\n userId: googleUser.sub,\r\n salt: salt,\r\n iterations: 100000,\r\n });\r\n\r\n const wallet = new SphereWallet(\r\n this.cedra,\r\n privateKeyHex,\r\n this.config.network as SphereNetwork,\r\n this.config.rpcEndpoint,\r\n this.config.indexerUrl\r\n );\r\n\r\n // Encrypt wallet data for storage\r\n const encryptedWallet = this.encryptWalletData(privateKeyHex);\r\n\r\n // Start session\r\n await this.sessionManager.saveSession({\r\n encryptedWallet,\r\n userInfo: {\r\n email: googleUser.email,\r\n name: googleUser.name,\r\n picture: googleUser.picture\r\n }\r\n });\r\n\r\n this.currentWallet = wallet;\r\n this.emit('auth_success', { wallet, user: googleUser });\r\n return wallet;\r\n } catch (error: any) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n `Google authentication failed: ${error.message}`\r\n );\r\n }\r\n }\r\n\r\n async restoreSession(): Promise<SphereWalletMethods | null> {\r\n try {\r\n const session = await this.sessionManager.getSession();\r\n if (session && session.expiresAt > Date.now()) {\r\n const privateKeyHex = this.decryptWalletData(session.encryptedWallet);\r\n if (!privateKeyHex) return null;\r\n\r\n const wallet = new SphereWallet(\r\n this.cedra,\r\n privateKeyHex,\r\n this.config.network as SphereNetwork,\r\n this.config.rpcEndpoint,\r\n this.config.indexerUrl\r\n );\r\n this.currentWallet = wallet;\r\n this.emit('auth_success', { wallet, method: 'restored' });\r\n return wallet;\r\n }\r\n } catch (error) {\r\n console.error('Session restoration failed:', error);\r\n }\r\n return null;\r\n }\r\n\r\n async handleGoogleResponse(credential: string): Promise<SphereWalletMethods> {\r\n try {\r\n if (!this.initialized) await this.initialize();\r\n\r\n const googleUser = await this.authProvider.handleCredentialResponse(credential);\r\n\r\n // Derive deterministic key from Google sub\r\n const salt = KeyDerivation.generateDeterministicSalt(this.appName, googleUser.email);\r\n const privateKeyHex = KeyDerivation.derivePrivateKey({\r\n userId: googleUser.sub,\r\n salt: salt,\r\n iterations: 100000,\r\n });\r\n\r\n const wallet = new SphereWallet(\r\n this.cedra,\r\n privateKeyHex,\r\n this.config.network as SphereNetwork,\r\n this.config.rpcEndpoint,\r\n this.config.indexerUrl\r\n );\r\n\r\n // Encrypt wallet data for storage\r\n const encryptedWallet = this.encryptWalletData(privateKeyHex);\r\n\r\n // Start session\r\n await this.sessionManager.saveSession({\r\n encryptedWallet,\r\n userInfo: {\r\n email: googleUser.email,\r\n name: googleUser.name,\r\n picture: googleUser.picture\r\n }\r\n });\r\n\r\n this.currentWallet = wallet;\r\n this.emit('auth_success', { wallet, user: googleUser });\r\n return wallet;\r\n } catch (error: any) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n `Failed to handle Google response: ${error.message}`\r\n );\r\n }\r\n }\r\n\r\n async logout(): Promise<void> {\r\n await this.authProvider.logout();\r\n await this.sessionManager.clearSession();\r\n if (this.currentWallet) {\r\n await this.currentWallet.disconnect();\r\n }\r\n this.currentWallet = null;\r\n this.emit('logout');\r\n }\r\n\r\n isAuthenticated(): boolean {\r\n return this.currentWallet !== null;\r\n }\r\n\r\n getCurrentWallet(): SphereWalletMethods | null {\r\n return this.currentWallet;\r\n }\r\n\r\n getUserEmail(): string | null {\r\n const session = this.sessionManager.getCachedSession();\r\n return session?.userInfo.email || null;\r\n }\r\n\r\n getUserName(): string | null {\r\n const session = this.sessionManager.getCachedSession();\r\n return session?.userInfo.name || null;\r\n }\r\n\r\n getUserPicture(): string | null {\r\n const session = this.sessionManager.getCachedSession();\r\n return session?.userInfo.picture || null;\r\n }\r\n\r\n getEphemeralPublicKey(): string | null {\r\n // For deterministic wallets, this is the master public key\r\n return this.currentWallet?.getPublicKey() || null;\r\n }\r\n\r\n async updateNetwork(network: Network, rpcEndpoint: string): Promise<void> {\r\n this.config.network = network;\r\n this.config.rpcEndpoint = rpcEndpoint;\r\n\r\n const cedraConfig = new CedraConfig({\r\n network: network as CedraNetwork,\r\n fullnode: rpcEndpoint\r\n });\r\n\r\n this.cedra = new Cedra(cedraConfig);\r\n\r\n if (this.currentWallet) {\r\n this.currentWallet.updateNetwork(network, rpcEndpoint);\r\n }\r\n\r\n this.emit('network_changed', { network, rpcEndpoint });\r\n }\r\n\r\n getIndexerUrl(): string | undefined {\r\n return this.config.indexerUrl;\r\n }\r\n\r\n // Internal helpers for encryption\r\n private encryptWalletData(privateKeyHex: string): string {\r\n return CryptoJS.AES.encrypt(privateKeyHex, this.storageKey).toString();\r\n }\r\n\r\n private decryptWalletData(encryptedData: string): string {\r\n try {\r\n const bytes = CryptoJS.AES.decrypt(encryptedData, this.storageKey);\r\n return bytes.toString(CryptoJS.enc.Utf8);\r\n } catch (error) {\r\n console.warn('[Sphere] Failed to decrypt wallet data');\r\n return '';\r\n }\r\n }\r\n\r\n // EventEmitter overrides to satisfy interface\r\n on(event: string, listener: (...args: any[]) => void): this {\r\n return super.on(event, listener);\r\n }\r\n\r\n off(event: string, listener: (...args: any[]) => void): this {\r\n return super.off(event, listener);\r\n }\r\n}\r\n","import React, { createContext, useContext, useEffect, useState, ReactNode, useCallback } from 'react';\r\nimport { SphereAccountAbstraction } from '../SphereAccountAbstraction';\r\nimport { SphereWalletMethods, SDKConfig, BalanceInfo, WalletInfo } from '../types';\r\n\r\ninterface SphereContextType {\r\n sdk: SphereAccountAbstraction;\r\n wallet: SphereWalletMethods | null;\r\n walletInfo: WalletInfo | null;\r\n balance: BalanceInfo | null;\r\n /** @deprecated Use userEmail instead */\r\n email: string | null;\r\n userEmail: string | null;\r\n userName: string | null;\r\n userPicture: string | null;\r\n indexerUrl: string | undefined;\r\n isAuthenticated: boolean;\r\n isLoading: boolean;\r\n error: string | null;\r\n login: () => Promise<void>;\r\n logout: () => Promise<void>;\r\n setIsLoading: (loading: boolean) => void;\r\n refreshData: () => Promise<void>;\r\n handleAuthSuccess: (wallet: SphereWalletMethods) => Promise<void>;\r\n}\r\n\r\nconst SphereContext = createContext<SphereContextType | undefined>(undefined);\r\n\r\nexport interface SphereProviderProps {\r\n children: ReactNode;\r\n config: SDKConfig;\r\n}\r\n\r\nexport const SphereProvider: React.FC<SphereProviderProps> = ({ children, config }) => {\r\n const [sdk] = useState(() => new SphereAccountAbstraction(config));\r\n const [wallet, setWallet] = useState<SphereWalletMethods | null>(null);\r\n const [walletInfo, setWalletInfo] = useState<WalletInfo | null>(null);\r\n const [balance, setBalance] = useState<BalanceInfo | null>(null);\r\n const [userEmail, setUserEmail] = useState<string | null>(null);\r\n const [userName, setUserName] = useState<string | null>(null);\r\n const [userPicture, setUserPicture] = useState<string | null>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const refreshData = useCallback(async (activeWallet: SphereWalletMethods) => {\r\n try {\r\n const [info, bal] = await Promise.all([\r\n activeWallet.getAccountInfo(),\r\n activeWallet.getBalance()\r\n ]);\r\n setWalletInfo(info);\r\n setBalance(bal);\r\n } catch (err) {\r\n console.error('Failed to refresh data:', err);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n const onAuth = ({ wallet }: { wallet: SphereWalletMethods }) => {\r\n setWallet(wallet);\r\n const email = sdk.getUserEmail();\r\n setUserEmail(email);\r\n setUserName(sdk.getUserName());\r\n setUserPicture(sdk.getUserPicture());\r\n refreshData(wallet);\r\n };\r\n\r\n const onLogout = () => {\r\n setWallet(null);\r\n setUserEmail(null);\r\n setUserName(null);\r\n setUserPicture(null);\r\n setWalletInfo(null);\r\n setBalance(null);\r\n };\r\n\r\n // Subscribe to events\r\n sdk.on('auth_success', onAuth);\r\n sdk.on('logout', onLogout);\r\n\r\n const init = async () => {\r\n try {\r\n await sdk.initialize();\r\n const restored = await sdk.restoreSession();\r\n if (restored) {\r\n setWallet(restored);\r\n setUserEmail(sdk.getUserEmail());\r\n setUserName(sdk.getUserName());\r\n setUserPicture(sdk.getUserPicture());\r\n await refreshData(restored);\r\n }\r\n } catch (err: any) {\r\n console.error('SDK Init error:', err);\r\n setError(err.message || 'Initialization failed');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n init();\r\n\r\n return () => {\r\n sdk.off('auth_success', onAuth);\r\n sdk.off('logout', onLogout);\r\n };\r\n }, [sdk, refreshData]);\r\n\r\n // Background Polling\r\n useEffect(() => {\r\n if (!wallet) return undefined;\r\n\r\n const pollInterval = setInterval(() => {\r\n refreshData(wallet);\r\n }, 10000);\r\n\r\n return () => clearInterval(pollInterval);\r\n }, [wallet, refreshData]);\r\n\r\n const handleAuthSuccess = useCallback(async (newWallet: SphereWalletMethods) => {\r\n setWallet(newWallet);\r\n await refreshData(newWallet);\r\n }, [refreshData]);\r\n\r\n const login = async () => {\r\n setError(null);\r\n try {\r\n await sdk.loginWithGoogle();\r\n } catch (err: any) {\r\n console.error('Sphere Login Error:', err);\r\n setError(err.message || 'Login failed');\r\n throw err;\r\n }\r\n };\r\n\r\n const logout = async () => {\r\n try {\r\n await sdk.logout();\r\n } catch (err: any) {\r\n setError(err.message || 'Logout failed');\r\n throw err;\r\n }\r\n };\r\n\r\n return (\r\n <SphereContext.Provider\r\n value={{\r\n sdk,\r\n wallet,\r\n walletInfo,\r\n balance,\r\n email: userEmail, // Restore email for backward compatibility\r\n userEmail,\r\n userName,\r\n userPicture,\r\n indexerUrl: sdk.getIndexerUrl(),\r\n isAuthenticated: !!wallet,\r\n isLoading,\r\n error,\r\n login,\r\n logout,\r\n setIsLoading,\r\n refreshData: async () => {\r\n if (wallet) await refreshData(wallet);\r\n },\r\n handleAuthSuccess\r\n }}\r\n >\r\n {children}\r\n </SphereContext.Provider>\r\n );\r\n};\r\n\r\nexport const useSphere = () => {\r\n const context = useContext(SphereContext);\r\n if (context === undefined) {\r\n throw new Error('useSphere must be used within a SphereProvider');\r\n }\r\n return context;\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSphere } from './SphereProvider';\r\n\r\ninterface SphereModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n}\r\n\r\nexport const SphereModal: React.FC<SphereModalProps> = ({ isOpen, onClose }) => {\r\n const { login, isAuthenticated, isLoading, error } = useSphere();\r\n const [localLoading, setLocalLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (isAuthenticated) {\r\n onClose();\r\n }\r\n }, [isAuthenticated, onClose]);\r\n\r\n const handleLogin = async () => {\r\n try {\r\n setLocalLoading(true);\r\n await login();\r\n } catch (err) {\r\n console.error('Sphere Login Error:', err);\r\n } finally {\r\n setLocalLoading(false);\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <div style={styles.overlay} onClick={(e) => e.target === e.currentTarget && onClose()}>\r\n <div style={styles.modal}>\r\n <div style={styles.header}>\r\n <div style={{ width: 32 }} /> {/* Spacer */}\r\n <h2 style={styles.title}>Login or sign up</h2>\r\n <button style={styles.closeBtn} onClick={onClose} aria-label=\"Close\">×</button>\r\n </div>\r\n\r\n <div style={styles.content}>\r\n <button\r\n style={{\r\n ...styles.socialButton,\r\n opacity: (isLoading || localLoading) ? 0.7 : 1,\r\n cursor: (isLoading || localLoading) ? 'not-allowed' : 'pointer',\r\n marginBottom: 0\r\n }}\r\n onClick={handleLogin}\r\n disabled={isLoading || localLoading}\r\n >\r\n {(isLoading || localLoading) ? (\r\n <div style={styles.spinner} />\r\n ) : (\r\n <img\r\n src=\"https://www.gstatic.com/marketing-cms/assets/images/d5/dc/cfe9ce8b4425b410b49b7f2dd3f3/g.webp=s48-fcrop64=1,00000000ffffffff-rw\"\r\n alt=\"Google\"\r\n style={styles.socialIcon}\r\n />\r\n )}\r\n <span style={styles.socialText}>Google</span>\r\n </button>\r\n\r\n {error && (\r\n <div style={styles.errorBanner}>\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={styles.footer}>\r\n Protected by <strong>Sphere</strong>\r\n </div>\r\n\r\n <style>{`\r\n @keyframes sphere-spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: 'transparent',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 9999,\r\n padding: '20px'\r\n },\r\n modal: {\r\n backgroundColor: '#0c0c0c',\r\n color: '#ffffff',\r\n width: '90%',\r\n maxWidth: '360px',\r\n aspectRatio: '1/1',\r\n borderRadius: '0',\r\n position: 'relative',\r\n boxShadow: '0 0 0 1px #222, 0 25px 60px rgba(0, 0, 0, 0.7)',\r\n overflow: 'hidden',\r\n fontFamily: 'Inter, -apple-system, system-ui, sans-serif',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: '24px',\r\n boxSizing: 'border-box',\r\n justifyContent: 'space-between'\r\n },\r\n header: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '100%'\r\n },\r\n title: {\r\n fontSize: '14px',\r\n fontWeight: '500',\r\n color: '#94a3b8',\r\n textAlign: 'center',\r\n margin: 0,\r\n flex: 1\r\n },\r\n closeBtn: {\r\n background: 'rgba(255, 255, 255, 0.05)',\r\n border: 'none',\r\n color: '#888',\r\n fontSize: '20px',\r\n cursor: 'pointer',\r\n width: '28px',\r\n height: '28px',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n content: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '100%',\r\n flex: 1\r\n },\r\n socialButton: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n height: '48px',\r\n backgroundColor: 'transparent',\r\n border: '1px solid #333',\r\n borderRadius: '0',\r\n padding: '0 16px',\r\n marginBottom: '10px',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n color: '#fff',\r\n boxSizing: 'border-box',\r\n transition: 'background 0.2s',\r\n },\r\n socialIcon: {\r\n width: '18px',\r\n height: '18px',\r\n },\r\n socialText: {\r\n marginLeft: '12px',\r\n fontWeight: '500',\r\n },\r\n errorBanner: {\r\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\r\n border: '1px solid rgba(239, 68, 68, 0.2)',\r\n color: '#f87171',\r\n padding: '12px 16px',\r\n borderRadius: '16px',\r\n fontSize: '13px',\r\n marginBottom: '24px',\r\n textAlign: 'center',\r\n width: '100%'\r\n },\r\n spinner: {\r\n width: '18px',\r\n height: '18px',\r\n border: '2px solid rgba(255, 255, 255, 0.1)',\r\n borderTop: '2px solid #ffffff',\r\n borderRadius: '50%',\r\n animation: 'sphere-spin 0.8s linear infinite'\r\n },\r\n footer: {\r\n textAlign: 'center',\r\n fontSize: '11px',\r\n color: '#475569',\r\n }\r\n};\r\n","import React, { useState } from 'react';\r\n\r\ninterface SphereAvatarProps {\r\n src?: string | null;\r\n name?: string | null;\r\n size?: number;\r\n style?: React.CSSProperties;\r\n className?: string;\r\n}\r\n\r\nexport const SphereAvatar: React.FC<SphereAvatarProps> = ({\r\n src,\r\n name,\r\n size = 40,\r\n style,\r\n className\r\n}) => {\r\n const [imageError, setImageError] = useState(false);\r\n\r\n const containerStyle: React.CSSProperties = {\r\n width: `${size}px`,\r\n height: `${size}px`,\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n overflow: 'hidden',\r\n backgroundColor: '#2d3748',\r\n color: 'white',\r\n fontWeight: '600',\r\n fontSize: `${size * 0.4}px`,\r\n userSelect: 'none',\r\n ...style\r\n };\r\n\r\n const initials = name ? name.charAt(0).toUpperCase() : '?';\r\n\r\n if (src && !imageError) {\r\n return (\r\n <div className={className} style={containerStyle}>\r\n <img\r\n src={src}\r\n alt={name || 'Avatar'}\r\n referrerPolicy=\"no-referrer\"\r\n onError={() => setImageError(true)}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover'\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={className} style={containerStyle}>\r\n {initials}\r\n </div>\r\n );\r\n};\r\n"]}
1
+ {"version":3,"sources":["../src/core/EventEmitter.ts","../src/types/index.ts","../src/wallet/SphereWallet.ts","../src/auth/GoogleAuthProvider.ts","../src/storage/SecureStorage.ts","../src/auth/KeyDerivation.ts","../src/core/constants.ts","../src/SphereAccountAbstraction.ts","../src/react/SphereProvider.tsx","../src/react/SphereModal.tsx","../src/react/SphereAvatar.tsx"],"names":["ErrorCode","CedraNetwork","nonce","CryptoJS","Account","CedraConfig","Cedra","wallet","useState","useEffect","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Simple, browser-compatible EventEmitter implementation\r\n * Removes dependency on Node.js 'events' module\r\n */\r\nexport class EventEmitter {\r\n private listeners: Map<string, Function[]> = new Map();\r\n\r\n on(event: string, listener: Function): this {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, []);\r\n }\r\n this.listeners.get(event)!.push(listener);\r\n return this;\r\n }\r\n\r\n off(event: string, listener: Function): this {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n const index = eventListeners.indexOf(listener);\r\n if (index !== -1) {\r\n eventListeners.splice(index, 1);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n emit(event: string, ...args: any[]): boolean {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners && eventListeners.length > 0) {\r\n eventListeners.forEach(listener => listener(...args));\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n removeAllListeners(event?: string): this {\r\n if (event) {\r\n this.listeners.delete(event);\r\n } else {\r\n this.listeners.clear();\r\n }\r\n return this;\r\n }\r\n}\r\n","/**\r\n * Type definitions for Sphere Account Abstraction SDK\r\n */\r\n\r\nexport type Network = 'mainnet' | 'testnet' | 'devnet';\r\n\r\nexport interface SDKConfig {\r\n /** Sphere network to connect to */\r\n network?: Network;\r\n /** Google OAuth Client ID */\r\n googleClientId?: string;\r\n /** Custom RPC endpoint */\r\n rpcEndpoint?: string;\r\n /** GraphQL indexer endpoint for querying blockchain data */\r\n indexerUrl?: string;\r\n /** Redirect URI for OAuth flows (optional) */\r\n redirectUri?: string;\r\n}\r\n\r\nexport interface GoogleAuthResponse {\r\n /** Google ID token (JWT) */\r\n idToken: string;\r\n /** User's email address */\r\n email: string;\r\n /** User's display name */\r\n name?: string;\r\n /** User's profile picture URL */\r\n picture?: string;\r\n /** Google user ID */\r\n sub: string;\r\n}\r\n\r\nexport interface WalletInfo {\r\n /** Cedra wallet address (32 bytes hex) */\r\n address: string;\r\n /** Public key (hex) */\r\n publicKey: string;\r\n /** Whether the account exists on-chain */\r\n existsOnChain: boolean;\r\n /** Current sequence number (nonce) */\r\n sequenceNumber: string;\r\n /** Authentication key */\r\n authKey: string;\r\n}\r\n\r\nexport interface TransactionOptions {\r\n /** Recipient address */\r\n to: string;\r\n /** Amount to send (in smallest unit, e.g., 100000000 = 1 CED) */\r\n amount: number;\r\n /** Optional coin type (defaults to CedraCoin) */\r\n coinType?: string;\r\n /** Optional max gas amount */\r\n maxGasAmount?: number;\r\n /** Optional gas unit price */\r\n gasUnitPrice?: number;\r\n}\r\n\r\nexport interface TransactionResult {\r\n /** Transaction hash */\r\n hash: string;\r\n /** Whether transaction was successful (Executed) */\r\n success: boolean;\r\n /** If aborted, this contains the VM status/error */\r\n vmStatus?: string;\r\n /** Gas used */\r\n gasUsed: string;\r\n /** Block height */\r\n version: string;\r\n}\r\n\r\nexport interface TransactionHistoryItem {\r\n hash: string;\r\n success: boolean;\r\n type: string;\r\n sender: string;\r\n receiver?: string;\r\n amount?: string;\r\n timestamp: number;\r\n version: string;\r\n}\r\n\r\nexport interface FungibleAssetMetadata {\r\n asset_type: string;\r\n creator_address: string;\r\n decimals: number;\r\n icon_uri?: string;\r\n name: string;\r\n project_uri?: string;\r\n symbol: string;\r\n token_standard: string;\r\n}\r\n\r\nexport interface BalanceInfo {\r\n /** Coin type identifier */\r\n coinType: string;\r\n /** Balance amount (in smallest unit) */\r\n amount: string;\r\n /** Decimals for this coin */\r\n decimals: number;\r\n /** Human-readable balance */\r\n formatted: string;\r\n /** Token metadata (if available) */\r\n metadata?: FungibleAssetMetadata;\r\n}\r\n\r\nexport interface KeylessConfig {\r\n /** Google ID token (JWT) used for keyless proof */\r\n idToken: string;\r\n /** Ephemeral Key Pair (Ed25519) - Runtime only */\r\n ephemeralKeyPair?: any;\r\n /** Ephemeral Private Key Hex - Storage only */\r\n ephemeralPrivateKey?: string;\r\n /** Nonce blinding factor used during login */\r\n nonceBlinding: string;\r\n /** Expiry of the ephemeral session */\r\n expiresAt: number;\r\n}\r\n\r\nexport interface SessionData {\r\n /** Encrypted wallet data (deterministic private key) */\r\n encryptedWallet: string;\r\n /** Session expiration timestamp */\r\n expiresAt: number;\r\n /** Google refresh token (encrypted) */\r\n refreshToken?: string;\r\n /** Keyless session data (Petra way) */\r\n keyless?: KeylessConfig;\r\n /** User info */\r\n userInfo: {\r\n email: string;\r\n name?: string;\r\n picture?: string;\r\n };\r\n}\r\n\r\nexport interface StorageProvider {\r\n /** Get item from storage */\r\n getItem(key: string): Promise<string | null>;\r\n /** Set item in storage */\r\n setItem(key: string, value: string): Promise<void>;\r\n /** Remove item from storage */\r\n removeItem(key: string): Promise<void>;\r\n /** Clear all storage */\r\n clear(): Promise<void>;\r\n}\r\n\r\nexport interface KeyDerivationOptions {\r\n /** User identifier (e.g., Google sub) */\r\n userId: string;\r\n /** Application-specific salt */\r\n salt: string;\r\n /** Number of iterations for key derivation */\r\n iterations?: number;\r\n}\r\n\r\nexport interface SphereWalletMethods {\r\n /** Get wallet address */\r\n getAddress(): string;\r\n /** Get public key */\r\n getPublicKey(): string;\r\n /** Check if account exists on-chain */\r\n existsOnChain(): Promise<boolean>;\r\n /** Get account balance */\r\n getBalance(coinType?: string): Promise<BalanceInfo>;\r\n /** Get all token balances */\r\n getAllBalances(): Promise<BalanceInfo[]>;\r\n /** Send transaction */\r\n sendTransaction(options: TransactionOptions, simulate?: boolean): Promise<TransactionResult>;\r\n /** Update network and RPC endpoint */\r\n updateNetwork(network: Network, rpcEndpoint: string): void;\r\n /** Simulate transaction without submitting */\r\n simulateTransaction(options: TransactionOptions): Promise<{\r\n success: boolean;\r\n gasUsed: string;\r\n gasUnitPrice: string;\r\n totalGasCost: number;\r\n vmStatus: string;\r\n }>;\r\n /** Sign message */\r\n signMessage(message: string): Promise<string>;\r\n /** Get account info */\r\n getAccountInfo(): Promise<WalletInfo>;\r\n /** Wait for a transaction to be confirmed */\r\n waitForTransaction(hash: string): Promise<TransactionResult>;\r\n /** Get current network gas price */\r\n getGasPrice(): Promise<number>;\r\n /** Get transaction history */\r\n getTransactionHistory(): Promise<TransactionHistoryItem[]>;\r\n /** Disconnect wallet */\r\n disconnect(): Promise<void>;\r\n}\r\n\r\nexport interface AccountAbstractionSDK {\r\n /** Initialize SDK */\r\n initialize(): Promise<void>;\r\n /** Login with Google OAuth */\r\n loginWithGoogle(): Promise<SphereWalletMethods>;\r\n /** Handle Google OAuth response (for redirects) */\r\n handleGoogleResponse(credential: string): Promise<SphereWalletMethods>;\r\n /** Restore session if available */\r\n restoreSession(): Promise<SphereWalletMethods | null>;\r\n /** Logout and clear session */\r\n logout(): Promise<void>;\r\n /** Check if user is authenticated */\r\n isAuthenticated(): boolean;\r\n /** Get current wallet (if authenticated) */\r\n getCurrentWallet(): SphereWalletMethods | null;\r\n /** Get current user email (if authenticated) */\r\n getUserEmail(): string | null;\r\n /** Get current user name (if authenticated) */\r\n getUserName(): string | null;\r\n /** Get current user picture URL (if authenticated) */\r\n getUserPicture(): string | null;\r\n /** Get the ephemeral public key for the current session */\r\n getEphemeralPublicKey(): string | null;\r\n /** Update network and RPC endpoint */\r\n updateNetwork(network: Network, rpcEndpoint: string): Promise<void>;\r\n getIndexerUrl(): string | undefined;\r\n /** Subscribe to SDK events */\r\n on(event: string, callback: (data: any) => void): void;\r\n /** Unsubscribe from SDK events */\r\n off(event: string, callback: (data: any) => void): void;\r\n}\r\n\r\n\r\nexport interface ErrorResponse {\r\n /** Error code */\r\n code: string;\r\n /** Error message */\r\n message: string;\r\n /** Additional error details */\r\n details?: unknown;\r\n}\r\n\r\n// Error codes\r\nexport enum ErrorCode {\r\n AUTHENTICATION_FAILED = 'AUTHENTICATION_FAILED',\r\n WALLET_CREATION_FAILED = 'WALLET_CREATION_FAILED',\r\n TRANSACTION_FAILED = 'TRANSACTION_FAILED',\r\n INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE',\r\n NETWORK_ERROR = 'NETWORK_ERROR',\r\n INVALID_ADDRESS = 'INVALID_ADDRESS',\r\n SESSION_EXPIRED = 'SESSION_EXPIRED',\r\n STORAGE_ERROR = 'STORAGE_ERROR',\r\n KEY_DERIVATION_FAILED = 'KEY_DERIVATION_FAILED',\r\n TRANSACTION_ABORTED = 'TRANSACTION_ABORTED',\r\n DISCARDED_TRANSACTION = 'DISCARDED_TRANSACTION',\r\n INVALID_CONFIG = 'INVALID_CONFIG',\r\n}\r\n\r\n// Custom error class\r\nexport class SphereSDKError extends Error {\r\n constructor(\r\n public code: ErrorCode,\r\n message: string,\r\n public details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'SphereSDKError';\r\n }\r\n}\r\n","/**\r\n * Sphere Wallet Implementation\r\n */\r\n\r\nimport {\r\n Account,\r\n Ed25519PrivateKey,\r\n PrivateKey,\r\n PrivateKeyVariants,\r\n Cedra,\r\n CedraConfig,\r\n Network as CedraNetwork,\r\n} from '@cedra-labs/ts-sdk';\r\nimport {\r\n SphereWalletMethods,\r\n TransactionOptions,\r\n TransactionResult,\r\n TransactionHistoryItem,\r\n BalanceInfo,\r\n WalletInfo,\r\n SphereSDKError,\r\n ErrorCode,\r\n Network,\r\n KeylessConfig,\r\n} from '../types';\r\n\r\n/**\r\n * Sphere Wallet class\r\n * Manages wallet operations and blockchain interactions\r\n */\r\nexport class SphereWallet implements SphereWalletMethods {\r\n private account: Account;\r\n private client: Cedra;\r\n private network: CedraNetwork;\r\n private privateKeyHex: string;\r\n private keylessConfig: KeylessConfig | null = null;\r\n private _indexerUrl: string | null = null;\r\n\r\n constructor(clientOrKey: Cedra | string, privateKeyOrNetwork?: string | Network, networkOrEndpoint?: Network | string, rpcEndpoint?: string, indexerUrl?: string) {\r\n try {\r\n if (clientOrKey instanceof Cedra) {\r\n // Constructor overload for internal use\r\n this.client = clientOrKey;\r\n this.privateKeyHex = privateKeyOrNetwork as string;\r\n const net = networkOrEndpoint as Network;\r\n this.network = this.mapNetwork(net || 'testnet');\r\n this._indexerUrl = rpcEndpoint || null; // indexerUrl shifted in this signature\r\n\r\n const formattedKey = PrivateKey.formatPrivateKey(this.privateKeyHex, PrivateKeyVariants.Ed25519);\r\n const privateKey = new Ed25519PrivateKey(formattedKey);\r\n this.account = Account.fromPrivateKey({ privateKey });\r\n } else {\r\n // Standard constructor\r\n this.privateKeyHex = clientOrKey;\r\n const net = privateKeyOrNetwork as Network;\r\n this.network = this.mapNetwork(net || 'testnet');\r\n const endpoint = rpcEndpoint || (networkOrEndpoint as string);\r\n\r\n const config = new CedraConfig({\r\n network: this.network,\r\n fullnode: endpoint\r\n });\r\n this.client = new Cedra(config);\r\n this._indexerUrl = indexerUrl || null;\r\n\r\n const formattedKey = PrivateKey.formatPrivateKey(this.privateKeyHex, PrivateKeyVariants.Ed25519);\r\n const privateKey = new Ed25519PrivateKey(formattedKey);\r\n this.account = Account.fromPrivateKey({ privateKey });\r\n }\r\n } catch (error) {\r\n throw new SphereSDKError(\r\n ErrorCode.WALLET_CREATION_FAILED,\r\n 'Failed to create wallet',\r\n error\r\n );\r\n }\r\n }\r\n\r\n getAddress(): string {\r\n return this.account.accountAddress.toString();\r\n }\r\n\r\n getPublicKey(): string {\r\n return this.account.publicKey.toString();\r\n }\r\n\r\n getIndexerUrl(): string | null {\r\n return this._indexerUrl;\r\n }\r\n\r\n async existsOnChain(): Promise<boolean> {\r\n try {\r\n await this.client.getAccountInfo({\r\n accountAddress: this.account.accountAddress,\r\n });\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n }\r\n\r\n async getBalance(coinType?: string): Promise<BalanceInfo> {\r\n const defaultCoinType = '0x1::cedra_coin::CedraCoin';\r\n const targetCoinType = coinType || defaultCoinType;\r\n\r\n try {\r\n // FA Check\r\n if (targetCoinType.startsWith('0x') && !targetCoinType.includes('::')) {\r\n const [balance] = await this.client.view({\r\n payload: {\r\n function: '0x1::primary_fungible_store::balance',\r\n typeArguments: ['0x1::fungible_asset::Metadata'],\r\n functionArguments: [this.getAddress(), targetCoinType],\r\n }\r\n });\r\n const [decimals] = await this.client.view({\r\n payload: {\r\n function: '0x1::fungible_asset::decimals',\r\n typeArguments: ['0x1::fungible_asset::Metadata'],\r\n functionArguments: [targetCoinType],\r\n }\r\n });\r\n\r\n const amountVal = balance?.toString() || '0';\r\n const decimalsVal = decimals ? Number(decimals) : 8;\r\n return {\r\n coinType: targetCoinType,\r\n amount: amountVal,\r\n decimals: decimalsVal,\r\n formatted: (Number(amountVal) / Math.pow(10, decimalsVal)).toFixed(Math.min(decimalsVal, 8))\r\n };\r\n }\r\n\r\n // Legacy Coin\r\n const amount = await this.client.getAccountCoinAmount({\r\n accountAddress: this.account.accountAddress,\r\n coinType: targetCoinType as `${string}::${string}::${string}`,\r\n });\r\n\r\n return {\r\n coinType: targetCoinType,\r\n amount: amount.toString(),\r\n decimals: 8,\r\n formatted: (Number(amount) / 1e8).toFixed(8)\r\n };\r\n } catch (error) {\r\n return {\r\n coinType: targetCoinType,\r\n amount: '0',\r\n decimals: 8,\r\n formatted: '0.00000000',\r\n };\r\n }\r\n }\r\n\r\n async getAllBalances(): Promise<BalanceInfo[]> {\r\n return [await this.getBalance()];\r\n }\r\n\r\n async sendTransaction(options: TransactionOptions, simulate: boolean = true): Promise<TransactionResult> {\r\n try {\r\n const { to, amount, coinType, maxGasAmount, gasUnitPrice } = options;\r\n\r\n const transaction = await this.client.transaction.build.simple({\r\n sender: this.account.accountAddress,\r\n data: {\r\n function: (coinType?.startsWith('0x') && !coinType.includes('::'))\r\n ? '0x1::primary_fungible_store::transfer'\r\n : '0x1::cedra_account::transfer' as any,\r\n typeArguments: (coinType?.startsWith('0x') && !coinType.includes('::'))\r\n ? ['0x1::fungible_asset::Metadata']\r\n : [],\r\n functionArguments: (coinType?.startsWith('0x') && !coinType.includes('::'))\r\n ? [coinType, to, amount]\r\n : [to, amount],\r\n },\r\n options: {\r\n maxGasAmount: maxGasAmount || 20000,\r\n gasUnitPrice: gasUnitPrice,\r\n },\r\n });\r\n\r\n if (simulate) {\r\n const [sim] = await this.client.transaction.simulate.simple({\r\n signerPublicKey: this.account.publicKey,\r\n transaction,\r\n });\r\n if (!sim.success) throw new Error(`Simulation failed: ${sim.vm_status}`);\r\n }\r\n\r\n const authenticator = await this.client.transaction.sign({\r\n signer: this.account,\r\n transaction,\r\n });\r\n\r\n const pending = await this.client.transaction.submit.simple({\r\n transaction,\r\n senderAuthenticator: authenticator,\r\n });\r\n\r\n return await this.waitForTransaction(pending.hash);\r\n } catch (error: any) {\r\n throw new SphereSDKError(ErrorCode.TRANSACTION_FAILED, error.message, error);\r\n }\r\n }\r\n\r\n async waitForTransaction(hash: string): Promise<TransactionResult> {\r\n const tx = await this.client.waitForTransaction({ transactionHash: hash });\r\n return {\r\n hash: hash,\r\n success: tx.success,\r\n vmStatus: tx.vm_status,\r\n gasUsed: tx.gas_used,\r\n version: tx.version,\r\n };\r\n }\r\n\r\n async getGasPrice(): Promise<number> {\r\n const res = await this.client.getGasPriceEstimation();\r\n return res.gas_estimate;\r\n }\r\n\r\n async getTransactionHistory(): Promise<TransactionHistoryItem[]> {\r\n const txs = await this.client.getAccountTransactions({\r\n accountAddress: this.account.accountAddress,\r\n });\r\n\r\n return txs.map((tx: any) => ({\r\n hash: tx.hash,\r\n success: tx.success,\r\n type: tx.type,\r\n sender: tx.sender,\r\n receiver: tx.payload?.functionArguments?.[0],\r\n amount: tx.payload?.functionArguments?.[1],\r\n timestamp: parseInt(tx.timestamp || '0') / 1000,\r\n version: tx.version,\r\n }));\r\n }\r\n\r\n async simulateTransaction(options: TransactionOptions) {\r\n const { to, amount, maxGasAmount, gasUnitPrice } = options;\r\n const transaction = await this.client.transaction.build.simple({\r\n sender: this.account.accountAddress,\r\n data: {\r\n function: '0x1::cedra_account::transfer',\r\n functionArguments: [to, amount],\r\n },\r\n options: {\r\n maxGasAmount: maxGasAmount || 20000,\r\n gasUnitPrice: gasUnitPrice,\r\n },\r\n });\r\n\r\n const [res] = await this.client.transaction.simulate.simple({\r\n signerPublicKey: this.account.publicKey,\r\n transaction,\r\n });\r\n\r\n return {\r\n success: res.success,\r\n gasUsed: res.gas_used,\r\n gasUnitPrice: res.gas_unit_price,\r\n totalGasCost: Number(res.gas_used) * Number(res.gas_unit_price),\r\n vmStatus: res.vm_status,\r\n };\r\n }\r\n\r\n async signMessage(message: string): Promise<string> {\r\n const sig = this.account.sign(new TextEncoder().encode(message));\r\n return sig.toString();\r\n }\r\n\r\n async getAccountInfo(): Promise<WalletInfo> {\r\n const info = await this.client.getAccountInfo({ accountAddress: this.account.accountAddress });\r\n return {\r\n address: this.getAddress(),\r\n publicKey: this.getPublicKey(),\r\n existsOnChain: true,\r\n sequenceNumber: info.sequence_number,\r\n authKey: info.authentication_key,\r\n };\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n // @ts-expect-error\r\n this.account = null;\r\n }\r\n\r\n updateNetwork(network: Network, rpcEndpoint: string): void {\r\n this.network = this.mapNetwork(network);\r\n this.client = new Cedra(new CedraConfig({ network: this.network, fullnode: rpcEndpoint }));\r\n }\r\n\r\n private mapNetwork(network: string): CedraNetwork {\r\n switch (network.toLowerCase()) {\r\n case 'mainnet': return CedraNetwork.MAINNET;\r\n case 'testnet': return CedraNetwork.TESTNET;\r\n case 'devnet': return CedraNetwork.DEVNET;\r\n default: return CedraNetwork.TESTNET;\r\n }\r\n }\r\n\r\n getAccount(): Account { return this.account; }\r\n getClient(): Cedra { return this.client; }\r\n getPrivateKeyHex(): string { return this.privateKeyHex; }\r\n setKeylessConfig(config: KeylessConfig): void { this.keylessConfig = config; }\r\n isKeyless(): boolean { return !!this.keylessConfig; }\r\n}\r\n","/**\r\n * Google OAuth Authentication Provider\r\n * Handles Google Sign-In flow and token validation\r\n */\r\n\r\nimport { jwtVerify, decodeJwt } from 'jose';\r\nimport { GoogleAuthResponse, SphereSDKError, ErrorCode } from '../types';\r\n\r\nexport interface GoogleAuthConfig {\r\n clientId: string;\r\n redirectUri?: string;\r\n}\r\n\r\n/**\r\n * Google OAuth Provider for authentication\r\n */\r\nexport class GoogleAuthProvider {\r\n private clientId: string;\r\n private redirectUri?: string;\r\n\r\n constructor(config: GoogleAuthConfig) {\r\n this.clientId = config.clientId;\r\n this.redirectUri = config.redirectUri;\r\n }\r\n\r\n /**\r\n * Initiate Google OAuth login flow\r\n * Opens Google Sign-In popup\r\n * @param nonce Optional OIDC nonce for keyless binding\r\n */\r\n async login(nonce?: string): Promise<GoogleAuthResponse> {\r\n try {\r\n // Check if we're in a browser environment\r\n if (typeof window === 'undefined') {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Google OAuth requires a browser environment'\r\n );\r\n }\r\n\r\n // Use Google Identity Services (GIS) - the modern approach\r\n return new Promise((resolve, reject) => {\r\n // Load Google Identity Services script if not already loaded\r\n this.loadGoogleIdentityScript()\r\n .then(() => {\r\n const uxMode = this.redirectUri ? 'redirect' : 'popup';\r\n\r\n if (uxMode === 'redirect') {\r\n // Generate a nonce for security\r\n const nonce = Math.random().toString(36).substring(2) + Date.now().toString(36);\r\n\r\n // Construct the Google OAuth2 URL for a full-page redirect\r\n const params = new URLSearchParams({\r\n client_id: this.clientId,\r\n redirect_uri: this.redirectUri!,\r\n response_type: 'id_token',\r\n scope: 'openid email profile',\r\n nonce: nonce,\r\n prompt: 'select_account'\r\n });\r\n\r\n const authUrl = `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`;\r\n\r\n // Redirect the entire page\r\n window.location.href = authUrl;\r\n\r\n // Do not resolve/reject - the page is navigating away.\r\n // This prevents the calling code from proceeding with empty data.\r\n } else {\r\n // Use OAuth2 Token Client for a pure popup flow (Zero Frames in page)\r\n // @ts-expect-error - google is loaded from external script\r\n const client = google.accounts.oauth2.initTokenClient({\r\n client_id: this.clientId,\r\n scope: 'email profile openid',\r\n nonce: nonce, // Bind the ephemeral key pair via nonce\r\n callback: async (tokenResponse: any) => {\r\n if (tokenResponse.error) {\r\n reject(new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n `Google login failed: ${tokenResponse.error_description || tokenResponse.error}`\r\n ));\r\n return;\r\n }\r\n\r\n if (tokenResponse && tokenResponse.access_token) {\r\n try {\r\n // Fetch user info using the access token\r\n const userInfoResponse = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {\r\n headers: {\r\n 'Authorization': `Bearer ${tokenResponse.access_token}`\r\n }\r\n });\r\n\r\n if (!userInfoResponse.ok) {\r\n throw new Error('Failed to fetch user info from Google');\r\n }\r\n\r\n const payload = await userInfoResponse.json();\r\n\r\n const authResponse: GoogleAuthResponse = {\r\n idToken: tokenResponse.access_token, // Use access token\r\n email: payload.email as string,\r\n name: payload.name as string,\r\n picture: payload.picture as string,\r\n sub: payload.sub as string,\r\n };\r\n\r\n resolve(authResponse);\r\n } catch (error) {\r\n reject(new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Failed to retrieve user profile after login',\r\n error\r\n ));\r\n }\r\n }\r\n },\r\n });\r\n\r\n // Request the token (triggers the popup window, NO IFRAMES on page)\r\n client.requestAccessToken();\r\n }\r\n })\r\n .catch(reject);\r\n });\r\n } catch (error) {\r\n if (error instanceof SphereSDKError) {\r\n throw error;\r\n }\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Failed to initiate Google login',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Initialize Google Identity Services\r\n * @param callback Credential handler\r\n * @param nonce Optional OIDC nonce for binding\r\n */\r\n async initialize(callback: (response: { credential: string }) => void, nonce?: string): Promise<void> {\r\n await this.loadGoogleIdentityScript();\r\n // @ts-expect-error - google is loaded from external script\r\n google.accounts.id.initialize({\r\n client_id: this.clientId,\r\n callback: callback,\r\n nonce: nonce,\r\n });\r\n }\r\n\r\n /**\r\n * Handle the credential response from Google\r\n */\r\n public async handleCredentialResponse(\r\n credential: string\r\n ): Promise<GoogleAuthResponse> {\r\n try {\r\n // Decode the JWT token (without verification for now)\r\n const payload = decodeJwt(credential);\r\n\r\n // Extract user information\r\n const authResponse: GoogleAuthResponse = {\r\n idToken: credential,\r\n email: payload.email as string,\r\n name: payload.name as string,\r\n picture: payload.picture as string,\r\n sub: payload.sub as string,\r\n };\r\n\r\n // Validate required fields\r\n if (!authResponse.email || !authResponse.sub) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Invalid Google credential: missing required fields'\r\n );\r\n }\r\n\r\n return authResponse;\r\n } catch (error) {\r\n if (error instanceof SphereSDKError) {\r\n throw error;\r\n }\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Failed to process Google credential',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Verify Google ID token (optional, for enhanced security)\r\n * This should ideally be done server-side\r\n */\r\n async verifyToken(idToken: string): Promise<boolean> {\r\n try {\r\n // Fetch Google's public keys\r\n const JWKS_URI = 'https://www.googleapis.com/oauth2/v3/certs';\r\n const response = await fetch(JWKS_URI);\r\n const jwks = await response.json();\r\n\r\n // Verify the token\r\n await jwtVerify(idToken, async () => {\r\n // This is a simplified version\r\n // In production, properly implement JWKS key selection\r\n return jwks.keys[0];\r\n });\r\n\r\n return true;\r\n } catch (error) {\r\n console.error('Token verification failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Load Google Identity Services script\r\n */\r\n private loadGoogleIdentityScript(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n // Check if already loaded\r\n // @ts-expect-error - google is loaded from external script\r\n if (typeof google !== 'undefined' && google.accounts) {\r\n resolve();\r\n return;\r\n }\r\n\r\n // Create script element\r\n const script = document.createElement('script');\r\n script.src = 'https://accounts.google.com/gsi/client';\r\n script.async = true;\r\n script.defer = true;\r\n\r\n script.onload = () => resolve();\r\n script.onerror = () =>\r\n reject(\r\n new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Failed to load Google Identity Services'\r\n )\r\n );\r\n\r\n document.head.appendChild(script);\r\n });\r\n }\r\n\r\n /**\r\n * Sign out from Google\r\n */\r\n async logout(): Promise<void> {\r\n try {\r\n // @ts-expect-error - google is loaded from external script\r\n if (typeof google !== 'undefined' && google.accounts) {\r\n // @ts-expect-error - google is loaded from external script\r\n google.accounts.id.disableAutoSelect();\r\n }\r\n } catch (error) {\r\n console.error('Google logout error:', error);\r\n // Don't throw - logout should be best effort\r\n }\r\n }\r\n\r\n /**\r\n * Render Google Sign-In button\r\n * @param elementId ID of the container element\r\n * @param options Button customization options\r\n * @param options Button customization options\r\n */\r\n async renderButton(\r\n elementId: string,\r\n options?: {\r\n theme?: 'outline' | 'filled_blue' | 'filled_black';\r\n size?: 'large' | 'medium' | 'small';\r\n text?: 'signin_with' | 'signup_with' | 'continue_with';\r\n shape?: 'rectangular' | 'pill' | 'circle' | 'square';\r\n width?: string | number;\r\n nonce?: string; // Optional nonce for keyless\r\n callback?: (response: { credential: string }) => void;\r\n }\r\n ): Promise<void> {\r\n await this.loadGoogleIdentityScript();\r\n\r\n if (options?.callback) {\r\n // @ts-expect-error - google is loaded from external script\r\n google.accounts.id.initialize({\r\n client_id: this.clientId,\r\n callback: options.callback,\r\n nonce: options.nonce, // Pass nonce to button initialization\r\n });\r\n }\r\n\r\n // @ts-expect-error - google is loaded from external script\r\n google.accounts.id.renderButton(document.getElementById(elementId), {\r\n theme: options?.theme || 'outline',\r\n size: options?.size || 'large',\r\n text: options?.text || 'signin_with',\r\n shape: options?.shape || 'rectangular',\r\n width: options?.width, // Google API accepts pixels as number or string\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Example usage:\r\n * \r\n * const authProvider = new GoogleAuthProvider({\r\n * clientId: 'YOUR_GOOGLE_CLIENT_ID'\r\n * });\r\n * \r\n * // Method 1: Programmatic login\r\n * const authResponse = await authProvider.login();\r\n * console.log('Logged in as:', authResponse.email);\r\n * \r\n * // Method 2: Render button\r\n * await authProvider.renderButton('google-signin-button', {\r\n * theme: 'filled_blue',\r\n * size: 'large'\r\n * });\r\n */\r\n\r\n","/**\r\n * Secure Storage Module\r\n * Handles encrypted storage of sensitive wallet data\r\n */\r\n\r\nimport CryptoJS from 'crypto-js';\r\nimport { StorageProvider, SessionData, SphereSDKError, ErrorCode } from '../types';\r\n\r\n/**\r\n * Browser-based secure storage implementation\r\n */\r\nexport class SecureStorage implements StorageProvider {\r\n private encryptionKey: string;\r\n private storagePrefix: string;\r\n\r\n constructor(encryptionKey?: string, storagePrefix = 'cedra_sdk_') {\r\n // Use provided key or generate from browser fingerprint\r\n this.encryptionKey = encryptionKey || this.generateEncryptionKey();\r\n this.storagePrefix = storagePrefix;\r\n }\r\n\r\n /**\r\n * Get item from storage and decrypt\r\n */\r\n async getItem(key: string): Promise<string | null> {\r\n try {\r\n const fullKey = this.storagePrefix + key;\r\n const encryptedData = localStorage.getItem(fullKey);\r\n\r\n if (!encryptedData) {\r\n return null;\r\n }\r\n\r\n // Decrypt the data\r\n const bytes = CryptoJS.AES.decrypt(encryptedData, this.encryptionKey);\r\n\r\n try {\r\n const decrypted = bytes.toString(CryptoJS.enc.Utf8);\r\n // If decryption failed or produced junk, it might return empty or throw\r\n if (!decrypted) return null;\r\n return decrypted;\r\n } catch (e) {\r\n // This happens if the key is wrong (e.g. malformed UTF-8)\r\n console.warn(`[SecureStorage] Failed to decrypt ${key}. Key might have changed.`);\r\n return null;\r\n }\r\n } catch (error) {\r\n console.error('Storage get error:', error);\r\n // We return null here too to prevent SDK from breaking on corrupted data\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Encrypt and store item\r\n */\r\n async setItem(key: string, value: string): Promise<void> {\r\n try {\r\n const fullKey = this.storagePrefix + key;\r\n\r\n // Encrypt the data\r\n const encrypted = CryptoJS.AES.encrypt(\r\n value,\r\n this.encryptionKey\r\n ).toString();\r\n\r\n localStorage.setItem(fullKey, encrypted);\r\n } catch (error) {\r\n console.error('Storage set error:', error);\r\n throw new SphereSDKError(\r\n ErrorCode.STORAGE_ERROR,\r\n 'Failed to store data',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Remove item from storage\r\n */\r\n async removeItem(key: string): Promise<void> {\r\n try {\r\n const fullKey = this.storagePrefix + key;\r\n localStorage.removeItem(fullKey);\r\n } catch (error) {\r\n console.error('Storage remove error:', error);\r\n throw new SphereSDKError(\r\n ErrorCode.STORAGE_ERROR,\r\n 'Failed to remove data from storage',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Clear all SDK storage\r\n */\r\n async clear(): Promise<void> {\r\n try {\r\n // Remove all items with our prefix\r\n const keys = Object.keys(localStorage);\r\n for (const key of keys) {\r\n if (key.startsWith(this.storagePrefix)) {\r\n localStorage.removeItem(key);\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Storage clear error:', error);\r\n throw new SphereSDKError(\r\n ErrorCode.STORAGE_ERROR,\r\n 'Failed to clear storage',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Generate encryption key from browser fingerprint\r\n * This provides basic encryption without requiring user input\r\n * Note: Not cryptographically secure, but better than plaintext\r\n */\r\n private generateEncryptionKey(): string {\r\n const fingerprint = [\r\n navigator.userAgent,\r\n navigator.language,\r\n new Date().getTimezoneOffset(),\r\n screen.width,\r\n screen.height,\r\n 'cedra-sdk-v1', // Version salt\r\n ].join('|');\r\n\r\n return CryptoJS.SHA256(fingerprint).toString();\r\n }\r\n\r\n /**\r\n * Check if storage is available\r\n */\r\n static isAvailable(): boolean {\r\n try {\r\n const test = '__storage_test__';\r\n localStorage.setItem(test, test);\r\n localStorage.removeItem(test);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Session Manager\r\n * Manages user sessions with automatic expiration\r\n */\r\nexport class SessionManager {\r\n private storage: StorageProvider;\r\n private sessionKey = 'current_session';\r\n private sessionDuration: number; // in milliseconds\r\n\r\n private cachedSession: SessionData | null = null;\r\n\r\n constructor(storage: StorageProvider, sessionDurationHours = 24) {\r\n this.storage = storage;\r\n this.sessionDuration = sessionDurationHours * 60 * 60 * 1000;\r\n }\r\n\r\n /**\r\n * Get cached session data (synchronous)\r\n */\r\n getCachedSession(): SessionData | null {\r\n return this.cachedSession;\r\n }\r\n\r\n /**\r\n * Save session data\r\n */\r\n async saveSession(data: Omit<SessionData, 'expiresAt'>): Promise<void> {\r\n try {\r\n const sessionData: SessionData = {\r\n ...data,\r\n expiresAt: Date.now() + this.sessionDuration,\r\n };\r\n\r\n this.cachedSession = sessionData;\r\n await this.storage.setItem(\r\n this.sessionKey,\r\n JSON.stringify(sessionData)\r\n );\r\n } catch (error: any) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n `Google authentication failed: ${error.message}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get current session\r\n * Returns null if session doesn't exist or is expired\r\n */\r\n async getSession(): Promise<SessionData | null> {\r\n try {\r\n const sessionStr = await this.storage.getItem(this.sessionKey);\r\n\r\n if (!sessionStr) {\r\n return null;\r\n }\r\n\r\n const session: SessionData = JSON.parse(sessionStr);\r\n this.cachedSession = session;\r\n\r\n // Check if session is expired\r\n if (Date.now() > session.expiresAt) {\r\n await this.clearSession();\r\n return null;\r\n }\r\n\r\n return session;\r\n } catch (error) {\r\n console.error('Failed to get session:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Clear current session\r\n */\r\n async clearSession(): Promise<void> {\r\n this.cachedSession = null;\r\n await this.storage.removeItem(this.sessionKey);\r\n }\r\n\r\n /**\r\n * Check if session is valid\r\n */\r\n async isSessionValid(): Promise<boolean> {\r\n const session = await this.getSession();\r\n return session !== null;\r\n }\r\n\r\n /**\r\n * Refresh session expiration\r\n */\r\n async refreshSession(): Promise<void> {\r\n const session = await this.getSession();\r\n if (session) {\r\n await this.saveSession({\r\n encryptedWallet: session.encryptedWallet,\r\n userInfo: session.userInfo,\r\n refreshToken: session.refreshToken,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get time until session expires (in milliseconds)\r\n */\r\n async getTimeUntilExpiration(): Promise<number | null> {\r\n const session = await this.getSession();\r\n if (!session) {\r\n return null;\r\n }\r\n\r\n const timeLeft = session.expiresAt - Date.now();\r\n return timeLeft > 0 ? timeLeft : 0;\r\n }\r\n}\r\n\r\n/**\r\n * Example usage:\r\n * \r\n * // Initialize storage\r\n * const storage = new SecureStorage('my-encryption-key');\r\n * \r\n * // Initialize session manager\r\n * const sessionManager = new SessionManager(storage, 24); // 24 hour sessions\r\n * \r\n * // Save session\r\n * await sessionManager.saveSession({\r\n * encryptedWallet: 'encrypted-wallet-data',\r\n * userInfo: {\r\n * email: 'user@example.com',\r\n * name: 'John Doe'\r\n * }\r\n * });\r\n * \r\n * // Get session\r\n * const session = await sessionManager.getSession();\r\n * if (session) {\r\n * console.log('Session valid until:', new Date(session.expiresAt));\r\n * }\r\n * \r\n * // Clear session\r\n * await sessionManager.clearSession();\r\n */\r\n","/**\r\n * Key Derivation Module\r\n * Implements secure, deterministic key derivation from Google OAuth credentials\r\n */\r\n\r\nimport CryptoJS from 'crypto-js';\r\nimport { Account } from '@cedra-labs/ts-sdk';\r\nimport { KeyDerivationOptions, SphereSDKError, ErrorCode } from '../types';\r\n\r\n/**\r\n * Derives a deterministic private key from user credentials\r\n * Uses HKDF (HMAC-based Key Derivation Function) for security\r\n */\r\nexport class KeyDerivation {\r\n private static readonly DEFAULT_ITERATIONS = 100000;\r\n private static readonly KEY_LENGTH = 32; // 256 bits for Ed25519\r\n\r\n /**\r\n * Derive a private key from user ID and salt\r\n * @param options Key derivation options\r\n * @returns Hex-encoded private key (64 characters)\r\n */\r\n static derivePrivateKey(options: KeyDerivationOptions): string {\r\n try {\r\n const { userId, salt, iterations = this.DEFAULT_ITERATIONS } = options;\r\n\r\n // Validate inputs\r\n if (!userId || userId.length === 0) {\r\n throw new SphereSDKError(\r\n ErrorCode.KEY_DERIVATION_FAILED,\r\n 'User ID is required for key derivation'\r\n );\r\n }\r\n\r\n if (!salt || salt.length < 16) {\r\n throw new SphereSDKError(\r\n ErrorCode.KEY_DERIVATION_FAILED,\r\n 'Salt must be at least 16 characters'\r\n );\r\n }\r\n\r\n // Use PBKDF2 (Password-Based Key Derivation Function 2)\r\n // This is deterministic - same inputs always produce same output\r\n const derivedKey = CryptoJS.PBKDF2(userId, salt, {\r\n keySize: this.KEY_LENGTH / 4, // CryptoJS uses 32-bit words\r\n iterations: iterations,\r\n hasher: CryptoJS.algo.SHA256,\r\n });\r\n\r\n // Convert to hex string\r\n const privateKeyHex = derivedKey.toString(CryptoJS.enc.Hex);\r\n\r\n // Ensure it's exactly 64 characters (32 bytes)\r\n if (privateKeyHex.length !== 64) {\r\n throw new SphereSDKError(\r\n ErrorCode.KEY_DERIVATION_FAILED,\r\n 'Derived key has invalid length'\r\n );\r\n }\r\n\r\n return privateKeyHex;\r\n } catch (error) {\r\n if (error instanceof SphereSDKError) {\r\n throw error;\r\n }\r\n throw new SphereSDKError(\r\n ErrorCode.KEY_DERIVATION_FAILED,\r\n 'Failed to derive private key',\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Generate a deterministic salt from app name and user email\r\n * This ensures the same user gets the same wallet across devices\r\n * @param appName Application name\r\n * @param userEmail User's email address\r\n * @returns Deterministic salt string\r\n */\r\n static generateDeterministicSalt(appName: string, userEmail: string): string {\r\n // Normalize inputs to ensure consistent derivation\r\n const normalizedApp = appName.trim().toLowerCase();\r\n const normalizedEmail = userEmail.trim().toLowerCase();\r\n\r\n // Combine app name and email with a fixed separator\r\n const combined = `${normalizedApp}:${normalizedEmail}:sphere-wallet-v1`;\r\n\r\n // Hash to create a consistent salt\r\n const hash = CryptoJS.SHA256(combined);\r\n return hash.toString(CryptoJS.enc.Hex);\r\n }\r\n\r\n /**\r\n * Validate a private key format\r\n * @param privateKey Hex-encoded private key\r\n * @returns True if valid\r\n */\r\n static isValidPrivateKey(privateKey: string): boolean {\r\n // Must be 64 hex characters (32 bytes)\r\n const hexRegex = /^[0-9a-fA-F]{64}$/;\r\n return hexRegex.test(privateKey);\r\n }\r\n\r\n /**\r\n * Securely clear sensitive data from memory\r\n * @param data Sensitive string to clear\r\n */\r\n static clearSensitiveData(data: string): void {\r\n // Overwrite the string in memory (best effort in JavaScript)\r\n // Note: This is not guaranteed in JavaScript due to string immutability\r\n // but it's a best practice\r\n if (data) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (data as any) = '0'.repeat(data.length);\r\n }\r\n }\r\n\r\n /**\r\n * Generates a temporary ephemeral key pair for the session\r\n * @returns A fresh Ed25519 account/keypair\r\n */\r\n static generateEphemeralKeyPair(): Account {\r\n return Account.generate();\r\n }\r\n\r\n /**\r\n * Computes an OIDC-compliant nonce hash to bind the session key\r\n * @param publicKey Ephemeral Public Key (hex or string)\r\n * @param blinding A random blinding factor (hex)\r\n * @param expiry Expiration timestamp (optional)\r\n * @returns SHA256 hash of the nonce commitment\r\n */\r\n static computeNonce(publicKey: string, blinding: string, expiry: number = 0): string {\r\n // Nonce structure: hash(EPK | blinding | expiry)\r\n // This is a standard pattern in Keyless architectures to prevent replay attacks\r\n const combined = `${publicKey}:${blinding}:${expiry}`;\r\n const hash = CryptoJS.SHA256(combined);\r\n return hash.toString(CryptoJS.enc.Hex);\r\n }\r\n}\r\n\r\n/**\r\n * Example usage:\r\n * \r\n * const salt = KeyDerivation.generateDeterministicSalt('MyApp', 'user@example.com');\r\n * const privateKey = KeyDerivation.derivePrivateKey({\r\n * userId: 'google-user-id-12345',\r\n * salt: salt,\r\n * iterations: 100000\r\n * });\r\n * \r\n * // Use privateKey to create Cedra account\r\n * // ...\r\n * \r\n * // Clear sensitive data when done\r\n * KeyDerivation.clearSensitiveData(privateKey);\r\n */\r\n\r\n","/**\r\n * SDK Internal Constants\r\n * Default values for the SDK. Developers should provide their own values\r\n * via the config object during initialization.\r\n */\r\n\r\n// Default application name\r\nexport const DEFAULT_APP_NAME = 'Sphere Connect';\r\n\r\n// Default storage encryption key\r\nexport const DEFAULT_STORAGE_KEY = 'sphere-connect-v1-secure-key';\r\n","import { EventEmitter } from './core/EventEmitter';\r\nimport { Cedra, CedraConfig, Network as CedraNetwork } from '@cedra-labs/ts-sdk';\r\nimport { SphereWallet } from './wallet/SphereWallet';\r\nimport { GoogleAuthProvider } from './auth/GoogleAuthProvider';\r\nimport { SecureStorage, SessionManager } from './storage/SecureStorage';\r\nimport { KeyDerivation } from './auth/KeyDerivation';\r\nimport {\r\n SDKConfig,\r\n SphereWalletMethods,\r\n AccountAbstractionSDK,\r\n ErrorCode,\r\n SphereSDKError,\r\n Network,\r\n Network as SphereNetwork\r\n} from './types';\r\nimport { DEFAULT_APP_NAME, DEFAULT_STORAGE_KEY } from './core/constants';\r\nimport CryptoJS from 'crypto-js';\r\n\r\n/**\r\n * Main SDK class for Sphere Account Abstraction\r\n */\r\nexport class SphereAccountAbstraction extends EventEmitter implements AccountAbstractionSDK {\r\n private cedra: Cedra;\r\n private config: SDKConfig;\r\n private authProvider: GoogleAuthProvider;\r\n private storage: SecureStorage;\r\n private sessionManager: SessionManager;\r\n private currentWallet: SphereWallet | null = null;\r\n private initialized: boolean = false;\r\n private readonly appName: string = DEFAULT_APP_NAME;\r\n private readonly storageKey: string = DEFAULT_STORAGE_KEY;\r\n\r\n constructor(config: SDKConfig) {\r\n super();\r\n if (!config.googleClientId) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n 'Google Client ID is required for initializing the Sphere SDK'\r\n );\r\n }\r\n\r\n this.config = {\r\n network: config.network || 'testnet',\r\n googleClientId: config.googleClientId,\r\n rpcEndpoint: config.rpcEndpoint,\r\n indexerUrl: config.indexerUrl,\r\n redirectUri: config.redirectUri,\r\n };\r\n\r\n const rpc = this.config.rpcEndpoint;\r\n const cedraConfig = new CedraConfig({\r\n network: this.config.network as CedraNetwork,\r\n fullnode: rpc\r\n });\r\n\r\n this.cedra = new Cedra(cedraConfig);\r\n this.authProvider = new GoogleAuthProvider({\r\n clientId: this.config.googleClientId as string,\r\n redirectUri: this.config.redirectUri,\r\n });\r\n this.storage = new SecureStorage(this.storageKey);\r\n this.sessionManager = new SessionManager(this.storage, 24);\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n if (this.initialized) return;\r\n\r\n try {\r\n await this.restoreSession();\r\n this.initialized = true;\r\n this.emit('initialized');\r\n } catch (error) {\r\n console.error('Sphere SDK initialization error:', error);\r\n this.initialized = true;\r\n }\r\n }\r\n\r\n async loginWithGoogle(): Promise<SphereWalletMethods> {\r\n try {\r\n if (!this.initialized) await this.initialize();\r\n\r\n const googleUser = await this.authProvider.login();\r\n\r\n if (!googleUser || !googleUser.sub || !googleUser.email) {\r\n // If we are in redirect mode, this point should not be reached as the page unloads.\r\n // However, if it returns empty data, we should stop here.\r\n return null as any;\r\n }\r\n\r\n // Derive deterministic key from Google sub\r\n const salt = KeyDerivation.generateDeterministicSalt(this.appName, googleUser.email);\r\n const privateKeyHex = KeyDerivation.derivePrivateKey({\r\n userId: googleUser.sub,\r\n salt: salt,\r\n iterations: 100000,\r\n });\r\n\r\n const wallet = new SphereWallet(\r\n this.cedra,\r\n privateKeyHex,\r\n this.config.network as SphereNetwork,\r\n this.config.rpcEndpoint,\r\n this.config.indexerUrl\r\n );\r\n\r\n // Encrypt wallet data for storage\r\n const encryptedWallet = this.encryptWalletData(privateKeyHex);\r\n\r\n // Start session\r\n await this.sessionManager.saveSession({\r\n encryptedWallet,\r\n userInfo: {\r\n email: googleUser.email,\r\n name: googleUser.name,\r\n picture: googleUser.picture\r\n }\r\n });\r\n\r\n this.currentWallet = wallet;\r\n this.emit('auth_success', { wallet, user: googleUser });\r\n return wallet;\r\n } catch (error: any) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n `Google authentication failed: ${error.message}`\r\n );\r\n }\r\n }\r\n\r\n async restoreSession(): Promise<SphereWalletMethods | null> {\r\n try {\r\n const session = await this.sessionManager.getSession();\r\n if (session && session.expiresAt > Date.now()) {\r\n const privateKeyHex = this.decryptWalletData(session.encryptedWallet);\r\n if (!privateKeyHex) return null;\r\n\r\n const wallet = new SphereWallet(\r\n this.cedra,\r\n privateKeyHex,\r\n this.config.network as SphereNetwork,\r\n this.config.rpcEndpoint,\r\n this.config.indexerUrl\r\n );\r\n this.currentWallet = wallet;\r\n this.emit('auth_success', { wallet, method: 'restored' });\r\n return wallet;\r\n }\r\n } catch (error) {\r\n console.error('Session restoration failed:', error);\r\n }\r\n return null;\r\n }\r\n\r\n async handleGoogleResponse(credential: string): Promise<SphereWalletMethods> {\r\n try {\r\n if (!this.initialized) await this.initialize();\r\n\r\n const googleUser = await this.authProvider.handleCredentialResponse(credential);\r\n\r\n // Derive deterministic key from Google sub\r\n const salt = KeyDerivation.generateDeterministicSalt(this.appName, googleUser.email);\r\n const privateKeyHex = KeyDerivation.derivePrivateKey({\r\n userId: googleUser.sub,\r\n salt: salt,\r\n iterations: 100000,\r\n });\r\n\r\n const wallet = new SphereWallet(\r\n this.cedra,\r\n privateKeyHex,\r\n this.config.network as SphereNetwork,\r\n this.config.rpcEndpoint,\r\n this.config.indexerUrl\r\n );\r\n\r\n // Encrypt wallet data for storage\r\n const encryptedWallet = this.encryptWalletData(privateKeyHex);\r\n\r\n // Start session\r\n await this.sessionManager.saveSession({\r\n encryptedWallet,\r\n userInfo: {\r\n email: googleUser.email,\r\n name: googleUser.name,\r\n picture: googleUser.picture\r\n }\r\n });\r\n\r\n this.currentWallet = wallet;\r\n this.emit('auth_success', { wallet, user: googleUser });\r\n return wallet;\r\n } catch (error: any) {\r\n throw new SphereSDKError(\r\n ErrorCode.AUTHENTICATION_FAILED,\r\n `Failed to handle Google response: ${error.message}`\r\n );\r\n }\r\n }\r\n\r\n async logout(): Promise<void> {\r\n await this.authProvider.logout();\r\n await this.sessionManager.clearSession();\r\n if (this.currentWallet) {\r\n await this.currentWallet.disconnect();\r\n }\r\n this.currentWallet = null;\r\n this.emit('logout');\r\n }\r\n\r\n isAuthenticated(): boolean {\r\n return this.currentWallet !== null;\r\n }\r\n\r\n getCurrentWallet(): SphereWalletMethods | null {\r\n return this.currentWallet;\r\n }\r\n\r\n getUserEmail(): string | null {\r\n const session = this.sessionManager.getCachedSession();\r\n return session?.userInfo.email || null;\r\n }\r\n\r\n getUserName(): string | null {\r\n const session = this.sessionManager.getCachedSession();\r\n return session?.userInfo.name || null;\r\n }\r\n\r\n getUserPicture(): string | null {\r\n const session = this.sessionManager.getCachedSession();\r\n return session?.userInfo.picture || null;\r\n }\r\n\r\n getEphemeralPublicKey(): string | null {\r\n // For deterministic wallets, this is the master public key\r\n return this.currentWallet?.getPublicKey() || null;\r\n }\r\n\r\n async updateNetwork(network: Network, rpcEndpoint: string): Promise<void> {\r\n this.config.network = network;\r\n this.config.rpcEndpoint = rpcEndpoint;\r\n\r\n const cedraConfig = new CedraConfig({\r\n network: network as CedraNetwork,\r\n fullnode: rpcEndpoint\r\n });\r\n\r\n this.cedra = new Cedra(cedraConfig);\r\n\r\n if (this.currentWallet) {\r\n this.currentWallet.updateNetwork(network, rpcEndpoint);\r\n }\r\n\r\n this.emit('network_changed', { network, rpcEndpoint });\r\n }\r\n\r\n getIndexerUrl(): string | undefined {\r\n return this.config.indexerUrl;\r\n }\r\n\r\n // Internal helpers for encryption\r\n private encryptWalletData(privateKeyHex: string): string {\r\n return CryptoJS.AES.encrypt(privateKeyHex, this.storageKey).toString();\r\n }\r\n\r\n private decryptWalletData(encryptedData: string): string {\r\n try {\r\n const bytes = CryptoJS.AES.decrypt(encryptedData, this.storageKey);\r\n return bytes.toString(CryptoJS.enc.Utf8);\r\n } catch (error) {\r\n console.warn('[Sphere] Failed to decrypt wallet data');\r\n return '';\r\n }\r\n }\r\n\r\n // EventEmitter overrides to satisfy interface\r\n on(event: string, listener: (...args: any[]) => void): this {\r\n return super.on(event, listener);\r\n }\r\n\r\n off(event: string, listener: (...args: any[]) => void): this {\r\n return super.off(event, listener);\r\n }\r\n}\r\n","import React, { createContext, useContext, useEffect, useState, ReactNode, useCallback } from 'react';\r\nimport { SphereAccountAbstraction } from '../SphereAccountAbstraction';\r\nimport { SphereWalletMethods, SDKConfig, BalanceInfo, WalletInfo } from '../types';\r\n\r\ninterface SphereContextType {\r\n sdk: SphereAccountAbstraction;\r\n wallet: SphereWalletMethods | null;\r\n walletInfo: WalletInfo | null;\r\n balance: BalanceInfo | null;\r\n /** @deprecated Use userEmail instead */\r\n email: string | null;\r\n userEmail: string | null;\r\n userName: string | null;\r\n userPicture: string | null;\r\n indexerUrl: string | undefined;\r\n isAuthenticated: boolean;\r\n isLoading: boolean;\r\n error: string | null;\r\n login: () => Promise<void>;\r\n logout: () => Promise<void>;\r\n setIsLoading: (loading: boolean) => void;\r\n refreshData: () => Promise<void>;\r\n handleAuthSuccess: (wallet: SphereWalletMethods) => Promise<void>;\r\n}\r\n\r\nconst SphereContext = createContext<SphereContextType | undefined>(undefined);\r\n\r\nexport interface SphereProviderProps {\r\n children: ReactNode;\r\n config: SDKConfig;\r\n}\r\n\r\nexport const SphereProvider: React.FC<SphereProviderProps> = ({ children, config }) => {\r\n const [sdk] = useState(() => new SphereAccountAbstraction(config));\r\n const [wallet, setWallet] = useState<SphereWalletMethods | null>(null);\r\n const [walletInfo, setWalletInfo] = useState<WalletInfo | null>(null);\r\n const [balance, setBalance] = useState<BalanceInfo | null>(null);\r\n const [userEmail, setUserEmail] = useState<string | null>(null);\r\n const [userName, setUserName] = useState<string | null>(null);\r\n const [userPicture, setUserPicture] = useState<string | null>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const refreshData = useCallback(async (activeWallet: SphereWalletMethods) => {\r\n try {\r\n const [info, bal] = await Promise.all([\r\n activeWallet.getAccountInfo(),\r\n activeWallet.getBalance()\r\n ]);\r\n setWalletInfo(info);\r\n setBalance(bal);\r\n } catch (err) {\r\n console.error('Failed to refresh data:', err);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n const onAuth = ({ wallet }: { wallet: SphereWalletMethods }) => {\r\n setWallet(wallet);\r\n const email = sdk.getUserEmail();\r\n setUserEmail(email);\r\n setUserName(sdk.getUserName());\r\n setUserPicture(sdk.getUserPicture());\r\n refreshData(wallet);\r\n };\r\n\r\n const onLogout = () => {\r\n setWallet(null);\r\n setUserEmail(null);\r\n setUserName(null);\r\n setUserPicture(null);\r\n setWalletInfo(null);\r\n setBalance(null);\r\n };\r\n\r\n // Subscribe to events\r\n sdk.on('auth_success', onAuth);\r\n sdk.on('logout', onLogout);\r\n\r\n const init = async () => {\r\n try {\r\n await sdk.initialize();\r\n const restored = await sdk.restoreSession();\r\n if (restored) {\r\n setWallet(restored);\r\n setUserEmail(sdk.getUserEmail());\r\n setUserName(sdk.getUserName());\r\n setUserPicture(sdk.getUserPicture());\r\n await refreshData(restored);\r\n }\r\n } catch (err: any) {\r\n console.error('SDK Init error:', err);\r\n setError(err.message || 'Initialization failed');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n init();\r\n\r\n return () => {\r\n sdk.off('auth_success', onAuth);\r\n sdk.off('logout', onLogout);\r\n };\r\n }, [sdk, refreshData]);\r\n\r\n // Background Polling\r\n useEffect(() => {\r\n if (!wallet) return undefined;\r\n\r\n const pollInterval = setInterval(() => {\r\n refreshData(wallet);\r\n }, 10000);\r\n\r\n return () => clearInterval(pollInterval);\r\n }, [wallet, refreshData]);\r\n\r\n const handleAuthSuccess = useCallback(async (newWallet: SphereWalletMethods) => {\r\n setWallet(newWallet);\r\n await refreshData(newWallet);\r\n }, [refreshData]);\r\n\r\n const login = async () => {\r\n setError(null);\r\n try {\r\n await sdk.loginWithGoogle();\r\n } catch (err: any) {\r\n console.error('Sphere Login Error:', err);\r\n setError(err.message || 'Login failed');\r\n throw err;\r\n }\r\n };\r\n\r\n const logout = async () => {\r\n try {\r\n await sdk.logout();\r\n } catch (err: any) {\r\n setError(err.message || 'Logout failed');\r\n throw err;\r\n }\r\n };\r\n\r\n return (\r\n <SphereContext.Provider\r\n value={{\r\n sdk,\r\n wallet,\r\n walletInfo,\r\n balance,\r\n email: userEmail, // Restore email for backward compatibility\r\n userEmail,\r\n userName,\r\n userPicture,\r\n indexerUrl: sdk.getIndexerUrl(),\r\n isAuthenticated: !!wallet,\r\n isLoading,\r\n error,\r\n login,\r\n logout,\r\n setIsLoading,\r\n refreshData: async () => {\r\n if (wallet) await refreshData(wallet);\r\n },\r\n handleAuthSuccess\r\n }}\r\n >\r\n {children}\r\n </SphereContext.Provider>\r\n );\r\n};\r\n\r\nexport const useSphere = () => {\r\n const context = useContext(SphereContext);\r\n if (context === undefined) {\r\n throw new Error('useSphere must be used within a SphereProvider');\r\n }\r\n return context;\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSphere } from './SphereProvider';\r\n\r\ninterface SphereModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n}\r\n\r\nexport const SphereModal: React.FC<SphereModalProps> = ({ isOpen, onClose }) => {\r\n const { login, isAuthenticated, isLoading, error } = useSphere();\r\n const [localLoading, setLocalLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (isAuthenticated) {\r\n onClose();\r\n }\r\n }, [isAuthenticated, onClose]);\r\n\r\n const handleLogin = async () => {\r\n try {\r\n setLocalLoading(true);\r\n await login();\r\n } catch (err) {\r\n console.error('Sphere Login Error:', err);\r\n } finally {\r\n setLocalLoading(false);\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <div style={styles.overlay} onClick={(e) => e.target === e.currentTarget && onClose()}>\r\n <div style={styles.modal}>\r\n <div style={styles.header}>\r\n <div style={{ width: 32 }} /> {/* Spacer */}\r\n <h2 style={styles.title}>Login or sign up</h2>\r\n <button style={styles.closeBtn} onClick={onClose} aria-label=\"Close\">×</button>\r\n </div>\r\n\r\n <div style={styles.content}>\r\n <button\r\n style={{\r\n ...styles.socialButton,\r\n opacity: (isLoading || localLoading) ? 0.7 : 1,\r\n cursor: (isLoading || localLoading) ? 'not-allowed' : 'pointer',\r\n marginBottom: 0\r\n }}\r\n onClick={handleLogin}\r\n disabled={isLoading || localLoading}\r\n >\r\n {(isLoading || localLoading) ? (\r\n <div style={styles.spinner} />\r\n ) : (\r\n <img\r\n src=\"https://www.gstatic.com/marketing-cms/assets/images/d5/dc/cfe9ce8b4425b410b49b7f2dd3f3/g.webp=s48-fcrop64=1,00000000ffffffff-rw\"\r\n alt=\"Google\"\r\n style={styles.socialIcon}\r\n />\r\n )}\r\n <span style={styles.socialText}>Google</span>\r\n </button>\r\n\r\n {error && (\r\n <div style={styles.errorBanner}>\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={styles.footer}>\r\n Protected by <strong>Sphere</strong>\r\n </div>\r\n\r\n <style>{`\r\n @keyframes sphere-spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst styles: Record<string, React.CSSProperties> = {\r\n overlay: {\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: 'transparent',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 9999,\r\n padding: '20px'\r\n },\r\n modal: {\r\n backgroundColor: '#ffffffc7',\r\n color: '#000000',\r\n width: '90%',\r\n maxWidth: '360px',\r\n aspectRatio: '1/1',\r\n borderRadius: '8px',\r\n position: 'relative',\r\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\r\n overflow: 'hidden',\r\n fontFamily: 'Inter, -apple-system, system-ui, sans-serif',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: '24px',\r\n boxSizing: 'border-box',\r\n justifyContent: 'space-between'\r\n },\r\n header: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '100%'\r\n },\r\n title: {\r\n fontSize: '14px',\r\n fontWeight: '500',\r\n color: '#94a3b8',\r\n textAlign: 'center',\r\n margin: 0,\r\n flex: 1\r\n },\r\n closeBtn: {\r\n background: 'rgba(0, 0, 0, 0.05)',\r\n border: 'none',\r\n color: '#64748b',\r\n fontSize: '20px',\r\n cursor: 'pointer',\r\n width: '28px',\r\n height: '28px',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n content: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '100%',\r\n flex: 1\r\n },\r\n socialButton: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n height: '48px',\r\n backgroundColor: 'transparent',\r\n border: '1px solid #e2e8f0',\r\n borderRadius: '8px',\r\n padding: '0 16px',\r\n marginBottom: '10px',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n color: '#0f172a',\r\n boxSizing: 'border-box',\r\n transition: 'background 0.2s',\r\n },\r\n socialIcon: {\r\n width: '18px',\r\n height: '18px',\r\n },\r\n socialText: {\r\n marginLeft: '12px',\r\n fontWeight: '500',\r\n },\r\n errorBanner: {\r\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\r\n border: '1px solid rgba(239, 68, 68, 0.2)',\r\n color: '#f87171',\r\n padding: '12px 16px',\r\n borderRadius: '16px',\r\n fontSize: '13px',\r\n marginBottom: '24px',\r\n textAlign: 'center',\r\n width: '100%'\r\n },\r\n spinner: {\r\n width: '18px',\r\n height: '18px',\r\n border: '2px solid rgba(0, 0, 0, 0.1)',\r\n borderTop: '2px solid #000000',\r\n borderRadius: '50%',\r\n animation: 'sphere-spin 0.8s linear infinite'\r\n },\r\n footer: {\r\n textAlign: 'center',\r\n fontSize: '11px',\r\n color: '#475569',\r\n }\r\n};\r\n","import React, { useState } from 'react';\r\n\r\ninterface SphereAvatarProps {\r\n src?: string | null;\r\n name?: string | null;\r\n size?: number;\r\n style?: React.CSSProperties;\r\n className?: string;\r\n}\r\n\r\nexport const SphereAvatar: React.FC<SphereAvatarProps> = ({\r\n src,\r\n name,\r\n size = 40,\r\n style,\r\n className\r\n}) => {\r\n const [imageError, setImageError] = useState(false);\r\n\r\n const containerStyle: React.CSSProperties = {\r\n width: `${size}px`,\r\n height: `${size}px`,\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n overflow: 'hidden',\r\n backgroundColor: '#2d3748',\r\n color: 'white',\r\n fontWeight: '600',\r\n fontSize: `${size * 0.4}px`,\r\n userSelect: 'none',\r\n ...style\r\n };\r\n\r\n const initials = name ? name.charAt(0).toUpperCase() : '?';\r\n\r\n if (src && !imageError) {\r\n return (\r\n <div className={className} style={containerStyle}>\r\n <img\r\n src={src}\r\n alt={name || 'Avatar'}\r\n referrerPolicy=\"no-referrer\"\r\n onError={() => setImageError(true)}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover'\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={className} style={containerStyle}>\r\n {initials}\r\n </div>\r\n );\r\n};\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sphere-connect",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "Google OAuth-based account abstraction SDK for Sphere wallets",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -60,4 +60,4 @@
60
60
  "url": "https://github.com/sphere-labs/connect/issues"
61
61
  },
62
62
  "homepage": "https://docs.sphere.network"
63
- }
63
+ }