@pooflabs/web 0.0.81-rc2 → 0.0.81

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.
Files changed (81) hide show
  1. package/dist/auth/index.d.ts +10 -1
  2. package/dist/auth/providers/phantom-wallet-provider.d.ts +20 -21
  3. package/dist/global.d.ts +3 -1
  4. package/dist/{index-DHm4usay.js → index-B2WGCssJ.js} +347 -414
  5. package/dist/index-B2WGCssJ.js.map +1 -0
  6. package/dist/{index-CHqM9n4K.esm.js → index-CjHbp7Dq.esm.js} +3697 -562
  7. package/dist/index-CjHbp7Dq.esm.js.map +1 -0
  8. package/dist/{index-CL4JIAAR.js → index-DXPkkq81.js} +3698 -563
  9. package/dist/index-DXPkkq81.js.map +1 -0
  10. package/dist/{index-BjlCinic.js → index-D_DiP8XQ.js} +3698 -563
  11. package/dist/index-D_DiP8XQ.js.map +1 -0
  12. package/dist/{index-DCo85UGg.esm.js → index-dcJIjFrs.esm.js} +3697 -562
  13. package/dist/index-dcJIjFrs.esm.js.map +1 -0
  14. package/dist/{index-Bx_lLXRT.esm.js → index-nt_HQVrk.esm.js} +345 -414
  15. package/dist/index-nt_HQVrk.esm.js.map +1 -0
  16. package/dist/{index.browser-7dDfRU5G.esm.js → index.browser-BNdFfyIg.esm.js} +1571 -1368
  17. package/dist/index.browser-BNdFfyIg.esm.js.map +1 -0
  18. package/dist/{index.browser-CmlqbyPr.js → index.browser-CT6PUv9G.js} +1571 -1368
  19. package/dist/index.browser-CT6PUv9G.js.map +1 -0
  20. package/dist/index.browser-Cy21yaX0.esm.js +1096 -0
  21. package/dist/index.browser-Cy21yaX0.esm.js.map +1 -0
  22. package/dist/index.browser-OvGNsMPu.esm.js +1002 -0
  23. package/dist/index.browser-OvGNsMPu.esm.js.map +1 -0
  24. package/dist/index.browser-ZD7Tz2bn.js +1099 -0
  25. package/dist/index.browser-ZD7Tz2bn.js.map +1 -0
  26. package/dist/index.browser-d0PlOXpF.js +105 -0
  27. package/dist/index.browser-d0PlOXpF.js.map +1 -0
  28. package/dist/index.browser-pE1s68e9.esm.js +102 -0
  29. package/dist/index.browser-pE1s68e9.esm.js.map +1 -0
  30. package/dist/index.browser-vuTr40so.js +1008 -0
  31. package/dist/index.browser-vuTr40so.js.map +1 -0
  32. package/dist/index.d.ts +1 -0
  33. package/dist/index.esm.js +1 -1
  34. package/dist/index.js +1 -1
  35. package/dist/{index.native-TLhfXfe6.esm.js → index.native-BqYr--vb.esm.js} +202 -178
  36. package/dist/index.native-BqYr--vb.esm.js.map +1 -0
  37. package/dist/{index.native-DJA9_K3i.js → index.native-CyA-RdvW.js} +204 -178
  38. package/dist/index.native-CyA-RdvW.js.map +1 -0
  39. package/dist/index.native.esm.js +1 -1
  40. package/dist/index.native.js +1 -1
  41. package/dist/{phantom-wallet-provider-BegJFoWW.js → phantom-wallet-provider-DWCaMkyz.js} +148 -192
  42. package/dist/phantom-wallet-provider-DWCaMkyz.js.map +1 -0
  43. package/dist/{phantom-wallet-provider-DzUAMhbm.esm.js → phantom-wallet-provider-K2V96G-G.esm.js} +148 -192
  44. package/dist/phantom-wallet-provider-K2V96G-G.esm.js.map +1 -0
  45. package/dist/{privy-wallet-provider-Du-QHaaG.js → privy-wallet-provider-BMg_S_d0.js} +4 -4
  46. package/dist/privy-wallet-provider-BMg_S_d0.js.map +1 -0
  47. package/dist/{privy-wallet-provider-BspbiyOr.esm.js → privy-wallet-provider-DoX8q99w.esm.js} +4 -4
  48. package/dist/privy-wallet-provider-DoX8q99w.esm.js.map +1 -0
  49. package/dist/{solana-mobile-wallet-provider-Bh7SBFpQ.esm.js → solana-mobile-wallet-provider-Cmphb3oB.esm.js} +3 -52
  50. package/dist/solana-mobile-wallet-provider-Cmphb3oB.esm.js.map +1 -0
  51. package/dist/{solana-mobile-wallet-provider-DPp4SYem.js → solana-mobile-wallet-provider-t22Ie8lY.js} +3 -52
  52. package/dist/solana-mobile-wallet-provider-t22Ie8lY.js.map +1 -0
  53. package/package.json +3 -3
  54. package/dist/index-BjlCinic.js.map +0 -1
  55. package/dist/index-Bx_lLXRT.esm.js.map +0 -1
  56. package/dist/index-CHqM9n4K.esm.js.map +0 -1
  57. package/dist/index-CL4JIAAR.js.map +0 -1
  58. package/dist/index-DCo85UGg.esm.js.map +0 -1
  59. package/dist/index-DHm4usay.js.map +0 -1
  60. package/dist/index.browser-7dDfRU5G.esm.js.map +0 -1
  61. package/dist/index.browser-Bg_-PAgT.esm.js +0 -1250
  62. package/dist/index.browser-Bg_-PAgT.esm.js.map +0 -1
  63. package/dist/index.browser-C-_FEr5M.esm.js +0 -1134
  64. package/dist/index.browser-C-_FEr5M.esm.js.map +0 -1
  65. package/dist/index.browser-CmlqbyPr.js.map +0 -1
  66. package/dist/index.browser-CxXQ2RhF.js +0 -122
  67. package/dist/index.browser-CxXQ2RhF.js.map +0 -1
  68. package/dist/index.browser-DjEZSiqI.js +0 -1137
  69. package/dist/index.browser-DjEZSiqI.js.map +0 -1
  70. package/dist/index.browser-DuVkpEzB.js +0 -1253
  71. package/dist/index.browser-DuVkpEzB.js.map +0 -1
  72. package/dist/index.browser-xJkO73vw.esm.js +0 -119
  73. package/dist/index.browser-xJkO73vw.esm.js.map +0 -1
  74. package/dist/index.native-DJA9_K3i.js.map +0 -1
  75. package/dist/index.native-TLhfXfe6.esm.js.map +0 -1
  76. package/dist/phantom-wallet-provider-BegJFoWW.js.map +0 -1
  77. package/dist/phantom-wallet-provider-DzUAMhbm.esm.js.map +0 -1
  78. package/dist/privy-wallet-provider-BspbiyOr.esm.js.map +0 -1
  79. package/dist/privy-wallet-provider-Du-QHaaG.js.map +0 -1
  80. package/dist/solana-mobile-wallet-provider-Bh7SBFpQ.esm.js.map +0 -1
  81. package/dist/solana-mobile-wallet-provider-DPp4SYem.js.map +0 -1
@@ -22,6 +22,21 @@ function _interopNamespaceDefault(e) {
22
22
  return Object.freeze(n);
23
23
  }
24
24
 
25
+ function _mergeNamespaces(n, m) {
26
+ m.forEach(function (e) {
27
+ e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {
28
+ if (k !== 'default' && !(k in n)) {
29
+ var d = Object.getOwnPropertyDescriptor(e, k);
30
+ Object.defineProperty(n, k, d.get ? d : {
31
+ enumerable: true,
32
+ get: function () { return e[k]; }
33
+ });
34
+ }
35
+ });
36
+ });
37
+ return Object.freeze(n);
38
+ }
39
+
25
40
  var anchor__namespace = /*#__PURE__*/_interopNamespaceDefault(anchor);
