@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
@@ -4,6 +4,21 @@ import * as anchor from '@coral-xyz/anchor';
4
4
  import { Program } from '@coral-xyz/anchor';
5
5
  import * as React$2 from 'react';
6
6
 
7
+ function _mergeNamespaces(n, m) {
8
+ m.forEach(function (e) {
9
+ e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default' && !(k in n)) {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ });
19
+ return Object.freeze(n);
20
+ }
21
+
7
22
  function getDefaultExportFromCjs$1 (x) {
8
23
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
9
24
  }
@@ -9447,11 +9462,11 @@ function requireSrc () {
9447
9462
  }
9448
9463
 
9449
9464
  var bs58$1;
9450
- var hasRequiredBs58;
9465
+ var hasRequiredBs58$1;
9451
9466
 
9452
- function requireBs58 () {
9453
- if (hasRequiredBs58) return bs58$1;
9454
- hasRequiredBs58 = 1;
9467
+ function requireBs58$1 () {
9468
+ if (hasRequiredBs58$1) return bs58$1;
9469
+ hasRequiredBs58$1 = 1;
9455
9470
  var basex = requireSrc();
9456
9471
  var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
9457
9472
 
@@ -9459,8 +9474,8 @@ function requireBs58 () {
9459
9474
  return bs58$1;
9460
9475
  }
9461
9476
 
9462
- var bs58Exports = requireBs58();
9463
- var bs58$2 = /*@__PURE__*/getDefaultExportFromCjs(bs58Exports);
9477
+ var bs58Exports$1 = requireBs58$1();
9478
+ var bs58$2 = /*@__PURE__*/getDefaultExportFromCjs(bs58Exports$1);
9464
9479
 
9465
9480
  // ─────────────────────────────────────────────────────────────
9466
9481
  // Local implementation of getSimulationComputeUnits
@@ -10106,40 +10121,17 @@ async function getConfig() {
10106
10121
  return clientConfig;
10107
10122
  }
10108
10123
 
10109
- /******************************************************************************
10110
- Copyright (c) Microsoft Corporation.
10111
-
10112
- Permission to use, copy, modify, and/or distribute this software for any
10113
- purpose with or without fee is hereby granted.
10114
-
10115
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10116
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10117
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
10118
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
10119
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
10120
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
10121
- PERFORMANCE OF THIS SOFTWARE.
10122
- ***************************************************************************** */
10123
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
10124
-
10125
-
10126
- function __rest(s, e) {
10127
- var t = {};
10128
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
10129
- t[p] = s[p];
10130
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
10131
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10132
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
10133
- t[p[i]] = s[p[i]];
10134
- }
10135
- return t;
10136
- }
10137
-
10138
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
10139
- var e = new Error(message);
10140
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
10124
+ var __rest = function (s, e) {
10125
+ var t = {};
10126
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
10127
+ t[p] = s[p];
10128
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
10129
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10130
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
10131
+ t[p[i]] = s[p[i]];
10132
+ }
10133
+ return t;
10141
10134
  };
10142
-
10143
10135
  /**
10144
10136
  * Thrown when a user's wallet doesn't have enough SOL to cover the transaction.
10145
10137
  * Apps can catch this to trigger an onramp/funding flow.
@@ -12960,7 +12952,7 @@ async function getAuthProvider(config) {
12960
12952
  }
12961
12953
  return currentAuthProvider;
12962
12954
  }
12963
- async function login$1() {
12955
+ async function login$1(options) {
12964
12956
  // Re-initialize provider if it was cleared by logout
12965
12957
  if (!currentAuthProvider && initConfig) {
12966
12958
  currentAuthProvider = await getAuthProvider(initConfig);
@@ -12973,6 +12965,14 @@ async function login$1() {
12973
12965
  if (!currentAuthProvider) {
12974
12966
  throw new Error("Auth provider not initialized. Please call init() first.");
12975
12967
  }
12968
+ // Forward per-call overrides to providers that support them (duck-typed to stay
12969
+ // lazy-load safe — no direct import of PhantomWalletProvider here).
12970
+ // Always call (even with null) so previous overrides are cleared when this
12971
+ // login() is invoked without options — early-return paths inside the provider
12972
+ // bypass the .finally() cleanup, so we reset here too.
12973
+ if (typeof currentAuthProvider.setLoginOverrides === 'function') {
12974
+ currentAuthProvider.setLoginOverrides(options !== null && options !== void 0 ? options : null);
12975
+ }
12976
12976
  const loginResult = await currentAuthProvider.login();
12977
12977
  if (loginResult) {
12978
12978
  // Store which auth method was used so we restore the right provider on reload
@@ -13055,11 +13055,11 @@ function setAuthLoading(loading) {
13055
13055
  function getAuthLoading() {
13056
13056
  return isAuthLoading;
13057
13057
  }
13058
- async function login() {
13058
+ async function login(options) {
13059
13059
  if (!authProviderInstance) {
13060
13060
  throw new Error('SDK not initialized. Please call init() first.');
13061
13061
  }
13062
- const loggedInUser = await login$1();
13062
+ const loggedInUser = await login$1(options);
13063
13063
  setCurrentUser(loggedInUser);
13064
13064
  return currentUser;
13065
13065
  }
@@ -15648,7 +15648,7 @@ async function loadDependencies() {
15648
15648
  const [reactModule, reactDomModule, phantomModule] = await Promise.all([
15649
15649
  import('react'),
15650
15650
  import('react-dom/client'),
15651
- import('./index-DCo85UGg.esm.js')
15651
+ import('./index-dcJIjFrs.esm.js')
15652
15652
  ]);
15653
15653
  // Extract default export from ESM module namespace
15654
15654
  // Dynamic import() returns { default: Module, ...exports }, not the module directly
@@ -15660,6 +15660,10 @@ async function loadDependencies() {
15660
15660
  return loadingPromise;
15661
15661
  }
15662
15662
  class PhantomWalletProvider {
15663
+ /** Temporarily override modal appearance for a single login() call. Cleared automatically after login settles. */
15664
+ setLoginOverrides(opts) {
15665
+ this.loginOverrides = opts;
15666
+ }
15663
15667
  constructor(networkUrl = null, config = {}) {
15664
15668
  this.containerElement = null;
15665
15669
  this.root = null;
@@ -15669,6 +15673,7 @@ class PhantomWalletProvider {
15669
15673
  this.loginInProgress = false;
15670
15674
  this.autoLoginInProgress = false;
15671
15675
  this.initPromise = null;
15676
+ this.loginOverrides = null;
15672
15677
  /** Callback to swap to a Privy provider when the user clicks "Log in with email" */
15673
15678
  this.onSwitchToPrivy = null;
15674
15679
  /** Callback to swap to a Mobile Wallet Adapter provider when the user clicks "Connect Mobile Wallet" */
@@ -15691,13 +15696,8 @@ class PhantomWalletProvider {
15691
15696
  async initializeAsync() {
15692
15697
  // Lazy load dependencies only when actually instantiating
15693
15698
  await loadDependencies();
15694
- // Initialize React component eagerly only when there's a real reason to
15695
- // (URL callback to consume, prior session to restore, in-page wallet,
15696
- // or non-Android). Otherwise defer until ensureReady() is reached from
15697
- // a user-gesture flow. See shouldMountEagerly() for the rationale.
15698
- if (this.shouldMountEagerly()) {
15699
- this.initialize();
15700
- }
15699
+ // Initialize React component
15700
+ this.initialize();
15701
15701
  }
15702
15702
  /**
15703
15703
  * Check if social login providers are configured (non-injected providers).
@@ -15705,69 +15705,6 @@ class PhantomWalletProvider {
15705
15705
  hasSocialProviders() {
15706
15706
  return this.resolvedProviders.some(p => p !== 'injected');
15707
15707
  }
15708
- /**
15709
- * Decide whether to mount the @phantom/react-sdk <PhantomProvider> tree
15710
- * eagerly during init() or defer until the first user-triggered call
15711
- * (login / sign / etc.) reaches ensureReady().
15712
- *
15713
- * Mounting the React tree synchronously constructs BrowserSDK, which runs
15714
- * wallet-standard discovery in its constructor and fires sdk.autoConnect()
15715
- * in a useEffect on mount. On Solana Seeker (Android Chrome PWA), both
15716
- * pathways probe the Android intent surface to discover the Phantom mobile
15717
- * app, which surfaces Chrome's system "wants to access other apps and
15718
- * services" permission dialog *before* the PWA activity has window focus.
15719
- * The dialog renders with grayed-out buttons until the user backgrounds
15720
- * and resumes the app.
15721
- *
15722
- * Returns true when eager mount is needed (callback to handle, prior
15723
- * session, in-page wallet present, or non-Android). Otherwise returns
15724
- * false — the React tree is mounted lazily inside ensureReady() once a
15725
- * user gesture brings us there.
15726
- */
15727
- shouldMountEagerly() {
15728
- if (typeof window === 'undefined')
15729
- return false;
15730
- // Preserve desktop behavior: always mount eagerly.
15731
- if (!detectAndroid())
15732
- return true;
15733
- // In-page wallet present (Phantom in-app browser / desktop extension on
15734
- // a desktop-mode Android UA): no Android intent probe needed, mount free.
15735
- // Tighten beyond truthy `window.phantom` since arbitrary stubs can land
15736
- // on that key — require a wallet-shaped surface.
15737
- const ph = window.phantom;
15738
- if (ph && (ph.solana || ph.ethereum || ph.app))
15739
- return true;
15740
- // Returning from a Phantom redirect (OAuth or deeplink hop). SDK must
15741
- // be live to read these URL params via urlParamsAccessor.
15742
- const callbackKeys = ['session_id', 'wallet_id', 'selected_account_index', 'error', 'error_description'];
15743
- try {
15744
- const params = new URLSearchParams(window.location.search);
15745
- if (callbackKeys.some(k => params.has(k)))
15746
- return true;
15747
- }
15748
- catch (_a) {
15749
- return true; // conservative on URL access failure
15750
- }
15751
- // Returning user with a stored Phantom session. They've already
15752
- // approved the Android intent permission for this origin on first
15753
- // login, so the dialog is typically pre-granted by Chrome — eager
15754
- // mount lets autoConnect silently restore the wallet handshake.
15755
- // Require BOTH the marker AND a session storage entry so a stale
15756
- // orphaned marker doesn't keep eager-mounting forever. Note
15757
- // isAuthenticated() is a raw key-existence check, not a validity
15758
- // check — restoreSession() above clears the marker on the next load
15759
- // if the session is unusable, so the bug self-corrects after at
15760
- // most one further cold start.
15761
- try {
15762
- const stored = getPlatform().storage.getItem('tarobase_last_auth_method');
15763
- if (stored === 'phantom' && WebSessionManager.isAuthenticated())
15764
- return true;
15765
- }
15766
- catch (_b) {
15767
- return true;
15768
- }
15769
- return false;
15770
- }
15771
15708
  static getInstance(networkUrl, config) {
15772
15709
  if (!PhantomWalletProvider.instance) {
15773
15710
  new PhantomWalletProvider(networkUrl, config);
@@ -15843,7 +15780,7 @@ class PhantomWalletProvider {
15843
15780
  const sdkProviders = this.resolvedProviders.length > 0 ? [...this.resolvedProviders] : ['injected'];
15844
15781
  // Inner component that uses hooks
15845
15782
  const PhantomHooksComponent = () => {
15846
- var _a, _b;
15783
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
15847
15784
  const phantom = usePhantom();
15848
15785
  const { connect, error: connectError } = useConnect();
15849
15786
  const { disconnect, isDisconnecting } = useDisconnect();
@@ -16128,20 +16065,11 @@ class PhantomWalletProvider {
16128
16065
  const handleMobileWalletClick = async () => {
16129
16066
  that.loginInProgress = false;
16130
16067
  walletClickedRef.current = true;
16131
- // Don't close the wallet modal yet. On Android Chrome PWA,
16132
- // closing the modal here triggers a React commit and a focus
16133
- // transition that races MWA's transact() opening a localhost
16134
- // WebSocket. Chrome's "Apps on Device" / Local Network Access
16135
- // permission dialog spawns inheriting the activity's focus
16136
- // state at that moment — and the in-transit focus produces a
16137
- // dialog with grayed-out Allow/Block buttons. Keep the modal
16138
- // mounted through MWA login so focus is stable when the
16139
- // system dialog spawns; close it after login resolves.
16068
+ setShowWalletModal(false);
16140
16069
  if (that.onSwitchToMWA) {
16141
16070
  try {
16142
16071
  const mwaProvider = await that.onSwitchToMWA();
16143
16072
  const user = await mwaProvider.login();
16144
- setShowWalletModal(false);
16145
16073
  if (that.pendingLogin && user) {
16146
16074
  that.pendingLogin.resolve(user);
16147
16075
  that.pendingLogin = null;
@@ -16152,16 +16080,12 @@ class PhantomWalletProvider {
16152
16080
  }
16153
16081
  }
16154
16082
  catch (error) {
16155
- setShowWalletModal(false);
16156
16083
  if (that.pendingLogin) {
16157
16084
  that.pendingLogin.reject(error);
16158
16085
  that.pendingLogin = null;
16159
16086
  }
16160
16087
  }
16161
16088
  }
16162
- else {
16163
- setShowWalletModal(false);
16164
- }
16165
16089
  };
16166
16090
  const handleCloseModal = () => {
16167
16091
  setShowWalletModal(false);
@@ -16175,31 +16099,59 @@ class PhantomWalletProvider {
16175
16099
  if (!showWalletModal) {
16176
16100
  return null;
16177
16101
  }
16178
- const theme = that.config.theme === 'light' ? lightTheme : darkTheme;
16179
- 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');
16180
- 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');
16181
- const btnBg = 'rgba(152,151,156,0.1)';
16182
- const btnHoverBg = 'rgba(152,151,156,0.15)';
16102
+ 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';
16103
+ const isLight = effectiveTheme === 'light';
16104
+ const bgColor = isLight ? '#FFFFFF' : '#111113';
16105
+ const cardBorder = isLight ? '1px solid rgba(0,0,0,0.08)' : '1px solid rgba(255,255,255,0.07)';
16106
+ const textColor = isLight ? '#0f0f0f' : '#f5f5f5';
16107
+ const subTextColor = isLight ? 'rgba(0,0,0,0.45)' : 'rgba(255,255,255,0.4)';
16108
+ const btnBg = isLight ? 'rgba(0,0,0,0.04)' : 'rgba(255,255,255,0.05)';
16109
+ const btnHoverBg = isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.09)';
16110
+ const btnBorder = isLight ? '1px solid rgba(0,0,0,0.10)' : '1px solid rgba(255,255,255,0.09)';
16111
+ const dividerColor = isLight ? 'rgba(0,0,0,0.10)' : 'rgba(255,255,255,0.08)';
16183
16112
  const fontFamily = '"SF Pro Text",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif';
16184
16113
  const buttonStyle = (id) => ({
16185
16114
  display: 'flex',
16186
16115
  alignItems: 'center',
16187
16116
  justifyContent: 'center',
16188
- gap: '12px',
16117
+ gap: '10px',
16189
16118
  width: '100%',
16190
- height: '56px',
16191
- padding: '12px 16px',
16192
- border: 'none',
16193
- borderRadius: '16px',
16119
+ height: '52px',
16120
+ padding: '0 20px',
16121
+ border: btnBorder,
16122
+ borderRadius: '12px',
16194
16123
  backgroundColor: hoveredBtn === id ? btnHoverBg : btnBg,
16195
16124
  color: textColor,
16196
16125
  fontFamily,
16197
16126
  fontSize: '14px',
16198
- fontWeight: '600',
16199
- lineHeight: '17px',
16200
- letterSpacing: '-0.14px',
16127
+ fontWeight: '500',
16128
+ lineHeight: '1',
16129
+ letterSpacing: '0',
16130
+ cursor: 'pointer',
16131
+ transition: 'background-color 0.15s, border-color 0.15s',
16132
+ boxSizing: 'border-box',
16133
+ });
16134
+ const emailButtonStyle = (id) => ({
16135
+ display: 'flex',
16136
+ alignItems: 'center',
16137
+ justifyContent: 'center',
16138
+ gap: '10px',
16139
+ width: '100%',
16140
+ height: '52px',
16141
+ padding: '0 20px',
16142
+ border: isLight ? '1px solid rgba(0,0,0,0.15)' : '1px solid rgba(255,255,255,0.15)',
16143
+ borderRadius: '12px',
16144
+ backgroundColor: hoveredBtn === id
16145
+ ? (isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.12)')
16146
+ : (isLight ? 'rgba(0,0,0,0.03)' : 'rgba(255,255,255,0.08)'),
16147
+ color: textColor,
16148
+ fontFamily,
16149
+ fontSize: '14px',
16150
+ fontWeight: '500',
16151
+ lineHeight: '1',
16201
16152
  cursor: 'pointer',
16202
- transition: 'background-color 0.2s',
16153
+ transition: 'background-color 0.15s, border-color 0.15s',
16154
+ boxSizing: 'border-box',
16203
16155
  });
16204
16156
  const walletButtons = [];
16205
16157
  // Google OAuth button — shown when 'google' is in resolved providers
@@ -16211,7 +16163,7 @@ class PhantomWalletProvider {
16211
16163
  onMouseEnter: () => setHoveredBtn('google-oauth'),
16212
16164
  onMouseLeave: () => setHoveredBtn(null),
16213
16165
  }, React$1.createElement('svg', {
16214
- width: '20', height: '20', viewBox: '0 0 24 24',
16166
+ width: '18', height: '18', viewBox: '0 0 24 24',
16215
16167
  style: { flexShrink: '0' },
16216
16168
  }, React$1.createElement('path', {
16217
16169
  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',
@@ -16236,7 +16188,7 @@ class PhantomWalletProvider {
16236
16188
  onMouseEnter: () => setHoveredBtn('apple-oauth'),
16237
16189
  onMouseLeave: () => setHoveredBtn(null),
16238
16190
  }, React$1.createElement('svg', {
16239
- width: '20', height: '20', viewBox: '0 0 24 24',
16191
+ width: '18', height: '18', viewBox: '0 0 24 24',
16240
16192
  fill: textColor,
16241
16193
  style: { flexShrink: '0' },
16242
16194
  }, React$1.createElement('path', {
@@ -16288,11 +16240,9 @@ class PhantomWalletProvider {
16288
16240
  onClick: handleMobileWalletClick,
16289
16241
  onMouseEnter: () => setHoveredBtn('mobile-wallet'),
16290
16242
  onMouseLeave: () => setHoveredBtn(null),
16291
- },
16292
- // Mobile wallet icon (phone with wallet)
16293
- React$1.createElement('svg', {
16294
- width: '20', height: '20', viewBox: '0 0 24 24', fill: 'none',
16295
- style: { flexShrink: '0' },
16243
+ }, React$1.createElement('svg', {
16244
+ width: '18', height: '18', viewBox: '0 0 24 24', fill: 'none',
16245
+ style: { flexShrink: '0', opacity: '0.85' },
16296
16246
  },
16297
16247
  // Phone outline
16298
16248
  React$1.createElement('rect', {
@@ -16314,23 +16264,51 @@ class PhantomWalletProvider {
16314
16264
  if (that.config.enablePrivyFallback) {
16315
16265
  walletButtons.push(React$1.createElement('button', {
16316
16266
  key: 'email-login',
16317
- style: buttonStyle('email-login'),
16267
+ style: emailButtonStyle('email-login'),
16318
16268
  onClick: handleEmailClick,
16319
16269
  onMouseEnter: () => setHoveredBtn('email-login'),
16320
16270
  onMouseLeave: () => setHoveredBtn(null),
16321
- },
16322
- // Email icon
16323
- React$1.createElement('svg', {
16324
- width: '20', height: '20', viewBox: '0 0 24 24', fill: 'none',
16325
- style: { flexShrink: '0' },
16271
+ }, React$1.createElement('svg', {
16272
+ width: '18', height: '18', viewBox: '0 0 24 24', fill: 'none',
16273
+ style: { flexShrink: '0', opacity: '0.7' },
16326
16274
  }, React$1.createElement('path', {
16327
16275
  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',
16328
- stroke: textColor, strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round', fill: 'none',
16276
+ stroke: textColor, strokeWidth: '1.75', strokeLinecap: 'round', strokeLinejoin: 'round', fill: 'none',
16329
16277
  }), React$1.createElement('path', {
16330
16278
  d: 'M22 6l-10 7L2 6',
16331
- stroke: textColor, strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round', fill: 'none',
16332
- })), 'Log in with email'));
16279
+ stroke: textColor, strokeWidth: '1.75', strokeLinecap: 'round', strokeLinejoin: 'round', fill: 'none',
16280
+ })), 'Continue with email'));
16333
16281
  }
16282
+ // Split email button from the rest to insert OR divider
16283
+ const emailBtnIndex = walletButtons.findIndex((b) => b && b.key === 'email-login');
16284
+ const mainButtons = emailBtnIndex >= 0 ? walletButtons.slice(0, emailBtnIndex) : walletButtons;
16285
+ const emailButton = emailBtnIndex >= 0 ? walletButtons[emailBtnIndex] : null;
16286
+ // OR divider — shown when there are both wallet/social buttons and an email button
16287
+ const orDivider = (mainButtons.length > 0 && emailButton)
16288
+ ? React$1.createElement('div', {
16289
+ key: 'or-divider',
16290
+ style: {
16291
+ display: 'flex',
16292
+ alignItems: 'center',
16293
+ gap: '12px',
16294
+ margin: '4px 0',
16295
+ },
16296
+ }, React$1.createElement('div', {
16297
+ style: { flex: '1', height: '1px', backgroundColor: dividerColor },
16298
+ }), React$1.createElement('span', {
16299
+ style: {
16300
+ color: subTextColor,
16301
+ fontFamily,
16302
+ fontSize: '12px',
16303
+ fontWeight: '500',
16304
+ letterSpacing: '0.02em',
16305
+ textTransform: 'uppercase',
16306
+ userSelect: 'none',
16307
+ },
16308
+ }, 'or'), React$1.createElement('div', {
16309
+ style: { flex: '1', height: '1px', backgroundColor: dividerColor },
16310
+ }))
16311
+ : null;
16334
16312
  // Render custom modal
16335
16313
  return React$1.createElement('div', {
16336
16314
  // Overlay
@@ -16340,12 +16318,14 @@ class PhantomWalletProvider {
16340
16318
  left: '0',
16341
16319
  right: '0',
16342
16320
  bottom: '0',
16343
- backgroundColor: 'rgba(0,0,0,0.5)',
16321
+ backgroundColor: isLight ? 'rgba(0,0,0,0.35)' : 'rgba(0,0,0,0.65)',
16344
16322
  display: 'flex',
16345
16323
  alignItems: 'center',
16346
16324
  justifyContent: 'center',
16347
16325
  zIndex: 2147483647,
16348
16326
  pointerEvents: 'auto',
16327
+ backdropFilter: 'blur(4px)',
16328
+ WebkitBackdropFilter: 'blur(4px)',
16349
16329
  },
16350
16330
  onClick: (e) => {
16351
16331
  if (e.target === e.currentTarget)
@@ -16362,13 +16342,17 @@ class PhantomWalletProvider {
16362
16342
  React$1.createElement('div', {
16363
16343
  style: {
16364
16344
  backgroundColor: bgColor,
16365
- borderRadius: '24px',
16366
- width: '360px',
16367
- maxWidth: '90vw',
16368
- padding: '24px',
16345
+ border: cardBorder,
16346
+ borderRadius: '20px',
16347
+ width: '380px',
16348
+ maxWidth: 'calc(100vw - 32px)',
16349
+ padding: '28px 24px 24px',
16369
16350
  position: 'relative',
16370
- boxShadow: '0 20px 60px rgba(0,0,0,0.3)',
16351
+ boxShadow: isLight
16352
+ ? '0 8px 40px rgba(0,0,0,0.12), 0 2px 8px rgba(0,0,0,0.06)'
16353
+ : '0 8px 40px rgba(0,0,0,0.6), 0 2px 8px rgba(0,0,0,0.3)',
16371
16354
  pointerEvents: 'auto',
16355
+ boxSizing: 'border-box',
16372
16356
  },
16373
16357
  onMouseDown: (e) => {
16374
16358
  e.stopPropagation();
@@ -16377,26 +16361,30 @@ class PhantomWalletProvider {
16377
16361
  e.stopPropagation();
16378
16362
  },
16379
16363
  },
16380
- // Close button (X)
16364
+ // Close button
16381
16365
  React$1.createElement('button', {
16382
16366
  onClick: handleCloseModal,
16383
16367
  style: {
16384
16368
  position: 'absolute',
16385
- top: '16px',
16386
- right: '16px',
16387
- background: 'none',
16388
- border: 'none',
16369
+ top: '14px',
16370
+ right: '14px',
16371
+ background: isLight ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.07)',
16372
+ border: isLight ? '1px solid rgba(0,0,0,0.08)' : '1px solid rgba(255,255,255,0.08)',
16373
+ borderRadius: '50%',
16374
+ width: '28px',
16375
+ height: '28px',
16389
16376
  cursor: 'pointer',
16390
- padding: '4px',
16391
16377
  display: 'flex',
16392
16378
  alignItems: 'center',
16393
16379
  justifyContent: 'center',
16380
+ padding: '0',
16381
+ flexShrink: '0',
16394
16382
  },
16395
16383
  }, React$1.createElement('svg', {
16396
- width: '14', height: '14', viewBox: '0 0 14 14', fill: 'none',
16384
+ width: '12', height: '12', viewBox: '0 0 12 12', fill: 'none',
16397
16385
  }, React$1.createElement('path', {
16398
- d: 'M13 1L1 13M1 1l12 12',
16399
- stroke: textColor, strokeWidth: '2', strokeLinecap: 'round',
16386
+ d: 'M11 1L1 11M1 1l10 10',
16387
+ stroke: subTextColor, strokeWidth: '1.75', strokeLinecap: 'round',
16400
16388
  }))),
16401
16389
  // App icon (if provided)
16402
16390
  that.config.appIcon ? React$1.createElement('div', {
@@ -16404,27 +16392,40 @@ class PhantomWalletProvider {
16404
16392
  }, React$1.createElement('img', {
16405
16393
  src: that.config.appIcon,
16406
16394
  alt: that.config.appName || 'App',
16407
- style: { width: '48px', height: '48px', borderRadius: '12px' },
16395
+ style: { width: '44px', height: '44px', borderRadius: '10px' },
16408
16396
  })) : null,
16409
16397
  // Title
16410
16398
  React$1.createElement('div', {
16411
16399
  style: {
16412
16400
  color: textColor,
16413
16401
  fontFamily,
16414
- fontSize: '18px',
16402
+ fontSize: '17px',
16415
16403
  fontWeight: '600',
16416
16404
  textAlign: 'center',
16405
+ marginBottom: '6px',
16406
+ letterSpacing: '-0.2px',
16407
+ },
16408
+ }, (_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')),
16409
+ // Subtitle
16410
+ React$1.createElement('div', {
16411
+ style: {
16412
+ color: subTextColor,
16413
+ fontFamily,
16414
+ fontSize: '13px',
16415
+ fontWeight: '400',
16416
+ textAlign: 'center',
16417
16417
  marginBottom: '24px',
16418
+ lineHeight: '1.4',
16418
16419
  },
16419
- }, 'Connect Wallet'),
16420
- // Wallet buttons
16420
+ }, (_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'),
16421
+ // Main buttons + OR divider + email button
16421
16422
  React$1.createElement('div', {
16422
16423
  style: {
16423
16424
  display: 'flex',
16424
16425
  flexDirection: 'column',
16425
16426
  gap: '8px',
16426
16427
  },
16427
- }, ...walletButtons)));
16428
+ }, ...mainButtons, orDivider, emailButton)));
16428
16429
  };
16429
16430
  // Wrapper component with PhantomProvider
16430
16431
  const PhantomProviderWrapper = () => {
@@ -16457,13 +16458,6 @@ class PhantomWalletProvider {
16457
16458
  if (this.initPromise) {
16458
16459
  await this.initPromise;
16459
16460
  }
16460
- // Lazy-mount path: if initializeAsync deferred the React mount (e.g.
16461
- // first-time visitor on Android Chrome PWA), do it now. We're being
16462
- // called from a user-gesture flow like login(), so any Android intent
16463
- // dialog that surfaces will appear with the activity already focused.
16464
- if (!this.containerElement) {
16465
- this.initialize();
16466
- }
16467
16461
  // Wait for SDK to be ready
16468
16462
  await new Promise((resolve) => {
16469
16463
  const check = () => {
@@ -16557,7 +16551,7 @@ class PhantomWalletProvider {
16557
16551
  this.pendingLogin.reject = reject;
16558
16552
  });
16559
16553
  }
16560
- return new Promise((resolve, reject) => {
16554
+ const loginPromise = new Promise((resolve, reject) => {
16561
16555
  this.pendingLogin = { resolve, reject };
16562
16556
  this.loginInProgress = true;
16563
16557
  // Always use our custom wallet modal
@@ -16571,55 +16565,17 @@ class PhantomWalletProvider {
16571
16565
  }
16572
16566
  }, 180000);
16573
16567
  });
16568
+ return loginPromise.finally(() => {
16569
+ this.loginOverrides = null;
16570
+ });
16574
16571
  }
16575
16572
  async restoreSession() {
16576
- // Read from storage directly. Do NOT ensureReady() here — that would
16577
- // mount @phantom/react-sdk's <PhantomProvider> during init(), which
16578
- // synchronously constructs BrowserSDK (running wallet-standard discovery)
16579
- // and fires sdk.autoConnect() both probing the Android intent surface
16580
- // before the PWA activity has window focus on Solana Seeker. The
16581
- // resulting "access other apps and services" system dialog renders
16582
- // with grayed-out buttons.
16583
- //
16584
- // Wrap getSession() in try/catch: WebSessionManager.getSession() runs
16585
- // JSON.parse on the stored session *outside* its internal try/catch,
16586
- // so genuinely malformed JSON in localStorage would propagate through
16587
- // restoreSession() and break init() entirely. Treat any throw as
16588
- // "no session" and fall through to the cleanup path so corrupted
16589
- // storage is recoverable on next load.
16590
- let session;
16591
- try {
16592
- session = await WebSessionManager.getSession();
16593
- }
16594
- catch (_a) {
16595
- session = null;
16596
- }
16597
- if (!session) {
16598
- // Tidy up storage so we don't leave junk behind:
16599
- // (a) clearSession() removes any stale or unparseable session
16600
- // storage entry. WebSessionManager.getSession() can't reach
16601
- // its own clearSession() if JSON.parse threw. Idempotent —
16602
- // safe to call unconditionally here.
16603
- // (b) Drop the auth-method marker if it's stale.
16604
- // WebSessionManager.clearSession() only removes the session
16605
- // storage key, not the marker — so without this cleanup
16606
- // shouldMountEagerly() would keep eager-mounting on every
16607
- // future cold start.
16608
- try {
16609
- WebSessionManager.clearSession();
16610
- }
16611
- catch ( /* best-effort */_b) { /* best-effort */ }
16612
- try {
16613
- if (getPlatform().storage.getItem('tarobase_last_auth_method') === 'phantom') {
16614
- getPlatform().storage.removeItem('tarobase_last_auth_method');
16615
- }
16616
- }
16617
- catch (_c) {
16618
- // storage unavailable — best-effort cleanup
16619
- }
16620
- return null;
16573
+ await this.ensureReady();
16574
+ const session = await WebSessionManager.getSession();
16575
+ if (session) {
16576
+ return { provider: this, address: session.address };
16621
16577
  }
16622
- return { provider: this, address: session.address };
16578
+ return null;
16623
16579
  }
16624
16580
  async address() {
16625
16581
  var _a, _b, _c, _d;
@@ -20110,137 +20066,161 @@ function createSolanaRpcSubscriptionsFromTransport(transport) {
20110
20066
  });
20111
20067
  }
20112
20068
 
20113
- // base-x encoding / decoding
20114
- // Copyright (c) 2018 base-x contributors
20115
- // Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)
20116
- // Distributed under the MIT software license, see the accompanying
20117
- // file LICENSE or http://www.opensource.org/licenses/mit-license.php.
20118
- function base (ALPHABET) {
20119
- if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }
20120
- const BASE_MAP = new Uint8Array(256);
20121
- for (let j = 0; j < BASE_MAP.length; j++) {
20122
- BASE_MAP[j] = 255;
20123
- }
20124
- for (let i = 0; i < ALPHABET.length; i++) {
20125
- const x = ALPHABET.charAt(i);
20126
- const xc = x.charCodeAt(0);
20127
- if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }
20128
- BASE_MAP[xc] = i;
20129
- }
20130
- const BASE = ALPHABET.length;
20131
- const LEADER = ALPHABET.charAt(0);
20132
- const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up
20133
- const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up
20134
- function encode (source) {
20135
- // eslint-disable-next-line no-empty
20136
- if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {
20137
- source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
20138
- } else if (Array.isArray(source)) {
20139
- source = Uint8Array.from(source);
20140
- }
20141
- if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }
20142
- if (source.length === 0) { return '' }
20143
- // Skip & count leading zeroes.
20144
- let zeroes = 0;
20145
- let length = 0;
20146
- let pbegin = 0;
20147
- const pend = source.length;
20148
- while (pbegin !== pend && source[pbegin] === 0) {
20149
- pbegin++;
20150
- zeroes++;
20151
- }
20152
- // Allocate enough space in big-endian base58 representation.
20153
- const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;
20154
- const b58 = new Uint8Array(size);
20155
- // Process the bytes.
20156
- while (pbegin !== pend) {
20157
- let carry = source[pbegin];
20158
- // Apply "b58 = b58 * 256 + ch".
20159
- let i = 0;
20160
- for (let it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {
20161
- carry += (256 * b58[it1]) >>> 0;
20162
- b58[it1] = (carry % BASE) >>> 0;
20163
- carry = (carry / BASE) >>> 0;
20164
- }
20165
- if (carry !== 0) { throw new Error('Non-zero carry') }
20166
- length = i;
20167
- pbegin++;
20168
- }
20169
- // Skip leading zeroes in base58 result.
20170
- let it2 = size - length;
20171
- while (it2 !== size && b58[it2] === 0) {
20172
- it2++;
20173
- }
20174
- // Translate the result into a string.
20175
- let str = LEADER.repeat(zeroes);
20176
- for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }
20177
- return str
20178
- }
20179
- function decodeUnsafe (source) {
20180
- if (typeof source !== 'string') { throw new TypeError('Expected String') }
20181
- if (source.length === 0) { return new Uint8Array() }
20182
- let psz = 0;
20183
- // Skip and count leading '1's.
20184
- let zeroes = 0;
20185
- let length = 0;
20186
- while (source[psz] === LEADER) {
20187
- zeroes++;
20188
- psz++;
20189
- }
20190
- // Allocate enough space in big-endian base256 representation.
20191
- const size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.
20192
- const b256 = new Uint8Array(size);
20193
- // Process the characters.
20194
- while (psz < source.length) {
20195
- // Find code of next character
20196
- const charCode = source.charCodeAt(psz);
20197
- // Base map can not be indexed using char code
20198
- if (charCode > 255) { return }
20199
- // Decode character
20200
- let carry = BASE_MAP[charCode];
20201
- // Invalid character
20202
- if (carry === 255) { return }
20203
- let i = 0;
20204
- for (let it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {
20205
- carry += (BASE * b256[it3]) >>> 0;
20206
- b256[it3] = (carry % 256) >>> 0;
20207
- carry = (carry / 256) >>> 0;
20208
- }
20209
- if (carry !== 0) { throw new Error('Non-zero carry') }
20210
- length = i;
20211
- psz++;
20212
- }
20213
- // Skip leading zeroes in b256.
20214
- let it4 = size - length;
20215
- while (it4 !== size && b256[it4] === 0) {
20216
- it4++;
20217
- }
20218
- const vch = new Uint8Array(zeroes + (size - it4));
20219
- let j = zeroes;
20220
- while (it4 !== size) {
20221
- vch[j++] = b256[it4++];
20222
- }
20223
- return vch
20224
- }
20225
- function decode (string) {
20226
- const buffer = decodeUnsafe(string);
20227
- if (buffer) { return buffer }
20228
- throw new Error('Non-base' + BASE + ' character')
20229
- }
20230
- return {
20231
- encode,
20232
- decodeUnsafe,
20233
- decode
20234
- }
20069
+ var cjs = {};
20070
+
20071
+ var hasRequiredCjs;
20072
+
20073
+ function requireCjs () {
20074
+ if (hasRequiredCjs) return cjs;
20075
+ hasRequiredCjs = 1;
20076
+ // base-x encoding / decoding
20077
+ // Copyright (c) 2018 base-x contributors
20078
+ // Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)
20079
+ // Distributed under the MIT software license, see the accompanying
20080
+ // file LICENSE or http://www.opensource.org/licenses/mit-license.php.
20081
+ Object.defineProperty(cjs, '__esModule', { value: true });
20082
+ function base (ALPHABET) {
20083
+ if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }
20084
+ const BASE_MAP = new Uint8Array(256);
20085
+ for (let j = 0; j < BASE_MAP.length; j++) {
20086
+ BASE_MAP[j] = 255;
20087
+ }
20088
+ for (let i = 0; i < ALPHABET.length; i++) {
20089
+ const x = ALPHABET.charAt(i);
20090
+ const xc = x.charCodeAt(0);
20091
+ if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }
20092
+ BASE_MAP[xc] = i;
20093
+ }
20094
+ const BASE = ALPHABET.length;
20095
+ const LEADER = ALPHABET.charAt(0);
20096
+ const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up
20097
+ const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up
20098
+ function encode (source) {
20099
+ // eslint-disable-next-line no-empty
20100
+ if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {
20101
+ source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
20102
+ } else if (Array.isArray(source)) {
20103
+ source = Uint8Array.from(source);
20104
+ }
20105
+ if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }
20106
+ if (source.length === 0) { return '' }
20107
+ // Skip & count leading zeroes.
20108
+ let zeroes = 0;
20109
+ let length = 0;
20110
+ let pbegin = 0;
20111
+ const pend = source.length;
20112
+ while (pbegin !== pend && source[pbegin] === 0) {
20113
+ pbegin++;
20114
+ zeroes++;
20115
+ }
20116
+ // Allocate enough space in big-endian base58 representation.
20117
+ const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;
20118
+ const b58 = new Uint8Array(size);
20119
+ // Process the bytes.
20120
+ while (pbegin !== pend) {
20121
+ let carry = source[pbegin];
20122
+ // Apply "b58 = b58 * 256 + ch".
20123
+ let i = 0;
20124
+ for (let it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {
20125
+ carry += (256 * b58[it1]) >>> 0;
20126
+ b58[it1] = (carry % BASE) >>> 0;
20127
+ carry = (carry / BASE) >>> 0;
20128
+ }
20129
+ if (carry !== 0) { throw new Error('Non-zero carry') }
20130
+ length = i;
20131
+ pbegin++;
20132
+ }
20133
+ // Skip leading zeroes in base58 result.
20134
+ let it2 = size - length;
20135
+ while (it2 !== size && b58[it2] === 0) {
20136
+ it2++;
20137
+ }
20138
+ // Translate the result into a string.
20139
+ let str = LEADER.repeat(zeroes);
20140
+ for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }
20141
+ return str
20142
+ }
20143
+ function decodeUnsafe (source) {
20144
+ if (typeof source !== 'string') { throw new TypeError('Expected String') }
20145
+ if (source.length === 0) { return new Uint8Array() }
20146
+ let psz = 0;
20147
+ // Skip and count leading '1's.
20148
+ let zeroes = 0;
20149
+ let length = 0;
20150
+ while (source[psz] === LEADER) {
20151
+ zeroes++;
20152
+ psz++;
20153
+ }
20154
+ // Allocate enough space in big-endian base256 representation.
20155
+ const size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.
20156
+ const b256 = new Uint8Array(size);
20157
+ // Process the characters.
20158
+ while (psz < source.length) {
20159
+ // Find code of next character
20160
+ const charCode = source.charCodeAt(psz);
20161
+ // Base map can not be indexed using char code
20162
+ if (charCode > 255) { return }
20163
+ // Decode character
20164
+ let carry = BASE_MAP[charCode];
20165
+ // Invalid character
20166
+ if (carry === 255) { return }
20167
+ let i = 0;
20168
+ for (let it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {
20169
+ carry += (BASE * b256[it3]) >>> 0;
20170
+ b256[it3] = (carry % 256) >>> 0;
20171
+ carry = (carry / 256) >>> 0;
20172
+ }
20173
+ if (carry !== 0) { throw new Error('Non-zero carry') }
20174
+ length = i;
20175
+ psz++;
20176
+ }
20177
+ // Skip leading zeroes in b256.
20178
+ let it4 = size - length;
20179
+ while (it4 !== size && b256[it4] === 0) {
20180
+ it4++;
20181
+ }
20182
+ const vch = new Uint8Array(zeroes + (size - it4));
20183
+ let j = zeroes;
20184
+ while (it4 !== size) {
20185
+ vch[j++] = b256[it4++];
20186
+ }
20187
+ return vch
20188
+ }
20189
+ function decode (string) {
20190
+ const buffer = decodeUnsafe(string);
20191
+ if (buffer) { return buffer }
20192
+ throw new Error('Non-base' + BASE + ' character')
20193
+ }
20194
+ return {
20195
+ encode,
20196
+ decodeUnsafe,
20197
+ decode
20198
+ }
20199
+ }
20200
+ cjs.default = base;
20201
+ return cjs;
20202
+ }
20203
+
20204
+ var bs58;
20205
+ var hasRequiredBs58;
20206
+
20207
+ function requireBs58 () {
20208
+ if (hasRequiredBs58) return bs58;
20209
+ hasRequiredBs58 = 1;
20210
+ var basex = requireCjs();
20211
+ var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
20212
+
20213
+ bs58 = basex(ALPHABET);
20214
+ return bs58;
20235
20215
  }
20236
20216
 
20237
- var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
20238
- var bs58 = base(ALPHABET);
20217
+ var bs58Exports = requireBs58();
20218
+ var base58 = /*@__PURE__*/getDefaultExportFromCjs$1(bs58Exports);
20239
20219
 
20240
- var index = /*#__PURE__*/Object.freeze({
20220
+ var index = /*#__PURE__*/_mergeNamespaces({
20241
20221
  __proto__: null,
20242
- default: bs58
20243
- });
20222
+ default: base58
20223
+ }, [bs58Exports]);
20244
20224
 
20245
20225
  const SURFNET_RPC_URL$1 = "https://surfpool.fly.dev";
20246
20226
  let React;
@@ -20974,7 +20954,7 @@ class PrivyWalletProvider {
20974
20954
  // Handle case where signature might be bytes instead of string
20975
20955
  const rawSig = result.signature;
20976
20956
  if (rawSig instanceof Uint8Array || Array.isArray(rawSig)) {
20977
- signature = bs58.encode(rawSig instanceof Uint8Array ? rawSig : new Uint8Array(rawSig));
20957
+ signature = base58.encode(rawSig instanceof Uint8Array ? rawSig : new Uint8Array(rawSig));
20978
20958
  }
20979
20959
  else {
20980
20960
  signature = rawSig;
@@ -21142,46 +21122,6 @@ function isMobileWalletAvailable() {
21142
21122
  return detectAndroid();
21143
21123
  }
21144
21124
  const ED25519_SIGNATURE_LENGTH = 64;
21145
- /**
21146
- * On Android Chrome PWA (e.g. Solana Seeker in standalone mode), MWA's
21147
- * transact() opens a WebSocket to ws://localhost:<port>/solana-wallet to
21148
- * handshake with the wallet app on the device. Chrome guards localhost
21149
- * connections behind the Local Network Access ("Apps on Device") permission
21150
- * dialog. The dialog inherits the activity's window-focus state at spawn
21151
- * time — so if focus is in transit (e.g. just after a Phantom-modal close
21152
- * triggers a React commit), the dialog renders with grayed-out Allow/Block
21153
- * buttons and only becomes interactive after a manual background→resume
21154
- * (which forces an onPause→onResume cycle on the activity).
21155
- *
21156
- * Wait for window focus to settle, then yield one frame, before opening
21157
- * the WebSocket. This makes the system dialog spawn into a focused activity
21158
- * so its buttons are immediately tappable.
21159
- */
21160
- async function awaitActivityFocus() {
21161
- if (typeof document === 'undefined' || typeof window === 'undefined')
21162
- return;
21163
- if (!document.hasFocus()) {
21164
- await new Promise((resolve) => {
21165
- const onFocus = () => {
21166
- window.removeEventListener('focus', onFocus);
21167
- resolve();
21168
- };
21169
- window.addEventListener('focus', onFocus);
21170
- // Fallback in case the focus event never fires (e.g. activity
21171
- // already focused but document.hasFocus() momentarily lies during
21172
- // a React commit). 600ms is a perceptual ceiling — beyond this
21173
- // the user notices a stall, so we'd rather take the focus race
21174
- // than block forever.
21175
- setTimeout(() => {
21176
- window.removeEventListener('focus', onFocus);
21177
- resolve();
21178
- }, 600);
21179
- });
21180
- }
21181
- // Yield to next paint so any pending React commits / focus changes have
21182
- // flushed before the WebSocket open spawns the system dialog.
21183
- await new Promise((r) => requestAnimationFrame(() => r()));
21184
- }
21185
21125
  // Dynamically imported MWA protocol module
21186
21126
  let mwaProtocolModule = null;
21187
21127
  let mwaProtocolLoadPromise = null;
@@ -21194,7 +21134,7 @@ async function loadMwaProtocol() {
21194
21134
  return mwaProtocolLoadPromise;
21195
21135
  mwaProtocolLoadPromise = (async () => {
21196
21136
  try {
21197
- mwaProtocolModule = await import('./index.browser-xJkO73vw.esm.js');
21137
+ mwaProtocolModule = await import('./index.browser-pE1s68e9.esm.js');
21198
21138
  }
21199
21139
  catch (e) {
21200
21140
  console.warn('[SolanaMobileWallet] @solana-mobile/mobile-wallet-adapter-protocol-web3js not installed. Install it to enable Seeker wallet support.');
@@ -21216,7 +21156,7 @@ async function registerMobileWalletAdapter(config) {
21216
21156
  if (typeof window === 'undefined')
21217
21157
  return;
21218
21158
  try {
21219
- const walletStandardMobile = await import('./index.browser-7dDfRU5G.esm.js');
21159
+ const walletStandardMobile = await import('./index.browser-BNdFfyIg.esm.js');
21220
21160
  const registerMwa = walletStandardMobile.registerMwa || ((_a = walletStandardMobile.default) === null || _a === void 0 ? void 0 : _a.registerMwa);
21221
21161
  if (!registerMwa) {
21222
21162
  console.warn('[SolanaMobileWallet] registerMwa not found in @solana-mobile/wallet-standard-mobile');
@@ -21360,7 +21300,6 @@ class SolanaMobileWalletProvider {
21360
21300
  }
21361
21301
  // Pre-fetch nonce from server while wallet is not yet connected
21362
21302
  const nonce = await genAuthNonce();
21363
- await awaitActivityFocus();
21364
21303
  // Single transact() call: authorize + signMessages — one wallet popup
21365
21304
  const result = await transact(async (wallet) => {
21366
21305
  // Step 1: Authorize — user approves the dApp
@@ -21449,7 +21388,6 @@ class SolanaMobileWalletProvider {
21449
21388
  await loadMwaProtocol();
21450
21389
  const { transact } = mwaProtocolModule;
21451
21390
  const authToken = this.authToken;
21452
- await awaitActivityFocus();
21453
21391
  await transact(async (wallet) => {
21454
21392
  await wallet.deauthorize({ auth_token: authToken });
21455
21393
  }, this.getAssociationConfig());
@@ -21475,7 +21413,6 @@ class SolanaMobileWalletProvider {
21475
21413
  const { transact } = mwaProtocolModule;
21476
21414
  const base64Addr = this.base64Address;
21477
21415
  try {
21478
- await awaitActivityFocus();
21479
21416
  const signedMessages = await transact(async (wallet) => {
21480
21417
  await this.reauthorizeWallet(wallet);
21481
21418
  const messageBytes = getPlatform().textEncode(message);
@@ -21529,7 +21466,6 @@ class SolanaMobileWalletProvider {
21529
21466
  }
21530
21467
  }
21531
21468
  try {
21532
- await awaitActivityFocus();
21533
21469
  const signedTransactions = await transact(async (wallet) => {
21534
21470
  await this.reauthorizeWallet(wallet);
21535
21471
  return wallet.signTransactions({ transactions: [transaction] });
@@ -21577,7 +21513,6 @@ class SolanaMobileWalletProvider {
21577
21513
  }
21578
21514
  if (isSurfnet) {
21579
21515
  // Surfnet: sign-only, then submit to our specific RPC
21580
- await awaitActivityFocus();
21581
21516
  const signedTransactions = await transact(async (wallet) => {
21582
21517
  await this.reauthorizeWallet(wallet);
21583
21518
  return wallet.signTransactions({ transactions: [transaction] });
@@ -21597,7 +21532,6 @@ class SolanaMobileWalletProvider {
21597
21532
  return signature;
21598
21533
  }
21599
21534
  // Non-surfnet: use signAndSendTransactions for wallet-optimized submission
21600
- await awaitActivityFocus();
21601
21535
  const signatures = await transact(async (wallet) => {
21602
21536
  await this.reauthorizeWallet(wallet);
21603
21537
  return wallet.signAndSendTransactions({
@@ -21681,7 +21615,6 @@ class SolanaMobileWalletProvider {
21681
21615
  tx = result.tx;
21682
21616
  }
21683
21617
  if ((options === null || options === void 0 ? void 0 : options.shouldSubmitTx) === false) {
21684
- await awaitActivityFocus();
21685
21618
  const [signedTx] = await transact(async (wallet) => {
21686
21619
  await this.reauthorizeWallet(wallet);
21687
21620
  return wallet.signTransactions({ transactions: [tx] });
@@ -21695,7 +21628,6 @@ class SolanaMobileWalletProvider {
21695
21628
  }
21696
21629
  if (isSurfnet) {
21697
21630
  // Surfnet: sign then submit manually to our RPC
21698
- await awaitActivityFocus();
21699
21631
  const [signedTx] = await transact(async (wallet) => {
21700
21632
  await this.reauthorizeWallet(wallet);
21701
21633
  return wallet.signTransactions({ transactions: [tx] });
@@ -21724,7 +21656,6 @@ class SolanaMobileWalletProvider {
21724
21656
  };
21725
21657
  }
21726
21658
  // Non-surfnet: use signAndSendTransactions
21727
- await awaitActivityFocus();
21728
21659
  const signatures = await transact(async (wallet) => {
21729
21660
  await this.reauthorizeWallet(wallet);
21730
21661
  return wallet.signAndSendTransactions({
@@ -21978,7 +21909,7 @@ class PrivyExpoProvider {
21978
21909
  const wallet = await this.getWalletOrThrow();
21979
21910
  const messageBytes = getPlatform().textEncode(message);
21980
21911
  const result = await wallet.signMessage(messageBytes);
21981
- return bs58.encode(result.signature);
21912
+ return base58.encode(result.signature);
21982
21913
  }
21983
21914
  async signTransaction(transaction) {
21984
21915
  await this.ensureReady();
@@ -22133,5 +22064,5 @@ class PrivyExpoProvider {
22133
22064
  }
22134
22065
  }
22135
22066
 
22136
- export { getCachedData as $, subscribe as A, useAuth as B, deserializeTransaction as C, getIdToken as D, setPlatform as E, getPlatform as F, PrivyWalletProvider as G, DEFAULT_TEST_ADDRESS as H, isMobileWalletAvailable as I, registerMobileWalletAdapter as J, PrivyExpoProvider as K, InsufficientBalanceError as L, MockAuthProvider as M, ServerSessionManager as N, OffchainAuthProvider as O, PhantomWalletProvider as P, buildSetDocumentsTransaction as Q, ReactNativeSessionManager as R, SolanaMobileWalletProvider as S, clearCache as T, closeAllSubscriptions as U, convertRemainingAccounts as V, WebSessionManager as W, createSessionWithPrivy as X, createSessionWithSignature as Y, genAuthNonce as Z, genSolanaMessage as _, bs58 as a, getMany as a0, reconnectWithNewAuth as a1, refreshSession as a2, signSessionCreateMessage as a3, bufferExports as b, getCurrentUser as c, onAuthLoadingChanged as d, getAuthLoading as e, logout as f, getDefaultExportFromCjs$1 as g, getConfig as h, init as i, getAuthProvider as j, get as k, login as l, setMany as m, setFile as n, onAuthStateChanged as o, getFiles as p, runQueryMany as q, runQuery as r, set as s, runExpression as t, runExpressionMany as u, signMessage as v, signTransaction as w, signAndSubmitTransaction as x, count as y, aggregate as z };
22137
- //# sourceMappingURL=index-Bx_lLXRT.esm.js.map
22067
+ export { genAuthNonce as $, count as A, aggregate as B, subscribe as C, useAuth as D, deserializeTransaction as E, getIdToken as F, setPlatform as G, getPlatform as H, PrivyWalletProvider as I, DEFAULT_TEST_ADDRESS as J, isMobileWalletAvailable as K, registerMobileWalletAdapter as L, MockAuthProvider as M, PrivyExpoProvider as N, OffchainAuthProvider as O, PhantomWalletProvider as P, InsufficientBalanceError as Q, ReactNativeSessionManager as R, SolanaMobileWalletProvider as S, ServerSessionManager as T, buildSetDocumentsTransaction as U, clearCache as V, WebSessionManager as W, closeAllSubscriptions as X, convertRemainingAccounts as Y, createSessionWithPrivy as Z, createSessionWithSignature as _, base58 as a, genSolanaMessage as a0, getCachedData as a1, getMany as a2, reconnectWithNewAuth as a3, refreshSession as a4, signSessionCreateMessage as a5, bufferExports as b, commonjsRequire as c, getCurrentUser as d, onAuthLoadingChanged as e, getAuthLoading as f, getDefaultExportFromCjs$1 as g, logout as h, init as i, getConfig as j, getAuthProvider as k, login as l, get as m, setMany as n, onAuthStateChanged as o, setFile as p, getFiles as q, require$$0 as r, set as s, runQuery as t, runQueryMany as u, runExpression as v, runExpressionMany as w, signMessage as x, signTransaction as y, signAndSubmitTransaction as z };
22068
+ //# sourceMappingURL=index-nt_HQVrk.esm.js.map