@getpara/solana-wallet-connectors 2.27.0 → 2.29.0

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.
@@ -42,7 +42,10 @@ import { jsx } from "react/jsx-runtime";
42
42
  import { createContext, useEffect, useMemo, useRef, useState } from "react";
43
43
  import { useWallet } from "@solana/wallet-adapter-react";
44
44
  import { isIosAndRedirectable, WalletReadyState } from "@solana/wallet-adapter-base";
45
- import { isAndroid } from "@getpara/web-sdk";
45
+ import {
46
+ isAndroid,
47
+ isAndroidChrome
48
+ } from "@getpara/web-sdk";
46
49
  import {
47
50
  defaultSolanaExternalWallet
48
51
  } from "@getpara/react-common";
@@ -112,16 +115,63 @@ function SolanaExternalWalletProvider({
112
115
  return (_a = solanaAddressRef.current) == null ? void 0 : _a.toString();
113
116
  }),
114
117
  signMessage: (_0) => __async(this, [_0], function* ({ message }) {
115
- var _a, _b, _c, _d;
116
- try {
118
+ var _a, _b, _c;
119
+ const resolveSignFn = () => {
120
+ var _a2;
121
+ if (solanaSignMessageRef.current) return solanaSignMessageRef.current;
122
+ if (solanaSignMessage) return solanaSignMessage;
123
+ const adapter = (_a2 = walletRef.current) == null ? void 0 : _a2.adapter;
124
+ if (adapter && typeof adapter.signMessage === "function") {
125
+ return adapter.signMessage.bind(adapter);
126
+ }
127
+ return void 0;
128
+ };
129
+ const snapshotState = () => {
130
+ var _a2, _b2, _c2, _d, _e, _f, _g, _h;
131
+ return {
132
+ adapterName: (_b2 = (_a2 = walletRef.current) == null ? void 0 : _a2.adapter) == null ? void 0 : _b2.name,
133
+ adapterConnected: (_d = (_c2 = walletRef.current) == null ? void 0 : _c2.adapter) == null ? void 0 : _d.connected,
134
+ adapterHasPublicKey: !!((_f = (_e = walletRef.current) == null ? void 0 : _e.adapter) == null ? void 0 : _f.publicKey),
135
+ hasRefSignMessage: !!solanaSignMessageRef.current,
136
+ hasClosureSignMessage: !!solanaSignMessage,
137
+ hasAdapterSignMessage: typeof ((_h = (_g = walletRef.current) == null ? void 0 : _g.adapter) == null ? void 0 : _h.signMessage) === "function"
138
+ };
139
+ };
140
+ const waitForSignFn = () => __async(this, null, function* () {
117
141
  const start = Date.now();
118
- let fn = (_a = solanaSignMessageRef.current) != null ? _a : solanaSignMessage;
142
+ let fn = resolveSignFn();
119
143
  while (!fn) {
120
144
  if (Date.now() - start > SIGN_MESSAGE_REF_WAIT_MS) {
121
- throw new Error("Solana signMessage unavailable");
145
+ return void 0;
122
146
  }
123
147
  yield new Promise((resolve) => setTimeout(resolve, 100));
124
- fn = (_b = solanaSignMessageRef.current) != null ? _b : solanaSignMessage;
148
+ fn = resolveSignFn();
149
+ }
150
+ return fn;
151
+ });
152
+ try {
153
+ let fn = yield waitForSignFn();
154
+ if (!fn) {
155
+ const adapter = (_a = walletRef.current) == null ? void 0 : _a.adapter;
156
+ if (adapter) {
157
+ const stateBefore = snapshotState();
158
+ console.warn(
159
+ "[Solana signMessage] sign fn unavailable after wait; attempting adapter.connect() recovery",
160
+ stateBefore
161
+ );
162
+ try {
163
+ if (!adapter.connected) {
164
+ yield adapter.connect();
165
+ }
166
+ fn = yield waitForSignFn();
167
+ } catch (reconnectErr) {
168
+ console.error("[Solana signMessage] reconnect attempt failed", reconnectErr, snapshotState());
169
+ }
170
+ }
171
+ }
172
+ if (!fn) {
173
+ console.error("[Solana signMessage] sign fn unavailable after recovery", snapshotState());
174
+ throw new Error("Solana signMessage unavailable");
125
175
  }
126
176
  const encodedMessage = new TextEncoder().encode(message);
127
177
  const signature = yield fn(encodedMessage);
@@ -130,11 +180,11 @@ function SolanaExternalWalletProvider({
130
180
  };
131
181
  } catch (e) {
132
182
  console.error(e);
133
- if ((_c = e == null ? void 0 : e.message) == null ? void 0 : _c.includes("User rejected the request")) {
183
+ if ((_b = e == null ? void 0 : e.message) == null ? void 0 : _b.includes("User rejected the request")) {
134
184
  throw new Error("Signature request rejected");
135
185
  }
136
- console.error("Solana signature error:", e == null ? void 0 : e.message);
137
- throw new Error(`Solana signMessage failed: ${(_d = e == null ? void 0 : e.message) != null ? _d : "unknown"}`);
186
+ console.error("Solana signature error:", e == null ? void 0 : e.message, snapshotState());
187
+ throw new Error(`Solana signMessage failed: ${(_c = e == null ? void 0 : e.message) != null ? _c : "unknown"}`);
138
188
  }
139
189
  }),
140
190
  watchDisconnection: (callback) => {
@@ -266,7 +316,7 @@ function SolanaExternalWalletProvider({
266
316
  throw e;
267
317
  }
268
318
  });
269
- const connectCallback = (adapter) => {
319
+ const connectCallback = (adapter, walletName) => {
270
320
  return () => __async(this, null, function* () {
271
321
  var _a, _b, _c, _d;
272
322
  let address;
@@ -275,7 +325,7 @@ function SolanaExternalWalletProvider({
275
325
  } catch (e) {
276
326
  throw e;
277
327
  }
278
- const providerName = adapter.name;
328
+ const providerName = walletName != null ? walletName : adapter.name;
279
329
  const providerId = (_b = (_a = getWallet(providerName != null ? providerName : "")) == null ? void 0 : _a.id) != null ? _b : "";
280
330
  solanaAddressRef.current = address;
281
331
  return {
@@ -293,13 +343,15 @@ function SolanaExternalWalletProvider({
293
343
  };
294
344
  });
295
345
  };
296
- const connect = (adapter) => __async(this, null, function* () {
346
+ const connect = (adapter, walletName) => __async(this, null, function* () {
297
347
  var _a;
298
348
  if (isIosAndRedirectable() && !isInSolanaWalletDappBrowser()) {
299
349
  return;
300
350
  }
301
351
  if (isAndroid() && (adapter == null ? void 0 : adapter.name) === "Mobile Wallet Adapter") {
302
- return;
352
+ if (!isAndroidChrome()) return;
353
+ const tappedWallet = getWallet(walletName != null ? walletName : "");
354
+ if (!(tappedWallet == null ? void 0 : tappedWallet.mwaSupported)) return;
303
355
  }
304
356
  if (adapter && (wallet == null ? void 0 : wallet.adapter) && wallet.adapter.name !== adapter.name) {
305
357
  yield disconnect();
@@ -310,7 +362,7 @@ function SolanaExternalWalletProvider({
310
362
  let error;
311
363
  let authState;
312
364
  try {
313
- authState = yield para.connectExternalWallet({ connect: connectCallback(adapter) });
365
+ authState = yield para.connectExternalWallet({ connect: connectCallback(adapter, walletName) });
314
366
  address = (_a = authState.externalWallet) == null ? void 0 : _a.address;
315
367
  } catch (err) {
316
368
  switch (err.message) {
@@ -383,23 +435,29 @@ function SolanaExternalWalletProvider({
383
435
  const createWallet = (walletFn) => {
384
436
  const metaData = walletFn();
385
437
  const adapter = getAdapter(metaData.name);
438
+ const isMwaOnAndroidChrome = !!metaData.mwaSupported && isAndroidChrome();
386
439
  return __spreadProps(__spreadValues({
387
- connect: () => connect(adapter),
388
- connectMobile: () => connect(adapter),
440
+ connect: () => connect(adapter, metaData.name),
441
+ connectMobile: () => connect(adapter, metaData.name),
389
442
  type: "SOLANA",
390
- installed: adapter && ((adapter == null ? void 0 : adapter.readyState) === WalletReadyState.Installed || (adapter == null ? void 0 : adapter.readyState) === WalletReadyState.Loadable)
443
+ installed: isMwaOnAndroidChrome || adapter && ((adapter == null ? void 0 : adapter.readyState) === WalletReadyState.Installed || (adapter == null ? void 0 : adapter.readyState) === WalletReadyState.Loadable)
391
444
  }, metaData), {
392
445
  // Using name here since that's the only common id across the networks
393
446
  id: metaData.name
394
447
  });
395
448
  };
396
- const [wallets, setWallets] = useState(() => walletFns.map(createWallet));
449
+ const [wallets, setWallets] = useState(() => {
450
+ const created = walletFns.map(createWallet);
451
+ if (isAndroidChrome()) return created;
452
+ return created.filter((w) => w.internalId !== "SEED_VAULT_WALLET");
453
+ });
397
454
  useEffect(() => {
398
455
  setWallets(
399
456
  (prev) => prev.map((wallet2) => {
400
457
  var _a;
401
458
  const adapter = getAdapter((_a = wallet2.name) != null ? _a : "");
402
- const installed = !!adapter && (adapter.readyState === WalletReadyState.Installed || adapter.readyState === WalletReadyState.Loadable);
459
+ const isMwaOnAndroidChrome = !!wallet2.mwaSupported && isAndroidChrome();
460
+ const installed = isMwaOnAndroidChrome || !!adapter && (adapter.readyState === WalletReadyState.Installed || adapter.readyState === WalletReadyState.Loadable);
403
461
  if (wallet2.installed !== installed) {
404
462
  return __spreadProps(__spreadValues({}, wallet2), { installed });
405
463
  }
@@ -30,6 +30,7 @@ const backpackWallet = () => {
30
30
  isExtension: true,
31
31
  isMobile: true,
32
32
  hasIosSafariExtension: false,
33
+ mwaSupported: true,
33
34
  getQrUri: () => __async(void 0, null, function* () {
34
35
  if (typeof window !== "undefined" && isIosAndRedirectable()) {
35
36
  const url = encodeURIComponent(window.location.href);
@@ -4,5 +4,6 @@ import { glowWallet } from './glow/glow.js';
4
4
  import { backpackWallet } from './backpack/backpack.js';
5
5
  import { solflareWallet } from './solflare/solflare.js';
6
6
  import { metaMaskWallet } from './metaMask/metaMask.js';
7
- export { farcasterWallet, phantomWallet, glowWallet, backpackWallet, solflareWallet, metaMaskWallet };
7
+ import { seedVaultWallet } from './seedVault/seedVault.js';
8
+ export { farcasterWallet, phantomWallet, glowWallet, backpackWallet, solflareWallet, metaMaskWallet, seedVaultWallet };
8
9
  export declare const allWallets: (() => import("../../types/Wallet.js").Wallet)[];
@@ -5,7 +5,8 @@ import { glowWallet } from "./glow/glow.js";
5
5
  import { backpackWallet } from "./backpack/backpack.js";
6
6
  import { solflareWallet } from "./solflare/solflare.js";
7
7
  import { metaMaskWallet } from "./metaMask/metaMask.js";
8
- const allWallets = [phantomWallet, glowWallet, backpackWallet, solflareWallet, metaMaskWallet];
8
+ import { seedVaultWallet } from "./seedVault/seedVault.js";
9
+ const allWallets = [phantomWallet, glowWallet, backpackWallet, solflareWallet, metaMaskWallet, seedVaultWallet];
9
10
  export {
10
11
  allWallets,
11
12
  backpackWallet,
@@ -13,5 +14,6 @@ export {
13
14
  glowWallet,
14
15
  metaMaskWallet,
15
16
  phantomWallet,
17
+ seedVaultWallet,
16
18
  solflareWallet
17
19
  };
@@ -30,6 +30,7 @@ const phantomWallet = () => {
30
30
  isExtension: true,
31
31
  isMobile: true,
32
32
  hasIosSafariExtension: false,
33
+ mwaSupported: true,
33
34
  getQrUri: () => __async(void 0, null, function* () {
34
35
  if (typeof window !== "undefined" && isIosAndRedirectable()) {
35
36
  const url = encodeURIComponent(window.location.href);
@@ -0,0 +1,2 @@
1
+ import { Wallet } from '../../../types/Wallet.js';
2
+ export declare const seedVaultWallet: () => Wallet;
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ var __async = (__this, __arguments, generator) => {
3
+ return new Promise((resolve, reject) => {
4
+ var fulfilled = (value) => {
5
+ try {
6
+ step(generator.next(value));
7
+ } catch (e) {
8
+ reject(e);
9
+ }
10
+ };
11
+ var rejected = (value) => {
12
+ try {
13
+ step(generator.throw(value));
14
+ } catch (e) {
15
+ reject(e);
16
+ }
17
+ };
18
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
19
+ step((generator = generator.apply(__this, __arguments)).next());
20
+ });
21
+ };
22
+ import { icon } from "./seedVaultIcon.js";
23
+ const seedVaultWallet = () => {
24
+ return {
25
+ id: "seed_vault_wallet",
26
+ internalId: "SEED_VAULT_WALLET",
27
+ name: "Seed Vault Wallet",
28
+ iconUrl: icon,
29
+ isExtension: false,
30
+ isMobile: true,
31
+ hasIosSafariExtension: false,
32
+ mwaSupported: true,
33
+ // No QR / universal-link path: Seed Vault Wallet has no in-app browser and
34
+ // no `window.solana` injection. MWA is the only entry point.
35
+ getQrUri: () => __async(void 0, null, function* () {
36
+ return "";
37
+ }),
38
+ downloadUrl: "https://solanamobile.com/seeker"
39
+ };
40
+ };
41
+ export {
42
+ seedVaultWallet
43
+ };
@@ -0,0 +1 @@
1
+ export declare const icon = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAyNDUgMjQ1IiBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxMjIuNSIgY3k9IjEyMi41IiByPSIxMjIuNSIgZmlsbD0iIzAwMDAwMCIvPjxwYXRoIGQ9Ik0xMjIuNSAwQzE5MC4xNTUgMCAyNDUgNTQuODQ1MSAyNDUgMTIyLjVDMjQ1IDE5MC4xNTUgMTkwLjE1NSAyNDUgMTIyLjUgMjQ1QzU1LjAxMTkgMjQ1IDAuMjcyMzYgMTkwLjQyNSAwLjAwMjkyOTY5IDEyM0gwQzAgMTIyLjkzNiAwLjAwMDcyMDUyIDEyMi44NzIgMC4wMDA5NzY1NjIgMTIyLjgwOEMwLjAwMDcyNDU4OCAxMjIuNzA1IDAgMTIyLjYwMyAwIDEyMi41QzAgNTQuODQ1MSA1NC44NDUxIDAgMTIyLjUgMFpNMTIyLjUgMjBDODQuOTY4MiAyMCA1Mi4xNDc2IDQwLjE3MTkgMzQuMjg5MSA3MC4yNjU2QzU2LjU3MTEgNTUuOTIyOCA4Ny44NTU5IDQ3IDEyMi41IDQ3QzEzNy4zNjQgNDcgMTUwLjY3IDQ5LjQ5NjEgMTY0IDU1QzE3Ny4zMyA2MC41MDM5IDE4OC43MTggNzAuOTQxIDE5NS43OTMgODQuNTkyOEMxNzcuNDEgNzQuMDIwMiAxNTEuNzAxIDY3IDEyMi41IDY3QzkxLjc5NDEgNjcgNjQuOTQ3OSA3NC43NjE4IDQ2LjQyMjkgODYuMjU0OUMzMi44MzEzIDk0LjY4NzIgMjUuMDkzNSAxMDQuMDg2IDIxLjg0MDggMTEzSDY2VjEzM0gyMC41MzEyQzI1Ljc4OTUgMTg0LjY3NyA2OS40MzU3IDIyNSAxMjIuNSAyMjVDMTU5LjQ0IDIyNSAxOTEuODE0IDIwNS40NTkgMjA5Ljg1MyAxNzYuMTVDMTg3LjYxNCAxOTAuMjQ5IDE1Ni42MDEgMTk5IDEyMi4yOTMgMTk5QzEwNy40MjkgMTk5IDk0LjEyMzQgMTk2LjUwNCA4MC43OTMgMTkxQzY3LjQ2MjUgMTg1LjQ5NiA1Ni4wNzUyIDE3NS4wNTkgNDkgMTYxLjQwN0M2Ny4zODI2IDE3MS45OCA5My4wOTIzIDE3OSAxMjIuMjkzIDE3OUMxNTIuOTk5IDE3OSAxNzkuODQ1IDE3MS4yMzggMTk4LjM3IDE1OS43NDVDMjExLjk2MiAxNTEuMzEzIDIxOS42OTkgMTQxLjkxNCAyMjIuOTUyIDEzM0gxNzlWMTEzSDIyNC41NjNDMjE5Ljc3IDYwLjg0NDYgMTc1LjkwNiAyMCAxMjIuNSAyMFpNMTIyLjUgODZDMTQyLjY1OCA4NiAxNTkgMTAyLjM0MiAxNTkgMTIyLjVDMTU5IDE0Mi42NTggMTQyLjY1OCAxNTkgMTIyLjUgMTU5QzEwMi4zNDIgMTU5IDg2IDE0Mi42NTggODYgMTIyLjVDODYgMTAyLjM0MiAxMDIuMzQyIDg2IDEyMi41IDg2Wk0xMjIuNSAxMDZDMTEzLjM4NyAxMDYgMTA2IDExMy4zODcgMTA2IDEyMi41QzEwNiAxMzEuNjEzIDExMy4zODcgMTM5IDEyMi41IDEzOUMxMzEuNjEzIDEzOSAxMzkgMTMxLjYxMyAxMzkgMTIyLjVDMTM5IDExMy4zODcgMTMxLjYxMyAxMDYgMTIyLjUgMTA2WiIgZmlsbD0iI0ZGRkZGRiIvPjwvc3ZnPgo=";
@@ -0,0 +1,5 @@
1
+ "use client";
2
+ const icon = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAyNDUgMjQ1IiBmaWxsPSJub25lIj48Y2lyY2xlIGN4PSIxMjIuNSIgY3k9IjEyMi41IiByPSIxMjIuNSIgZmlsbD0iIzAwMDAwMCIvPjxwYXRoIGQ9Ik0xMjIuNSAwQzE5MC4xNTUgMCAyNDUgNTQuODQ1MSAyNDUgMTIyLjVDMjQ1IDE5MC4xNTUgMTkwLjE1NSAyNDUgMTIyLjUgMjQ1QzU1LjAxMTkgMjQ1IDAuMjcyMzYgMTkwLjQyNSAwLjAwMjkyOTY5IDEyM0gwQzAgMTIyLjkzNiAwLjAwMDcyMDUyIDEyMi44NzIgMC4wMDA5NzY1NjIgMTIyLjgwOEMwLjAwMDcyNDU4OCAxMjIuNzA1IDAgMTIyLjYwMyAwIDEyMi41QzAgNTQuODQ1MSA1NC44NDUxIDAgMTIyLjUgMFpNMTIyLjUgMjBDODQuOTY4MiAyMCA1Mi4xNDc2IDQwLjE3MTkgMzQuMjg5MSA3MC4yNjU2QzU2LjU3MTEgNTUuOTIyOCA4Ny44NTU5IDQ3IDEyMi41IDQ3QzEzNy4zNjQgNDcgMTUwLjY3IDQ5LjQ5NjEgMTY0IDU1QzE3Ny4zMyA2MC41MDM5IDE4OC43MTggNzAuOTQxIDE5NS43OTMgODQuNTkyOEMxNzcuNDEgNzQuMDIwMiAxNTEuNzAxIDY3IDEyMi41IDY3QzkxLjc5NDEgNjcgNjQuOTQ3OSA3NC43NjE4IDQ2LjQyMjkgODYuMjU0OUMzMi44MzEzIDk0LjY4NzIgMjUuMDkzNSAxMDQuMDg2IDIxLjg0MDggMTEzSDY2VjEzM0gyMC41MzEyQzI1Ljc4OTUgMTg0LjY3NyA2OS40MzU3IDIyNSAxMjIuNSAyMjVDMTU5LjQ0IDIyNSAxOTEuODE0IDIwNS40NTkgMjA5Ljg1MyAxNzYuMTVDMTg3LjYxNCAxOTAuMjQ5IDE1Ni42MDEgMTk5IDEyMi4yOTMgMTk5QzEwNy40MjkgMTk5IDk0LjEyMzQgMTk2LjUwNCA4MC43OTMgMTkxQzY3LjQ2MjUgMTg1LjQ5NiA1Ni4wNzUyIDE3NS4wNTkgNDkgMTYxLjQwN0M2Ny4zODI2IDE3MS45OCA5My4wOTIzIDE3OSAxMjIuMjkzIDE3OUMxNTIuOTk5IDE3OSAxNzkuODQ1IDE3MS4yMzggMTk4LjM3IDE1OS43NDVDMjExLjk2MiAxNTEuMzEzIDIxOS42OTkgMTQxLjkxNCAyMjIuOTUyIDEzM0gxNzlWMTEzSDIyNC41NjNDMjE5Ljc3IDYwLjg0NDYgMTc1LjkwNiAyMCAxMjIuNSAyMFpNMTIyLjUgODZDMTQyLjY1OCA4NiAxNTkgMTAyLjM0MiAxNTkgMTIyLjVDMTU5IDE0Mi42NTggMTQyLjY1OCAxNTkgMTIyLjUgMTU5QzEwMi4zNDIgMTU5IDg2IDE0Mi42NTggODYgMTIyLjVDODYgMTAyLjM0MiAxMDIuMzQyIDg2IDEyMi41IDg2Wk0xMjIuNSAxMDZDMTEzLjM4NyAxMDYgMTA2IDExMy4zODcgMTA2IDEyMi41QzEwNiAxMzEuNjEzIDExMy4zODcgMTM5IDEyMi41IDEzOUMxMzEuNjEzIDEzOSAxMzkgMTMxLjYxMyAxMzkgMTIyLjVDMTM5IDExMy4zODcgMTMxLjYxMyAxMDYgMTIyLjUgMTA2WiIgZmlsbD0iI0ZGRkZGRiIvPjwvc3ZnPgo=";
3
+ export {
4
+ icon
5
+ };
@@ -30,6 +30,7 @@ const solflareWallet = () => {
30
30
  isExtension: true,
31
31
  isMobile: true,
32
32
  hasIosSafariExtension: false,
33
+ mwaSupported: true,
33
34
  getQrUri: () => __async(void 0, null, function* () {
34
35
  if (typeof window !== "undefined" && isIosAndRedirectable()) {
35
36
  const url = encodeURIComponent(window.location.href);
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@getpara/solana-wallet-connectors",
3
- "version": "2.27.0",
3
+ "version": "2.29.0",
4
4
  "dependencies": {
5
- "@getpara/react-common": "2.27.0",
6
- "@getpara/web-sdk": "2.27.0",
5
+ "@getpara/react-common": "2.29.0",
6
+ "@getpara/web-sdk": "2.29.0",
7
7
  "bs58": "^6.0.0"
8
8
  },
9
9
  "devDependencies": {
@@ -23,7 +23,7 @@
23
23
  "dist",
24
24
  "package.json"
25
25
  ],
26
- "gitHead": "9f3045c8e2b0b372c792a7a35a997d5955f910b1",
26
+ "gitHead": "3fe797a65534cf466471441317763b1cef00b5b5",
27
27
  "main": "dist/index.js",
28
28
  "peerDependencies": {
29
29
  "@farcaster/mini-app-solana": "^1.0.5",