@thru/wallet 0.2.22
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.
- package/README.md +67 -0
- package/android/build.gradle +37 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/org/thru/walletnative/ThruWebViewBridgeModule.kt +77 -0
- package/app.plugin.cjs +101 -0
- package/dist/BrowserSDK-CpRFiJsW.d.ts +409 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +941 -0
- package/dist/index.js.map +1 -0
- package/dist/native/react.d.ts +109 -0
- package/dist/native/react.js +2381 -0
- package/dist/native/react.js.map +1 -0
- package/dist/native.d.ts +329 -0
- package/dist/native.js +1126 -0
- package/dist/native.js.map +1 -0
- package/dist/react-ui.d.ts +5 -0
- package/dist/react-ui.js +266 -0
- package/dist/react-ui.js.map +1 -0
- package/dist/react.d.ts +66 -0
- package/dist/react.js +1151 -0
- package/dist/react.js.map +1 -0
- package/expo-module.config.json +6 -0
- package/package.json +114 -0
- package/src/BrowserSDK.ts +315 -0
- package/src/index.ts +27 -0
- package/src/interfaces/IThruChain.ts +37 -0
- package/src/interfaces/accounts.ts +61 -0
- package/src/interfaces/index.ts +9 -0
- package/src/interfaces/types.ts +95 -0
- package/src/native/NativeSDK.test.ts +819 -0
- package/src/native/NativeSDK.ts +773 -0
- package/src/native/index.ts +39 -0
- package/src/native/provider/NativeProvider.ts +363 -0
- package/src/native/provider/WebViewBridge.test.ts +339 -0
- package/src/native/provider/WebViewBridge.ts +339 -0
- package/src/native/provider/chains/ThruChain.ts +85 -0
- package/src/native/provider/shell.html +88 -0
- package/src/native/provider/shell.test.ts +56 -0
- package/src/native/provider/shell.ts +111 -0
- package/src/native/provider/shims-html.d.ts +4 -0
- package/src/native/react/ThruContext.ts +37 -0
- package/src/native/react/ThruProvider.tsx +168 -0
- package/src/native/react/ThruWalletSheet.tsx +1162 -0
- package/src/native/react/android-webauthn.ts +37 -0
- package/src/native/react/hooks/useAccounts.ts +35 -0
- package/src/native/react/hooks/useThru.ts +11 -0
- package/src/native/react/hooks/useWallet.ts +71 -0
- package/src/native/react/hooks/useWalletAvailability.ts +31 -0
- package/src/native/react/hooks/waitForWallet.ts +21 -0
- package/src/native/react/index.ts +29 -0
- package/src/protocol/index.ts +2 -0
- package/src/protocol/postMessage.ts +283 -0
- package/src/protocol/walletState.ts +12 -0
- package/src/provider/EmbeddedProvider.ts +330 -0
- package/src/provider/IframeManager.ts +438 -0
- package/src/provider/chains/ThruChain.ts +86 -0
- package/src/provider/index.ts +17 -0
- package/src/provider/types/messages.ts +37 -0
- package/src/react/ThruContext.ts +31 -0
- package/src/react/ThruProvider.tsx +169 -0
- package/src/react/hooks/useAccounts.ts +38 -0
- package/src/react/hooks/useThru.ts +11 -0
- package/src/react/hooks/useWallet.ts +81 -0
- package/src/react/index.ts +30 -0
- package/src/react-ui/ThruAccountSwitcher.tsx +187 -0
- package/src/react-ui/custom.d.ts +8 -0
- package/src/react-ui/index.ts +1 -0
- package/src/static/logo.png +0 -0
- package/src/static/logomark_red.svg +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/interfaces/accounts.ts","../src/interfaces/types.ts","../src/protocol/postMessage.ts","../src/protocol/walletState.ts","../src/native/provider/chains/ThruChain.ts","../src/native/provider/WebViewBridge.ts","../src/native/provider/NativeProvider.ts","../src/native/NativeSDK.ts"],"names":[],"mappings":";;;AAYO,SAAS,4BAAA,CACd,UACA,eAAA,EACsB;AACtB,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OACE,QAAA,CAAS,KAAK,CAAC,OAAA,KAAY,QAAQ,OAAA,KAAY,eAAA,CAAgB,OAAO,CAAA,IACtE,eAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,IAAA;AACxB;AAEO,SAAS,6BAAA,CACd,UACA,OAAA,EACsB;AACtB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,OAAO,SAAS,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,OAAA,KAAY,OAAO,CAAA,IAAK,IAAA;AACpE;AAEO,SAAS,6BAAA,CACd,UACA,eAAA,EACsB;AACtB,EAAA,MAAM,aAAA,GAAgB,4BAAA,CAA6B,QAAA,EAAU,eAAe,CAAA;AAC5E,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,aAAA,GAAgB,CAAC,aAAa,IAAI,EAAC;AAAA,IAC7C,eAAA,EAAiB;AAAA,GACnB;AACF;AAEO,SAAS,4BAAA,CAGd,QACA,eAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS,6BAAA;AAAA,IACb,MAAA,CAAO,QAAA;AAAA,IACP,eAAA,IAAmB,OAAO,eAAA,IAAmB;AAAA,GAC/C;AACA,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,iBAAiB,MAAA,CAAO;AAAA,GAC1B;AACF;;;AC5DO,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA,EAAM;AACR;AAyBO,IAAM,uBAAA,GAA0B;AAAA,EACrC,sBAAA,EAAwB,wBAAA;AAAA,EACxB,sBAAA,EAAwB;AAC1B;;;ACvBO,IAAM,0BAAA,GAA6B;AAAA,EACxC,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,YAAA,EAAc,aAAA;AAAA,EACd,gBAAA,EAAkB,iBAAA;AAAA,EAClB,YAAA,EAAc,aAAA;AAAA,EACd,oBAAA,EAAsB,oBAAA;AAAA,EACtB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,cAAA,EAAgB,eAAA;AAAA,EAChB,eAAA,EAAiB;AACnB;AAKO,IAAM,wBAAA,GAA2B;AAAA,EACtC,aAAA,EAAe,eAAA;AAAA,EACf,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA,EACf,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,eAAA,EAAiB;AACnB;AAKO,IAAM,uBAAA,GAA0B,OAAA;AAEhC,IAAM,kBAAA,GAAqB,cAAA;AAIlC,IAAM,iBAAA,GAAoB,KAAA;AAEnB,IAAM,eAAA,GAAkB,CAAC,MAAA,GAAiB,iBAAA,KAA8B;AAC7E,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACrD,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,KAAK,GAAA,EAAK,IAAI,MAAM,CAAA,CAAA;AAC1C,CAAA;AAqJO,IAAM,SAAA,GAAY;AAAA,EACvB,aAAA,EAAe,eAAA;AAAA,EACf,aAAA,EAAe,eAAA;AAAA,EACf,gBAAA,EAAkB,kBAAA;AAAA,EAClB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,eAAA,EAAiB,iBAAA;AAAA,EACjB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,aAAA,EAAe,eAAA;AAAA,EACf,OAAA,EAAS,SAAA;AAAA,EACT,aAAA,EAAe;AACjB;;;AC9MO,SAAS,+BACd,MAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,MAAA,CAAO,YAAA,IAAgB,CAAC,OAAO,UAAA,EAAY;AAC9C,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,UAAU,EAAC,EAAG,iBAAiB,IAAA,EAAK;AAAA,EAC1D;AAEA,EAAA,OAAO,6BAA6B,MAAM,CAAA;AAC5C;;;ACIO,IAAM,kBAAN,MAA4C;AAAA,EAKjD,WAAA,CAAY,MAAA,EAAuB,QAAA,EAA0B,MAAA,EAAgB;AAC3E,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,EACnC;AAAA,EAEA,MAAM,OAAA,GAA0C;AAC9C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ;AAC3C,IAAA,MAAM,kBAAkB,MAAA,CAAO,eAAA;AAC/B,IAAA,MAAM,WAAA,GACJ,eAAA,EAAiB,WAAA,KAAgB,WAAA,CAAY,OACzC,eAAA,GACA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,KAAgB,YAAY,IAAI,CAAA;AAC1E,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,EAAE,SAAA,EAAW,WAAA,CAAY,OAAA,EAAQ;AAAA,EAC1C;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,IAAA,CAAK,SAAS,UAAA,EAAW;AAAA,EACjC;AAAA,EAEA,MAAM,iBAAA,GAAiD;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY;AAAA,MAC7C,IAAI,eAAA,EAAgB;AAAA,MACpB,MAAM,0BAAA,CAA2B,mBAAA;AAAA,MACjC,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,SAAS,MAAA,CAAO,cAAA;AAAA,EACzB;AAAA,EAEA,MAAM,gBAAgB,WAAA,EAAqD;AACzE,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,IAAA,CAAK,SAAS,WAAA,EAAY;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY;AAAA,QAC7C,IAAI,eAAA,EAAgB;AAAA,QACpB,MAAM,0BAAA,CAA2B,gBAAA;AAAA,QACjC,OAAA,EAAS;AAAA,UACP,eAAe,WAAA,CAAY,aAAA;AAAA,UAC3B,gBAAgB,WAAA,CAAY,cAAA;AAAA,UAC5B,iBAAiB,WAAA,CAAY,eAAA;AAAA,UAC7B,oBAAoB,WAAA,CAAY,kBAAA;AAAA,UAChC,mBAAmB,WAAA,CAAY,iBAAA;AAAA,UAC/B,QAAQ,WAAA,CAAY;AAAA,SACtB;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AACD,MAAA,OAAO,SAAS,MAAA,CAAO,iBAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,IAC5B;AAAA,EACF;AACF,CAAA;;;AClEA,IAAM,yBAAA,GAA4B,CAAC,yBAAyB,CAAA;AAE5D,SAAS,kBAAA,GAA8B;AACrC,EAAA,MAAM,OAAA,GAAU,UAAA;AAKhB,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,EAAA,IAAI,OAAO,OAAA,KAAY,SAAA,EAAW,OAAO,OAAA;AAEzC,EAAA,OACE,OAAA,CAAQ,SAAS,GAAA,EAAK,QAAA,KAAa,UACnC,OAAA,CAAQ,OAAA,CAAQ,IAAI,QAAA,KAAa,YAAA;AAErC;AAEA,SAAS,kBAAkB,QAAA,EAA2B;AACpD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AAC5D,EAAA,IACE,MAAM,MAAA,KAAW,CAAA,IACjB,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,CAAC,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,IAAK,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,GAAG,CAAA,EACtE;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA;AACf,EAAA,OACE,MAAM,EAAA,IACN,CAAA,KAAM,OACL,CAAA,KAAM,GAAA,IAAO,KAAK,EAAA,IAAM,CAAA,IAAK,EAAA,IAC7B,CAAA,KAAM,OAAO,CAAA,KAAM,GAAA,IACnB,MAAM,GAAA,IAAO,CAAA,IAAK,MAAM,CAAA,IAAK,GAAA;AAElC;AAEA,SAAS,2BAA2B,GAAA,EAAmB;AACrD,EAAA,IAAI,CAAC,kBAAA,EAAmB,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI,IAAI,QAAA,KAAa,OAAA,IAAW,GAAA,CAAI,QAAA,KAAa,UAAU,OAAO,KAAA;AAElE,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,CAAS,WAAA,EAAY;AAC1C,EAAA,OACE,aAAa,WAAA,IACb,QAAA,KAAa,SACb,CAAC,QAAA,CAAS,SAAS,GAAG,CAAA,IACtB,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,IAC1B,QAAA,CAAS,SAAS,SAAS,CAAA,IAC3B,kBAAkB,QAAQ,CAAA;AAE9B;AAEA,SAAS,qBAAqB,SAAA,EAAyB;AACrD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAI,IAAI,SAAS,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,uBAAuB,SAAS,CAAA,mCAAA;AAAA,KAClC;AAAA,EACF;AACA,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,MAAM,YACJ,yBAAA,CAA0B,QAAA,CAAS,MAAM,CAAA,IACzC,2BAA2B,GAAG,CAAA;AAChC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4BAA4B,MAAM,CAAA,oCAAA,EAAuC,yBAAA,CAA0B,IAAA,CAAK,IAAI,CAAC,CAAA,6EAAA;AAAA,KAE/G;AAAA,EACF;AACF;AAYA,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,uBAAA,GAA0B,IAAI,EAAA,GAAK,GAAA;AACzC,IAAM,0BAA0B,EAAA,GAAK,GAAA;AAErC,IAAM,kBAAA,uBAA8C,GAAA,CAAI;AAAA,EACtD,0BAAA,CAA2B,OAAA;AAAA,EAC3B,0BAAA,CAA2B,YAAA;AAAA,EAC3B,0BAAA,CAA2B,gBAAA;AAAA,EAC3B,0BAAA,CAA2B;AAC7B,CAAC,CAAA;AAcM,IAAM,gBAAN,MAAoB;AAAA,EAoBzB,YAAY,OAAA,EAA+B;AAf3C,IAAA,IAAA,CAAQ,OAAA,GAAiC,IAAA;AACzC,IAAA,IAAA,CAAQ,KAAA,GAAQ,KAAA;AAChB,IAAA,IAAA,CAAQ,YAAA,GAAqC,IAAA;AAC7C,IAAA,IAAA,CAAQ,YAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,WAAA,GAA6C,IAAA;AACrD,IAAA,IAAA,CAAQ,UAAA,GAAmD,IAAA;AAE3D,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAG5B;AAMA,IAAA,oBAAA,CAAqB,QAAQ,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,GAAU,gBAAgB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAAuB;AACrB,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AACrC,MAAA,GAAA,CAAI,WAAW,CAAA,EAAG,GAAA,CAAI,SAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,OAAA,CAAA;AAAA,IACnD;AACA,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,OAAO,CAAA;AAChD,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,GAAA,EAA2B;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,GAAkB;AAChB,IAAA,IAAI,KAAK,KAAA,EAAO;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AACjD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,MAAM,IAAI,IAAA,CAAK,YAAA;AACf,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,CAAA,IAAI;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAA,GAA4B;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAO,OAAA,CAAQ,OAAA,EAAQ;AACvC,IAAA,IAAI,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA,CAAK,YAAA;AACnC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,OAAA,CAAc,CAAC,SAAS,MAAA,KAAW;AACzD,MAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,MAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,MAAA,IAAA,CAAK,UAAA,GAAa,WAAW,MAAM;AACjC,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,MAAM,IAAI,IAAA,CAAK,WAAA;AACf,UAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,UAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,UAAA,CAAA,CAAE,IAAI,KAAA,CAAM,+CAA+C,CAAC,CAAA;AAAA,QAC9D;AAAA,MACF,GAAG,gBAAgB,CAAA;AAAA,IACrB,CAAC,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YACJ,OAAA,EACuD;AACvD,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,YAAY,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,IAAI,IACjD,uBAAA,GACA,uBAAA;AAEJ,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AACtC,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,0CAA0C,CAAC,CAAA;AAAA,MAC9D,GAAG,SAAS,CAAA;AAEZ,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,CAAC,QAAA,KAAa;AACjD,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AACtC,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,OAAA;AAAA,YACE;AAAA,WACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,WAAW,eAAe,CAAA;AAChE,UAAC,GAAA,CAA0C,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,IAAA;AAClE,UAAC,GAAA,CAA0C,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,IAAA;AAClE,UAAA,MAAA,CAAO,GAAG,CAAA;AAAA,QACZ;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,CAAA;AAAA,kBAAA,EACD,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,CAAA;AAUrC,MAAA,IAAA,CAAK,OAAA,CAAS,iBAAiB,MAAM,CAAA;AAAA,IACvC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAA,CAAsB,UAAU,2BAAA,EAAmC;AACjE,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,KAAA,CAAM,KAAK,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,CAAA,EAAG;AACtE,MAAA,OAAA,CAAQ;AAAA,QACN,EAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,MAAM,SAAA,CAAU,aAAA;AAAA,UAChB;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,KAAA,EAAsC;AAC9C,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,WAAA,CAAY,IAAI,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,IAAA,MAAM,GAAA,GAAM,IAAA;AAIZ,IAAA,IAAI,GAAA,CAAI,OAAA,KAAY,IAAA,CAAK,OAAA,EAAS;AAElC,IAAA,IAAI,GAAA,CAAI,SAAS,kBAAA,EAAoB;AACnC,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,IAAI,EAAA,KAAO,QAAA,IAAY,KAAK,eAAA,CAAgB,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AAClE,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,EAAE,CAAA;AAC/C,MAAA,OAAA,CAAQ,GAAqC,CAAA;AAC7C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,SAAS,uBAAA,EAAyB;AACxC,MAAA,MAAM,GAAA,GAAM,GAAA;AACZ,MAAA,IAAA,CAAK,OAAA,GAAU,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,YAAA,EAAc;AAGzC,MAAA,IAAA,CAAK,YAAA,CAAa,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAChC,MAAA,IAAA,CAAK,WAAA,CAAY,IAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AACF,CAAA;;;ACtTA,IAAM,kBAAA,GAAqB,yCAAA;AAC3B,IAAM,cAAA,GAAiB,mBAAA;AA2BhB,IAAM,iBAAN,MAAqB;AAAA,EAgB1B,WAAA,CAAY,MAAA,GAA+B,EAAC,EAAG;AAZ/C,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,WAA4B,EAAC;AACrC,IAAA,IAAA,CAAQ,eAAA,GAAwC,IAAA;AAChD,IAAA,IAAA,CAAiB,cAAA,uBAAqB,GAAA,EAGpC;AAqDF;AAAA,IAAA,IAAA,CAAA,SAAA,GAAY,CAAC,KAAA,KAAyC;AACpD,MAAA,IAAA,CAAK,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,IAC7B,CAAA;AAhDE,IAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,kBAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,IAAU,cAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,aAAA,CAAc,EAAE,WAAW,CAAA;AAE7C,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,CAAC,SAAA,EAAW,OAAA,KAAY;AAC5C,MAAA,IAAA,CAAK,IAAA,CAAK,WAAkC,OAAO,CAAA;AAEnD,MAAA,IAAI,SAAA,KAAc,yBAAyB,OAAA,EAAS;AAClD,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,IACE,SAAA,KAAc,wBAAA,CAAyB,UAAA,IACvC,SAAA,KAAc,yBAAyB,IAAA,EACvC;AACA,QAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,KAAc,yBAAyB,eAAA,EAAiB;AAC1D,QAAA,MAAM,OAAA,GACH,SACG,OAAA,IAAW,IAAA;AACjB,QAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,MAClC;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,CAAC,YAAY,IAAI,CAAA;AAC7D,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,aAAa,IAAI,eAAA,CAAgB,KAAK,MAAA,EAAQ,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,IACtE;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,GAAA,EAA2B;AACvC,IAAA,IAAA,CAAK,MAAA,CAAO,cAAc,GAAG,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,gBAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,OAAO,SAAA,EAAU;AAAA,EACxB;AAAA;AAAA;AAAA,EASA,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAO,YAAA,EAAa;AAAA,EAClC;AAAA;AAAA;AAAA,EAIA,eAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA;AAAA,EACrB;AAAA;AAAA,EAGA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,EAC/B;AAAA;AAAA,EAGA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,eAAA,IAAkB;AAAA,EACzB;AAAA;AAAA,EAGA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,eAAA,IAAkB;AAAA,EACzB;AAAA;AAAA,EAGA,sBAAsB,OAAA,EAAwB;AAC5C,IAAA,IAAA,CAAK,MAAA,CAAO,sBAAsB,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,QAAQ,OAAA,EAAkD;AAC9D,IAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,aAAA,EAAe,EAAE,CAAA;AACpD,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA,MAAM,UAAiC,EAAC;AACxC,MAAA,IAAI,OAAA,EAAS,QAAA,EAAU,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,QAAA;AAClD,MAAA,IAAI,SAAS,uBAAA,EAAyB;AACpC,QAAA,OAAA,CAAQ,0BAA0B,OAAA,CAAQ,uBAAA;AAAA,MAC5C;AACA,MAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,MAAA;AAE9C,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY;AAAA,QAC7C,IAAI,eAAA,EAAgB;AAAA,QACpB,MAAM,0BAAA,CAA2B,OAAA;AAAA,QACjC,OAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,QAAA,CAAS,MAAM,CAAA;AAC3D,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,MAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,eAAA;AAE9B,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,OAAA,EAAS,MAAM,CAAA;AAClD,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,aAAA,EAAe,EAAE,OAAO,CAAA;AAC3D,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,OAAA,EACmC;AACnC,IAAA,MAAM,UAAiC,EAAC;AACxC,IAAA,IAAI,OAAA,EAAS,QAAA,EAAU,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,QAAA;AAClD,IAAA,IAAI,SAAS,uBAAA,EAAyB;AACpC,MAAA,OAAA,CAAQ,0BAA0B,OAAA,CAAQ,uBAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY;AAAA,MAC7C,IAAI,eAAA,EAAgB;AAAA,MACpB,MAAM,0BAAA,CAA2B,oBAAA;AAAA,MACjC,OAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,8BAAA,CAA+B,QAAA,CAAS,MAAM,CAAA;AAE7D,IAAA,IACE,OAAO,YAAA,IACP,MAAA,CAAO,cACP,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EACzB;AACA,MAAA,IAAA,CAAK,iBAAA;AAAA,QACH;AAAA,UACE,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,MAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,OAAO,QAAA,IAAY,MAAA;AAAA,UAC7B,iBAAiB,MAAA,CAAO;AAAA,SAC1B;AAAA,QACA,MAAA,CAAO,iBAAiB,OAAA,IAAW;AAAA,OACrC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACvB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,WAAA,CAAY;AAAA,QAC5B,IAAI,eAAA,EAAgB;AAAA,QACpB,MAAM,0BAAA,CAA2B,UAAA;AAAA,QACjC,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AACD,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,UAAA,EAAY,EAAE,CAAA;AAAA,IACnD,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,KAAA,EAAO,EAAE,OAAO,CAAA;AACnD,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,WAAA,EAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,iBAAA,CACE,QACA,sBAAA,EACM;AACN,IAAA,MAAM,kBACJ,6BAAA,CAA8B,MAAA,CAAO,UAAU,sBAAsB,CAAA,IACrE,OAAO,eAAA,IACP,IAAA;AACF,IAAA,MAAM,UAAA,GAAa,4BAAA,CAA6B,MAAA,EAAQ,eAAe,CAAA;AACvE,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,WAAW,UAAA,CAAW,QAAA;AAC3B,IAAA,IAAA,CAAK,kBAAkB,UAAA,CAAW,eAAA;AAAA,EACpC;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AAAA,EAEA,WAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,kBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,MAAM,cAAc,SAAA,EAA2C;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAC3D,IAAA,MAAM,OAAA,GAAgC,EAAE,SAAA,EAAU;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY;AAAA,MAC7C,IAAI,eAAA,EAAgB;AAAA,MACpB,MAAM,0BAAA,CAA2B,cAAA;AAAA,MACjC,OAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,OAAA;AAChC,IAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAChC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAA,GAAgD;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAC3D,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY;AAAA,QAC7C,IAAI,eAAA,EAAgB;AAAA,QACpB,MAAM,0BAAA,CAA2B,eAAA;AAAA,QACjC,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,QAAA,CAAS,MAAM,CAAA;AAC3D,MAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,MAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,eAAA;AAC9B,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,KAAA,EAAO,EAAE,OAAO,CAAA;AACnD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,IAAI,IAAA,GAAmB;AACrB,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,EAAA,CAAG,OAA4B,EAAA,EAAuC;AACpE,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,EAAE,CAAA;AAAA,EACxC;AAAA,EAEA,GAAA,CAAI,OAA4B,EAAA,EAAuC;AACrE,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,EAAE,CAAA;AAAA,EAC3C;AAAA;AAAA,EAGA,SAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAO,OAAA,EAAQ;AACpB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEQ,IAAA,CAAK,OAA4B,IAAA,EAAsB;AAC7D,IAAA,IAAA,CAAK,eAAe,GAAA,CAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC9C,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,IAAI,CAAA;AAAA,MACT,SAAS,GAAA,EAAK;AAEZ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,KAAK,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,MACpE;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,oBAAoB,OAAA,EAAqC;AAC/D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,WAAW,EAAC;AACjB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,OAAO,CAAA;AACxB,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA;AAAA,EACzB;AACF,CAAA;AC7OA,IAAM,mBAAA,GAAsB,+BAAA;AAC5B,IAAM,mCAAA,GAAsC,sBAAA;AAE5C,IAAM,4BAAA,GAAmD;AAAA,EACvD,MAAA,EAAQ,UAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,WAAA,EAAa,KAAA;AAAA,EACb,UAAA,EAAY,KAAA;AAAA,EACZ,UAAA,EAAY,KAAA;AAAA,EACZ,gBAAA,EAAkB,KAAA;AAAA,EAClB,UAAU,EAAC;AAAA,EACX,eAAA,EAAiB,IAAA;AAAA,EACjB,QAAA,EAAU,IAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAgBO,IAAM,YAAN,MAAgB;AAAA,EAerB,WAAA,CAAY,MAAA,GAA0B,EAAC,EAAG;AAb1C,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAAkC;AAC/D,IAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,IAAA,IAAA,CAAQ,UAAA,GAA0B,IAAA;AAElC,IAAA,IAAA,CAAQ,eAAA,GAAiD,IAAA;AACzD,IAAA,IAAA,CAAQ,iBAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,kBAAA,GAAyC,4BAAA;AAmCjD;AAAA,IAAA,IAAA,CAAA,SAAA,GAAY,CAAC,KAAA,KAAyC;AACpD,MAAA,IAAA,CAAK,QAAA,CAAS,UAAU,KAAK,CAAA;AAAA,IAC/B,CAAA;AA7BE,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,IAAU,mBAAA;AAC/B,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,mBAAA;AACvC,IAAA,IAAA,CAAK,4BACH,MAAA,CAAO,yBAAA,IACP,GAAG,IAAA,CAAK,UAAU,GAAG,mCAAmC,CAAA,CAAA;AAC1D,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,cAAA,IAAkB,cAAA;AAC/C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe;AAAA,MACjC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,CAAC,YAAY,IAAI;AAAA,KACvD,CAAA;AACD,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA;AAAA,EAGA,cAAc,GAAA,EAA2B;AACvC,IAAA,IAAA,CAAK,QAAA,CAAS,cAAc,GAAG,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,gBAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,SAAS,gBAAA,EAAiB;AAAA,EACjC;AAAA;AAAA,EAQA,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAS,YAAA,EAAa;AAAA,EACpC;AAAA;AAAA,EAGA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,SAAS,eAAA,EAAgB;AAAA,EACvC;AAAA;AAAA,EAGA,cAAc,QAAA,EAAqC;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,kBAAkB,QAAA,CAAS,eAAA;AACzC,IAAA,IAAA,CAAK,QAAA,CAAS,kBAAkB,QAAA,CAAS,eAAA;AAAA,EAC3C;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,SAAS,eAAA,GAAkB,MAAA;AAChC,IAAA,IAAA,CAAK,SAAS,eAAA,GAAkB,MAAA;AAAA,EAClC;AAAA;AAAA,EAGA,sBAAsB,OAAA,EAAwB;AAC5C,IAAA,IAAA,CAAK,QAAA,CAAS,sBAAsB,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,iBAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,WAAA,EAAa;AACtB,IAAA,MAAM,IAAA,CAAK,SAAS,UAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA,EAEA,MAAM,QAAQ,OAAA,EAAkD;AAC9D,IAAA,MAAM,eAAA,GAAkB,SAAS,MAAA,KAAW,gBAAA;AAC5C,IAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA,CAAK,eAAA;AACtC,IAAA,IACE,CAAC,eAAA,IACD,IAAA,CAAK,qBACL,IAAA,CAAK,QAAA,CAAS,aAAY,EAC1B;AACA,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,EAAE,MAAA,EAAQ,cAAc,CAAA;AAE7C,IAAA,MAAM,YAAY,YAAY;AAC5B,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,SAAS,WAAA,EAAY;AAC1B,QAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAM,KAAK,UAAA,EAAW;AAE7C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA;AACvD,QAAA,MAAM,uBAAA,GAA0B,eAAA,GAC5B,IAAA,GACA,MAAM,KAAK,0BAAA,EAA2B;AAC1C,QAAA,MAAM,eAAA,GACJ,QAAA,IAAY,uBAAA,IAA2B,OAAA,EAAS,MAAA,GAC5C;AAAA,UACE,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,UAC/B,GAAI,uBAAA,GAA0B,EAAE,uBAAA,KAA4B,EAAC;AAAA,UAC7D,GAAI,SAAS,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,SACtD,GACA,KAAA,CAAA;AACN,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,eAAe,CAAA;AAC1D,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,MAAM,IAAA,CAAK,6BAAA,CAA8B,MAAA,CAAO,QAAQ,CAAA;AAAA,QAC1D;AACA,QAAA,MAAM,kBACJ,IAAA,CAAK,QAAA,CAAS,kBAAA,EAAmB,IAAK,OAAO,eAAA,IAAmB,IAAA;AAClE,QAAA,MAAM,YAAA,GAAe,4BAAA;AAAA,UACnB;AAAA,YACE,GAAG,MAAA;AAAA,YACH,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY;AAAA,YACpC;AAAA,WACF;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAA,CAAK,iBAAA,GAAoB,YAAA;AACzB,QAAA,MAAM,IAAA,CAAK,6BAAA;AAAA,UACT,YAAA,CAAa,iBAAiB,OAAA,IAAW;AAAA,SAC3C;AACA,QAAA,MAAM,KAAK,wBAAA,EAAyB;AACpC,QAAA,IAAA,CAAK,qBAAA;AAAA,UACH,oCAAoC,YAAY;AAAA,SAClD;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,WAAW,YAAY,CAAA;AACjC,QAAA,OAAO,YAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,SAAS,WAAA,EAAY;AAC1B,QAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,IAAK,CAAC,eAAA,EAAiB;AAClD,UAAA,IAAA,CAAK,SAAS,eAAA,EAAgB;AAC9B,UAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,UAAA,MAAM,KAAK,wBAAA,EAAyB;AACpC,UAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,UAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,MAAA,EAAQ,iBAAiB,CAAA;AAAA,QACrD;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,QAAA,MAAM,KAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AACvB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,OAAA,EAAgD;AAC3D,IAAA,OAAO,KAAK,OAAA,CAAQ;AAAA,MAClB,QAAA,EAAU,IAAA,CAAK,qBAAA,CAAsB,OAAO,CAAA;AAAA,MAC5C,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAS,UAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,CAAA;AAC1B,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,MAAM,KAAK,wBAAA,EAAyB;AACpC,MAAA,IAAA,CAAK,2BAAA,EAA4B;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,EACnC;AAAA,EAEA,qBAAA,GAA4C;AAC1C,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA,EAEA,MAAM,iBAAA,CACJ,OAAA,GAAoC,EAAC,EACN;AAE/B,IAAA,MAAM,KAAK,wBAAA,EAAyB;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,oBACJ,OAAA,EAC0C;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AACvD,MAAA,IAAA,CAAK,qBAAA,CAAsB,qCAAA,CAAsC,KAAK,CAAC,CAAA;AACvE,MAAA,MAAM,IAAA,CAAK,qBAAqB,KAAK,CAAA;AACrC,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,qBAAA,CAAsB,2BAAA,CAA4B,KAAK,CAAC,CAAA;AAC7D,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,0BACJ,OAAA,EAC6B;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AACvD,MAAA,MAAM,YAAA,GAAe,sCAAsC,KAAK,CAAA;AAChE,MAAA,IAAA,CAAK,sBAAsB,YAAY,CAAA;AACvC,MAAA,MAAM,IAAA,CAAK,qBAAqB,KAAK,CAAA;AACrC,MAAA,OAAO,YAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,4BAA4B,KAAK,CAAA;AACtD,MAAA,IAAA,CAAK,sBAAsB,YAAY,CAAA;AACvC,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,MAAA,OAAO,YAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,WAAA,GAA+B;AAC7B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY;AAC3C,IAAA,MAAM,iBAAiB,IAAA,CAAK,qBAAA;AAAA,MAC1B,QAAA;AAAA,MACA,IAAA,CAAK,SAAS,kBAAA;AAAmB,KACnC;AACA,IAAA,OAAO,cAAA;AAAA,EACT;AAAA,EAEA,kBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,SAAS,kBAAA,EAAmB;AAAA,EAC1C;AAAA,EAEA,MAAM,cAAc,SAAA,EAA2C;AAC7D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,cAAc,SAAS,CAAA;AAC3D,IAAA,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,QAAA,CAAS,WAAA,IAAe,OAAO,CAAA;AAC/D,IAAA,MAAM,IAAA,CAAK,6BAAA,CAA8B,OAAA,CAAQ,OAAO,CAAA;AACxD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAA,GAAgD;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAM,KAAK,UAAA,EAAW;AAC7C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,cAAA,EAAe;AAClD,IAAA,MAAM,YAAA,GAAe,6BAA6B,MAAM,CAAA;AACxD,IAAA,MAAM,eAAA,GAAkB,aAAa,eAAA,IAAmB,IAAA;AACxD,IAAA,IAAA,CAAK,qBAAA,CAAsB,YAAA,CAAa,QAAA,EAAU,eAAe,CAAA;AACjE,IAAA,MAAM,IAAA,CAAK,6BAAA,CAA8B,eAAA,EAAiB,OAAA,IAAW,IAAI,CAAA;AACzE,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,IAAA,CAAK,qBAAA;AAAA,QACH,mCAAA,CAAoC,KAAK,iBAAiB;AAAA,OAC5D;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,eAAe,CAAA;AAC3C,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,IAAI,IAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EACvB;AAAA,EAEA,EAAA,CAAG,OAAiB,QAAA,EAA+B;AACjD,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAAA,EAC9C;AAAA,EAEA,GAAA,CAAI,OAAiB,QAAA,EAA+B;AAClD,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,EACjD;AAAA,EAEA,IAAA,CAAK,OAAiB,QAAA,EAA+B;AAEnD,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,KAAgB;AAClC,MAAA,QAAA,CAAS,GAAG,IAAI,CAAA;AAChB,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,IACzB,CAAA;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,OAAO,CAAA;AAAA,EACxB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AACtB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,GAAqB,4BAAA;AAAA,EAC5B;AAAA;AAAA,EAGO,OAAA,GAAgB;AACrB,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,IAAA,CAAK,aAAa,gBAAA,CAAiB,EAAE,OAAA,EAAS,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA,EAGQ,IAAA,CAAK,OAAiB,IAAA,EAAkB;AAC9C,IAAA,IAAA,CAAK,eAAe,GAAA,CAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC9C,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,IAAI,CAAA;AAAA,MACT,SAAS,GAAA,EAAK;AAEZ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,MAC/D;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,oBAAA,GAA6B;AAGnC,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAA,CAAyB,UAAA,EAAY,CAAC,IAAA,KAAS;AAC9D,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAA,CAAyB,KAAA,EAAO,CAAC,IAAA,KAAS;AACzD,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IACzB,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAA,CAAyB,IAAA,EAAM,CAAC,IAAA,KAAS;AACxD,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAI,CAAA;AACtB,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC9C,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAA,CAAyB,eAAA,EAAiB,CAAC,IAAA,KAAS;AACnE,MAAA,MAAM,OAAA,GAAU,IAAA;AAChB,MAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,IAAA;AACpC,MAAA,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,QAAA,CAAS,WAAA,IAAe,OAAO,CAAA;AAC/D,MAAA,IAAI,OAAA,EAAS,KAAK,IAAA,CAAK,6BAAA,CAA8B,QAAQ,OAAO,CAAA;AACpE,MAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,uBACZ,OAAA,EACmC;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAM,KAAK,UAAA,EAAW;AAE7C,IAAA,MAAM,QAAA,GACJ,OAAA,EAAS,QAAA,IAAY,IAAA,CAAK,mBAAmB,QAAA,IAAY,MAAA;AAC3D,IAAA,MAAM,eAAA,GAAkB,WACpB,EAAE,QAAA,EAAU,KAAK,eAAA,CAAgB,QAAQ,GAAE,GAC3C,MAAA;AACJ,IAAA,MAAM,uBAAA,GAA0B,MAAM,IAAA,CAAK,0BAAA,EAA2B;AACtE,IAAA,MAAM,mBAAA,GACJ,mBAAmB,uBAAA,GACf;AAAA,MACE,GAAI,mBAAmB,EAAC;AAAA,MACxB,GAAI,uBAAA,GAA0B,EAAE,uBAAA,KAA4B;AAAC,KAC/D,GACA,MAAA;AACN,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,mBAAmB,mBAAmB,CAAA;AACxE,IAAA,OAAO,+BAA+B,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAc,qBACZ,KAAA,EACe;AACf,IAAA,IAAI,MAAM,YAAA,IAAgB,KAAA,CAAM,cAAc,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG;AACvE,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,iBAAiB,KAAA,CAAM,eAAA;AAAA,QACvB,MAAA,EAAQ,WAAA;AAAA,QACR,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,OAC9B;AACA,MAAA,MAAM,YAAA,GAAe,6BAA6B,MAAM,CAAA;AACxD,MAAA,IAAA,CAAK,iBAAA,GAAoB,YAAA;AACzB,MAAA,MAAM,IAAA,CAAK,6BAAA;AAAA,QACT,KAAK,QAAA,CAAS,kBAAA,IAAsB,OAAA,IAClC,YAAA,CAAa,iBAAiB,OAAA,IAC9B;AAAA,OACJ;AACA,MAAA,MAAM,KAAK,wBAAA,EAAyB;AACpC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,YAAY,CAAA;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eACJ,IAAA,CAAK,QAAA,CAAS,aAAY,IAAK,CAAC,CAAC,IAAA,CAAK,iBAAA;AACxC,IAAA,IAAA,CAAK,SAAS,eAAA,EAAgB;AAC9B,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,MAAM,KAAK,wBAAA,EAAyB;AACpC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,MAAA,EAAQ,qBAAqB,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEQ,sBAAsB,YAAA,EAAwC;AACpE,IAAA,IAAA,CAAK,kBAAA,GAAqB,YAAA;AAC1B,IAAA,IAAA,CAAK,IAAA,CAAK,uBAAuB,YAAY,CAAA;AAAA,EAC/C;AAAA,EAEQ,2BAAA,GAAoC;AAC1C,IAAA,MAAM,WACJ,IAAA,CAAK,kBAAA,CAAmB,MAAA,KAAW,OAAA,GAC/B,KAAK,kBAAA,GACL,IAAA;AACN,IAAA,IAAA,CAAK,qBAAA,CAAsB;AAAA,MACzB,MAAA,EAAQ,OAAA;AAAA,MACR,YAAA,EAAc,KAAA;AAAA,MACd,WAAA,EAAa,KAAA;AAAA,MACb,UAAA,EAAY,KAAA;AAAA,MACZ,UAAA,EAAY,UAAU,UAAA,IAAc,KAAA;AAAA,MACpC,gBAAA,EAAkB,UAAU,gBAAA,IAAoB,KAAA;AAAA,MAChD,UAAU,EAAC;AAAA,MACX,eAAA,EAAiB,IAAA;AAAA,MACjB,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAAA,EAEQ,gBACN,KAAA,EACkC;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO;AAIV,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,EAAO;AAAA,IAC9B;AACA,IAAA,MAAM,QAAA,GAAiC;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,IAAA,CAAK;AAAA,KAC7B;AACA,IAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,MAAA;AAC1C,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,CAAS,OAAA,GAAU,KAAA,CAAM,OAAA;AAC5C,IAAA,IAAI,KAAA,CAAM,QAAA,EAAU,QAAA,CAAS,QAAA,GAAW,KAAA,CAAM,QAAA;AAC9C,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,sBAAsB,OAAA,EAA8C;AAC1E,IAAA,MAAM,QAAA,GAAiC;AAAA,MACrC,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,SAAS,OAAA,CAAQ;AAAA,KACnB;AACA,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,MAAA,GAAS,OAAA,CAAQ,OAAA;AAC/C,IAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,QAAA,CAAS,QAAA,GAAW,OAAA,CAAQ,SAAA;AACnD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,qBAAA,CACN,UACA,eAAA,EACiB;AACjB,IAAA,MAAM,MAAA,GAAS,6BAAA,CAA8B,QAAA,EAAU,eAAe,CAAA;AACtE,IAAA,MAAM,eAAe,MAAA,CAAO,QAAA;AAC5B,IAAA,MAAM,sBAAsB,MAAA,CAAO,eAAA;AACnC,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,QAAA,CAAS,aAAY,EAAG;AACzD,MAAA,IAAA,CAAK,iBAAA,GAAoB;AAAA,QACvB,GAAG,IAAA,CAAK,iBAAA;AAAA,QACR,QAAA,EAAU,YAAA;AAAA,QACV,eAAA,EAAiB;AAAA,OACnB;AACA,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,KAAK,IAAA,CAAK,6BAAA,CAA8B,mBAAA,CAAoB,OAAO,CAAA;AAAA,MACrE;AAAA,IACF;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAc,8BACZ,QAAA,EACe;AACf,IAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,0BAAA,EAA2B;AAC/D,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACvB,IAAA,IAAI,CAAC,SAAS,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,OAAA,KAAY,gBAAgB,CAAA,EAAG;AACrE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,kBAAA,EAAmB,EAAG,YAAY,gBAAA,EAAkB;AACpE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,gBAAgB,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,mDAAmD,KAAK,CAAA;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAc,8BACZ,sBAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,yBAAyB,CAAA;AAC5D,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAA6C;AAAA,QACjD,OAAA,EAAS,CAAA;AAAA,QACT,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,YAAA,EAAc,IAAA,CAAK,QAAA,CAAS,eAAA,EAAgB;AAAA,QAC5C,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAChC;AAAA,OACF;AACA,MAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AAAA,QACjB,IAAA,CAAK,yBAAA;AAAA,QACL,IAAA,CAAK,UAAU,QAAQ;AAAA,OACzB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,mDAAmD,KAAK,CAAA;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAc,wBAAA,GAA0C;AACtD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAAA,IAC/C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,iDAAiD,KAAK,CAAA;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAc,0BAAA,GAAqD;AACjE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,yBAAyB,CAAA;AACrE,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA;AAAA,QAClB;AAAA,OACF;AACA,MAAA,IACE,MAAA,CAAO,YAAY,CAAA,IACnB,MAAA,CAAO,WAAW,IAAA,CAAK,MAAA,IACvB,OAAO,YAAA,KAAiB,IAAA,CAAK,SAAS,eAAA,EAAgB,IACtD,OAAO,MAAA,CAAO,sBAAA,KAA2B,YACzC,MAAA,CAAO,sBAAA,CAAuB,WAAW,CAAA,EACzC;AACA,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,yBAAyB,CAAA;AAC5D,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,MAAA,CAAO,sBAAA;AAAA,IAChB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,mDAAmD,KAAK,CAAA;AACrE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,yBAAyB,CAAA;AAAA,MAC9D,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,mCAAA,CACP,QACA,eAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,MAAA,EAA2B,IAAI,CAAA;AAC3E,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA;AAClD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA;AAAA,IACR,YAAA,EAAc,gBAAA;AAAA,IACd,WAAA,EAAa,gBAAA;AAAA,IACb,UAAA,EAAY,IAAA;AAAA,IACZ,UAAA,EAAY,gBAAA;AAAA,IACZ,gBAAA,EAAkB,gBAAA;AAAA,IAClB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,IAC7B,KAAA,EAAO;AAAA,GACT;AACF;AAEA,SAAS,sCACP,KAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,+BAA+B,KAAK,CAAA;AACnD,EAAA,MAAM,gBAAA,GACH,KAAA,CAA4C,gBAAA,IAC7C,KAAA,CAAM,SAAS,MAAA,GAAS,CAAA;AAC1B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA;AAAA,IACR,cAAc,KAAA,CAAM,YAAA;AAAA,IACpB,WAAA,EAAa,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,WAAA;AAAA,IACzC,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,gBAAA;AAAA,IACA,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,QAAA,EAAU,KAAA,CAAM,YAAA,GAAe,KAAA,CAAM,QAAA,GAAW,IAAA;AAAA,IAChD,KAAA,EAAO;AAAA,GACT;AACF;AAEA,SAAS,4BAA4B,KAAA,EAAoC;AACvE,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,WAAA,EAAa,KAAA;AAAA,IACb,UAAA,EAAY,KAAA;AAAA,IACZ,UAAA,EAAY,KAAA;AAAA,IACZ,gBAAA,EAAkB,KAAA;AAAA,IAClB,UAAU,EAAC;AAAA,IACX,eAAA,EAAiB,IAAA;AAAA,IACjB,QAAA,EAAU,IAAA;AAAA,IACV,OACE,KAAA,YAAiB,KAAA,GACb,KAAA,GACA,IAAI,MAAM,kCAAkC;AAAA,GACpD;AACF;AAEA,SAAS,oBAAoB,KAAA,EAAyB;AACpD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,OAAQ,KAAA,CAA6B,SAAS,SAAA,CAAU,aAAA;AAC1D","file":"native.js","sourcesContent":["import type { WalletAccount } from \"./types\";\n\nexport interface ActiveWalletAccounts {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\nexport type WalletAccountResult<T> = Omit<T, \"accounts\" | \"selectedAccount\"> & {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n};\n\nexport function resolveSelectedWalletAccount(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): WalletAccount | null {\n if (selectedAccount) {\n return (\n accounts.find((account) => account.address === selectedAccount.address) ??\n selectedAccount\n );\n }\n\n return accounts[0] ?? null;\n}\n\nexport function resolveWalletAccountByAddress(\n accounts: WalletAccount[],\n address?: string | null,\n): WalletAccount | null {\n if (!address) return null;\n return accounts.find((account) => account.address === address) ?? null;\n}\n\nexport function normalizeActiveWalletAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): ActiveWalletAccounts {\n const activeAccount = resolveSelectedWalletAccount(accounts, selectedAccount);\n return {\n accounts: activeAccount ? [activeAccount] : [],\n selectedAccount: activeAccount,\n };\n}\n\nexport function normalizeWalletAccountResult<\n T extends { accounts: WalletAccount[]; selectedAccount?: WalletAccount | null },\n>(\n result: T,\n selectedAccount?: WalletAccount | null,\n): WalletAccountResult<T> {\n const active = normalizeActiveWalletAccounts(\n result.accounts,\n selectedAccount ?? result.selectedAccount ?? null,\n );\n return {\n ...result,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n}\n","export const AddressType = {\n THRU: \"thru\",\n} as const;\n\nexport type AddressType = (typeof AddressType)[keyof typeof AddressType];\n\nexport interface WalletAccount {\n accountType: AddressType;\n address: string;\n label: string;\n}\n\nexport interface AppMetadata {\n appId: string;\n appName: string;\n appUrl: string;\n imageUrl?: string;\n}\n\nexport interface ConnectResult {\n walletId?: string;\n accounts: WalletAccount[];\n selectedAccount?: WalletAccount | null;\n status?: \"pending\" | \"completed\";\n metadata?: AppMetadata;\n}\n\nexport const ThruTransactionEncoding = {\n SIGNING_PAYLOAD_BASE64: \"signing_payload_base64\",\n RAW_TRANSACTION_BASE64: \"raw_transaction_base64\",\n} as const;\n\nexport type ThruTransactionEncoding =\n (typeof ThruTransactionEncoding)[keyof typeof ThruTransactionEncoding];\n\nexport interface ThruSigningContext {\n mode: \"managed_fee_payer\";\n selectedAccountPublicKey: string | null;\n feePayerPublicKey: string;\n signerPublicKey: string;\n acceptedInputEncodings: ThruTransactionEncoding[];\n outputEncoding: typeof ThruTransactionEncoding.RAW_TRANSACTION_BASE64;\n}\n\nexport interface ThruTransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface ThruTransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface ThruTransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: ThruTransactionReviewSimulation;\n abiReflection?: ThruTransactionReviewAbiReflection;\n}\n\nexport interface ThruTransactionIntent {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: ThruTransactionReviewPayload;\n}\n\nexport interface ConnectedApp {\n accountId: number;\n appId: string;\n origin: string;\n metadata: AppMetadata;\n connectedAt: number;\n updatedAt: number;\n}\n\nexport interface SignMessageParams {\n message: string | Uint8Array;\n networkId: string;\n}\n\nexport interface SignMessageResult {\n signature: Uint8Array;\n publicKey: string;\n}\n","import type {\n AppMetadata,\n ConnectResult,\n ThruSigningContext,\n WalletAccount,\n} from \"../interfaces\";\n\nexport const POST_MESSAGE_REQUEST_TYPES = {\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n SIGN_MESSAGE: \"signMessage\",\n SIGN_TRANSACTION: \"signTransaction\",\n GET_ACCOUNTS: \"getAccounts\",\n GET_CONNECTION_STATE: \"getConnectionState\",\n GET_SIGNING_CONTEXT: \"getSigningContext\",\n SELECT_ACCOUNT: \"selectAccount\",\n MANAGE_ACCOUNTS: \"manageAccounts\",\n} as const;\n\nexport type RequestType =\n (typeof POST_MESSAGE_REQUEST_TYPES)[keyof typeof POST_MESSAGE_REQUEST_TYPES];\n\nexport const EMBEDDED_PROVIDER_EVENTS = {\n CONNECT_START: \"connect_start\",\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n CONNECT_ERROR: \"connect_error\",\n ERROR: \"error\",\n LOCK: \"lock\",\n UI_SHOW: \"ui_show\",\n ACCOUNT_CHANGED: \"account_changed\",\n} as const;\n\nexport type EmbeddedProviderEvent =\n (typeof EMBEDDED_PROVIDER_EVENTS)[keyof typeof EMBEDDED_PROVIDER_EVENTS];\n\nexport const POST_MESSAGE_EVENT_TYPE = \"event\" as const;\n\nexport const IFRAME_READY_EVENT = \"iframe:ready\" as const;\n\nexport const DEFAULT_IFRAME_URL = \"http://localhost:3000/embedded\";\n\nconst REQUEST_ID_PREFIX = \"req\";\n\nexport const createRequestId = (prefix: string = REQUEST_ID_PREFIX): string => {\n const random = Math.random().toString(36).slice(2, 11);\n return `${prefix}_${Date.now()}_${random}`;\n};\n\ninterface BaseRequest {\n id: string;\n origin: string;\n}\n\nexport interface ConnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CONNECT;\n payload: ConnectRequestPayload;\n}\n\nexport interface DisconnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.DISCONNECT;\n payload?: undefined;\n}\n\nexport interface SignMessageRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE;\n payload: SignMessagePayload;\n}\n\nexport interface SignTransactionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION;\n payload: SignTransactionPayload;\n}\n\nexport interface GetAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS;\n payload?: undefined;\n}\n\nexport interface GetConnectionStateRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE;\n payload: ConnectRequestPayload;\n}\n\nexport interface GetSigningContextRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT;\n payload?: undefined;\n}\n\nexport interface SelectAccountRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT;\n payload: SelectAccountPayload;\n}\n\nexport interface ManageAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS;\n payload?: undefined;\n}\n\nexport type PostMessageRequest =\n | ConnectRequestMessage\n | DisconnectRequestMessage\n | SignMessageRequestMessage\n | SignTransactionRequestMessage\n | GetAccountsRequestMessage\n | GetConnectionStateRequestMessage\n | GetSigningContextRequestMessage\n | SelectAccountRequestMessage\n | ManageAccountsRequestMessage;\n\nexport interface DisconnectResult {\n // Empty object keeps compatibility with existing consumers expecting a success payload\n}\n\nexport interface GetAccountsResult {\n accounts: WalletAccount[];\n}\n\nexport interface GetConnectionStateResult {\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n}\n\nexport interface SelectAccountPayload {\n publicKey: string;\n}\n\nexport interface SelectAccountResult {\n account: WalletAccount;\n}\n\nexport interface ManageAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\ntype RequestResultMap = {\n [POST_MESSAGE_REQUEST_TYPES.CONNECT]: ConnectResult;\n [POST_MESSAGE_REQUEST_TYPES.DISCONNECT]: DisconnectResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE]: SignMessageResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION]: SignTransactionResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS]: GetAccountsResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE]: GetConnectionStateResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT]: GetSigningContextResult;\n [POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT]: SelectAccountResult;\n [POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS]: ManageAccountsResult;\n};\n\ninterface ResponseErrorPayload {\n code: ErrorCode;\n message: string;\n data?: unknown;\n}\n\ntype SuccessResponse<TType extends RequestType> = {\n id: string;\n success: true;\n result: RequestResultMap[TType];\n};\n\ntype ErrorResponse = {\n id: string;\n success: false;\n error: ResponseErrorPayload;\n};\n\nexport type PostMessageResponse<TType extends RequestType = RequestType> =\n | SuccessResponse<TType>\n | ErrorResponse;\n\nexport type SuccessfulPostMessageResponse<\n TType extends RequestType = RequestType,\n> = Extract<PostMessageResponse<TType>, { success: true }>;\n\nexport type InferPostMessageResponse<TRequest extends PostMessageRequest> =\n PostMessageResponse<TRequest[\"type\"]>;\n\nexport type InferSuccessfulPostMessageResponse<\n TRequest extends PostMessageRequest,\n> = SuccessfulPostMessageResponse<TRequest[\"type\"]>;\n\nexport interface PostMessageEvent<\n TEvent extends EmbeddedProviderEvent = EmbeddedProviderEvent,\n TData = any,\n> {\n type: typeof POST_MESSAGE_EVENT_TYPE;\n event: TEvent;\n data?: TData;\n}\n\nexport const ErrorCode = {\n USER_REJECTED: \"USER_REJECTED\",\n WALLET_LOCKED: \"WALLET_LOCKED\",\n INVALID_PASSWORD: \"INVALID_PASSWORD\",\n ALREADY_CONNECTED: \"ALREADY_CONNECTED\",\n ACCOUNT_NOT_FOUND: \"ACCOUNT_NOT_FOUND\",\n ACCOUNT_CHANGED: \"ACCOUNT_CHANGED\",\n INVALID_TRANSACTION: \"INVALID_TRANSACTION\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INSUFFICIENT_FUNDS: \"INSUFFICIENT_FUNDS\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n TIMEOUT: \"TIMEOUT\",\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport type ConnectMetadataInput = Partial<AppMetadata>;\n\nexport type ConnectIntent = \"default\" | \"switch-account\";\n\nexport interface ConnectRequestPayload {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectIntent;\n}\n\nexport type { AppMetadata, ConnectResult };\n\nexport interface SignMessagePayload {\n message: string | number[];\n accountIndex?: number;\n}\n\nexport interface SignMessageResult {\n signature: number[];\n publicKey: string;\n}\n\n/**\n * Wallet-managed instruction signing intent.\n *\n * Dapps provide the instruction data and account context. The wallet owns\n * signing strategy details such as passkey validation, fee payer choice,\n * account ordering, headers, nonces, and final wire layout. Review metadata\n * is treated as untrusted display-only data.\n */\nexport interface SignTransactionPayload {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: TransactionReviewPayload;\n}\n\nexport interface SignTransactionResult {\n signedTransaction: string;\n}\n\nexport interface TransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface TransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface TransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: TransactionReviewSimulation;\n abiReflection?: TransactionReviewAbiReflection;\n}\n\nexport interface GetSigningContextResult {\n signingContext: ThruSigningContext;\n}\n","import { normalizeWalletAccountResult } from \"../interfaces\";\nimport type { GetConnectionStateResult } from \"./postMessage\";\n\nexport function normalizeConnectionStateResult(\n result: GetConnectionStateResult,\n): GetConnectionStateResult {\n if (!result.isAuthorized || !result.hasPasskey) {\n return { ...result, accounts: [], selectedAccount: null };\n }\n\n return normalizeWalletAccountResult(result);\n}\n","import {\n AddressType,\n type IThruChain,\n type ThruSigningContext,\n type ThruTransactionIntent,\n} from \"../../../interfaces\";\nimport { POST_MESSAGE_REQUEST_TYPES, createRequestId } from \"../../../protocol\";\nimport type { NativeProvider } from \"../NativeProvider\";\nimport type { WebViewBridge } from \"../WebViewBridge\";\n\n/**\n * NativeThruChain - mirror of EmbeddedThruChain over the WebView bridge.\n * Sign moments toggle the host bottom sheet via provider.requestShow /\n * requestHide instead of iframe.show / hide.\n */\nexport class NativeThruChain implements IThruChain {\n private readonly bridge: WebViewBridge;\n private readonly provider: NativeProvider;\n private readonly origin: string;\n\n constructor(bridge: WebViewBridge, provider: NativeProvider, origin: string) {\n this.bridge = bridge;\n this.provider = provider;\n this.origin = origin;\n }\n\n get connected(): boolean {\n return this.provider.isConnected();\n }\n\n async connect(): Promise<{ publicKey: string }> {\n const result = await this.provider.connect();\n const selectedAccount = result.selectedAccount;\n const thruAccount =\n selectedAccount?.accountType === AddressType.THRU\n ? selectedAccount\n : result.accounts.find((addr) => addr.accountType === AddressType.THRU);\n if (!thruAccount) {\n throw new Error(\"Thru address not found in connection result\");\n }\n return { publicKey: thruAccount.address };\n }\n\n async disconnect(): Promise<void> {\n await this.provider.disconnect();\n }\n\n async getSigningContext(): Promise<ThruSigningContext> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT,\n origin: this.origin,\n });\n return response.result.signingContext;\n }\n\n async signTransaction(transaction: ThruTransactionIntent): Promise<string> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n this.provider.requestShow();\n try {\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n payload: {\n walletAddress: transaction.walletAddress,\n programAddress: transaction.programAddress,\n instructionData: transaction.instructionData,\n readWriteAddresses: transaction.readWriteAddresses,\n readOnlyAddresses: transaction.readOnlyAddresses,\n review: transaction.review,\n },\n origin: this.origin,\n });\n return response.result.signedTransaction;\n } finally {\n this.provider.requestHide();\n }\n }\n}\n","import {\n ErrorCode,\n IFRAME_READY_EVENT,\n POST_MESSAGE_EVENT_TYPE,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type InferSuccessfulPostMessageResponse,\n type PostMessageEvent,\n type PostMessageRequest,\n type PostMessageResponse,\n} from \"../../protocol\";\n\n/* RN-side analog of `web/packages/embedded-provider/src/IframeManager.ts`.\n The wallet ships unchanged. The shell HTML (src/shell.html) hosts an\n <iframe src=\"wallet.thru.org/embedded/native\"> and forwards\n iframe<->ReactNativeWebView postMessage traffic. This bridge only\n speaks the RN side: webView.injectJavaScript out, onMessage in. */\n\nconst PRODUCTION_WALLET_ORIGINS = ['https://wallet.thru.org'];\n\nfunction isDevelopmentBuild(): boolean {\n const runtime = globalThis as typeof globalThis & {\n __DEV__?: boolean;\n process?: { env?: { NODE_ENV?: string } };\n };\n\n const devFlag = runtime.__DEV__;\n if (typeof devFlag === 'boolean') return devFlag;\n\n return (\n runtime.process?.env?.NODE_ENV !== undefined &&\n runtime.process.env.NODE_ENV !== 'production'\n );\n}\n\nfunction isPrivateIpv4Host(hostname: string): boolean {\n const parts = hostname.split('.').map((part) => Number(part));\n if (\n parts.length !== 4 ||\n parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)\n ) {\n return false;\n }\n\n const [a, b] = parts;\n return (\n a === 10 ||\n a === 127 ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 100 && b >= 64 && b <= 127)\n );\n}\n\nfunction isAllowedDevelopmentOrigin(url: URL): boolean {\n if (!isDevelopmentBuild()) return false;\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n\n const hostname = url.hostname.toLowerCase();\n return (\n hostname === 'localhost' ||\n hostname === '::1' ||\n !hostname.includes('.') ||\n hostname.endsWith('.local') ||\n hostname.endsWith('.ts.net') ||\n isPrivateIpv4Host(hostname)\n );\n}\n\nfunction validateWalletOrigin(walletUrl: string): void {\n let url: URL;\n try {\n url = new URL(walletUrl);\n } catch {\n throw new Error(\n `Invalid wallet URL: ${walletUrl}. URL must be a valid absolute URL.`\n );\n }\n const origin = url.origin;\n const isAllowed =\n PRODUCTION_WALLET_ORIGINS.includes(origin) ||\n isAllowedDevelopmentOrigin(url);\n if (!isAllowed) {\n throw new Error(\n `Untrusted wallet origin: ${origin}. Only trusted origins are allowed: ${PRODUCTION_WALLET_ORIGINS.join(', ')}. ` +\n 'Development builds also allow localhost, LAN, and Tailscale wallet origins.'\n );\n }\n}\n\n/* Minimal contract for a react-native-webview ref. We accept both refs\n ({ current: WebView }) and direct WebView instances. */\nexport interface WebViewRefLike {\n injectJavaScript: (script: string) => void;\n}\n\nexport interface WebViewMessageEventLike {\n nativeEvent: { data: string };\n}\n\nconst READY_TIMEOUT_MS = 10_000;\nconst SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1000;\nconst FAST_REQUEST_TIMEOUT_MS = 30 * 1000;\n\nconst SLOW_REQUEST_TYPES: ReadonlySet<string> = new Set([\n POST_MESSAGE_REQUEST_TYPES.CONNECT,\n POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE,\n POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n]);\n\nexport interface WebViewBridgeOptions {\n walletUrl: string;\n}\n\n/**\n * Bidirectional bridge between a host React Native app and the wallet\n * iframe running inside a `react-native-webview`. Mirrors the public\n * surface of `IframeManager` minus DOM-only concerns (visibility\n * styling lives with the host bottom sheet). All other invariants -\n * frameId correlation, IFRAME_READY handshake, request/response\n * routing, timeouts - match the iframe implementation exactly.\n */\nexport class WebViewBridge {\n readonly walletUrl: string;\n readonly walletOrigin: string;\n readonly frameId: string;\n\n private webView: WebViewRefLike | null = null;\n private ready = false;\n private readyPromise: Promise<void> | null = null;\n private resolveReady: (() => void) | null = null;\n private rejectReady: ((err: Error) => void) | null = null;\n private readyTimer: ReturnType<typeof setTimeout> | null = null;\n\n private messageHandlers = new Map<\n string,\n (response: PostMessageResponse) => void\n >();\n\n /* Event broadcasts from the iframe (type === 'event'). */\n public onEvent?: (eventType: string, payload: unknown) => void;\n\n constructor(options: WebViewBridgeOptions) {\n validateWalletOrigin(options.walletUrl);\n this.walletUrl = options.walletUrl;\n this.walletOrigin = new URL(options.walletUrl).origin;\n this.frameId = createRequestId('frame');\n }\n\n /**\n * Compose the URL to load inside the shell <iframe>. The host\n * (ThruWalletSheet) calls this when building the shell HTML.\n */\n getIframeSrc(): string {\n const url = new URL(this.walletUrl);\n if (!url.pathname.endsWith('/native')) {\n url.pathname = `${url.pathname.replace(/\\/$/, '')}/native`;\n }\n url.searchParams.set('tn_frame_id', this.frameId);\n return url.toString();\n }\n\n /**\n * Hand the bridge a WebView ref. Required before `awaitReady()` /\n * `sendMessage()` will resolve.\n */\n attachWebView(ref: WebViewRefLike): void {\n this.webView = ref;\n }\n\n /**\n * Mark the bridge ready when the native host loads the wallet as the\n * top-level WebView document instead of through the shell iframe.\n */\n markReady(): void {\n if (this.ready) return;\n this.ready = true;\n if (this.readyTimer) clearTimeout(this.readyTimer);\n this.readyTimer = null;\n const r = this.resolveReady;\n this.resolveReady = null;\n this.rejectReady = null;\n r?.();\n }\n\n /**\n * Returns a promise that resolves when the iframe sends\n * IFRAME_READY_EVENT. Idempotent: returns the same promise on\n * subsequent calls. Rejects after READY_TIMEOUT_MS.\n */\n awaitReady(): Promise<void> {\n if (this.ready) return Promise.resolve();\n if (this.readyPromise) return this.readyPromise;\n this.readyPromise = new Promise<void>((resolve, reject) => {\n this.resolveReady = resolve;\n this.rejectReady = reject;\n this.readyTimer = setTimeout(() => {\n this.readyTimer = null;\n if (this.rejectReady) {\n const r = this.rejectReady;\n this.rejectReady = null;\n this.resolveReady = null;\n r(new Error('WebView ready timeout - wallet failed to load'));\n }\n }, READY_TIMEOUT_MS);\n });\n return this.readyPromise;\n }\n\n /**\n * Send a request to the iframe (via injectJavaScript -> shell ->\n * iframe.postMessage) and resolve with the matching response.\n */\n async sendMessage<TRequest extends PostMessageRequest>(\n request: TRequest\n ): Promise<InferSuccessfulPostMessageResponse<TRequest>> {\n await this.awaitReady();\n if (!this.webView) {\n throw new Error('WebView not attached - call attachWebView() first');\n }\n\n const timeoutMs = SLOW_REQUEST_TYPES.has(request.type)\n ? SLOW_REQUEST_TIMEOUT_MS\n : FAST_REQUEST_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.messageHandlers.delete(request.id);\n reject(new Error('Request timeout - wallet did not respond'));\n }, timeoutMs);\n\n this.messageHandlers.set(request.id, (response) => {\n clearTimeout(timer);\n this.messageHandlers.delete(request.id);\n if (response.success) {\n resolve(\n response as InferSuccessfulPostMessageResponse<TRequest>\n );\n } else {\n const err = new Error(response.error?.message || 'Unknown error');\n (err as { code?: string; data?: unknown }).code = response.error?.code;\n (err as { code?: string; data?: unknown }).data = response.error?.data;\n reject(err);\n }\n });\n\n const script = `try {\n var msg = ${JSON.stringify(request)};\n if (window.__pushIn) {\n window.__pushIn(msg);\n } else {\n window.dispatchEvent(new MessageEvent('message', {\n data: msg,\n origin: msg.origin || ''\n }));\n }\n } catch (e) {} ; true;`;\n this.webView!.injectJavaScript(script);\n });\n }\n\n /**\n * Reject all in-flight wallet requests when the native host dismisses the\n * WebView without waiting for a wallet-side response.\n */\n rejectPendingRequests(message = 'User rejected the request'): void {\n for (const [id, handler] of Array.from(this.messageHandlers.entries())) {\n handler({\n id,\n success: false,\n error: {\n code: ErrorCode.USER_REJECTED,\n message,\n },\n });\n }\n }\n\n /**\n * Hook this into <WebView onMessage>. The shell forwards iframe\n * postMessage payloads to ReactNativeWebView; we route them here.\n */\n onMessage(event: WebViewMessageEventLike): void {\n let data: unknown;\n try {\n data = JSON.parse(event.nativeEvent.data);\n } catch {\n return;\n }\n if (!data || typeof data !== 'object') return;\n const msg = data as Record<string, unknown>;\n\n /* Frame-id check matches the iframe model: ignore traffic that\n isn't tagged for this bridge instance. */\n if (msg.frameId !== this.frameId) return;\n\n if (msg.type === IFRAME_READY_EVENT) {\n this.markReady();\n return;\n }\n\n /* Response to a specific request (has `id`). */\n if (typeof msg.id === 'string' && this.messageHandlers.has(msg.id)) {\n const handler = this.messageHandlers.get(msg.id)!;\n handler(msg as unknown as PostMessageResponse);\n return;\n }\n\n /* Event broadcast (no id). */\n if (msg.type === POST_MESSAGE_EVENT_TYPE) {\n const evt = msg as unknown as PostMessageEvent;\n this.onEvent?.(evt.event, evt.data);\n }\n }\n\n /**\n * Drop pending handlers and clear ready promise. Call when the host\n * unmounts the WebView.\n */\n destroy(): void {\n if (this.readyTimer) {\n clearTimeout(this.readyTimer);\n this.readyTimer = null;\n }\n if (this.rejectReady && this.readyPromise) {\n /* Attach a swallow handler so Node doesn't flag the rejection as\n unhandled if the host wasn't awaiting it at destroy time. */\n this.readyPromise.catch(() => {});\n this.rejectReady(new Error('Bridge destroyed'));\n }\n this.resolveReady = null;\n this.rejectReady = null;\n this.readyPromise = null;\n this.ready = false;\n this.messageHandlers.clear();\n this.webView = null;\n }\n}\n","import {\n AddressType,\n normalizeWalletAccountResult,\n resolveWalletAccountByAddress,\n type AddressType as AddressTypeValue,\n type ConnectResult,\n type IThruChain,\n type WalletAccount,\n} from \"../../interfaces\";\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type EmbeddedProviderEvent,\n type GetConnectionStateResult,\n type ManageAccountsResult,\n type SelectAccountPayload,\n normalizeConnectionStateResult,\n} from \"../../protocol\";\nimport { NativeThruChain } from \"./chains/ThruChain\";\nimport {\n WebViewBridge,\n type WebViewMessageEventLike,\n type WebViewRefLike,\n} from \"./WebViewBridge\";\n\nconst DEFAULT_WALLET_URL = \"https://wallet.thru.org/embedded/native\";\nconst DEFAULT_ORIGIN = \"thru-mobile://app\";\n\nexport interface NativeProviderConfig {\n /** wallet.thru.org/embedded/native URL to load. */\n walletUrl?: string;\n /** Caller-supplied dapp origin. Stamped on every postMessage so\n wallet's ConnectedAppsStorage can scope per-host. */\n origin?: string;\n addressTypes?: AddressTypeValue[];\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectRequestPayload[\"intent\"];\n}\n\nexport type NativeProviderEvent = EmbeddedProviderEvent;\nexport type NativeProviderEventCallback = (data?: unknown) => void;\n\n/**\n * RN-side analog of `web/packages/embedded-provider/src/EmbeddedProvider.ts`.\n * Same public surface (connect/disconnect/sign/getAccounts/etc.) over a\n * WebView+iframe bridge instead of a same-origin iframe. Visibility is\n * delegated to the host (ThruWalletSheet) via `requestShow` /\n * `requestHide` callbacks - bottom sheet logic stays in the React layer.\n */\nexport class NativeProvider {\n private readonly bridge: WebViewBridge;\n private readonly origin: string;\n private _thruChain?: IThruChain;\n private connected = false;\n private accounts: WalletAccount[] = [];\n private selectedAccount: WalletAccount | null = null;\n private readonly eventListeners = new Map<\n string,\n Set<NativeProviderEventCallback>\n >();\n\n /** Set by the host bottom sheet to react to UI_SHOW / completion. */\n public onShowRequested?: () => void;\n public onHideRequested?: () => void;\n\n constructor(config: NativeProviderConfig = {}) {\n const walletUrl = config.walletUrl ?? DEFAULT_WALLET_URL;\n this.origin = config.origin ?? DEFAULT_ORIGIN;\n this.bridge = new WebViewBridge({ walletUrl });\n\n this.bridge.onEvent = (eventType, payload) => {\n this.emit(eventType as NativeProviderEvent, payload);\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.UI_SHOW) {\n this.requestShow();\n return;\n }\n\n if (\n eventType === EMBEDDED_PROVIDER_EVENTS.DISCONNECT ||\n eventType === EMBEDDED_PROVIDER_EVENTS.LOCK\n ) {\n this.clearConnection();\n this.requestHide();\n return;\n }\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED) {\n const account =\n (payload as { account?: WalletAccount } | null | undefined)\n ?.account ?? null;\n this.refreshAccountCache(account);\n }\n };\n\n const addressTypes = config.addressTypes ?? [AddressType.THRU];\n if (addressTypes.includes(AddressType.THRU)) {\n this._thruChain = new NativeThruChain(this.bridge, this, this.origin);\n }\n }\n\n /** Hand the bridge a WebView ref. Required before connect/sign. */\n attachWebView(ref: WebViewRefLike): void {\n this.bridge.attachWebView(ref);\n }\n\n /** Mark a direct top-level WebView wallet document as ready. */\n markWebViewReady(): void {\n this.bridge.markReady();\n }\n\n /** Pass through the WebView's `onMessage` event handler. */\n onMessage = (event: WebViewMessageEventLike): void => {\n this.bridge.onMessage(event);\n };\n\n /** Build the URL to load inside the shell <iframe>. The host shell\n template should substitute this for WALLET_URL_PLACEHOLDER. */\n getIframeSrc(): string {\n return this.bridge.getIframeSrc();\n }\n\n /** Wallet origin (e.g. https://wallet.thru.org). The shell template\n should substitute this for WALLET_ORIGIN_PLACEHOLDER. */\n getWalletOrigin(): string {\n return this.bridge.walletOrigin;\n }\n\n /** Wait for the iframe's IFRAME_READY_EVENT handshake. */\n async initialize(): Promise<void> {\n await this.bridge.awaitReady();\n }\n\n /** Open the wallet UI (called internally; also exposed for host). */\n requestShow(): void {\n this.onShowRequested?.();\n }\n\n /** Close the wallet UI (called internally; also exposed for host). */\n requestHide(): void {\n this.onHideRequested?.();\n }\n\n /** Reject pending requests after a user-driven native sheet dismiss. */\n rejectPendingRequests(message?: string): void {\n this.bridge.rejectPendingRequests(message);\n }\n\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_START, {});\n try {\n this.requestShow();\n const payload: ConnectRequestPayload = {};\n if (options?.metadata) payload.metadata = options.metadata;\n if (options?.preferredAccountAddress) {\n payload.preferredAccountAddress = options.preferredAccountAddress;\n }\n if (options?.intent) payload.intent = options.intent;\n\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CONNECT,\n payload,\n origin: this.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n this.connected = true;\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT, result);\n this.requestHide();\n return result;\n } catch (error) {\n this.requestHide();\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_ERROR, { error });\n throw error;\n }\n }\n\n async getConnectionState(\n options?: ConnectOptions,\n ): Promise<GetConnectionStateResult> {\n const payload: ConnectRequestPayload = {};\n if (options?.metadata) payload.metadata = options.metadata;\n if (options?.preferredAccountAddress) {\n payload.preferredAccountAddress = options.preferredAccountAddress;\n }\n\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE,\n payload,\n origin: this.origin,\n });\n\n const result = normalizeConnectionStateResult(response.result);\n\n if (\n result.isAuthorized &&\n result.hasPasskey &&\n result.accounts.length > 0\n ) {\n this.hydrateConnection(\n {\n accounts: result.accounts,\n status: \"completed\",\n metadata: result.metadata ?? undefined,\n selectedAccount: result.selectedAccount,\n },\n result.selectedAccount?.address ?? null,\n );\n } else {\n this.clearConnection();\n }\n\n return result;\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.DISCONNECT,\n origin: this.origin,\n });\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, {});\n } catch (error) {\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n } finally {\n this.requestHide();\n }\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n hydrateConnection(\n result: ConnectResult,\n selectedAccountAddress?: string | null,\n ): void {\n const selectedAccount =\n resolveWalletAccountByAddress(result.accounts, selectedAccountAddress) ??\n result.selectedAccount ??\n null;\n const normalized = normalizeWalletAccountResult(result, selectedAccount);\n this.connected = true;\n this.accounts = normalized.accounts;\n this.selectedAccount = normalized.selectedAccount;\n }\n\n clearConnection(): void {\n this.connected = false;\n this.accounts = [];\n this.selectedAccount = null;\n }\n\n getAccounts(): WalletAccount[] {\n return this.accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.selectedAccount;\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n if (!this.connected) throw new Error(\"Wallet not connected\");\n const payload: SelectAccountPayload = { publicKey };\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT,\n payload,\n origin: this.origin,\n });\n const account = response.result.account;\n this.refreshAccountCache(account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.connected) throw new Error(\"Wallet not connected\");\n try {\n this.requestShow();\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n origin: this.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n this.requestHide();\n return result;\n } catch (error) {\n this.requestHide();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n }\n }\n\n get thru(): IThruChain {\n if (!this._thruChain) {\n throw new Error(\"Thru chain not enabled in provider config\");\n }\n return this._thruChain;\n }\n\n on(event: NativeProviderEvent, cb: NativeProviderEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(cb);\n }\n\n off(event: NativeProviderEvent, cb: NativeProviderEventCallback): void {\n this.eventListeners.get(event)?.delete(cb);\n }\n\n /** Internal: used by NativeThruChain. */\n getBridge(): WebViewBridge {\n return this.bridge;\n }\n\n destroy(): void {\n this.bridge.destroy();\n this.eventListeners.clear();\n this.clearConnection();\n }\n\n private emit(event: NativeProviderEvent, data?: unknown): void {\n this.eventListeners.get(event)?.forEach((cb) => {\n try {\n cb(data);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[NativeProvider] listener error for ${event}:`, err);\n }\n });\n }\n\n private refreshAccountCache(account: WalletAccount | null): void {\n if (!account) {\n this.accounts = [];\n this.selectedAccount = null;\n return;\n }\n this.accounts = [account];\n this.selectedAccount = account;\n }\n}\n","import {\n AddressType,\n type AppMetadata,\n type AddressType as AddressTypeValue,\n type ConnectResult,\n type IThruChain,\n type WalletAccount,\n normalizeActiveWalletAccounts,\n normalizeWalletAccountResult,\n} from \"../interfaces\";\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n ErrorCode,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type GetConnectionStateResult,\n type ManageAccountsResult,\n normalizeConnectionStateResult,\n} from \"../protocol\";\nimport { NativeProvider } from \"./provider/NativeProvider\";\nimport type {\n WebViewMessageEventLike,\n WebViewRefLike,\n} from \"./provider/WebViewBridge\";\nimport { createThruClient, type Thru } from \"@thru/sdk/client\";\n\nexport type IosWebViewMode = \"direct\" | \"shell-iframe\";\n\nexport type WalletAvailability =\n | {\n status: \"checking\";\n isAuthorized: false;\n isConnected: false;\n isUnlocked: false;\n hasPasskey: false;\n hasWalletAccount: false;\n accounts: WalletAccount[];\n selectedAccount: null;\n metadata: null;\n error: null;\n }\n | {\n status: \"ready\";\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n error: null;\n }\n | {\n status: \"error\";\n isAuthorized: false;\n isConnected: false;\n isUnlocked: false;\n hasPasskey: false;\n hasWalletAccount: false;\n accounts: WalletAccount[];\n selectedAccount: null;\n metadata: null;\n error: Error;\n };\n\nexport interface NativeSDKConfig {\n walletUrl?: string;\n /** Stamped on every postMessage so wallet's ConnectedAppsStorage can\n scope per-host. Default: 'thru-mobile://app'. */\n origin?: string;\n rpcUrl?: string;\n addressTypes?: AddressTypeValue[];\n /** iOS-only host mode. Shell iframe is the default; direct is kept\n as an escape hatch for real-device passkey/WebAuthn comparisons. */\n iosWebViewMode?: IosWebViewMode;\n /** Optional host-provided persistent storage (SecureStore,\n AsyncStorage, localStorage-compatible adapter, etc.). */\n storage?: NativeSDKStorage;\n /** Override the legacy connection snapshot key cleared from `storage`. */\n storageKey?: string;\n /** Override the key used to remember the app-local selected account. */\n selectedAccountStorageKey?: string;\n}\n\nexport interface SignInOptions {\n app_id: string;\n app_display_name: string;\n app_url?: string;\n image_url?: string;\n intent?: ConnectOptions[\"intent\"];\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectRequestPayload[\"intent\"];\n}\n\nexport interface RestoreConnectionOptions {\n hydrate?: boolean;\n}\n\nexport type SDKEvent =\n | \"connect\"\n | \"disconnect\"\n | \"lock\"\n | \"error\"\n | \"accountChanged\"\n | \"availabilityChanged\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type EventCallback = (...args: any[]) => void;\n\nexport interface NativeSDKStorage {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<void>;\n removeItem: (key: string) => void | Promise<void>;\n}\n\nexport interface NativeSDKUiHandlers {\n onShowRequested?: () => void;\n onHideRequested?: () => void;\n}\n\nconst DEFAULT_STORAGE_KEY = \"thru.native-sdk.connection.v1\";\nconst SELECTED_ACCOUNT_STORAGE_KEY_SUFFIX = \".selected-account.v1\";\n\nconst CHECKING_WALLET_AVAILABILITY: WalletAvailability = {\n status: \"checking\",\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: false,\n hasWalletAccount: false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error: null,\n};\n\ninterface PersistedSelectedAccountSnapshot {\n version: 1;\n origin: string;\n walletOrigin: string;\n savedAt: string;\n selectedAccountAddress: string;\n}\n\n/**\n * NativeSDK - mobile mirror of `@thru/wallet`'s `BrowserSDK`.\n * Public surface matches verbatim except `mountInline(HTMLElement)` is\n * replaced by `attachWebView(WebViewRefLike)` since the host bottom\n * sheet owns the WebView lifecycle.\n */\nexport class NativeSDK {\n private provider: NativeProvider;\n private eventListeners = new Map<SDKEvent, Set<EventCallback>>();\n private initialized = false;\n private thruClient: Thru | null = null;\n private rpcUrl: string | undefined;\n private connectInFlight: Promise<ConnectResult> | null = null;\n private lastConnectResult: ConnectResult | null = null;\n private walletAvailability: WalletAvailability = CHECKING_WALLET_AVAILABILITY;\n private readonly origin: string;\n private readonly storage?: NativeSDKStorage;\n private readonly storageKey: string;\n private readonly selectedAccountStorageKey: string;\n private readonly iosWebViewMode: IosWebViewMode;\n\n constructor(config: NativeSDKConfig = {}) {\n this.origin = config.origin ?? \"thru-mobile://app\";\n this.rpcUrl = config.rpcUrl;\n this.storage = config.storage;\n this.storageKey = config.storageKey ?? DEFAULT_STORAGE_KEY;\n this.selectedAccountStorageKey =\n config.selectedAccountStorageKey ??\n `${this.storageKey}${SELECTED_ACCOUNT_STORAGE_KEY_SUFFIX}`;\n this.iosWebViewMode = config.iosWebViewMode ?? \"shell-iframe\";\n this.provider = new NativeProvider({\n walletUrl: config.walletUrl,\n origin: this.origin,\n addressTypes: config.addressTypes ?? [AddressType.THRU],\n });\n this.setupEventForwarding();\n }\n\n /** Hand the WebView ref to the underlying provider/bridge. */\n attachWebView(ref: WebViewRefLike): void {\n this.provider.attachWebView(ref);\n }\n\n /** Mark a direct top-level WebView wallet document as ready. */\n markWebViewReady(): void {\n this.provider.markWebViewReady();\n }\n\n /** Bind to the WebView's `onMessage` handler. */\n onMessage = (event: WebViewMessageEventLike): void => {\n this.provider.onMessage(event);\n };\n\n /** Build the URL to load inside the shell <iframe>. */\n getIframeSrc(): string {\n return this.provider.getIframeSrc();\n }\n\n /** Wallet origin (e.g. https://wallet.thru.org). */\n getWalletOrigin(): string {\n return this.provider.getWalletOrigin();\n }\n\n /** Bind host UI lifecycle handlers used by custom WebView hosts. */\n setUiHandlers(handlers: NativeSDKUiHandlers): void {\n this.provider.onShowRequested = handlers.onShowRequested;\n this.provider.onHideRequested = handlers.onHideRequested;\n }\n\n clearUiHandlers(): void {\n this.provider.onShowRequested = undefined;\n this.provider.onHideRequested = undefined;\n }\n\n /** Reject in-flight wallet requests after a user-driven host dismiss. */\n rejectPendingRequests(message?: string): void {\n this.provider.rejectPendingRequests(message);\n }\n\n /** iOS WebView host mode. Non-iOS hosts should ignore this value. */\n getIosWebViewMode(): IosWebViewMode {\n return this.iosWebViewMode;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n await this.provider.initialize();\n this.initialized = true;\n }\n\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n const isAccountSwitch = options?.intent === \"switch-account\";\n if (this.connectInFlight) return this.connectInFlight;\n if (\n !isAccountSwitch &&\n this.lastConnectResult &&\n this.provider.isConnected()\n ) {\n return this.lastConnectResult;\n }\n\n this.emit(\"connect\", { status: \"connecting\" });\n\n const inFlight = (async () => {\n try {\n this.provider.requestShow();\n if (!this.initialized) await this.initialize();\n\n const metadata = this.resolveMetadata(options?.metadata);\n const preferredAccountAddress = isAccountSwitch\n ? null\n : await this.readSelectedAccountAddress();\n const providerOptions =\n metadata || preferredAccountAddress || options?.intent\n ? {\n ...(metadata ? { metadata } : {}),\n ...(preferredAccountAddress ? { preferredAccountAddress } : {}),\n ...(options?.intent ? { intent: options.intent } : {}),\n }\n : undefined;\n const result = await this.provider.connect(providerOptions);\n if (!isAccountSwitch) {\n await this.applyPreferredSelectedAccount(result.accounts);\n }\n const selectedAccount =\n this.provider.getSelectedAccount() ?? result.selectedAccount ?? null;\n const activeResult = normalizeWalletAccountResult(\n {\n ...result,\n accounts: this.provider.getAccounts(),\n selectedAccount,\n },\n selectedAccount,\n );\n this.lastConnectResult = activeResult;\n await this.persistSelectedAccountAddress(\n activeResult.selectedAccount?.address ?? null,\n );\n await this.clearPersistedConnection();\n this.setWalletAvailability(\n walletAvailabilityFromConnectResult(activeResult),\n );\n this.emit(\"connect\", activeResult);\n return activeResult;\n } catch (error) {\n this.provider.requestHide();\n if (isUserRejectedError(error) && !isAccountSwitch) {\n this.provider.clearConnection();\n this.lastConnectResult = null;\n await this.clearPersistedConnection();\n this.clearAuthorizedAvailability();\n this.emit(\"disconnect\", { reason: \"user_rejected\" });\n }\n this.emit(\"error\", error);\n throw error;\n } finally {\n this.connectInFlight = null;\n }\n })();\n\n this.connectInFlight = inFlight;\n return inFlight;\n }\n\n async signIn(options: SignInOptions): Promise<ConnectResult> {\n return this.connect({\n metadata: this.resolveSignInMetadata(options),\n ...(options.intent ? { intent: options.intent } : {}),\n });\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.provider.disconnect();\n this.emit(\"disconnect\", {});\n this.lastConnectResult = null;\n await this.clearPersistedConnection();\n this.clearAuthorizedAvailability();\n } catch (error) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n isConnected(): boolean {\n return this.provider.isConnected();\n }\n\n getWalletAvailability(): WalletAvailability {\n return this.walletAvailability;\n }\n\n async restoreConnection(\n options: RestoreConnectionOptions = {},\n ): Promise<ConnectResult | null> {\n void options;\n await this.clearPersistedConnection();\n return null;\n }\n\n async syncConnectionState(\n options?: ConnectOptions,\n ): Promise<GetConnectionStateResult | null> {\n try {\n const state = await this.requestConnectionState(options);\n this.setWalletAvailability(walletAvailabilityFromConnectionState(state));\n await this.applyConnectionState(state);\n return state;\n } catch (error) {\n this.setWalletAvailability(walletAvailabilityFromError(error));\n this.emit(\"error\", error);\n return null;\n }\n }\n\n async refreshWalletAvailability(\n options?: ConnectOptions,\n ): Promise<WalletAvailability> {\n try {\n const state = await this.requestConnectionState(options);\n const availability = walletAvailabilityFromConnectionState(state);\n this.setWalletAvailability(availability);\n await this.applyConnectionState(state);\n return availability;\n } catch (error) {\n const availability = walletAvailabilityFromError(error);\n this.setWalletAvailability(availability);\n this.emit(\"error\", error);\n return availability;\n }\n }\n\n getAccounts(): WalletAccount[] {\n const accounts = this.provider.getAccounts();\n const activeAccounts = this.refreshCachedAccounts(\n accounts,\n this.provider.getSelectedAccount(),\n );\n return activeAccounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.provider.getSelectedAccount();\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n const account = await this.provider.selectAccount(publicKey);\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n await this.persistSelectedAccountAddress(account.address);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.initialized) await this.initialize();\n const result = await this.provider.manageAccounts();\n const activeResult = normalizeWalletAccountResult(result);\n const selectedAccount = activeResult.selectedAccount ?? null;\n this.refreshCachedAccounts(activeResult.accounts, selectedAccount);\n await this.persistSelectedAccountAddress(selectedAccount?.address ?? null);\n if (this.lastConnectResult) {\n this.setWalletAvailability(\n walletAvailabilityFromConnectResult(this.lastConnectResult),\n );\n }\n this.emit(\"accountChanged\", selectedAccount);\n return activeResult;\n }\n\n get thru(): IThruChain {\n return this.provider.thru;\n }\n\n on(event: SDKEvent, callback: EventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n off(event: SDKEvent, callback: EventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n once(event: SDKEvent, callback: EventCallback): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrapped = (...args: any[]) => {\n callback(...args);\n this.off(event, wrapped);\n };\n this.on(event, wrapped);\n }\n\n destroy(): void {\n this.provider.destroy();\n this.eventListeners.clear();\n this.initialized = false;\n this.connectInFlight = null;\n this.lastConnectResult = null;\n this.walletAvailability = CHECKING_WALLET_AVAILABILITY;\n }\n\n /** Lazily-instantiated Thru chain client. */\n public getThru(): Thru {\n if (!this.thruClient) {\n this.thruClient = createThruClient({ baseUrl: this.rpcUrl });\n }\n return this.thruClient;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private emit(event: SDKEvent, data?: any): void {\n this.eventListeners.get(event)?.forEach((cb) => {\n try {\n cb(data);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[NativeSDK] listener error for ${event}:`, err);\n }\n });\n }\n\n private setupEventForwarding(): void {\n /* CONNECT is emitted from connect() directly (with the resolved\n ConnectResult), so don't double-emit here. */\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, (data) => {\n this.lastConnectResult = null;\n this.clearAuthorizedAvailability();\n this.emit(\"disconnect\", data);\n });\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ERROR, (data) => {\n this.emit(\"error\", data);\n });\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.LOCK, (data) => {\n this.lastConnectResult = null;\n this.clearAuthorizedAvailability();\n this.emit(\"lock\", data);\n this.emit(\"disconnect\", { reason: \"locked\" });\n });\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, (data) => {\n const payload = data as { account?: WalletAccount } | undefined;\n const account = payload?.account ?? null;\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n if (account) void this.persistSelectedAccountAddress(account.address);\n this.emit(\"accountChanged\", account);\n });\n }\n\n private async requestConnectionState(\n options?: ConnectOptions,\n ): Promise<GetConnectionStateResult> {\n if (!this.initialized) await this.initialize();\n\n const metadata =\n options?.metadata ?? this.lastConnectResult?.metadata ?? undefined;\n const providerOptions = metadata\n ? { metadata: this.resolveMetadata(metadata) }\n : undefined;\n const preferredAccountAddress = await this.readSelectedAccountAddress();\n const nextProviderOptions =\n providerOptions || preferredAccountAddress\n ? {\n ...(providerOptions ?? {}),\n ...(preferredAccountAddress ? { preferredAccountAddress } : {}),\n }\n : undefined;\n const state = await this.provider.getConnectionState(nextProviderOptions);\n return normalizeConnectionStateResult(state);\n }\n\n private async applyConnectionState(\n state: GetConnectionStateResult,\n ): Promise<void> {\n if (state.isAuthorized && state.hasPasskey && state.accounts.length > 0) {\n const result: ConnectResult = {\n accounts: state.accounts,\n selectedAccount: state.selectedAccount,\n status: \"completed\",\n metadata: state.metadata ?? undefined,\n };\n const activeResult = normalizeWalletAccountResult(result);\n this.lastConnectResult = activeResult;\n await this.persistSelectedAccountAddress(\n this.provider.getSelectedAccount()?.address ??\n activeResult.selectedAccount?.address ??\n null,\n );\n await this.clearPersistedConnection();\n this.emit(\"connect\", activeResult);\n return;\n }\n\n const wasConnected =\n this.provider.isConnected() || !!this.lastConnectResult;\n this.provider.clearConnection();\n this.lastConnectResult = null;\n await this.clearPersistedConnection();\n if (wasConnected) {\n this.emit(\"disconnect\", { reason: \"state_unavailable\" });\n }\n }\n\n private setWalletAvailability(availability: WalletAvailability): void {\n this.walletAvailability = availability;\n this.emit(\"availabilityChanged\", availability);\n }\n\n private clearAuthorizedAvailability(): void {\n const previous =\n this.walletAvailability.status === \"ready\"\n ? this.walletAvailability\n : null;\n this.setWalletAvailability({\n status: \"ready\",\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: previous?.hasPasskey ?? false,\n hasWalletAccount: previous?.hasWalletAccount ?? false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error: null,\n });\n }\n\n private resolveMetadata(\n input?: ConnectMetadataInput,\n ): ConnectMetadataInput | undefined {\n if (!input) {\n /* On RN we have no window.location.origin; require explicit\n metadata, but stamp the configured origin as appId so the\n wallet can scope per-host. */\n return { appId: this.origin };\n }\n const metadata: ConnectMetadataInput = {\n appId: input.appId ?? this.origin,\n };\n if (input.appUrl) metadata.appUrl = input.appUrl;\n if (input.appName) metadata.appName = input.appName;\n if (input.imageUrl) metadata.imageUrl = input.imageUrl;\n return metadata;\n }\n\n private resolveSignInMetadata(options: SignInOptions): ConnectMetadataInput {\n const metadata: ConnectMetadataInput = {\n appId: options.app_id,\n appName: options.app_display_name,\n };\n if (options.app_url) metadata.appUrl = options.app_url;\n if (options.image_url) metadata.imageUrl = options.image_url;\n return metadata;\n }\n\n private refreshCachedAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n ): WalletAccount[] {\n const active = normalizeActiveWalletAccounts(accounts, selectedAccount);\n const nextAccounts = active.accounts;\n const nextSelectedAccount = active.selectedAccount;\n if (this.lastConnectResult && this.provider.isConnected()) {\n this.lastConnectResult = {\n ...this.lastConnectResult,\n accounts: nextAccounts,\n selectedAccount: nextSelectedAccount,\n };\n if (nextSelectedAccount) {\n void this.persistSelectedAccountAddress(nextSelectedAccount.address);\n }\n }\n return nextAccounts;\n }\n\n private async applyPreferredSelectedAccount(\n accounts: WalletAccount[],\n ): Promise<void> {\n const preferredAddress = await this.readSelectedAccountAddress();\n if (!preferredAddress) return;\n if (!accounts.some((account) => account.address === preferredAddress)) {\n return;\n }\n if (this.provider.getSelectedAccount()?.address === preferredAddress) {\n return;\n }\n\n try {\n await this.provider.selectAccount(preferredAddress);\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to restore selected account:\", error);\n }\n }\n\n private async persistSelectedAccountAddress(\n selectedAccountAddress: string | null,\n ): Promise<void> {\n if (!this.storage) return;\n try {\n if (!selectedAccountAddress) {\n await this.storage.removeItem(this.selectedAccountStorageKey);\n return;\n }\n\n const snapshot: PersistedSelectedAccountSnapshot = {\n version: 1,\n origin: this.origin,\n walletOrigin: this.provider.getWalletOrigin(),\n savedAt: new Date().toISOString(),\n selectedAccountAddress,\n };\n await this.storage.setItem(\n this.selectedAccountStorageKey,\n JSON.stringify(snapshot),\n );\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to persist selected account:\", error);\n }\n }\n\n private async clearPersistedConnection(): Promise<void> {\n if (!this.storage) return;\n try {\n await this.storage.removeItem(this.storageKey);\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to clear connection state:\", error);\n }\n }\n\n private async readSelectedAccountAddress(): Promise<string | null> {\n if (!this.storage) return null;\n\n try {\n const raw = await this.storage.getItem(this.selectedAccountStorageKey);\n if (!raw) return null;\n\n const parsed = JSON.parse(\n raw,\n ) as Partial<PersistedSelectedAccountSnapshot>;\n if (\n parsed.version !== 1 ||\n parsed.origin !== this.origin ||\n parsed.walletOrigin !== this.provider.getWalletOrigin() ||\n typeof parsed.selectedAccountAddress !== \"string\" ||\n parsed.selectedAccountAddress.length === 0\n ) {\n await this.storage.removeItem(this.selectedAccountStorageKey);\n return null;\n }\n\n return parsed.selectedAccountAddress;\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to restore selected account:\", error);\n try {\n await this.storage.removeItem(this.selectedAccountStorageKey);\n } catch {\n /* best effort */\n }\n return null;\n }\n }\n}\n\nfunction walletAvailabilityFromConnectResult(\n result: ConnectResult,\n selectedAccount?: WalletAccount | null,\n): WalletAvailability {\n const active = normalizeWalletAccountResult(result, selectedAccount ?? null);\n const hasActiveAccount = active.accounts.length > 0;\n return {\n status: \"ready\",\n isAuthorized: hasActiveAccount,\n isConnected: hasActiveAccount,\n isUnlocked: true,\n hasPasskey: hasActiveAccount,\n hasWalletAccount: hasActiveAccount,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n metadata: result.metadata ?? null,\n error: null,\n };\n}\n\nfunction walletAvailabilityFromConnectionState(\n state: GetConnectionStateResult,\n): WalletAvailability {\n const active = normalizeConnectionStateResult(state);\n const hasWalletAccount =\n (state as Partial<GetConnectionStateResult>).hasWalletAccount ??\n state.accounts.length > 0;\n return {\n status: \"ready\",\n isAuthorized: state.isAuthorized,\n isConnected: state.isAuthorized && state.isConnected,\n isUnlocked: state.isUnlocked,\n hasPasskey: state.hasPasskey,\n hasWalletAccount,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n metadata: state.isAuthorized ? state.metadata : null,\n error: null,\n };\n}\n\nfunction walletAvailabilityFromError(error: unknown): WalletAvailability {\n return {\n status: \"error\",\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: false,\n hasWalletAccount: false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error:\n error instanceof Error\n ? error\n : new Error(\"Wallet availability check failed\"),\n };\n}\n\nfunction isUserRejectedError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n return (error as { code?: unknown }).code === ErrorCode.USER_REJECTED;\n}\n"]}
|
package/dist/react-ui.js
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import '@thru/sdk/client';
|
|
3
|
+
import { createContext, useState, useRef, useMemo, useEffect, useCallback, useContext } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var defaultContextValue = {
|
|
7
|
+
wallet: null,
|
|
8
|
+
isConnected: false,
|
|
9
|
+
accounts: [],
|
|
10
|
+
isConnecting: false,
|
|
11
|
+
error: null,
|
|
12
|
+
thru: null,
|
|
13
|
+
selectedAccount: null,
|
|
14
|
+
selectAccount: async () => void 0,
|
|
15
|
+
manageAccounts: async () => ({ accounts: [], selectedAccount: null })
|
|
16
|
+
};
|
|
17
|
+
var ThruContext = createContext(defaultContextValue);
|
|
18
|
+
function useThru() {
|
|
19
|
+
const context = useContext(ThruContext);
|
|
20
|
+
return context;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/react/hooks/useAccounts.ts
|
|
24
|
+
function useAccounts(options) {
|
|
25
|
+
const { accounts, selectedAccount, isConnected, isConnecting } = useThru();
|
|
26
|
+
const externalOnSelect = options?.onAccountSelect;
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
}, [externalOnSelect, selectedAccount]);
|
|
29
|
+
return useMemo(
|
|
30
|
+
() => ({
|
|
31
|
+
accounts,
|
|
32
|
+
selectedAccount,
|
|
33
|
+
isConnected,
|
|
34
|
+
isConnecting
|
|
35
|
+
}),
|
|
36
|
+
[accounts, selectedAccount, isConnected, isConnecting]
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
function waitForWallet(getWallet, timeout = 5e3, interval = 100) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const start = Date.now();
|
|
42
|
+
const check = () => {
|
|
43
|
+
const sdk = getWallet();
|
|
44
|
+
if (sdk) return resolve(sdk);
|
|
45
|
+
if (Date.now() - start > timeout) return reject(new Error("SDK not initialized in time"));
|
|
46
|
+
setTimeout(check, interval);
|
|
47
|
+
};
|
|
48
|
+
check();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function useWallet() {
|
|
52
|
+
const {
|
|
53
|
+
wallet,
|
|
54
|
+
isConnected,
|
|
55
|
+
accounts,
|
|
56
|
+
selectedAccount,
|
|
57
|
+
selectAccount,
|
|
58
|
+
manageAccounts,
|
|
59
|
+
isConnecting
|
|
60
|
+
} = useThru();
|
|
61
|
+
const walletRef = useRef(wallet);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
walletRef.current = wallet;
|
|
64
|
+
}, [wallet]);
|
|
65
|
+
const disconnect = async () => {
|
|
66
|
+
if (!wallet) {
|
|
67
|
+
throw new Error("SDK not initialized");
|
|
68
|
+
}
|
|
69
|
+
await wallet.disconnect();
|
|
70
|
+
};
|
|
71
|
+
const connect = async (options) => {
|
|
72
|
+
try {
|
|
73
|
+
const readySdk = walletRef.current ?? await waitForWallet(() => walletRef.current);
|
|
74
|
+
const result = await readySdk.connect(options);
|
|
75
|
+
return result;
|
|
76
|
+
} catch (err) {
|
|
77
|
+
const error = err;
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const mountInline = async (container) => {
|
|
82
|
+
const readySdk = walletRef.current ?? await waitForWallet(() => walletRef.current);
|
|
83
|
+
await readySdk.mountInline(container);
|
|
84
|
+
};
|
|
85
|
+
const openAccountSettings = async () => {
|
|
86
|
+
return manageAccounts();
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
wallet: wallet?.thru,
|
|
90
|
+
accounts,
|
|
91
|
+
connect,
|
|
92
|
+
disconnect,
|
|
93
|
+
mountInline,
|
|
94
|
+
manageAccounts: openAccountSettings,
|
|
95
|
+
isConnected: isConnected && !!wallet,
|
|
96
|
+
isConnecting,
|
|
97
|
+
selectedAccount,
|
|
98
|
+
selectAccount
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
var SvgLogomarkRed = (props) => /* @__PURE__ */ jsxs("svg", { width: "1em", height: "1em", viewBox: "0 0 400 400", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: [
|
|
102
|
+
/* @__PURE__ */ jsxs("g", { clipPath: "url(#clip0_6077_1488)", children: [
|
|
103
|
+
/* @__PURE__ */ jsx("circle", { cx: 200.001, cy: 200, r: 200, fill: "#D33C43" }),
|
|
104
|
+
/* @__PURE__ */ jsx("path", { d: "M92.913 118.57C93.6389 118.015 98.9022 123.196 108.531 129.408C117.491 135.752 130.043 142.834 145.993 146.578C157.454 149.27 168.635 150.726 179.444 152.13C200.407 154.854 218.507 157.207 231.181 167.591C239.558 174.457 240.954 183.41 242.189 191.314C243.555 200.045 244.842 208.29 255.509 210.754C256.363 210.951 257.232 211.002 258.12 210.924C262.872 210.508 268.106 206.444 274.026 201.854C275.575 200.657 277.163 199.424 278.785 198.225C285.668 193.692 293.288 189.791 301.57 190.777C317.149 192.633 317.21 204.674 317.838 207.431L317.837 207.421C320.455 209.479 326.196 213.068 325.786 213.989C325.578 214.301 318.801 213.951 315.903 214.691C282.106 223.316 293.989 258.708 266.092 280.272C242.773 298.301 202.912 299.418 197.428 296.967C195.539 296.122 203.175 292.135 201.361 291.797C179.146 296.598 184.02 343.337 176.76 348.583C174.405 350.024 168.458 347.488 165.051 344.609C163.371 342.694 163.108 341.012 164.245 339.468C165.724 337.465 171.993 328.673 172.054 328.584C172.156 328.444 172.193 328.268 172.168 328.098C172.142 327.927 172.046 327.779 171.906 327.676C171.616 327.466 171.208 327.533 170.998 327.823L161.711 340.772C161.706 340.778 161.696 340.789 161.686 340.801C158.712 340.244 152.309 335.073 151.89 329.019C151.997 328.993 152.104 328.953 152.202 328.882L163.967 319.96C164.31 319.7 164.377 319.207 164.117 318.863C163.857 318.52 163.364 318.453 163.02 318.713L151.256 327.635C151.133 327.729 151.045 327.858 150.994 327.993C147.571 327.089 143.312 321.96 143.591 317.911C143.622 317.908 143.649 317.917 143.681 317.914C143.784 317.905 143.891 317.875 143.991 317.819L156.905 310.671C157.284 310.46 157.421 309.987 157.21 309.607C156.999 309.228 156.527 309.092 156.147 309.303L143.233 316.451C143.133 316.502 143.056 316.577 142.99 316.661C140.709 315.657 137.269 310.975 137.907 307.617C137.955 307.623 137.997 307.63 138.044 307.626C138.127 307.619 138.214 307.601 138.295 307.562L152.454 301.252C152.847 301.076 153.026 300.611 152.85 300.218C152.675 299.825 152.209 299.646 151.816 299.821L137.657 306.132C137.547 306.183 137.454 306.259 137.378 306.35C134.141 304.524 130.647 297.984 132.475 293.694C132.48 293.694 132.489 293.694 132.491 293.693C132.501 293.693 132.52 293.691 132.522 293.69L149.014 290.274C149.363 290.202 149.589 289.857 149.516 289.503C149.481 289.333 149.378 289.186 149.228 289.089C149.084 288.997 148.914 288.964 148.745 289C148.617 289.027 135.795 291.718 135.243 291.819C132.961 292.234 131.936 292.13 130.785 290.582C128.663 286.968 126.869 280.279 128.521 278.764C134.974 272.599 165.939 286.69 180.264 276.822C189.479 270.474 198.395 257.824 211.315 250.994C184.067 246.663 163.004 243.22 156.847 224.222C141.919 225.036 135.547 212.453 134.865 207.948C120.603 206.202 119.126 193.745 119.81 189.121C111.6 188.897 103.78 177.335 106.088 166.87C101.413 166.018 95.9124 155.183 98.2948 146.941C89.0608 140.637 90.2634 119.99 92.913 118.57ZM168.519 226.037C167.95 225.93 167.407 226.297 167.294 226.861C167.186 227.426 167.553 227.974 168.118 228.087L215.935 237.459C216.036 237.476 216.136 237.483 216.229 237.475C216.681 237.435 217.071 237.103 217.161 236.635C217.269 236.071 216.901 235.522 216.337 235.409L168.519 226.037ZM203.915 170.233C202.344 169.926 200.771 170.372 199.594 171.453C198.417 172.535 197.839 174.067 198.01 175.659C198.347 178.796 200.652 181.331 203.738 181.972L207.528 182.76C207.326 182.898 207.124 183.052 206.94 183.22C205.763 184.301 205.186 185.833 205.356 187.425C205.694 190.562 207.998 193.098 211.084 193.738L214.837 194.519C214.619 194.663 214.407 194.818 214.214 194.997C213.037 196.079 212.459 197.611 212.63 199.202C212.967 202.339 215.272 204.875 218.358 205.516L222.148 206.304C221.946 206.442 221.744 206.591 221.56 206.764C220.383 207.845 219.806 209.377 219.976 210.969C220.314 214.106 222.619 216.641 225.705 217.281L229.511 218.074C229.283 218.225 229.067 218.385 228.863 218.57C227.686 219.652 227.109 221.184 227.279 222.775C227.616 225.912 229.921 228.447 233.008 229.088L248.141 232.229C248.215 232.243 248.294 232.247 248.366 232.24C248.704 232.211 248.991 231.966 249.065 231.619L249.101 231.61C249.19 231.184 248.918 230.773 248.497 230.685L233.364 227.545C230.939 227.04 229.137 225.051 228.87 222.594C228.754 221.5 229.148 220.451 229.957 219.71C230.761 218.97 231.844 218.666 232.92 218.875L240.906 220.432C241.331 220.51 241.742 220.238 241.825 219.812C241.898 219.445 241.694 219.081 241.357 218.942C241.303 218.916 241.243 218.895 241.184 218.885L226.052 215.744C223.626 215.239 221.825 213.251 221.557 210.794C221.441 209.7 221.84 208.649 222.644 207.909C223.448 207.169 224.532 206.865 225.607 207.074L230.398 208.005L233.517 208.653C233.592 208.668 233.67 208.671 233.743 208.665C233.795 208.661 233.845 208.641 233.896 208.626C233.902 208.626 233.907 208.624 233.912 208.624C233.943 208.616 233.969 208.614 233.994 208.602C234.248 208.517 234.454 208.299 234.508 208.018C234.591 207.592 234.315 207.181 233.889 207.098L230.683 206.473L218.695 203.984C216.27 203.48 214.469 201.491 214.201 199.034C214.084 197.94 214.479 196.89 215.288 196.149C216.092 195.409 217.175 195.105 218.251 195.314L225.21 196.668L226.227 196.877C226.302 196.891 226.38 196.895 226.453 196.889C226.723 196.865 226.96 196.698 227.08 196.452C227.107 196.403 227.123 196.349 227.14 196.295C227.144 196.284 227.153 196.278 227.152 196.268V196.257C227.152 196.252 227.151 196.248 227.151 196.247C227.234 195.821 226.957 195.41 226.531 195.327L225.493 195.125L211.405 192.202C208.98 191.697 207.178 189.709 206.911 187.252C206.794 186.158 207.189 185.108 207.998 184.367C208.802 183.627 209.885 183.323 210.961 183.532L215.768 184.468L218.871 185.112C218.945 185.127 219.024 185.13 219.097 185.124C219.148 185.119 219.199 185.099 219.25 185.084C219.255 185.084 219.266 185.082 219.271 185.082C219.297 185.075 219.323 185.072 219.348 185.06C219.602 184.975 219.809 184.763 219.862 184.476C219.945 184.05 219.668 183.64 219.242 183.557L216.058 182.935L204.055 180.442C201.634 179.937 199.833 177.949 199.565 175.491C199.449 174.397 199.843 173.347 200.652 172.606C201.456 171.866 202.54 171.562 203.615 171.771L211.601 173.329C212.027 173.407 212.437 173.135 212.52 172.709C212.603 172.283 212.327 171.873 211.901 171.79L203.915 170.233ZM152.516 208.282C151.957 208.164 151.402 208.527 151.284 209.092C151.166 209.657 151.528 210.206 152.093 210.324L208.431 222.027C208.537 222.044 208.637 222.052 208.735 222.043C209.182 222.004 209.567 221.681 209.663 221.218C209.781 220.653 209.418 220.103 208.853 219.985L152.516 208.282ZM118.854 57C120.83 57.2144 121.048 63.7115 138.308 80.2256C164.308 105.108 227.725 121.332 245.062 145.904C258.456 164.882 248.989 192.334 263.681 206.707C260.822 208.37 258.24 209.25 255.98 208.726C246.681 206.577 245.608 199.7 244.25 190.995C242.961 182.724 241.497 173.348 232.505 165.98C219.374 155.218 200.994 152.827 179.714 150.062C168.957 148.664 157.83 147.219 146.47 144.55C142.409 143.597 138.574 142.42 134.962 141.093C129.218 135.676 128.148 125.727 130.803 121.852C126.479 119.984 117.694 109.778 122.171 102.389C118.128 100.868 114.629 89.1011 118.179 82.835C113.329 77.4133 116.114 59.0558 118.854 57ZM138.04 191.65C137.475 191.532 136.926 191.899 136.813 192.464C136.701 193.028 137.062 193.577 137.627 193.69L137.622 193.691L201.845 206.693C201.946 206.711 202.046 206.718 202.144 206.709C202.596 206.669 202.982 206.343 203.077 205.879C203.19 205.314 202.827 204.765 202.263 204.652L138.04 191.65ZM125.147 174.518C124.583 174.405 124.035 174.772 123.922 175.337C123.809 175.901 124.176 176.45 124.74 176.563L192.075 190.016C192.171 190.033 192.271 190.04 192.369 190.031C192.821 189.992 193.205 189.66 193.301 189.196C193.413 188.632 193.047 188.084 192.482 187.971L125.147 174.518ZM111.413 155.837C110.848 155.719 110.299 156.082 110.181 156.646C110.063 157.211 110.425 157.761 110.99 157.879L110.985 157.884L183.515 172.871C183.621 172.888 183.721 172.894 183.819 172.886C184.271 172.846 184.656 172.519 184.752 172.056C184.87 171.491 184.507 170.941 183.942 170.823L111.413 155.837ZM133.877 95.4932C133.376 95.2125 132.738 95.3937 132.457 95.8945V95.8896C132.177 96.3903 132.358 97.0279 132.858 97.3086L221.206 146.782C221.393 146.891 221.601 146.932 221.804 146.914C222.136 146.885 222.45 146.7 222.627 146.387C222.907 145.886 222.725 145.247 222.224 144.967L133.877 95.4932ZM138.349 110.708C137.843 110.433 137.21 110.619 136.935 111.125C136.66 111.63 136.846 112.263 137.351 112.538L198.85 145.965C199.037 146.064 199.239 146.103 199.436 146.086C199.774 146.056 200.092 145.861 200.263 145.543L200.264 145.548C200.538 145.042 200.352 144.41 199.847 144.135L138.349 110.708ZM141.64 124.996C141.139 124.715 140.5 124.897 140.22 125.397C139.939 125.898 140.12 126.537 140.621 126.817L170.728 143.668C170.916 143.777 171.124 143.817 171.326 143.799C171.658 143.77 171.972 143.58 172.148 143.267C172.429 142.766 172.247 142.127 171.746 141.847L141.64 124.996Z", fill: "#F9FBFB" })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: "clip0_6077_1488", children: /* @__PURE__ */ jsx("rect", { width: 400, height: 400, fill: "white" }) }) })
|
|
107
|
+
] });
|
|
108
|
+
var logomark_red_default = SvgLogomarkRed;
|
|
109
|
+
var containerStyle = {
|
|
110
|
+
display: "flex",
|
|
111
|
+
justifyContent: "flex-end",
|
|
112
|
+
width: "auto",
|
|
113
|
+
position: "relative",
|
|
114
|
+
cursor: "pointer"
|
|
115
|
+
};
|
|
116
|
+
var dropdownStyle = {
|
|
117
|
+
position: "absolute",
|
|
118
|
+
top: "calc(100% + 8px)",
|
|
119
|
+
right: 0,
|
|
120
|
+
minWidth: 220,
|
|
121
|
+
backgroundColor: "#0f172a",
|
|
122
|
+
borderRadius: 0,
|
|
123
|
+
border: "1px solid rgba(148, 163, 184, 0.2)",
|
|
124
|
+
boxShadow: "0 20px 40px rgba(15, 23, 42, 0.45)",
|
|
125
|
+
padding: "8px 0"
|
|
126
|
+
};
|
|
127
|
+
var itemStyle = {
|
|
128
|
+
display: "flex",
|
|
129
|
+
alignItems: "center",
|
|
130
|
+
gap: 12,
|
|
131
|
+
padding: "10px 16px",
|
|
132
|
+
cursor: "pointer",
|
|
133
|
+
color: "#e2e8f0",
|
|
134
|
+
fontSize: 14
|
|
135
|
+
};
|
|
136
|
+
var iconWrapperStyle = {
|
|
137
|
+
width: 32,
|
|
138
|
+
height: 32,
|
|
139
|
+
display: "inline-flex",
|
|
140
|
+
alignItems: "center",
|
|
141
|
+
justifyContent: "center",
|
|
142
|
+
backgroundColor: "#"
|
|
143
|
+
};
|
|
144
|
+
function formatAddress(address) {
|
|
145
|
+
if (!address) return "Unknown";
|
|
146
|
+
if (address.length <= 8) return address;
|
|
147
|
+
return `${address.slice(0, 4)}...${address.slice(-4)}`;
|
|
148
|
+
}
|
|
149
|
+
function ThruAccountSwitcher() {
|
|
150
|
+
const { connect, isConnected, isConnecting, selectAccount } = useWallet();
|
|
151
|
+
const { accounts, selectedAccount } = useAccounts();
|
|
152
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
153
|
+
const containerRef = useRef(null);
|
|
154
|
+
const hasAccounts = accounts.length > 0;
|
|
155
|
+
const displayLabel = useMemo(() => {
|
|
156
|
+
if (isConnecting) return "Connecting...";
|
|
157
|
+
if (!isConnected || !hasAccounts) return "Connect";
|
|
158
|
+
return formatAddress(selectedAccount?.address ?? accounts[0]?.address);
|
|
159
|
+
}, [isConnecting, isConnected, hasAccounts, selectedAccount, accounts]);
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
if (!isOpen) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const handleClickOutside = (event) => {
|
|
165
|
+
if (!containerRef.current) return;
|
|
166
|
+
if (!containerRef.current.contains(event.target)) {
|
|
167
|
+
setIsOpen(false);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
171
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
172
|
+
}, [isOpen]);
|
|
173
|
+
useEffect(() => {
|
|
174
|
+
if (!isConnected) {
|
|
175
|
+
setIsOpen(false);
|
|
176
|
+
}
|
|
177
|
+
}, [isConnected]);
|
|
178
|
+
const handleToggle = useCallback(async () => {
|
|
179
|
+
if (isConnecting) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (!isConnected) {
|
|
183
|
+
try {
|
|
184
|
+
await connect();
|
|
185
|
+
} catch (error) {
|
|
186
|
+
console.error("[WalletLauncher] Failed to connect wallet:", error);
|
|
187
|
+
}
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
setIsOpen((prev) => !prev);
|
|
191
|
+
}, [connect, isConnected, isConnecting]);
|
|
192
|
+
const handleSelectAccount = useCallback(
|
|
193
|
+
async (account) => {
|
|
194
|
+
try {
|
|
195
|
+
await selectAccount(account);
|
|
196
|
+
} catch (error) {
|
|
197
|
+
console.error("[ThruAccountSwitcher] Failed to select account:", error);
|
|
198
|
+
} finally {
|
|
199
|
+
setIsOpen(false);
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
[selectAccount]
|
|
203
|
+
);
|
|
204
|
+
const buttonStyle = useMemo(() => {
|
|
205
|
+
const connected = isConnected && hasAccounts;
|
|
206
|
+
return {
|
|
207
|
+
position: "relative",
|
|
208
|
+
display: "flex",
|
|
209
|
+
alignItems: "center",
|
|
210
|
+
gap: 12,
|
|
211
|
+
padding: "10px 16px",
|
|
212
|
+
borderRadius: 0,
|
|
213
|
+
backgroundColor: connected ? "#0f172a" : "#1f2937",
|
|
214
|
+
color: connected ? "#f8fafc" : "#9ca3af",
|
|
215
|
+
cursor: isConnecting ? "wait" : "pointer",
|
|
216
|
+
userSelect: "none",
|
|
217
|
+
minWidth: 220,
|
|
218
|
+
border: isOpen ? "1px solid #3b82f6" : "1px solid rgba(148, 163, 184, 0.2)",
|
|
219
|
+
boxShadow: "0 12px 30px rgba(15, 23, 42, 0.35)",
|
|
220
|
+
transition: "border 120ms ease, box-shadow 120ms ease, background-color 120ms ease",
|
|
221
|
+
opacity: connected ? 1 : 0.85
|
|
222
|
+
};
|
|
223
|
+
}, [hasAccounts, isConnected, isConnecting, isOpen]);
|
|
224
|
+
const caretStyle = useMemo(
|
|
225
|
+
() => ({
|
|
226
|
+
marginLeft: "auto",
|
|
227
|
+
transform: isOpen ? "rotate(180deg)" : "rotate(0deg)",
|
|
228
|
+
transition: "transform 120ms ease",
|
|
229
|
+
color: isConnected && hasAccounts ? "#f8fafc" : "#9ca3af",
|
|
230
|
+
fontSize: 12
|
|
231
|
+
}),
|
|
232
|
+
[hasAccounts, isConnected, isOpen]
|
|
233
|
+
);
|
|
234
|
+
return /* @__PURE__ */ jsxs("div", { ref: containerRef, style: containerStyle, children: [
|
|
235
|
+
/* @__PURE__ */ jsxs("div", { style: buttonStyle, onClick: handleToggle, role: "button", "aria-haspopup": "listbox", "aria-expanded": isOpen, children: [
|
|
236
|
+
/* @__PURE__ */ jsx("span", { style: iconWrapperStyle, children: /* @__PURE__ */ jsx(logomark_red_default, { width: "100%", height: "100%" }) }),
|
|
237
|
+
/* @__PURE__ */ jsx("span", { style: { fontWeight: 600 }, children: displayLabel }),
|
|
238
|
+
/* @__PURE__ */ jsx("span", { style: caretStyle, children: "\u25BC" })
|
|
239
|
+
] }),
|
|
240
|
+
isOpen && isConnected && hasAccounts ? /* @__PURE__ */ jsx("div", { style: dropdownStyle, role: "listbox", children: accounts.map((account) => {
|
|
241
|
+
const isSelected = selectedAccount?.address === account.address && selectedAccount?.accountType === account.accountType;
|
|
242
|
+
return /* @__PURE__ */ jsxs(
|
|
243
|
+
"div",
|
|
244
|
+
{
|
|
245
|
+
role: "option",
|
|
246
|
+
"aria-selected": isSelected,
|
|
247
|
+
style: {
|
|
248
|
+
...itemStyle,
|
|
249
|
+
backgroundColor: isSelected ? "rgba(59, 130, 246, 0.15)" : "transparent",
|
|
250
|
+
color: isSelected ? "#f8fafc" : "#e2e8f0"
|
|
251
|
+
},
|
|
252
|
+
onClick: () => handleSelectAccount(account),
|
|
253
|
+
children: [
|
|
254
|
+
/* @__PURE__ */ jsx("span", { style: { ...iconWrapperStyle, width: 28, height: 28 }, children: /* @__PURE__ */ jsx(logomark_red_default, { width: 16, height: 16 }) }),
|
|
255
|
+
/* @__PURE__ */ jsx("span", { style: { fontFamily: "monospace" }, children: formatAddress(account.address) })
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
`${account.accountType}:${account.address}`
|
|
259
|
+
);
|
|
260
|
+
}) }) : null
|
|
261
|
+
] });
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export { ThruAccountSwitcher };
|
|
265
|
+
//# sourceMappingURL=react-ui.js.map
|
|
266
|
+
//# sourceMappingURL=react-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/ThruContext.ts","../src/react/hooks/useThru.ts","../src/react/hooks/useAccounts.ts","../src/react/hooks/useWallet.ts","../src/static/logomark_red.svg","../src/react-ui/ThruAccountSwitcher.tsx"],"names":["useEffect","jsx","useState","useRef","useMemo","useCallback","jsxs"],"mappings":"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","file":"react-ui.js","sourcesContent":["import { BrowserSDK } from \"../BrowserSDK\";\nimport type { WalletAccount } from \"../interfaces\";\nimport type { ManageAccountsResult } from \"../protocol\";\nimport { Thru } from \"@thru/sdk/client\";\nimport { createContext } from \"react\";\n\nexport interface ThruContextValue {\n wallet: BrowserSDK | null;\n isConnected: boolean;\n accounts: WalletAccount[];\n isConnecting: boolean;\n error: Error | null;\n thru: Thru | null;\n selectedAccount: WalletAccount | null;\n selectAccount: (account: WalletAccount) => Promise<void>;\n manageAccounts: () => Promise<ManageAccountsResult>;\n}\n\nconst defaultContextValue: ThruContextValue = {\n wallet: null,\n isConnected: false,\n accounts: [],\n isConnecting: false,\n error: null,\n thru: null,\n selectedAccount: null,\n selectAccount: async () => undefined,\n manageAccounts: async () => ({ accounts: [], selectedAccount: null }),\n};\n\nexport const ThruContext = createContext<ThruContextValue>(defaultContextValue);\n","import { useContext } from \"react\";\nimport { ThruContext } from \"../ThruContext\";\n\n/**\n * useThru - Access the Thru SDK context\n * Must be used within a ThruProvider\n */\nexport function useThru() {\n const context = useContext(ThruContext);\n return context;\n}","import type { WalletAccount } from '../../interfaces';\nimport { useEffect, useMemo } from 'react';\nimport { useThru } from './useThru';\n\nexport interface UseAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n isConnected: boolean;\n isConnecting: boolean;\n}\n\nexport interface UseAccountsOptions {\n onAccountSelect?: (account: WalletAccount) => void;\n}\n\n/**\n * useAccounts - Exposes connected wallet accounts and selection helpers.\n */\nexport function useAccounts(options?: UseAccountsOptions): UseAccountsResult {\n const { accounts, selectedAccount, isConnected, isConnecting } = useThru();\n const externalOnSelect = options?.onAccountSelect;\n\n useEffect(() => {\n if (selectedAccount) {\n externalOnSelect?.(selectedAccount);\n }\n }, [externalOnSelect, selectedAccount]);\n\n return useMemo(\n () => ({\n accounts,\n selectedAccount,\n isConnected,\n isConnecting,\n }),\n [accounts, selectedAccount, isConnected, isConnecting]\n );\n}\n","import { BrowserSDK, ConnectOptions } from '../../BrowserSDK';\nimport type { ConnectResult, IThruChain } from '../../interfaces';\nimport type { ManageAccountsResult } from '../../protocol';\nimport { useEffect, useRef } from 'react';\nimport { useThru } from './useThru';\n\nfunction waitForWallet(getWallet: () => BrowserSDK | null, timeout = 5000, interval = 100): Promise<BrowserSDK> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n const check = () => {\n const sdk = getWallet();\n if (sdk) return resolve(sdk);\n if (Date.now() - start > timeout) return reject(new Error('SDK not initialized in time'));\n setTimeout(check, interval);\n };\n check();\n });\n}\n\n/**\n * useThruChain - Hook for accessing the Thru chain API exposed by the Browser SDK.\n * Returns the chain instance (if available) and a boolean indicating readiness.\n */\nexport function useWallet() {\n const {\n wallet,\n isConnected,\n accounts,\n selectedAccount,\n selectAccount,\n manageAccounts,\n isConnecting,\n } = useThru();\n const walletRef = useRef(wallet);\n\n useEffect(() => {\n walletRef.current = wallet;\n }, [wallet]);\n\n const disconnect = async (): Promise<void> => {\n if (!wallet) {\n throw new Error('SDK not initialized');\n }\n await wallet.disconnect();\n };\n\n const connect = async (options?: ConnectOptions): Promise<ConnectResult> => {\n try {\n const readySdk =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n const result = await readySdk.connect(options);\n return result;\n } catch (err) {\n const error = err as Error;\n throw error;\n }\n };\n\n const mountInline = async (container: HTMLElement): Promise<void> => {\n const readySdk =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n await readySdk.mountInline(container);\n };\n\n const openAccountSettings = async (): Promise<ManageAccountsResult> => {\n return manageAccounts();\n };\n\n return {\n wallet: wallet?.thru as IThruChain | undefined,\n accounts,\n connect,\n disconnect,\n mountInline,\n manageAccounts: openAccountSettings,\n isConnected: isConnected && !!wallet,\n isConnecting,\n selectedAccount,\n selectAccount,\n };\n}\n","import * as React from \"react\";\nconst SvgLogomarkRed = props => <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 400 400\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><g clipPath=\"url(#clip0_6077_1488)\"><circle cx={200.001} cy={200} r={200} fill=\"#D33C43\" /><path d=\"M92.913 118.57C93.6389 118.015 98.9022 123.196 108.531 129.408C117.491 135.752 130.043 142.834 145.993 146.578C157.454 149.27 168.635 150.726 179.444 152.13C200.407 154.854 218.507 157.207 231.181 167.591C239.558 174.457 240.954 183.41 242.189 191.314C243.555 200.045 244.842 208.29 255.509 210.754C256.363 210.951 257.232 211.002 258.12 210.924C262.872 210.508 268.106 206.444 274.026 201.854C275.575 200.657 277.163 199.424 278.785 198.225C285.668 193.692 293.288 189.791 301.57 190.777C317.149 192.633 317.21 204.674 317.838 207.431L317.837 207.421C320.455 209.479 326.196 213.068 325.786 213.989C325.578 214.301 318.801 213.951 315.903 214.691C282.106 223.316 293.989 258.708 266.092 280.272C242.773 298.301 202.912 299.418 197.428 296.967C195.539 296.122 203.175 292.135 201.361 291.797C179.146 296.598 184.02 343.337 176.76 348.583C174.405 350.024 168.458 347.488 165.051 344.609C163.371 342.694 163.108 341.012 164.245 339.468C165.724 337.465 171.993 328.673 172.054 328.584C172.156 328.444 172.193 328.268 172.168 328.098C172.142 327.927 172.046 327.779 171.906 327.676C171.616 327.466 171.208 327.533 170.998 327.823L161.711 340.772C161.706 340.778 161.696 340.789 161.686 340.801C158.712 340.244 152.309 335.073 151.89 329.019C151.997 328.993 152.104 328.953 152.202 328.882L163.967 319.96C164.31 319.7 164.377 319.207 164.117 318.863C163.857 318.52 163.364 318.453 163.02 318.713L151.256 327.635C151.133 327.729 151.045 327.858 150.994 327.993C147.571 327.089 143.312 321.96 143.591 317.911C143.622 317.908 143.649 317.917 143.681 317.914C143.784 317.905 143.891 317.875 143.991 317.819L156.905 310.671C157.284 310.46 157.421 309.987 157.21 309.607C156.999 309.228 156.527 309.092 156.147 309.303L143.233 316.451C143.133 316.502 143.056 316.577 142.99 316.661C140.709 315.657 137.269 310.975 137.907 307.617C137.955 307.623 137.997 307.63 138.044 307.626C138.127 307.619 138.214 307.601 138.295 307.562L152.454 301.252C152.847 301.076 153.026 300.611 152.85 300.218C152.675 299.825 152.209 299.646 151.816 299.821L137.657 306.132C137.547 306.183 137.454 306.259 137.378 306.35C134.141 304.524 130.647 297.984 132.475 293.694C132.48 293.694 132.489 293.694 132.491 293.693C132.501 293.693 132.52 293.691 132.522 293.69L149.014 290.274C149.363 290.202 149.589 289.857 149.516 289.503C149.481 289.333 149.378 289.186 149.228 289.089C149.084 288.997 148.914 288.964 148.745 289C148.617 289.027 135.795 291.718 135.243 291.819C132.961 292.234 131.936 292.13 130.785 290.582C128.663 286.968 126.869 280.279 128.521 278.764C134.974 272.599 165.939 286.69 180.264 276.822C189.479 270.474 198.395 257.824 211.315 250.994C184.067 246.663 163.004 243.22 156.847 224.222C141.919 225.036 135.547 212.453 134.865 207.948C120.603 206.202 119.126 193.745 119.81 189.121C111.6 188.897 103.78 177.335 106.088 166.87C101.413 166.018 95.9124 155.183 98.2948 146.941C89.0608 140.637 90.2634 119.99 92.913 118.57ZM168.519 226.037C167.95 225.93 167.407 226.297 167.294 226.861C167.186 227.426 167.553 227.974 168.118 228.087L215.935 237.459C216.036 237.476 216.136 237.483 216.229 237.475C216.681 237.435 217.071 237.103 217.161 236.635C217.269 236.071 216.901 235.522 216.337 235.409L168.519 226.037ZM203.915 170.233C202.344 169.926 200.771 170.372 199.594 171.453C198.417 172.535 197.839 174.067 198.01 175.659C198.347 178.796 200.652 181.331 203.738 181.972L207.528 182.76C207.326 182.898 207.124 183.052 206.94 183.22C205.763 184.301 205.186 185.833 205.356 187.425C205.694 190.562 207.998 193.098 211.084 193.738L214.837 194.519C214.619 194.663 214.407 194.818 214.214 194.997C213.037 196.079 212.459 197.611 212.63 199.202C212.967 202.339 215.272 204.875 218.358 205.516L222.148 206.304C221.946 206.442 221.744 206.591 221.56 206.764C220.383 207.845 219.806 209.377 219.976 210.969C220.314 214.106 222.619 216.641 225.705 217.281L229.511 218.074C229.283 218.225 229.067 218.385 228.863 218.57C227.686 219.652 227.109 221.184 227.279 222.775C227.616 225.912 229.921 228.447 233.008 229.088L248.141 232.229C248.215 232.243 248.294 232.247 248.366 232.24C248.704 232.211 248.991 231.966 249.065 231.619L249.101 231.61C249.19 231.184 248.918 230.773 248.497 230.685L233.364 227.545C230.939 227.04 229.137 225.051 228.87 222.594C228.754 221.5 229.148 220.451 229.957 219.71C230.761 218.97 231.844 218.666 232.92 218.875L240.906 220.432C241.331 220.51 241.742 220.238 241.825 219.812C241.898 219.445 241.694 219.081 241.357 218.942C241.303 218.916 241.243 218.895 241.184 218.885L226.052 215.744C223.626 215.239 221.825 213.251 221.557 210.794C221.441 209.7 221.84 208.649 222.644 207.909C223.448 207.169 224.532 206.865 225.607 207.074L230.398 208.005L233.517 208.653C233.592 208.668 233.67 208.671 233.743 208.665C233.795 208.661 233.845 208.641 233.896 208.626C233.902 208.626 233.907 208.624 233.912 208.624C233.943 208.616 233.969 208.614 233.994 208.602C234.248 208.517 234.454 208.299 234.508 208.018C234.591 207.592 234.315 207.181 233.889 207.098L230.683 206.473L218.695 203.984C216.27 203.48 214.469 201.491 214.201 199.034C214.084 197.94 214.479 196.89 215.288 196.149C216.092 195.409 217.175 195.105 218.251 195.314L225.21 196.668L226.227 196.877C226.302 196.891 226.38 196.895 226.453 196.889C226.723 196.865 226.96 196.698 227.08 196.452C227.107 196.403 227.123 196.349 227.14 196.295C227.144 196.284 227.153 196.278 227.152 196.268V196.257C227.152 196.252 227.151 196.248 227.151 196.247C227.234 195.821 226.957 195.41 226.531 195.327L225.493 195.125L211.405 192.202C208.98 191.697 207.178 189.709 206.911 187.252C206.794 186.158 207.189 185.108 207.998 184.367C208.802 183.627 209.885 183.323 210.961 183.532L215.768 184.468L218.871 185.112C218.945 185.127 219.024 185.13 219.097 185.124C219.148 185.119 219.199 185.099 219.25 185.084C219.255 185.084 219.266 185.082 219.271 185.082C219.297 185.075 219.323 185.072 219.348 185.06C219.602 184.975 219.809 184.763 219.862 184.476C219.945 184.05 219.668 183.64 219.242 183.557L216.058 182.935L204.055 180.442C201.634 179.937 199.833 177.949 199.565 175.491C199.449 174.397 199.843 173.347 200.652 172.606C201.456 171.866 202.54 171.562 203.615 171.771L211.601 173.329C212.027 173.407 212.437 173.135 212.52 172.709C212.603 172.283 212.327 171.873 211.901 171.79L203.915 170.233ZM152.516 208.282C151.957 208.164 151.402 208.527 151.284 209.092C151.166 209.657 151.528 210.206 152.093 210.324L208.431 222.027C208.537 222.044 208.637 222.052 208.735 222.043C209.182 222.004 209.567 221.681 209.663 221.218C209.781 220.653 209.418 220.103 208.853 219.985L152.516 208.282ZM118.854 57C120.83 57.2144 121.048 63.7115 138.308 80.2256C164.308 105.108 227.725 121.332 245.062 145.904C258.456 164.882 248.989 192.334 263.681 206.707C260.822 208.37 258.24 209.25 255.98 208.726C246.681 206.577 245.608 199.7 244.25 190.995C242.961 182.724 241.497 173.348 232.505 165.98C219.374 155.218 200.994 152.827 179.714 150.062C168.957 148.664 157.83 147.219 146.47 144.55C142.409 143.597 138.574 142.42 134.962 141.093C129.218 135.676 128.148 125.727 130.803 121.852C126.479 119.984 117.694 109.778 122.171 102.389C118.128 100.868 114.629 89.1011 118.179 82.835C113.329 77.4133 116.114 59.0558 118.854 57ZM138.04 191.65C137.475 191.532 136.926 191.899 136.813 192.464C136.701 193.028 137.062 193.577 137.627 193.69L137.622 193.691L201.845 206.693C201.946 206.711 202.046 206.718 202.144 206.709C202.596 206.669 202.982 206.343 203.077 205.879C203.19 205.314 202.827 204.765 202.263 204.652L138.04 191.65ZM125.147 174.518C124.583 174.405 124.035 174.772 123.922 175.337C123.809 175.901 124.176 176.45 124.74 176.563L192.075 190.016C192.171 190.033 192.271 190.04 192.369 190.031C192.821 189.992 193.205 189.66 193.301 189.196C193.413 188.632 193.047 188.084 192.482 187.971L125.147 174.518ZM111.413 155.837C110.848 155.719 110.299 156.082 110.181 156.646C110.063 157.211 110.425 157.761 110.99 157.879L110.985 157.884L183.515 172.871C183.621 172.888 183.721 172.894 183.819 172.886C184.271 172.846 184.656 172.519 184.752 172.056C184.87 171.491 184.507 170.941 183.942 170.823L111.413 155.837ZM133.877 95.4932C133.376 95.2125 132.738 95.3937 132.457 95.8945V95.8896C132.177 96.3903 132.358 97.0279 132.858 97.3086L221.206 146.782C221.393 146.891 221.601 146.932 221.804 146.914C222.136 146.885 222.45 146.7 222.627 146.387C222.907 145.886 222.725 145.247 222.224 144.967L133.877 95.4932ZM138.349 110.708C137.843 110.433 137.21 110.619 136.935 111.125C136.66 111.63 136.846 112.263 137.351 112.538L198.85 145.965C199.037 146.064 199.239 146.103 199.436 146.086C199.774 146.056 200.092 145.861 200.263 145.543L200.264 145.548C200.538 145.042 200.352 144.41 199.847 144.135L138.349 110.708ZM141.64 124.996C141.139 124.715 140.5 124.897 140.22 125.397C139.939 125.898 140.12 126.537 140.621 126.817L170.728 143.668C170.916 143.777 171.124 143.817 171.326 143.799C171.658 143.77 171.972 143.58 172.148 143.267C172.429 142.766 172.247 142.127 171.746 141.847L141.64 124.996Z\" fill=\"#F9FBFB\" /></g><defs><clipPath id=\"clip0_6077_1488\"><rect width={400} height={400} fill=\"white\" /></clipPath></defs></svg>;\nexport default SvgLogomarkRed;","'use client';\n\nimport { useAccounts, useWallet } from '../react';\nimport type { CSSProperties } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport Logo from '../static/logomark_red.svg';\n\nconst containerStyle: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n width: 'auto',\n position: 'relative',\n cursor: 'pointer'\n};\n\nconst dropdownStyle: CSSProperties = {\n position: 'absolute',\n top: 'calc(100% + 8px)',\n right: 0,\n minWidth: 220,\n backgroundColor: '#0f172a',\n borderRadius: 0,\n border: '1px solid rgba(148, 163, 184, 0.2)',\n boxShadow: '0 20px 40px rgba(15, 23, 42, 0.45)',\n padding: '8px 0',\n};\n\nconst itemStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: '10px 16px',\n cursor: 'pointer',\n color: '#e2e8f0',\n fontSize: 14,\n};\n\nconst iconWrapperStyle: CSSProperties = {\n width: 32,\n height: 32,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#'\n};\n\nfunction formatAddress(address: string | undefined): string {\n if (!address) return 'Unknown';\n if (address.length <= 8) return address;\n return `${address.slice(0, 4)}...${address.slice(-4)}`;\n}\n\nexport function ThruAccountSwitcher() {\n const { connect, isConnected, isConnecting, selectAccount } = useWallet();\n const { accounts, selectedAccount } = useAccounts();\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const hasAccounts = accounts.length > 0;\n const displayLabel = useMemo(() => {\n if (isConnecting) return 'Connecting...';\n if (!isConnected || !hasAccounts) return 'Connect';\n return formatAddress(selectedAccount?.address ?? accounts[0]?.address);\n }, [isConnecting, isConnected, hasAccounts, selectedAccount, accounts]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handleClickOutside = (event: MouseEvent) => {\n if (!containerRef.current) return;\n if (!containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isConnected) {\n setIsOpen(false);\n }\n }, [isConnected]);\n\n const handleToggle = useCallback(async () => {\n if (isConnecting) {\n return;\n }\n\n if (!isConnected) {\n try {\n await connect();\n } catch (error) {\n console.error('[WalletLauncher] Failed to connect wallet:', error);\n }\n return;\n }\n\n setIsOpen((prev) => !prev);\n }, [connect, isConnected, isConnecting]);\n\n const handleSelectAccount = useCallback(\n async (account: (typeof accounts)[number]) => {\n try {\n await selectAccount(account);\n } catch (error) {\n console.error('[ThruAccountSwitcher] Failed to select account:', error);\n } finally {\n setIsOpen(false);\n }\n },\n [selectAccount]\n );\n\n const buttonStyle: CSSProperties = useMemo(() => {\n const connected = isConnected && hasAccounts;\n return {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: '10px 16px',\n borderRadius: 0,\n backgroundColor: connected ? '#0f172a' : '#1f2937',\n color: connected ? '#f8fafc' : '#9ca3af',\n cursor: isConnecting ? 'wait' : 'pointer',\n userSelect: 'none',\n minWidth: 220,\n border: isOpen ? '1px solid #3b82f6' : '1px solid rgba(148, 163, 184, 0.2)',\n boxShadow: '0 12px 30px rgba(15, 23, 42, 0.35)',\n transition: 'border 120ms ease, box-shadow 120ms ease, background-color 120ms ease',\n opacity: connected ? 1 : 0.85,\n } satisfies CSSProperties;\n }, [hasAccounts, isConnected, isConnecting, isOpen]);\n\n const caretStyle: CSSProperties = useMemo(\n () => ({\n marginLeft: 'auto',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 120ms ease',\n color: isConnected && hasAccounts ? '#f8fafc' : '#9ca3af',\n fontSize: 12,\n }),\n [hasAccounts, isConnected, isOpen]\n );\n\n return (\n <div ref={containerRef} style={containerStyle}>\n <div style={buttonStyle} onClick={handleToggle} role=\"button\" aria-haspopup=\"listbox\" aria-expanded={isOpen}>\n <span style={iconWrapperStyle}>\n <Logo width={'100%'} height={'100%'} />\n </span>\n <span style={{ fontWeight: 600 }}>{displayLabel}</span>\n <span style={caretStyle}>▼</span>\n </div>\n {isOpen && isConnected && hasAccounts ? (\n <div style={dropdownStyle} role=\"listbox\">\n {accounts.map((account) => {\n const isSelected =\n selectedAccount?.address === account.address && selectedAccount?.accountType === account.accountType;\n return (\n <div\n key={`${account.accountType}:${account.address}`}\n role=\"option\"\n aria-selected={isSelected}\n style={{\n ...itemStyle,\n backgroundColor: isSelected ? 'rgba(59, 130, 246, 0.15)' : 'transparent',\n color: isSelected ? '#f8fafc' : '#e2e8f0',\n }}\n onClick={() => handleSelectAccount(account)}\n >\n <span style={{ ...iconWrapperStyle, width: 28, height: 28 }}>\n <Logo width={16} height={16} />\n </span>\n <span style={{ fontFamily: 'monospace' }}>{formatAddress(account.address)}</span>\n </div>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n"]}
|