26
41
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React$2);
27
42
 
@@ -9468,11 +9483,11 @@ function requireSrc () {
9468
9483
  }
9469
9484
 
9470
9485
  var bs58$1;
9471
- var hasRequiredBs58;
9486
+ var hasRequiredBs58$1;
9472
9487
 
9473
- function requireBs58 () {
9474
- if (hasRequiredBs58) return bs58$1;
9475
- hasRequiredBs58 = 1;
9488
+ function requireBs58$1 () {
9489
+ if (hasRequiredBs58$1) return bs58$1;
9490
+ hasRequiredBs58$1 = 1;
9476
9491
  var basex = requireSrc();
9477
9492
  var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
9478
9493
 
@@ -9480,8 +9495,8 @@ function requireBs58 () {
9480
9495
  return bs58$1;
9481
9496
  }
9482
9497
 
9483
- var bs58Exports = requireBs58();
9484
- var bs58$2 = /*@__PURE__*/getDefaultExportFromCjs(bs58Exports);
9498
+ var bs58Exports$1 = requireBs58$1();
9499
+ var bs58$2 = /*@__PURE__*/getDefaultExportFromCjs(bs58Exports$1);
9485
9500
 
9486
9501
  // ─────────────────────────────────────────────────────────────
9487
9502
  // Local implementation of getSimulationComputeUnits
@@ -10127,40 +10142,17 @@ async function getConfig() {
10127
10142
  return clientConfig;
10128
10143
  }
10129
10144
 
10130
- /******************************************************************************
10131
- Copyright (c) Microsoft Corporation.
10132
-
10133
- Permission to use, copy, modify, and/or distribute this software for any
10134
- purpose with or without fee is hereby granted.
10135
-
10136
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10137
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10138
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
10139
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
10140
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
10141
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
10142
- PERFORMANCE OF THIS SOFTWARE.
10143
- ***************************************************************************** */
10144
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
10145
-
10146
-
10147
- function __rest(s, e) {
10148
- var t = {};
10149
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
10150
- t[p] = s[p];
10151
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
10152
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10153
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
10154
- t[p[i]] = s[p[i]];
10155
- }
10156
- return t;
10157
- }
10158
-
10159
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
10160
- var e = new Error(message);
10161
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
10145
+ var __rest = function (s, e) {
10146
+ var t = {};
10147
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
10148
+ t[p] = s[p];
10149
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
10150
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10151
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
10152
+ t[p[i]] = s[p[i]];
10153
+ }
10154
+ return t;
10162
10155
  };
10163
-
10164
10156
  /**
10165
10157
  * Thrown when a user's wallet doesn't have enough SOL to cover the transaction.
10166
10158
  * Apps can catch this to trigger an onramp/funding flow.
@@ -12981,7 +12973,7 @@ async function getAuthProvider(config) {
12981
12973
  }
12982
12974
  return currentAuthProvider;
12983
12975
  }
12984
- async function login$1() {
12976
+ async function login$1(options) {
12985
12977
  // Re-initialize provider if it was cleared by logout
12986
12978
  if (!currentAuthProvider && initConfig) {
12987
12979
  currentAuthProvider = await getAuthProvider(initConfig);
@@ -12994,6 +12986,14 @@ async function login$1() {
12994
12986
  if (!currentAuthProvider) {
12995
12987
  throw new Error("Auth provider not initialized. Please call init() first.");
12996
12988
  }
12989
+ // Forward per-call overrides to providers that support them (duck-typed to stay
12990
+ // lazy-load safe — no direct import of PhantomWalletProvider here).
12991
+ // Always call (even with null) so previous overrides are cleared when this
12992
+ // login() is invoked without options — early-return paths inside the provider
12993
+ // bypass the .finally() cleanup, so we reset here too.
12994
+ if (typeof currentAuthProvider.setLoginOverrides === 'function') {
12995
+ currentAuthProvider.setLoginOverrides(options !== null && options !== void 0 ? options : null);
12996
+ }
12997
12997
  const loginResult = await currentAuthProvider.login();
12998
12998
  if (loginResult) {
12999
12999
  // Store which auth method was used so we restore the right provider on reload
@@ -13076,11 +13076,11 @@ function setAuthLoading(loading) {
13076
13076
  function getAuthLoading() {
13077
13077
  return isAuthLoading;
13078
13078
  }
13079
- async function login() {
13079
+ async function login(options) {
13080
13080
  if (!authProviderInstance) {
13081
13081
  throw new Error('SDK not initialized. Please call init() first.');
13082
13082
  }
13083
- const loggedInUser = await login$1();
13083
+ const loggedInUser = await login$1(options);
13084
13084
  setCurrentUser(loggedInUser);
13085
13085
  return currentUser;
13086
13086
  }
@@ -15669,7 +15669,7 @@ async function loadDependencies() {
15669
15669
  const [reactModule, reactDomModule, phantomModule] = await Promise.all([
15670
15670
  import('react'),
15671
15671
  import('react-dom/client'),
15672
- Promise.resolve().then(function () { return require('./index-CL4JIAAR.js'); })
15672
+ Promise.resolve().then(function () { return require('./index-DXPkkq81.js'); })
15673
15673
  ]);
15674
15674
  // Extract default export from ESM module namespace
15675
15675
  // Dynamic import() returns { default: Module, ...exports }, not the module directly
@@ -15681,6 +15681,10 @@ async function loadDependencies() {
15681
15681
  return loadingPromise;
15682
15682
  }
15683
15683
  class PhantomWalletProvider {
15684
+ /** Temporarily override modal appearance for a single login() call. Cleared automatically after login settles. */
15685
+ setLoginOverrides(opts) {
15686
+ this.loginOverrides = opts;
15687
+ }
15684
15688
  constructor(networkUrl = null, config = {}) {
15685
15689
  this.containerElement = null;
15686
15690
  this.root = null;
@@ -15690,6 +15694,7 @@ class PhantomWalletProvider {
15690
15694
  this.loginInProgress = false;
15691
15695
  this.autoLoginInProgress = false;
15692
15696
  this.initPromise = null;
15697
+ this.loginOverrides = null;
15693
15698
  /** Callback to swap to a Privy provider when the user clicks "Log in with email" */
15694
15699
  this.onSwitchToPrivy = null;
15695
15700
  /** Callback to swap to a Mobile Wallet Adapter provider when the user clicks "Connect Mobile Wallet" */
@@ -15712,13 +15717,8 @@ class PhantomWalletProvider {
15712
15717
  async initializeAsync() {
15713
15718
  // Lazy load dependencies only when actually instantiating
15714
15719
  await loadDependencies();
15715
- // Initialize React component eagerly only when there's a real reason to
15716
- // (URL callback to consume, prior session to restore, in-page wallet,
15717
- // or non-Android). Otherwise defer until ensureReady() is reached from
15718
- // a user-gesture flow. See shouldMountEagerly() for the rationale.
15719
- if (this.shouldMountEagerly()) {
15720
- this.initialize();
15721
- }
15720
+ // Initialize React component
15721
+ this.initialize();
15722
15722
  }
15723
15723
  /**
15724
15724
  * Check if social login providers are configured (non-injected providers).
@@ -15726,69 +15726,6 @@ class PhantomWalletProvider {
15726
15726
  hasSocialProviders() {
15727
15727
  return this.resolvedProviders.some(p => p !== 'injected');
15728
15728
  }
15729
- /**
15730
- * Decide whether to mount the @phantom/react-sdk <PhantomProvider> tree
15731
- * eagerly during init() or defer until the first user-triggered call
15732
- * (login / sign / etc.) reaches ensureReady().
15733
- *
15734
- * Mounting the React tree synchronously constructs BrowserSDK, which runs
15735
- * wallet-standard discovery in its constructor and fires sdk.autoConnect()
15736
- * in a useEffect on mount. On Solana Seeker (Android Chrome PWA), both
15737
- * pathways probe the Android intent surface to discover the Phantom mobile
15738
- * app, which surfaces Chrome's system "wants to access other apps and
15739
- * services" permission dialog *before* the PWA activity has window focus.
15740
- * The dialog renders with grayed-out buttons until the user backgrounds
15741
- * and resumes the app.
15742
- *
15743
- * Returns true when eager mount is needed (callback to handle, prior
15744
- * session, in-page wallet present, or non-Android). Otherwise returns
15745
- * false — the React tree is mounted lazily inside ensureReady() once a
15746
- * user gesture brings us there.
15747
- */
15748
- shouldMountEagerly() {
15749
- if (typeof window === 'undefined')
15750
- return false;
15751
- // Preserve desktop behavior: always mount eagerly.
15752
- if (!detectAndroid())
15753
- return true;
15754
- // In-page wallet present (Phantom in-app browser / desktop extension on
15755
- // a desktop-mode Android UA): no Android intent probe needed, mount free.
15756
- // Tighten beyond truthy `window.phantom` since arbitrary stubs can land
15757
- // on that key — require a wallet-shaped surface.
15758
- const ph = window.phantom;
15759
- if (ph && (ph.solana || ph.ethereum || ph.app))
15760
- return true;
15761
- // Returning from a Phantom redirect (OAuth or deeplink hop). SDK must
15762
- // be live to read these URL params via urlParamsAccessor.
15763
- const callbackKeys = ['session_id', 'wallet_id', 'selected_account_index', 'error', 'error_description'];
15764
- try {
15765
- const params = new URLSearchParams(window.location.search);
15766
- if (callbackKeys.some(k => params.has(k)))
15767
- return true;
15768
- }
15769
- catch (_a) {
15770
- return true; // conservative on URL access failure
15771
- }
15772
- // Returning user with a stored Phantom session. They've already
15773
- // approved the Android intent permission for this origin on first
15774
- // login, so the dialog is typically pre-granted by Chrome — eager
15775
- // mount lets autoConnect silently restore the wallet handshake.
15776
- // Require BOTH the marker AND a session storage entry so a stale
15777
- // orphaned marker doesn't keep eager-mounting forever. Note
15778
- // isAuthenticated() is a raw key-existence check, not a validity
15779
- // check — restoreSession() above clears the marker on the next load
15780
- // if the session is unusable, so the bug self-corrects after at
15781
- // most one further cold start.
15782
- try {
15783
- const stored = getPlatform().storage.getItem('tarobase_last_auth_method');
15784
- if (stored === 'phantom' && WebSessionManager.isAuthenticated())
15785
- return true;
15786
- }
15787
- catch (_b) {
15788
- return true;
15789
- }
15790
- return false;
15791
- }
15792
15729
  static getInstance(networkUrl, config) {
15793
15730
  if (!PhantomWalletProvider.instance) {
15794
15731
  new PhantomWalletProvider(networkUrl, config);
@@ -15864,7 +15801,7 @@ class PhantomWalletProvider {
15864
15801
  const sdkProviders = this.resolvedProviders.length > 0 ? [...this.resolvedProviders] : ['injected'];
15865
15802
  // Inner component that uses hooks
15866
15803
  const PhantomHooksComponent = () => {
15867
- var _a, _b;
15804
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
15868
15805
  const phantom = usePhantom();
15869
15806
  const { connect, error: connectError } = useConnect();
15870
15807
  const { disconnect, isDisconnecting } = useDisconnect();
@@ -16149,20 +16086,11 @@ class PhantomWalletProvider {
16149
16086
  const handleMobileWalletClick = async () => {
16150
16087
  that.loginInProgress = false;
16151
16088
  walletClickedRef.current = true;
16152
- // Don't close the wallet modal yet. On Android Chrome PWA,
16153
- // closing the modal here triggers a React commit and a focus
16154
- // transition that races MWA's transact() opening a localhost
16155
- // WebSocket. Chrome's "Apps on Device" / Local Network Access
16156
- // permission dialog spawns inheriting the activity's focus
16157
- // state at that moment — and the in-transit focus produces a
16158
- // dialog with grayed-out Allow/Block buttons. Keep the modal
16159
- // mounted through MWA login so focus is stable when the
16160
- // system dialog spawns; close it after login resolves.
16089
+ setShowWalletModal(false);
16161
16090
  if (that.onSwitchToMWA) {
16162
16091
  try {
16163
16092
  const mwaProvider = await that.onSwitchToMWA();
16164
16093
  const user = await mwaProvider.login();
16165
- setShowWalletModal(false);
16166
16094
  if (that.pendingLogin && user) {
16167
16095
  that.pendingLogin.resolve(user);
16168
16096
  that.pendingLogin = null;
@@ -16173,16 +16101,12 @@ class PhantomWalletProvider {
16173
16101
  }
16174
16102
  }
16175
16103
  catch (error) {
16176
- setShowWalletModal(false);
16177
16104
  if (that.pendingLogin) {
16178
16105
  that.pendingLogin.reject(error);
16179
16106
  that.pendingLogin = null;
16180
16107
  }
16181
16108
  }
16182
16109
  }
16183
- else {
16184
- setShowWalletModal(false);
16185
- }
16186
16110
  };
16187
16111
  const handleCloseModal = () => {
16188
16112
  setShowWalletModal(false);
@@ -16196,31 +16120,59 @@ class PhantomWalletProvider {
16196
16120
  if (!showWalletModal) {
16197
16121
  return null;
16198
16122
  }
16199
- const theme = that.config.theme === 'light' ? lightTheme : darkTheme;
16200
- const bgColor = ((_a = theme === null || theme === void 0 ? void 0 : theme.background) === null || _a === void 0 ? void 0 : _a.primary) || (that.config.theme === 'light' ? '#FFFFFF' : '#1A1A2E');
16201
- const textColor = ((_b = theme === null || theme === void 0 ? void 0 : theme.text) === null || _b === void 0 ? void 0 : _b.primary) || (that.config.theme === 'light' ? '#000000' : '#FFFFFF');
16202
- const btnBg = 'rgba(152,151,156,0.1)';
16203
- const btnHoverBg = 'rgba(152,151,156,0.15)';
16123
+ const effectiveTheme = (_c = (_b = (_a = that.loginOverrides) === null || _a === void 0 ? void 0 : _a.theme) !== null && _b !== void 0 ? _b : that.config.theme) !== null && _c !== void 0 ? _c : 'dark';
16124
+ const isLight = effectiveTheme === 'light';
16125
+ const bgColor = isLight ? '#FFFFFF' : '#111113';
16126
+ const cardBorder = isLight ? '1px solid rgba(0,0,0,0.08)' : '1px solid rgba(255,255,255,0.07)';
16127
+ const textColor = isLight ? '#0f0f0f' : '#f5f5f5';
16128
+ const subTextColor = isLight ? 'rgba(0,0,0,0.45)' : 'rgba(255,255,255,0.4)';
16129
+ const btnBg = isLight ? 'rgba(0,0,0,0.04)' : 'rgba(255,255,255,0.05)';
16130
+ const btnHoverBg = isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.09)';
16131
+ const btnBorder = isLight ? '1px solid rgba(0,0,0,0.10)' : '1px solid rgba(255,255,255,0.09)';
16132
+ const dividerColor = isLight ? 'rgba(0,0,0,0.10)' : 'rgba(255,255,255,0.08)';
16204
16133
  const fontFamily = '"SF Pro Text",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif';
16205
16134
  const buttonStyle = (id) => ({
16206
16135
  display: 'flex',
16207
16136
  alignItems: 'center',
16208
16137
  justifyContent: 'center',
16209
- gap: '12px',
16138
+ gap: '10px',
16210
16139
  width: '100%',
16211
- height: '56px',
16212
- padding: '12px 16px',
16213
- border: 'none',
16214
- borderRadius: '16px',
16140
+ height: '52px',
16141
+ padding: '0 20px',
16142
+ border: btnBorder,
16143
+ borderRadius: '12px',
16215
16144
  backgroundColor: hoveredBtn === id ? btnHoverBg : btnBg,
16216
16145
  color: textColor,
16217
16146
  fontFamily,
16218
16147
  fontSize: '14px',
16219
- fontWeight: '600',
16220
- lineHeight: '17px',
16221
- letterSpacing: '-0.14px',
16148
+ fontWeight: '500',
16149
+ lineHeight: '1',
16150
+ letterSpacing: '0',
16222
16151
  cursor: 'pointer',
16223
- transition: 'background-color 0.2s',
16152
+ transition: 'background-color 0.15s, border-color 0.15s',
16153
+ boxSizing: 'border-box',
16154
+ });
16155
+ const emailButtonStyle = (id) => ({
16156
+ display: 'flex',
16157
+ alignItems: 'center',
16158
+ justifyContent: 'center',
16159
+ gap: '10px',
16160
+ width: '100%',
16161
+ height: '52px',
16162
+ padding: '0 20px',
16163
+ border: isLight ? '1px solid rgba(0,0,0,0.15)' : '1px solid rgba(255,255,255,0.15)',
16164
+ borderRadius: '12px',
16165
+ backgroundColor: hoveredBtn === id
16166
+ ? (isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.12)')
16167
+ : (isLight ? 'rgba(0,0,0,0.03)' : 'rgba(255,255,255,0.08)'),
16168
+ color: textColor,
16169
+ fontFamily,
16170
+ fontSize: '14px',
16171
+ fontWeight: '500',
16172
+ lineHeight: '1',
16173
+ cursor: 'pointer',
16174
+ transition: 'background-color 0.15s, border-color 0.15s',
16175
+ boxSizing: 'border-box',
16224
16176
  });
16225
16177
  const walletButtons = [];
16226
16178
  // Google OAuth button — shown when 'google' is in resolved providers
@@ -16232,7 +16184,7 @@ class PhantomWalletProvider {
16232
16184
  onMouseEnter: () => setHoveredBtn('google-oauth'),
16233
16185
  onMouseLeave: () => setHoveredBtn(null),
16234
16186
  }, React$1.createElement('svg', {
16235
- width: '20', height: '20', viewBox: '0 0 24 24',
16187
+ width: '18', height: '18', viewBox: '0 0 24 24',
16236
16188
  style: { flexShrink: '0' },
16237
16189
  }, React$1.createElement('path', {
16238
16190
  d: 'M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z',
@@ -16257,7 +16209,7 @@ class PhantomWalletProvider {
16257
16209
  onMouseEnter: () => setHoveredBtn('apple-oauth'),
16258
16210
  onMouseLeave: () => setHoveredBtn(null),
16259
16211
  }, React$1.createElement('svg', {
16260
- width: '20', height: '20', viewBox: '0 0 24 24',
16212
+ width: '18', height: '18', viewBox: '0 0 24 24',
16261
16213
  fill: textColor,
16262
16214
  style: { flexShrink: '0' },
16263
16215
  }, React$1.createElement('path', {
@@ -16309,11 +16261,9 @@ class PhantomWalletProvider {
16309
16261
  onClick: handleMobileWalletClick,
16310
16262
  onMouseEnter: () => setHoveredBtn('mobile-wallet'),
16311
16263
  onMouseLeave: () => setHoveredBtn(null),
16312
- },
16313
- // Mobile wallet icon (phone with wallet)
16314
- React$1.createElement('svg', {
16315
- width: '20', height: '20', viewBox: '0 0 24 24', fill: 'none',
16316
- style: { flexShrink: '0' },
16264
+ }, React$1.createElement('svg', {
16265
+ width: '18', height: '18', viewBox: '0 0 24 24', fill: 'none',
16266
+ style: { flexShrink: '0', opacity: '0.85' },
16317
16267
  },
16318
16268
  // Phone outline
16319
16269
  React$1.createElement('rect', {
@@ -16335,23 +16285,51 @@ class PhantomWalletProvider {
16335
16285
  if (that.config.enablePrivyFallback) {
16336
16286
  walletButtons.push(React$1.createElement('button', {
16337
16287
  key: 'email-login',
16338
- style: buttonStyle('email-login'),
16288
+ style: emailButtonStyle('email-login'),
16339
16289
  onClick: handleEmailClick,
16340
16290
  onMouseEnter: () => setHoveredBtn('email-login'),
16341
16291
  onMouseLeave: () => setHoveredBtn(null),
16342
- },
16343
- // Email icon
16344
- React$1.createElement('svg', {
16345
- width: '20', height: '20', viewBox: '0 0 24 24', fill: 'none',
16346
- style: { flexShrink: '0' },
16292
+ }, React$1.createElement('svg', {
16293
+ width: '18', height: '18', viewBox: '0 0 24 24', fill: 'none',
16294
+ style: { flexShrink: '0', opacity: '0.7' },
16347
16295
  }, React$1.createElement('path', {
16348
16296
  d: 'M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z',
16349
- stroke: textColor, strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round', fill: 'none',
16297
+ stroke: textColor, strokeWidth: '1.75', strokeLinecap: 'round', strokeLinejoin: 'round', fill: 'none',
16350
16298
  }), React$1.createElement('path', {
16351
16299
  d: 'M22 6l-10 7L2 6',
16352
- stroke: textColor, strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round', fill: 'none',
16353
- })), 'Log in with email'));
16300
+ stroke: textColor, strokeWidth: '1.75', strokeLinecap: 'round', strokeLinejoin: 'round', fill: 'none',
16301
+ })), 'Continue with email'));
16354
16302
  }
16303
+ // Split email button from the rest to insert OR divider
16304
+ const emailBtnIndex = walletButtons.findIndex((b) => b && b.key === 'email-login');
16305
+ const mainButtons = emailBtnIndex >= 0 ? walletButtons.slice(0, emailBtnIndex) : walletButtons;
16306
+ const emailButton = emailBtnIndex >= 0 ? walletButtons[emailBtnIndex] : null;
16307
+ // OR divider — shown when there are both wallet/social buttons and an email button
16308
+ const orDivider = (mainButtons.length > 0 && emailButton)
16309
+ ? React$1.createElement('div', {
16310
+ key: 'or-divider',
16311
+ style: {
16312
+ display: 'flex',
16313
+ alignItems: 'center',
16314
+ gap: '12px',
16315
+ margin: '4px 0',
16316
+ },
16317
+ }, React$1.createElement('div', {
16318
+ style: { flex: '1', height: '1px', backgroundColor: dividerColor },
16319
+ }), React$1.createElement('span', {
16320
+ style: {
16321
+ color: subTextColor,
16322
+ fontFamily,
16323
+ fontSize: '12px',
16324
+ fontWeight: '500',
16325
+ letterSpacing: '0.02em',
16326
+ textTransform: 'uppercase',
16327
+ userSelect: 'none',
16328
+ },
16329
+ }, 'or'), React$1.createElement('div', {
16330
+ style: { flex: '1', height: '1px', backgroundColor: dividerColor },
16331
+ }))
16332
+ : null;
16355
16333
  // Render custom modal
16356
16334
  return React$1.createElement('div', {
16357
16335
  // Overlay
@@ -16361,12 +16339,14 @@ class PhantomWalletProvider {
16361
16339
  left: '0',
16362
16340
  right: '0',
16363
16341
  bottom: '0',
16364
- backgroundColor: 'rgba(0,0,0,0.5)',
16342
+ backgroundColor: isLight ? 'rgba(0,0,0,0.35)' : 'rgba(0,0,0,0.65)',
16365
16343
  display: 'flex',
16366
16344
  alignItems: 'center',
16367
16345
  justifyContent: 'center',
16368
16346
  zIndex: 2147483647,
16369
16347
  pointerEvents: 'auto',
16348
+ backdropFilter: 'blur(4px)',
16349
+ WebkitBackdropFilter: 'blur(4px)',
16370
16350
  },
16371
16351
  onClick: (e) => {
16372
16352
  if (e.target === e.currentTarget)
@@ -16383,13 +16363,17 @@ class PhantomWalletProvider {
16383
16363
  React$1.createElement('div', {
16384
16364
  style: {
16385
16365
  backgroundColor: bgColor,
16386
- borderRadius: '24px',
16387
- width: '360px',
16388
- maxWidth: '90vw',
16389
- padding: '24px',
16366
+ border: cardBorder,
16367
+ borderRadius: '20px',
16368
+ width: '380px',
16369
+ maxWidth: 'calc(100vw - 32px)',
16370
+ padding: '28px 24px 24px',
16390
16371
  position: 'relative',
16391
- boxShadow: '0 20px 60px rgba(0,0,0,0.3)',
16372
+ boxShadow: isLight
16373
+ ? '0 8px 40px rgba(0,0,0,0.12), 0 2px 8px rgba(0,0,0,0.06)'
16374
+ : '0 8px 40px rgba(0,0,0,0.6), 0 2px 8px rgba(0,0,0,0.3)',
16392
16375
  pointerEvents: 'auto',
16376
+ boxSizing: 'border-box',
16393
16377
  },
16394
16378
  onMouseDown: (e) => {
16395
16379
  e.stopPropagation();
@@ -16398,26 +16382,30 @@ class PhantomWalletProvider {
16398
16382
  e.stopPropagation();
16399
16383
  },
16400
16384
  },
16401
- // Close button (X)
16385
+ // Close button
16402
16386
  React$1.createElement('button', {
16403
16387
  onClick: handleCloseModal,
16404
16388
  style: {
16405
16389
  position: 'absolute',
16406
- top: '16px',
16407
- right: '16px',
16408
- background: 'none',
16409
- border: 'none',
16390
+ top: '14px',
16391
+ right: '14px',
16392
+ background: isLight ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.07)',
16393
+ border: isLight ? '1px solid rgba(0,0,0,0.08)' : '1px solid rgba(255,255,255,0.08)',
16394
+ borderRadius: '50%',
16395
+ width: '28px',
16396
+ height: '28px',
16410
16397
  cursor: 'pointer',
16411
- padding: '4px',
16412
16398
  display: 'flex',
16413
16399
  alignItems: 'center',
16414
16400
  justifyContent: 'center',
16401
+ padding: '0',
16402
+ flexShrink: '0',
16415
16403
  },
16416
16404
  }, React$1.createElement('svg', {
16417
- width: '14', height: '14', viewBox: '0 0 14 14', fill: 'none',
16405
+ width: '12', height: '12', viewBox: '0 0 12 12', fill: 'none',
16418
16406
  }, React$1.createElement('path', {
16419
- d: 'M13 1L1 13M1 1l12 12',
16420
- stroke: textColor, strokeWidth: '2', strokeLinecap: 'round',
16407
+ d: 'M11 1L1 11M1 1l10 10',
16408
+ stroke: subTextColor, strokeWidth: '1.75', strokeLinecap: 'round',
16421
16409
  }))),
16422
16410
  // App icon (if provided)
16423
16411
  that.config.appIcon ? React$1.createElement('div', {
@@ -16425,27 +16413,40 @@ class PhantomWalletProvider {
16425
16413
  }, React$1.createElement('img', {
16426
16414
  src: that.config.appIcon,
16427
16415
  alt: that.config.appName || 'App',
16428
- style: { width: '48px', height: '48px', borderRadius: '12px' },
16416
+ style: { width: '44px', height: '44px', borderRadius: '10px' },
16429
16417
  })) : null,
16430
16418
  // Title
16431
16419
  React$1.createElement('div', {
16432
16420
  style: {
16433
16421
  color: textColor,
16434
16422
  fontFamily,
16435
- fontSize: '18px',
16423
+ fontSize: '17px',
16436
16424
  fontWeight: '600',
16437
16425
  textAlign: 'center',
16426
+ marginBottom: '6px',
16427
+ letterSpacing: '-0.2px',
16428
+ },
16429
+ }, (_f = (_e = (_d = that.loginOverrides) === null || _d === void 0 ? void 0 : _d.modalTitle) !== null && _e !== void 0 ? _e : that.config.modalTitle) !== null && _f !== void 0 ? _f : (that.config.appName ? `Log in to ${that.config.appName}` : 'Log in to your account')),
16430
+ // Subtitle
16431
+ React$1.createElement('div', {
16432
+ style: {
16433
+ color: subTextColor,
16434
+ fontFamily,
16435
+ fontSize: '13px',
16436
+ fontWeight: '400',
16437
+ textAlign: 'center',
16438
16438
  marginBottom: '24px',
16439
+ lineHeight: '1.4',
16439
16440
  },
16440
- }, 'Connect Wallet'),
16441
- // Wallet buttons
16441
+ }, (_j = (_h = (_g = that.loginOverrides) === null || _g === void 0 ? void 0 : _g.modalSubtitle) !== null && _h !== void 0 ? _h : that.config.modalSubtitle) !== null && _j !== void 0 ? _j : 'Choose how you\'d like to continue'),
16442
+ // Main buttons + OR divider + email button
16442
16443
  React$1.createElement('div', {
16443
16444
  style: {
16444
16445
  display: 'flex',
16445
16446
  flexDirection: 'column',
16446
16447
  gap: '8px',
16447
16448
  },
16448
- }, ...walletButtons)));
16449
+ }, ...mainButtons, orDivider, emailButton)));
16449
16450
  };
16450
16451
  // Wrapper component with PhantomProvider
16451
16452
  const PhantomProviderWrapper = () => {
@@ -16478,13 +16479,6 @@ class PhantomWalletProvider {
16478
16479
  if (this.initPromise) {
16479
16480
  await this.initPromise;
16480
16481
  }
16481
- // Lazy-mount path: if initializeAsync deferred the React mount (e.g.
16482
- // first-time visitor on Android Chrome PWA), do it now. We're being
16483
- // called from a user-gesture flow like login(), so any Android intent
16484
- // dialog that surfaces will appear with the activity already focused.
16485
- if (!this.containerElement) {
16486
- this.initialize();
16487
- }
16488
16482
  // Wait for SDK to be ready
16489
16483
  await new Promise((resolve) => {
16490
16484
  const check = () => {
@@ -16578,7 +16572,7 @@ class PhantomWalletProvider {
16578
16572
  this.pendingLogin.reject = reject;
16579
16573
  });
16580
16574
  }
16581
- return new Promise((resolve, reject) => {
16575
+ const loginPromise = new Promise((resolve, reject) => {
16582
16576
  this.pendingLogin = { resolve, reject };
16583
16577
  this.loginInProgress = true;
16584
16578
  // Always use our custom wallet modal
@@ -16592,55 +16586,17 @@ class PhantomWalletProvider {
16592
16586
  }
16593
16587
  }, 180000);
16594
16588
  });
16589
+ return loginPromise.finally(() => {
16590
+ this.loginOverrides = null;
16591
+ });
16595
16592
  }
16596
16593
  async restoreSession() {
16597
- // Read from storage directly. Do NOT ensureReady() here — that would
16598
- // mount @phantom/react-sdk's <PhantomProvider> during init(), which
16599
- // synchronously constructs BrowserSDK (running wallet-standard discovery)
16600
- // and fires sdk.autoConnect() both probing the Android intent surface
16601
- // before the PWA activity has window focus on Solana Seeker. The
16602
- // resulting "access other apps and services" system dialog renders
16603
- // with grayed-out buttons.
16604
- //
16605
- // Wrap getSession() in try/catch: WebSessionManager.getSession() runs
16606
- // JSON.parse on the stored session *outside* its internal try/catch,
16607
- // so genuinely malformed JSON in localStorage would propagate through
16608
- // restoreSession() and break init() entirely. Treat any throw as
16609
- // "no session" and fall through to the cleanup path so corrupted
16610
- // storage is recoverable on next load.
16611
- let session;
16612
- try {
16613
- session = await WebSessionManager.getSession();
16614
- }
16615
- catch (_a) {
16616
- session = null;
16617
- }
16618
- if (!session) {
16619
- // Tidy up storage so we don't leave junk behind:
16620
- // (a) clearSession() removes any stale or unparseable session
16621
- // storage entry. WebSessionManager.getSession() can't reach
16622
- // its own clearSession() if JSON.parse threw. Idempotent —
16623
- // safe to call unconditionally here.
16624
- // (b) Drop the auth-method marker if it's stale.
16625
- // WebSessionManager.clearSession() only removes the session
16626
- // storage key, not the marker — so without this cleanup
16627
- // shouldMountEagerly() would keep eager-mounting on every
16628
- // future cold start.
16629
- try {
16630
- WebSessionManager.clearSession();
16631
- }
16632
- catch ( /* best-effort */_b) { /* best-effort */ }
16633
- try {
16634
- if (getPlatform().storage.getItem('tarobase_last_auth_method') === 'phantom') {
16635
- getPlatform().storage.removeItem('tarobase_last_auth_method');
16636
- }
16637
- }
16638
- catch (_c) {
16639
- // storage unavailable — best-effort cleanup
16640
- }
16641
- return null;
16594
+ await this.ensureReady();
16595
+ const session = await WebSessionManager.getSession();
16596
+ if (session) {
16597
+ return { provider: this, address: session.address };
16642
16598
  }
16643
- return { provider: this, address: session.address };
16599
+ return null;
16644
16600
  }
16645
16601
  async address() {
16646
16602
  var _a, _b, _c, _d;
@@ -20131,137 +20087,161 @@ function createSolanaRpcSubscriptionsFromTransport(transport) {
20131
20087
  });
20132
20088
  }
20133
20089
 
20134
- // base-x encoding / decoding
20135
- // Copyright (c) 2018 base-x contributors
20136
- // Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)
20137
- // Distributed under the MIT software license, see the accompanying
20138
- // file LICENSE or http://www.opensource.org/licenses/mit-license.php.
20139
- function base (ALPHABET) {
20140
- if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }
20141
- const BASE_MAP = new Uint8Array(256);
20142
- for (let j = 0; j < BASE_MAP.length; j++) {
20143
- BASE_MAP[j] = 255;
20144
- }
20145
- for (let i = 0; i < ALPHABET.length; i++) {
20146
- const x = ALPHABET.charAt(i);
20147
- const xc = x.charCodeAt(0);
20148
- if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }
20149
- BASE_MAP[xc] = i;
20150
- }
20151
- const BASE = ALPHABET.length;
20152
- const LEADER = ALPHABET.charAt(0);
20153
- const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up
20154
- const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up
20155
- function encode (source) {
20156
- // eslint-disable-next-line no-empty
20157
- if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {
20158
- source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
20159
- } else if (Array.isArray(source)) {
20160
- source = Uint8Array.from(source);
20161
- }
20162
- if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }
20163
- if (source.length === 0) { return '' }
20164
- // Skip & count leading zeroes.
20165
- let zeroes = 0;
20166
- let length = 0;
20167
- let pbegin = 0;
20168
- const pend = source.length;
20169
- while (pbegin !== pend && source[pbegin] === 0) {
20170
- pbegin++;
20171
- zeroes++;
20172
- }
20173
- // Allocate enough space in big-endian base58 representation.
20174
- const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;
20175
- const b58 = new Uint8Array(size);
20176
- // Process the bytes.
20177
- while (pbegin !== pend) {
20178
- let carry = source[pbegin];
20179
- // Apply "b58 = b58 * 256 + ch".
20180
- let i = 0;
20181
- for (let it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {
20182
- carry += (256 * b58[it1]) >>> 0;
20183
- b58[it1] = (carry % BASE) >>> 0;
20184
- carry = (carry / BASE) >>> 0;
20185
- }
20186
- if (carry !== 0) { throw new Error('Non-zero carry') }
20187
- length = i;
20188
- pbegin++;
20189
- }
20190
- // Skip leading zeroes in base58 result.
20191
- let it2 = size - length;
20192
- while (it2 !== size && b58[it2] === 0) {
20193
- it2++;
20194
- }
20195
- // Translate the result into a string.
20196
- let str = LEADER.repeat(zeroes);
20197
- for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }
20198
- return str
20199
- }
20200
- function decodeUnsafe (source) {
20201
- if (typeof source !== 'string') { throw new TypeError('Expected String') }
20202
- if (source.length === 0) { return new Uint8Array() }
20203
- let psz = 0;
20204
- // Skip and count leading '1's.
20205
- let zeroes = 0;
20206
- let length = 0;
20207
- while (source[psz] === LEADER) {
20208
- zeroes++;
20209
- psz++;
20210
- }
20211
- // Allocate enough space in big-endian base256 representation.
20212
- const size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.
20213
- const b256 = new Uint8Array(size);
20214
- // Process the characters.
20215
- while (psz < source.length) {
20216
- // Find code of next character
20217
- const charCode = source.charCodeAt(psz);
20218
- // Base map can not be indexed using char code
20219
- if (charCode > 255) { return }
20220
- // Decode character
20221
- let carry = BASE_MAP[charCode];
20222
- // Invalid character
20223
- if (carry === 255) { return }
20224
- let i = 0;
20225
- for (let it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {
20226
- carry += (BASE * b256[it3]) >>> 0;
20227
- b256[it3] = (carry % 256) >>> 0;
20228
- carry = (carry / 256) >>> 0;
20229
- }
20230
- if (carry !== 0) { throw new Error('Non-zero carry') }
20231
- length = i;
20232
- psz++;
20233
- }
20234
- // Skip leading zeroes in b256.
20235
- let it4 = size - length;
20236
- while (it4 !== size && b256[it4] === 0) {
20237
- it4++;
20238
- }
20239
- const vch = new Uint8Array(zeroes + (size - it4));
20240
- let j = zeroes;
20241
- while (it4 !== size) {
20242
- vch[j++] = b256[it4++];
20243
- }
20244
- return vch
20245
- }
20246
- function decode (string) {
20247
- const buffer = decodeUnsafe(string);
20248
- if (buffer) { return buffer }
20249
- throw new Error('Non-base' + BASE + ' character')
20250
- }
20251
- return {
20252
- encode,
20253
- decodeUnsafe,
20254
- decode
20255
- }
20090
+ var cjs = {};
20091
+
20092
+ var hasRequiredCjs;
20093
+
20094
+ function requireCjs () {
20095
+ if (hasRequiredCjs) return cjs;
20096
+ hasRequiredCjs = 1;
20097
+ // base-x encoding / decoding
20098
+ // Copyright (c) 2018 base-x contributors
20099
+ // Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)
20100
+ // Distributed under the MIT software license, see the accompanying
20101
+ // file LICENSE or http://www.opensource.org/licenses/mit-license.php.
20102
+ Object.defineProperty(cjs, '__esModule', { value: true });
20103
+ function base (ALPHABET) {
20104
+ if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }
20105
+ const BASE_MAP = new Uint8Array(256);
20106
+ for (let j = 0; j < BASE_MAP.length; j++) {
20107
+ BASE_MAP[j] = 255;
20108
+ }
20109
+ for (let i = 0; i < ALPHABET.length; i++) {
20110
+ const x = ALPHABET.charAt(i);
20111
+ const xc = x.charCodeAt(0);
20112
+ if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }
20113
+ BASE_MAP[xc] = i;
20114
+ }
20115
+ const BASE = ALPHABET.length;
20116
+ const LEADER = ALPHABET.charAt(0);
20117
+ const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up
20118
+ const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up
20119
+ function encode (source) {
20120
+ // eslint-disable-next-line no-empty
20121
+ if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {
20122
+ source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
20123
+ } else if (Array.isArray(source)) {
20124
+ source = Uint8Array.from(source);
20125
+ }
20126
+ if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }
20127
+ if (source.length === 0) { return '' }
20128
+ // Skip & count leading zeroes.
20129
+ let zeroes = 0;
20130
+ let length = 0;
20131
+ let pbegin = 0;
20132
+ const pend = source.length;
20133
+ while (pbegin !== pend && source[pbegin] === 0) {
20134
+ pbegin++;
20135
+ zeroes++;
20136
+ }
20137
+ // Allocate enough space in big-endian base58 representation.
20138
+ const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;
20139
+ const b58 = new Uint8Array(size);
20140
+ // Process the bytes.
20141
+ while (pbegin !== pend) {
20142
+ let carry = source[pbegin];
20143
+ // Apply "b58 = b58 * 256 + ch".
20144
+ let i = 0;
20145
+ for (let it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {
20146
+ carry += (256 * b58[it1]) >>> 0;
20147
+ b58[it1] = (carry % BASE) >>> 0;
20148
+ carry = (carry / BASE) >>> 0;
20149
+ }
20150
+ if (carry !== 0) { throw new Error('Non-zero carry') }
20151
+ length = i;
20152
+ pbegin++;
20153
+ }
20154
+ // Skip leading zeroes in base58 result.
20155
+ let it2 = size - length;
20156
+ while (it2 !== size && b58[it2] === 0) {
20157
+ it2++;
20158
+ }
20159
+ // Translate the result into a string.
20160
+ let str = LEADER.repeat(zeroes);
20161
+ for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }
20162
+ return str
20163
+ }
20164
+ function decodeUnsafe (source) {
20165
+ if (typeof source !== 'string') { throw new TypeError('Expected String') }
20166
+ if (source.length === 0) { return new Uint8Array() }
20167
+ let psz = 0;
20168
+ // Skip and count leading '1's.
20169
+ let zeroes = 0;
20170
+ let length = 0;
20171
+ while (source[psz] === LEADER) {
20172
+ zeroes++;
20173
+ psz++;
20174
+ }
20175
+ // Allocate enough space in big-endian base256 representation.
20176
+ const size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.
20177
+ const b256 = new Uint8Array(size);
20178
+ // Process the characters.
20179
+ while (psz < source.length) {
20180
+ // Find code of next character
20181
+ const charCode = source.charCodeAt(psz);
20182
+ // Base map can not be indexed using char code
20183
+ if (charCode > 255) { return }
20184
+ // Decode character
20185
+ let carry = BASE_MAP[charCode];
20186
+ // Invalid character
20187
+ if (carry === 255) { return }
20188
+ let i = 0;
20189
+ for (let it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {
20190
+ carry += (BASE * b256[it3]) >>> 0;
20191
+ b256[it3] = (carry % 256) >>> 0;
20192
+ carry = (carry / 256) >>> 0;
20193
+ }
20194
+ if (carry !== 0) { throw new Error('Non-zero carry') }
20195
+ length = i;
20196
+ psz++;
20197
+ }
20198
+ // Skip leading zeroes in b256.
20199
+ let it4 = size - length;
20200
+ while (it4 !== size && b256[it4] === 0) {
20201
+ it4++;
20202
+ }
20203
+ const vch = new Uint8Array(zeroes + (size - it4));
20204
+ let j = zeroes;
20205
+ while (it4 !== size) {
20206
+ vch[j++] = b256[it4++];
20207
+ }
20208
+ return vch
20209
+ }
20210
+ function decode (string) {
20211
+ const buffer = decodeUnsafe(string);
20212
+ if (buffer) { return buffer }
20213
+ throw new Error('Non-base' + BASE + ' character')
20214
+ }
20215
+ return {
20216
+ encode,
20217
+ decodeUnsafe,
20218
+ decode
20219
+ }
20220
+ }
20221
+ cjs.default = base;
20222
+ return cjs;
20223
+ }
20224
+
20225
+ var bs58;
20226
+ var hasRequiredBs58;
20227
+
20228
+ function requireBs58 () {
20229
+ if (hasRequiredBs58) return bs58;
20230
+ hasRequiredBs58 = 1;
20231
+ var basex = requireCjs();
20232
+ var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
20233
+
20234
+ bs58 = basex(ALPHABET);
20235
+ return bs58;
20256
20236
  }
20257
20237
 
20258
- var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
20259
- var bs58 = base(ALPHABET);
20238
+ var bs58Exports = requireBs58();
20239
+ var base58 = /*@__PURE__*/getDefaultExportFromCjs$1(bs58Exports);
20260
20240
 
20261
- var index = /*#__PURE__*/Object.freeze({
20241
+ var index = /*#__PURE__*/_mergeNamespaces({
20262
20242
  __proto__: null,
20263
- default: bs58
20264
- });
20243
+ default: base58
20244
+ }, [bs58Exports]);
20265
20245
 
20266
20246
  const SURFNET_RPC_URL$1 = "https://surfpool.fly.dev";
20267
20247
  let React;
@@ -20995,7 +20975,7 @@ class PrivyWalletProvider {
20995
20975
  // Handle case where signature might be bytes instead of string
20996
20976
  const rawSig = result.signature;
20997
20977
  if (rawSig instanceof Uint8Array || Array.isArray(rawSig)) {
20998
- signature = bs58.encode(rawSig instanceof Uint8Array ? rawSig : new Uint8Array(rawSig));
20978
+ signature = base58.encode(rawSig instanceof Uint8Array ? rawSig : new Uint8Array(rawSig));
20999
20979
  }
21000
20980
  else {
21001
20981
  signature = rawSig;
@@ -21163,46 +21143,6 @@ function isMobileWalletAvailable() {
21163
21143
  return detectAndroid();
21164
21144
  }
21165
21145
  const ED25519_SIGNATURE_LENGTH = 64;
21166
- /**
21167
- * On Android Chrome PWA (e.g. Solana Seeker in standalone mode), MWA's
21168
- * transact() opens a WebSocket to ws://localhost:<port>/solana-wallet to
21169
- * handshake with the wallet app on the device. Chrome guards localhost
21170
- * connections behind the Local Network Access ("Apps on Device") permission
21171
- * dialog. The dialog inherits the activity's window-focus state at spawn
21172
- * time — so if focus is in transit (e.g. just after a Phantom-modal close
21173
- * triggers a React commit), the dialog renders with grayed-out Allow/Block
21174
- * buttons and only becomes interactive after a manual background→resume
21175
- * (which forces an onPause→onResume cycle on the activity).
21176
- *
21177
- * Wait for window focus to settle, then yield one frame, before opening
21178
- * the WebSocket. This makes the system dialog spawn into a focused activity
21179
- * so its buttons are immediately tappable.
21180
- */
21181
- async function awaitActivityFocus() {
21182
- if (typeof document === 'undefined' || typeof window === 'undefined')
21183
- return;
21184
- if (!document.hasFocus()) {
21185
- await new Promise((resolve) => {
21186
- const onFocus = () => {
21187
- window.removeEventListener('focus', onFocus);
21188
- resolve();
21189
- };
21190
- window.addEventListener('focus', onFocus);
21191
- // Fallback in case the focus event never fires (e.g. activity
21192
- // already focused but document.hasFocus() momentarily lies during
21193
- // a React commit). 600ms is a perceptual ceiling — beyond this
21194
- // the user notices a stall, so we'd rather take the focus race
21195
- // than block forever.
21196
- setTimeout(() => {
21197
- window.removeEventListener('focus', onFocus);
21198
- resolve();
21199
- }, 600);
21200
- });
21201
- }
21202
- // Yield to next paint so any pending React commits / focus changes have
21203
- // flushed before the WebSocket open spawns the system dialog.
21204
- await new Promise((r) => requestAnimationFrame(() => r()));
21205
- }
21206
21146
  // Dynamically imported MWA protocol module
21207
21147
  let mwaProtocolModule = null;
21208
21148
  let mwaProtocolLoadPromise = null;
@@ -21215,7 +21155,7 @@ async function loadMwaProtocol() {
21215
21155
  return mwaProtocolLoadPromise;
21216
21156
  mwaProtocolLoadPromise = (async () => {
21217
21157
  try {
21218
- mwaProtocolModule = await Promise.resolve().then(function () { return require('./index.browser-CxXQ2RhF.js'); });
21158
+ mwaProtocolModule = await Promise.resolve().then(function () { return require('./index.browser-d0PlOXpF.js'); });
21219
21159
  }
21220
21160
  catch (e) {
21221
21161
  console.warn('[SolanaMobileWallet] @solana-mobile/mobile-wallet-adapter-protocol-web3js not installed. Install it to enable Seeker wallet support.');
@@ -21237,7 +21177,7 @@ async function registerMobileWalletAdapter(config) {
21237
21177
  if (typeof window === 'undefined')
21238
21178
  return;
21239
21179
  try {
21240
- const walletStandardMobile = await Promise.resolve().then(function () { return require('./index.browser-CmlqbyPr.js'); });
21180
+ const walletStandardMobile = await Promise.resolve().then(function () { return require('./index.browser-CT6PUv9G.js'); });
21241
21181
  const registerMwa = walletStandardMobile.registerMwa || ((_a = walletStandardMobile.default) === null || _a === void 0 ? void 0 : _a.registerMwa);
21242
21182
  if (!registerMwa) {
21243
21183
  console.warn('[SolanaMobileWallet] registerMwa not found in @solana-mobile/wallet-standard-mobile');
@@ -21381,7 +21321,6 @@ class SolanaMobileWalletProvider {
21381
21321
  }
21382
21322
  // Pre-fetch nonce from server while wallet is not yet connected
21383
21323
  const nonce = await genAuthNonce();
21384
- await awaitActivityFocus();
21385
21324
  // Single transact() call: authorize + signMessages — one wallet popup
21386
21325
  const result = await transact(async (wallet) => {
21387
21326
  // Step 1: Authorize — user approves the dApp
@@ -21470,7 +21409,6 @@ class SolanaMobileWalletProvider {
21470
21409
  await loadMwaProtocol();
21471
21410
  const { transact } = mwaProtocolModule;
21472
21411
  const authToken = this.authToken;
21473
- await awaitActivityFocus();
21474
21412
  await transact(async (wallet) => {
21475
21413
  await wallet.deauthorize({ auth_token: authToken });
21476
21414
  }, this.getAssociationConfig());
@@ -21496,7 +21434,6 @@ class SolanaMobileWalletProvider {
21496
21434
  const { transact } = mwaProtocolModule;
21497
21435
  const base64Addr = this.base64Address;
21498
21436
  try {
21499
- await awaitActivityFocus();
21500
21437
  const signedMessages = await transact(async (wallet) => {
21501
21438
  await this.reauthorizeWallet(wallet);
21502
21439
  const messageBytes = getPlatform().textEncode(message);
@@ -21550,7 +21487,6 @@ class SolanaMobileWalletProvider {
21550
21487
  }
21551
21488
  }
21552
21489
  try {
21553
- await awaitActivityFocus();
21554
21490
  const signedTransactions = await transact(async (wallet) => {
21555
21491
  await this.reauthorizeWallet(wallet);
21556
21492
  return wallet.signTransactions({ transactions: [transaction] });
@@ -21598,7 +21534,6 @@ class SolanaMobileWalletProvider {
21598
21534
  }
21599
21535
  if (isSurfnet) {
21600
21536
  // Surfnet: sign-only, then submit to our specific RPC
21601
- await awaitActivityFocus();
21602
21537
  const signedTransactions = await transact(async (wallet) => {
21603
21538
  await this.reauthorizeWallet(wallet);
21604
21539
  return wallet.signTransactions({ transactions: [transaction] });
@@ -21618,7 +21553,6 @@ class SolanaMobileWalletProvider {
21618
21553
  return signature;
21619
21554
  }
21620
21555
  // Non-surfnet: use signAndSendTransactions for wallet-optimized submission
21621
- await awaitActivityFocus();
21622
21556
  const signatures = await transact(async (wallet) => {
21623
21557
  await this.reauthorizeWallet(wallet);
21624
21558
  return wallet.signAndSendTransactions({
@@ -21702,7 +21636,6 @@ class SolanaMobileWalletProvider {
21702
21636
  tx = result.tx;
21703
21637
  }
21704
21638
  if ((options === null || options === void 0 ? void 0 : options.shouldSubmitTx) === false) {
21705
- await awaitActivityFocus();
21706
21639
  const [signedTx] = await transact(async (wallet) => {
21707
21640
  await this.reauthorizeWallet(wallet);
21708
21641
  return wallet.signTransactions({ transactions: [tx] });
@@ -21716,7 +21649,6 @@ class SolanaMobileWalletProvider {
21716
21649
  }
21717
21650
  if (isSurfnet) {
21718
21651
  // Surfnet: sign then submit manually to our RPC
21719
- await awaitActivityFocus();
21720
21652
  const [signedTx] = await transact(async (wallet) => {
21721
21653
  await this.reauthorizeWallet(wallet);
21722
21654
  return wallet.signTransactions({ transactions: [tx] });
@@ -21745,7 +21677,6 @@ class SolanaMobileWalletProvider {
21745
21677
  };
21746
21678
  }
21747
21679
  // Non-surfnet: use signAndSendTransactions
21748
- await awaitActivityFocus();
21749
21680
  const signatures = await transact(async (wallet) => {
21750
21681
  await this.reauthorizeWallet(wallet);
21751
21682
  return wallet.signAndSendTransactions({
@@ -21999,7 +21930,7 @@ class PrivyExpoProvider {
21999
21930
  const wallet = await this.getWalletOrThrow();
22000
21931
  const messageBytes = getPlatform().textEncode(message);
22001
21932
  const result = await wallet.signMessage(messageBytes);
22002
- return bs58.encode(result.signature);
21933
+ return base58.encode(result.signature);
22003
21934
  }
22004
21935
  async signTransaction(transaction) {
22005
21936
  await this.ensureReady();
@@ -22166,11 +22097,12 @@ exports.ServerSessionManager = ServerSessionManager;
22166
22097
  exports.SolanaMobileWalletProvider = SolanaMobileWalletProvider;
22167
22098
  exports.WebSessionManager = WebSessionManager;
22168
22099
  exports.aggregate = aggregate;
22169
- exports.bs58 = bs58;
22100
+ exports.base58 = base58;
22170
22101
  exports.bufferExports = bufferExports;
22171
22102
  exports.buildSetDocumentsTransaction = buildSetDocumentsTransaction;
22172
22103
  exports.clearCache = clearCache;
22173
22104
  exports.closeAllSubscriptions = closeAllSubscriptions;
22105
+ exports.commonjsRequire = commonjsRequire;
22174
22106
  exports.convertRemainingAccounts = convertRemainingAccounts;
22175
22107
  exports.count = count;
22176
22108
  exports.createSessionWithPrivy = createSessionWithPrivy;
@@ -22198,6 +22130,7 @@ exports.onAuthStateChanged = onAuthStateChanged;
22198
22130
  exports.reconnectWithNewAuth = reconnectWithNewAuth;
22199
22131
  exports.refreshSession = refreshSession;
22200
22132
  exports.registerMobileWalletAdapter = registerMobileWalletAdapter;
22133
+ exports.require$$0 = require$$0;
22201
22134
  exports.runExpression = runExpression;
22202
22135
  exports.runExpressionMany = runExpressionMany;
22203
22136
  exports.runQuery = runQuery;
@@ -22212,4 +22145,4 @@ exports.signSessionCreateMessage = signSessionCreateMessage;
22212
22145
  exports.signTransaction = signTransaction;
22213
22146
  exports.subscribe = subscribe;
22214
22147
  exports.useAuth = useAuth;
22215
- //# sourceMappingURL=index-DHm4usay.js.map
22148
+ //# sourceMappingURL=index-B2WGCssJ.js.map