@getpara/solana-wallet-connectors 2.0.0-fc.2 → 2.0.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.
package/README.md ADDED
@@ -0,0 +1,14 @@
1
+ https://www.npmjs.com/package/@getpara/solana-wallet-connectors
2
+
3
+ `@getpara/solana-wallet-connectors` is a package that provides wallet connectors for Solana when using Para's React SDK Lite.
4
+ The package enables integration with popular Solana wallets like Phantom, Backpack, Solflare, and Glow through Para's provider system. After installation, you can configure it in your ParaProvider.
5
+
6
+ ###Prerequisites
7
+
8
+ To use Para, you need an API key. This key authenticates your requests to Para services and is essential for integration.
9
+
10
+ Don't have an API key yet? Request access to the [Developer Portal](https://developer.getpara.com/) to create API keys, manage billing, teams, and more.
11
+
12
+ ###Learn more
13
+
14
+ For more information on Para’s Solana wallet connector visit the [Para Docs](https://docs.getpara.com/v2/react/guides/external-wallets/solana-lite#solana-wallets-with-react-sdk-lite)
@@ -48,7 +48,7 @@ function ParaSolanaProvider({ children, config, internalConfig }) {
48
48
  ],
49
49
  localStorageKey: "paraSolanaExternal",
50
50
  autoConnect: true,
51
- children: /* @__PURE__ */ jsx(SolanaExternalWalletProvider, __spreadProps(__spreadValues({}, solanaExternalWalletProviderProps), { children }))
51
+ children: /* @__PURE__ */ jsx(SolanaExternalWalletProvider, __spreadProps(__spreadValues({}, solanaExternalWalletProviderProps), { chain, children }))
52
52
  }
53
53
  ) });
54
54
  }
@@ -1,10 +1,13 @@
1
1
  import { PropsWithChildren } from 'react';
2
2
  import { CreateWalletFn } from '../types/Wallet.js';
3
- import { ExternalWalletContextType, ExternalWalletProviderConfig, ExternalWalletProviderConfigBase } from '@getpara/react-common';
3
+ import { ExternalWalletContextType, ExternalWalletProviderConfig, ExternalWalletProviderConfigBase, FarcasterMiniAppManagement } from '@getpara/react-common';
4
4
  import { TExternalHooks } from './externalHooks.js';
5
- export type SolanaExternalWalletContextType = ExternalWalletContextType & TExternalHooks;
5
+ import { Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';
6
+ export type SolanaExternalWalletContextType = ExternalWalletContextType & TExternalHooks & FarcasterMiniAppManagement;
6
7
  export declare const SolanaExternalWalletContext: import("react").Context<SolanaExternalWalletContextType>;
7
8
  export type SolanaExternalWalletProviderConfig = ExternalWalletProviderConfigBase;
8
9
  type SolanaExternalWalletProviderConfigFull = ExternalWalletProviderConfig<CreateWalletFn>;
9
- export declare function SolanaExternalWalletProvider({ children, wallets: walletFns, onSwitchWallet, para, walletsWithFullAuth, includeWalletVerification, connectionOnly, }: SolanaExternalWalletProviderConfigFull & PropsWithChildren): import("react/jsx-runtime").JSX.Element;
10
+ export declare function SolanaExternalWalletProvider({ children, wallets: walletFns, onSwitchWallet, para, walletsWithFullAuth, includeWalletVerification, connectionOnly, chain, }: SolanaExternalWalletProviderConfigFull & PropsWithChildren & {
11
+ chain: Chain;
12
+ }): import("react/jsx-runtime").JSX.Element;
10
13
  export {};
@@ -1,5 +1,7 @@
1
1
  "use client";
2
2
  var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
3
5
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
4
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
7
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -15,6 +17,7 @@ var __spreadValues = (a, b) => {
15
17
  }
16
18
  return a;
17
19
  };
20
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
18
21
  var __async = (__this, __arguments, generator) => {
19
22
  return new Promise((resolve, reject) => {
20
23
  var fulfilled = (value) => {
@@ -36,7 +39,7 @@ var __async = (__this, __arguments, generator) => {
36
39
  });
37
40
  };
38
41
  import { jsx } from "react/jsx-runtime";
39
- import { createContext, useEffect, useMemo, useRef } from "react";
42
+ import { createContext, useEffect, useMemo, useRef, useState } from "react";
40
43
  import { useWallet } from "@solana/wallet-adapter-react";
41
44
  import { isIosAndRedirectable, WalletReadyState } from "@solana/wallet-adapter-base";
42
45
  import {
@@ -44,7 +47,10 @@ import {
44
47
  } from "@getpara/react-common";
45
48
  import bs58 from "bs58";
46
49
  import { externalHooks } from "./externalHooks.js";
47
- const SolanaExternalWalletContext = createContext(defaultSolanaExternalWallet);
50
+ import { farcasterWallet } from "../wallets/connectors/index.js";
51
+ const SolanaExternalWalletContext = createContext(__spreadProps(__spreadValues({}, defaultSolanaExternalWallet), {
52
+ farcasterStatus: void 0
53
+ }));
48
54
  function SolanaExternalWalletProvider({
49
55
  children,
50
56
  wallets: walletFns,
@@ -52,31 +58,28 @@ function SolanaExternalWalletProvider({
52
58
  para,
53
59
  walletsWithFullAuth,
54
60
  includeWalletVerification,
55
- connectionOnly
61
+ connectionOnly,
62
+ chain
56
63
  }) {
57
64
  const {
58
65
  wallets: adapters,
59
66
  select: selectWallet,
60
67
  disconnect,
68
+ disconnecting,
61
69
  publicKey: solanaAddress,
62
70
  wallet,
63
71
  connecting,
64
72
  signMessage: solanaSignMessage
65
73
  } = useWallet();
66
- const isLinkingAccount = useRef(false);
74
+ const disconnectTypeRef = useRef();
67
75
  const solanaSignMessageRef = useRef(solanaSignMessage);
68
76
  const solanaAddressRef = useRef(solanaAddress);
69
77
  const verificationMessage = useRef();
78
+ const [isFarcasterSetup, setIsFarcasterSetup] = useState(false);
70
79
  const reset = () => __async(this, null, function* () {
71
80
  yield disconnect();
72
81
  yield para.logout();
73
82
  });
74
- const _reset = (..._0) => __async(this, [..._0], function* ({ logout = false } = {}) {
75
- yield disconnect();
76
- if (logout) {
77
- yield para.logout();
78
- }
79
- });
80
83
  const login = (_0) => __async(this, [_0], function* ({
81
84
  address,
82
85
  providerId,
@@ -86,18 +89,19 @@ function SolanaExternalWalletProvider({
86
89
  try {
87
90
  return yield para.loginExternalWallet({
88
91
  externalWallet: {
92
+ partnerId: para.partnerId,
89
93
  address,
90
94
  type: "SOLANA",
91
95
  provider: providerName,
92
96
  providerId,
93
- withFullParaAuth: walletsWithFullAuth == null ? void 0 : walletsWithFullAuth.includes(
94
- (_b = (_a = getWallet(providerName != null ? providerName : "")) == null ? void 0 : _a.id.toUpperCase()) != null ? _b : ""
95
- ),
97
+ withFullParaAuth: walletsWithFullAuth === "ALL" || (walletsWithFullAuth == null ? void 0 : walletsWithFullAuth.includes((_b = (_a = getWallet(providerName != null ? providerName : "")) == null ? void 0 : _a.id.toUpperCase()) != null ? _b : "")),
96
98
  withVerification: includeWalletVerification,
97
99
  isConnectionOnly: connectionOnly
98
- }
100
+ },
101
+ uri: window == null ? void 0 : window.location.origin,
102
+ chainId: chain
99
103
  });
100
- } catch (err) {
104
+ } catch (e) {
101
105
  yield reset();
102
106
  throw "Error logging you in. Please try again.";
103
107
  }
@@ -114,7 +118,7 @@ function SolanaExternalWalletProvider({
114
118
  try {
115
119
  yield login({
116
120
  address,
117
- providerId: (_c = getWallet((_b = (_a = wallet == null ? void 0 : wallet.adapter) == null ? void 0 : _a.name) != null ? _b : "")) == null ? void 0 : _c.internalId,
121
+ providerId: (_c = getWallet((_b = (_a = wallet == null ? void 0 : wallet.adapter) == null ? void 0 : _a.name) != null ? _b : "")) == null ? void 0 : _c.id,
118
122
  providerName: (_d = wallet == null ? void 0 : wallet.adapter) == null ? void 0 : _d.name
119
123
  });
120
124
  } catch (err) {
@@ -127,7 +131,7 @@ function SolanaExternalWalletProvider({
127
131
  useEffect(() => {
128
132
  var _a;
129
133
  const storedExternalWallet = para.externalWallets[(_a = solanaAddress == null ? void 0 : solanaAddress.toString()) != null ? _a : ""];
130
- if (!!solanaAddress && !storedExternalWallet && !isLinkingAccount.current) {
134
+ if (!!solanaAddress && !storedExternalWallet && !disconnectTypeRef.current) {
131
135
  reset();
132
136
  }
133
137
  }, []);
@@ -139,7 +143,7 @@ function SolanaExternalWalletProvider({
139
143
  }, [solanaAddress]);
140
144
  useEffect(() => {
141
145
  const storedExternalWallet = Object.values(para.externalWallets || {})[0];
142
- if (!connecting && (!wallet || (wallet == null ? void 0 : wallet.adapter.connected)) && (storedExternalWallet == null ? void 0 : storedExternalWallet.type) === "SOLANA" && (storedExternalWallet == null ? void 0 : storedExternalWallet.address) !== (solanaAddress == null ? void 0 : solanaAddress.toString()) && !isLinkingAccount.current) {
146
+ if (!connecting && (!wallet || (wallet == null ? void 0 : wallet.adapter.connected)) && (storedExternalWallet == null ? void 0 : storedExternalWallet.type) === "SOLANA" && (storedExternalWallet == null ? void 0 : storedExternalWallet.address) !== (solanaAddress == null ? void 0 : solanaAddress.toString()) && !disconnectTypeRef.current) {
143
147
  switchWallet(solanaAddress == null ? void 0 : solanaAddress.toString());
144
148
  }
145
149
  }, [solanaAddress, connecting, wallet]);
@@ -177,6 +181,11 @@ function SolanaExternalWalletProvider({
177
181
  if (!adapter) {
178
182
  throw new Error("Adapter not found.");
179
183
  }
184
+ const wallet2 = getWallet(adapter.name);
185
+ if (wallet2 == null ? void 0 : wallet2.getQrUri) {
186
+ const qrUri = yield wallet2.getQrUri();
187
+ window.dispatchEvent(new CustomEvent("PARA_WALLETCONNECT_URI_READY", { detail: qrUri }));
188
+ }
180
189
  selectWallet(adapter.name);
181
190
  yield new Promise((resolve) => setTimeout(resolve, 100));
182
191
  let address;
@@ -225,7 +234,7 @@ function SolanaExternalWalletProvider({
225
234
  address = yield connectBase(adapter, true);
226
235
  if (address) {
227
236
  try {
228
- authState = yield login({ address, providerId: (_a = getWallet(adapter.name)) == null ? void 0 : _a.internalId, providerName: adapter.name });
237
+ authState = yield login({ address, providerId: (_a = getWallet(adapter.name)) == null ? void 0 : _a.id, providerName: adapter.name });
229
238
  verificationMessage.current = authState.stage === "verify" ? authState.signatureVerificationMessage : void 0;
230
239
  } catch (err) {
231
240
  yield disconnect();
@@ -237,7 +246,8 @@ function SolanaExternalWalletProvider({
237
246
  switch (err.message) {
238
247
  case "User aborted.":
239
248
  case "Approval Denied":
240
- case "You canceled this request.": {
249
+ case "You canceled this request.":
250
+ case "Disconnected before connect event": {
241
251
  error = "Connection request rejected";
242
252
  break;
243
253
  }
@@ -252,15 +262,16 @@ function SolanaExternalWalletProvider({
252
262
  });
253
263
  const requestInfo = (providerId) => __async(this, null, function* () {
254
264
  var _a, _b;
255
- const wallet2 = wallets.find((w) => w.internalId === providerId);
265
+ const wallet2 = wallets.find((w) => w.id === providerId);
256
266
  const adapter = getAdapter((_a = wallet2.name) != null ? _a : "");
257
- isLinkingAccount.current = true;
267
+ disconnectTypeRef.current = "ACCOUNT_LINKING";
258
268
  try {
259
269
  const address = yield connectBase(adapter);
260
270
  const externalWallet = {
271
+ partnerId: para.partnerId,
261
272
  address,
262
273
  type: "SOLANA",
263
- providerId: wallet2.internalId,
274
+ providerId: wallet2.id,
264
275
  provider: wallet2.name
265
276
  };
266
277
  return externalWallet;
@@ -269,19 +280,25 @@ function SolanaExternalWalletProvider({
269
280
  throw new Error((_b = e == null ? void 0 : e.message) != null ? _b : e);
270
281
  }
271
282
  });
272
- const disconnectBase = (providerId) => __async(this, null, function* () {
273
- var _a, _b;
274
- const wallet2 = wallets.find((w) => w.internalId === providerId);
283
+ const disconnectBase = (_0, ..._1) => __async(this, [_0, ..._1], function* (providerId, { disconnectType } = {}) {
284
+ var _a;
285
+ const wallet2 = wallets.find((w) => w.id === providerId);
286
+ if (!wallet2) {
287
+ return;
288
+ }
275
289
  const adapter = getAdapter((_a = wallet2.name) != null ? _a : "");
276
290
  if (!(adapter == null ? void 0 : adapter.connected)) {
277
291
  return;
278
292
  }
279
- isLinkingAccount.current = true;
293
+ if (disconnectType) {
294
+ disconnectTypeRef.current = disconnectType;
295
+ }
280
296
  try {
281
297
  yield adapter.disconnect();
282
298
  } catch (e) {
283
- console.error("Error disconnecting wallet:", e);
284
- throw new Error((_b = e == null ? void 0 : e.message) != null ? _b : e);
299
+ console.error("Error disconnecting Solana wallet:", e);
300
+ } finally {
301
+ disconnectTypeRef.current = void 0;
285
302
  }
286
303
  });
287
304
  const getAdapter = (name) => {
@@ -289,22 +306,103 @@ function SolanaExternalWalletProvider({
289
306
  return (_a = adapters.find((a) => a.adapter.name === "Mobile Wallet Adapter" ? a : a.adapter.name === name ? a : false)) == null ? void 0 : _a.adapter;
290
307
  };
291
308
  const getWallet = (name) => wallets.find((w) => w.name === name);
292
- const wallets = walletFns.map((walletFn) => {
309
+ const createWallet = (walletFn) => {
293
310
  const metaData = walletFn();
294
311
  const adapter = getAdapter(metaData.name);
295
- return __spreadValues({
312
+ return __spreadProps(__spreadValues({
296
313
  connect: () => connect(adapter),
297
314
  connectMobile: () => connect(adapter),
298
315
  type: "SOLANA",
299
316
  installed: adapter && ((adapter == null ? void 0 : adapter.readyState) === WalletReadyState.Installed || (adapter == null ? void 0 : adapter.readyState) === WalletReadyState.Loadable)
300
- }, metaData);
317
+ }, metaData), {
318
+ // Using name here since that's the only common id across the networks
319
+ id: metaData.name
320
+ });
321
+ };
322
+ const [wallets, setWallets] = useState(() => walletFns.map(createWallet));
323
+ const farcasterStatus = useMemo(() => {
324
+ if (!isFarcasterSetup) {
325
+ return void 0;
326
+ }
327
+ const farcasterAdapter = getAdapter("Farcaster");
328
+ if (!farcasterAdapter) {
329
+ return {
330
+ isPresent: false
331
+ };
332
+ }
333
+ return farcasterAdapter.connected && farcasterAdapter.publicKey ? {
334
+ isPresent: true,
335
+ isConnected: true,
336
+ address: farcasterAdapter.publicKey.toString()
337
+ } : {
338
+ isPresent: true,
339
+ isConnected: false
340
+ };
341
+ }, [isFarcasterSetup, adapters]);
342
+ useEffect(() => {
343
+ const detectFarcaster = () => __async(this, null, function* () {
344
+ if (para.isFarcasterMiniApp) {
345
+ try {
346
+ yield import("@farcaster/mini-app-solana");
347
+ } catch (e) {
348
+ }
349
+ }
350
+ });
351
+ detectFarcaster();
352
+ }, [para.isFarcasterMiniApp]);
353
+ useEffect(() => {
354
+ const setupFarcaster = () => __async(this, null, function* () {
355
+ const adapter = getAdapter("Farcaster");
356
+ if (para.isFarcasterMiniApp && !wallets.some((w) => w.internalId === "FARCASTER") && !!adapter) {
357
+ const wallet2 = createWallet(farcasterWallet);
358
+ setWallets((prev) => [...prev, wallet2]);
359
+ if (para.supportedWalletTypes.some(({ type }) => type === "SOLANA")) {
360
+ yield connectBase(adapter, true);
361
+ }
362
+ setIsFarcasterSetup(true);
363
+ }
364
+ });
365
+ setupFarcaster();
366
+ }, [para.isFarcasterMiniApp, wallets, adapters]);
367
+ const injectedWallets = adapters.filter((wallet2) => wallet2.adapter.name !== "Mobile Wallet Adapter" && !wallets.some((w) => w.name === wallet2.adapter.name)).map((wallet2) => {
368
+ const adapter = wallet2.adapter;
369
+ return {
370
+ connect: () => connect(adapter),
371
+ connectMobile: () => connect(adapter),
372
+ type: "SOLANA",
373
+ installed: adapter && ((adapter == null ? void 0 : adapter.readyState) === WalletReadyState.Installed || (adapter == null ? void 0 : adapter.readyState) === WalletReadyState.Loadable),
374
+ name: adapter.name,
375
+ iconUrl: adapter.icon,
376
+ // Using name here since that's the only common id across the networks
377
+ id: adapter.name,
378
+ internalId: adapter.name
379
+ };
301
380
  });
381
+ const walletsWithInjected = [...wallets, ...injectedWallets];
302
382
  return /* @__PURE__ */ jsx(
303
383
  SolanaExternalWalletContext.Provider,
304
384
  {
305
385
  value: useMemo(
306
- () => __spreadValues({ wallets, disconnect, signMessage, signVerificationMessage, requestInfo, disconnectBase }, externalHooks),
307
- [wallets, disconnect, signMessage, signVerificationMessage, requestInfo, disconnectBase]
386
+ () => __spreadValues({
387
+ wallets: walletsWithInjected,
388
+ disconnect,
389
+ disconnectStatus: disconnecting ? "pending" : "idle",
390
+ signMessage,
391
+ signVerificationMessage,
392
+ requestInfo,
393
+ disconnectBase,
394
+ farcasterStatus
395
+ }, externalHooks),
396
+ [
397
+ walletsWithInjected,
398
+ disconnect,
399
+ disconnecting,
400
+ signMessage,
401
+ signVerificationMessage,
402
+ requestInfo,
403
+ farcasterStatus,
404
+ disconnectBase
405
+ ]
308
406
  ),
309
407
  children
310
408
  }
@@ -0,0 +1,2 @@
1
+ import { Wallet } from '../../../types/Wallet.js';
2
+ export declare const farcasterWallet: () => Wallet;
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { icon } from "./farcasterIcon.js";
3
+ const farcasterWallet = () => {
4
+ return {
5
+ id: "farcaster",
6
+ internalId: "FARCASTER",
7
+ name: "Farcaster",
8
+ iconUrl: icon,
9
+ isExtension: true,
10
+ hasIosSafariExtension: false,
11
+ downloadUrl: "https://farcaster.xyz"
12
+ };
13
+ };
14
+ export {
15
+ farcasterWallet
16
+ };
@@ -0,0 +1 @@
1
+ export declare const icon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPG1hc2sgaWQ9Im1hc2swXzEzNDFfMzQiIHN0eWxlPSJtYXNrLXR5cGU6bHVtaW5hbmNlIiBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSI0IiB5PSIwIiB3aWR0aD0iMTciIGhlaWdodD0iMjQiPgo8cGF0aCBkPSJNMjAuNSAwSDRWMjRIMjAuNVYwWiIgZmlsbD0id2hpdGUiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzEzNDFfMzQpIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMy44MTMgMS44ODcwOEMxNC42ODUzIDEuODg3MDggMTUuNTAzNSAyLjAwNDAyIDE2LjI2MTIgMi4yMjA4OUMxNS41MTk1IDAuNDkyMjU0IDEzLjk3OTUgMCAxMi4yNjU2IDBDMTAuNTQ4MyAwIDkuMDA1NjUgMC40OTQxODggOC4yNjU2MiAyLjIzMTA3QzkuMDE3NjUgMi4wMDY1NyA5LjgzMjM2IDEuODg3MDggMTAuNzAxNyAxLjg4NzA4SDEzLjgxM1pNMTAuNTAyMiAzLjYyMjU2QzYuMzYwMDMgMy42MjI1NiA0IDYuODgxMTQgNCAxMC45MDA4VjE1LjAzQzQgMTUuNDMyIDQuMzM1NzkgMTUuNzUgNC43NSAxNS43NUgxOS43NUMyMC4xNjQyIDE1Ljc1IDIwLjUgMTUuNDMyIDIwLjUgMTUuMDNWMTAuOTAwOEMyMC41IDYuODgxMTQgMTcuNzU1NiAzLjYyMjU2IDEzLjYxMzUgMy42MjI1NkgxMC41MDIyWk0xMi4yNDQxIDEwLjkzNjVDMTMuNjkzOSAxMC45MzY1IDE0Ljg2OTIgOS43NjEyMyAxNC44NjkyIDguMzExNTNDMTQuODY5MiA2Ljg2MTc4IDEzLjY5MzkgNS42ODY1MyAxMi4yNDQxIDUuNjg2NTNDMTAuNzk0NCA1LjY4NjUzIDkuNjE5MTQgNi44NjE3OCA5LjYxOTE0IDguMzExNTNDOS42MTkxNCA5Ljc2MTIzIDEwLjc5NDQgMTAuOTM2NSAxMi4yNDQxIDEwLjkzNjVaTTQgMTguMTc3MUM0IDE3Ljc3NTEgNC4zMzU3OSAxNy40NDkyIDQuNzUgMTcuNDQ5MkgxOS43NUMyMC4xNjQyIDE3LjQ0OTIgMjAuNSAxNy43NzUxIDIwLjUgMTguMTc3MVYyMi41NDRDMjAuNSAyMy4zNDc5IDE5LjgyODQgMjMuOTk5NyAxOSAyMy45OTk3SDUuNUM0LjY3MTU3IDIzLjk5OTcgNCAyMy4zNDc5IDQgMjIuNTQ0VjE4LjE3NzFaIiBmaWxsPSIjRTMzRTNGIi8+CjwvZz4KPC9zdmc+Cg==";
@@ -0,0 +1,5 @@
1
+ "use client";
2
+ const icon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPG1hc2sgaWQ9Im1hc2swXzEzNDFfMzQiIHN0eWxlPSJtYXNrLXR5cGU6bHVtaW5hbmNlIiBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSI0IiB5PSIwIiB3aWR0aD0iMTciIGhlaWdodD0iMjQiPgo8cGF0aCBkPSJNMjAuNSAwSDRWMjRIMjAuNVYwWiIgZmlsbD0id2hpdGUiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzEzNDFfMzQpIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMy44MTMgMS44ODcwOEMxNC42ODUzIDEuODg3MDggMTUuNTAzNSAyLjAwNDAyIDE2LjI2MTIgMi4yMjA4OUMxNS41MTk1IDAuNDkyMjU0IDEzLjk3OTUgMCAxMi4yNjU2IDBDMTAuNTQ4MyAwIDkuMDA1NjUgMC40OTQxODggOC4yNjU2MiAyLjIzMTA3QzkuMDE3NjUgMi4wMDY1NyA5LjgzMjM2IDEuODg3MDggMTAuNzAxNyAxLjg4NzA4SDEzLjgxM1pNMTAuNTAyMiAzLjYyMjU2QzYuMzYwMDMgMy42MjI1NiA0IDYuODgxMTQgNCAxMC45MDA4VjE1LjAzQzQgMTUuNDMyIDQuMzM1NzkgMTUuNzUgNC43NSAxNS43NUgxOS43NUMyMC4xNjQyIDE1Ljc1IDIwLjUgMTUuNDMyIDIwLjUgMTUuMDNWMTAuOTAwOEMyMC41IDYuODgxMTQgMTcuNzU1NiAzLjYyMjU2IDEzLjYxMzUgMy42MjI1NkgxMC41MDIyWk0xMi4yNDQxIDEwLjkzNjVDMTMuNjkzOSAxMC45MzY1IDE0Ljg2OTIgOS43NjEyMyAxNC44NjkyIDguMzExNTNDMTQuODY5MiA2Ljg2MTc4IDEzLjY5MzkgNS42ODY1MyAxMi4yNDQxIDUuNjg2NTNDMTAuNzk0NCA1LjY4NjUzIDkuNjE5MTQgNi44NjE3OCA5LjYxOTE0IDguMzExNTNDOS42MTkxNCA5Ljc2MTIzIDEwLjc5NDQgMTAuOTM2NSAxMi4yNDQxIDEwLjkzNjVaTTQgMTguMTc3MUM0IDE3Ljc3NTEgNC4zMzU3OSAxNy40NDkyIDQuNzUgMTcuNDQ5MkgxOS43NUMyMC4xNjQyIDE3LjQ0OTIgMjAuNSAxNy43NzUxIDIwLjUgMTguMTc3MVYyMi41NDRDMjAuNSAyMy4zNDc5IDE5LjgyODQgMjMuOTk5NyAxOSAyMy45OTk3SDUuNUM0LjY3MTU3IDIzLjk5OTcgNCAyMy4zNDc5IDQgMjIuNTQ0VjE4LjE3NzFaIiBmaWxsPSIjRTMzRTNGIi8+CjwvZz4KPC9zdmc+Cg==";
3
+ export {
4
+ icon
5
+ };
@@ -1,6 +1,8 @@
1
+ import { farcasterWallet } from './farcaster/farcaster.js';
1
2
  import { phantomWallet } from './phantom/phantom.js';
2
3
  import { glowWallet } from './glow/glow.js';
3
4
  import { backpackWallet } from './backpack/backpack.js';
4
5
  import { solflareWallet } from './solflare/solflare.js';
5
- export { phantomWallet, glowWallet, backpackWallet, solflareWallet };
6
+ import { metaMaskWallet } from './metaMask/metaMask.js';
7
+ export { farcasterWallet, phantomWallet, glowWallet, backpackWallet, solflareWallet, metaMaskWallet };
6
8
  export declare const allWallets: (() => import("../../types/Wallet.js").Wallet)[];
@@ -1,13 +1,17 @@
1
1
  "use client";
2
+ import { farcasterWallet } from "./farcaster/farcaster.js";
2
3
  import { phantomWallet } from "./phantom/phantom.js";
3
4
  import { glowWallet } from "./glow/glow.js";
4
5
  import { backpackWallet } from "./backpack/backpack.js";
5
6
  import { solflareWallet } from "./solflare/solflare.js";
6
- const allWallets = [phantomWallet, glowWallet, backpackWallet, solflareWallet];
7
+ import { metaMaskWallet } from "./metaMask/metaMask.js";
8
+ const allWallets = [phantomWallet, glowWallet, backpackWallet, solflareWallet, metaMaskWallet];
7
9
  export {
8
10
  allWallets,
9
11
  backpackWallet,
12
+ farcasterWallet,
10
13
  glowWallet,
14
+ metaMaskWallet,
11
15
  phantomWallet,
12
16
  solflareWallet
13
17
  };
@@ -0,0 +1,2 @@
1
+ import { Wallet } from '../../../types/Wallet.js';
2
+ export declare const metaMaskWallet: () => Wallet;
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { icon } from "./metaMaskIcon.js";
3
+ const metaMaskWallet = () => {
4
+ return {
5
+ id: "metaMask",
6
+ internalId: "METAMASK",
7
+ name: "MetaMask",
8
+ iconUrl: icon,
9
+ isExtension: true,
10
+ isMobile: true,
11
+ hasIosSafariExtension: false,
12
+ // Metamask deep linking doesn't seem to work as expected currently.
13
+ // getQrUri: async () => {
14
+ // if (typeof window !== 'undefined' && isIosAndRedirectable()) {
15
+ // const url = encodeURIComponent(window.location.href);
16
+ // return `https://link.metamask.io/dapp/${url}`;
17
+ // }
18
+ // return '';
19
+ // },
20
+ downloadUrl: "https://metamask.io/download/"
21
+ };
22
+ };
23
+ export {
24
+ metaMaskWallet
25
+ };
@@ -0,0 +1 @@
1
+ export declare const icon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzE5MDMxXzE3MTgwOSkiPgo8cGF0aCBkPSJNMjIuNDI4MSAyMi4zNDUzTDE3LjI1ODUgMjAuODA2MUwxMy4zNiAyMy4xMzY2TDEwLjYzOTggMjMuMTM1NEw2LjczODk5IDIwLjgwNjFMMS41NzE3IDIyLjM0NTNMMCAxNy4wMzkxTDEuNTcxODcgMTEuMTVMMCA2LjE3MTAyTDEuNTcxODcgMEw5LjY0NjA4IDQuODIzOTdIMTQuMzUzOEwyMi40MjgxIDBMMjQgNi4xNzEwMkwyMi40MjgxIDExLjE1TDI0IDE3LjAzOTFMMjIuNDI4MSAyMi4zNDUzWiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNMS41NzI4OCAwTDkuNjQ3MjUgNC44MjczNUw5LjMyNjI1IDguMTQwM0wxLjU3Mjg4IDBaTTYuNzQwMzMgMTcuMDQxM0wxMC4yOTMgMTkuNzQ3NUw2Ljc0MDMzIDIwLjgwNTlWMTcuMDQxM1pNMTAuMDA5IDEyLjU2N0w5LjMyNjI1IDguMTQyNjdMNC45NTU2NCAxMS4xNTE0TDQuOTUzMjcgMTEuMTUwMlYxMS4xNTI0TDQuOTY2NzkgMTQuMjQ5M0w2LjczOTE0IDEyLjU2NzJMMTAuMDA5IDEyLjU2N1pNMjIuNDI4MSAwTDE0LjM1MzcgNC44MjczNUwxNC42NzM3IDguMTQwM0wyMi40MjgxIDBaTTE3LjI2MDggMTcuMDQxM0wxMy43MDggMTkuNzQ3NUwxNy4yNjA4IDIwLjgwNTlWMTcuMDQxM1pNMTkuMDQ2NyAxMS4xNTIyVjExLjE1TDE5LjA0NTcgMTEuMTUxMkwxNC42NzQ5IDguMTQyNjdMMTMuOTkyMiAxMi41NjdIMTcuMjYwN0wxOS4wMzQyIDE0LjI0ODlMMTkuMDQ2NyAxMS4xNTIyWiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNNi43MzkxNiAyMC44MDU5TDEuNTcxODcgMjIuMzQ1MUwwIDE3LjA0MTNINi43MzkxNlYyMC44MDU5Wk0xMC4wMDc4IDEyLjU2NThMMTAuOTk0OCAxOC45NjIyTDkuNjI2ODEgMTUuNDA1N0w0Ljk2NDYxIDE0LjI0ODlMNi43Mzc5NyAxMi41NjZMMTAuMDA3OCAxMi41NjU4Wk0xNy4yNjA3IDIwLjgwNTlMMjIuNDI4MSAyMi4zNDUxTDI0IDE3LjA0MTFIMTcuMjYwN0MxNy4yNjA3IDE3LjA0MTMgMTcuMjYwNyAyMC44MDU5IDE3LjI2MDcgMjAuODA1OVpNMTMuOTkyMiAxMi41NjU4TDEzLjAwNTIgMTguOTYyMkwxNC4zNzMgMTUuNDA1N0wxOS4wMzU2IDE0LjI0ODlMMTcuMjYxIDEyLjU2NkwxMy45OTIyIDEyLjU2NThaIiBmaWxsPSIjRTM0ODA3Ii8+CjxwYXRoIGQ9Ik0wIDE3LjAzOTFMMS41NzE4NyAxMS4xNUg0Ljk1MjFMNC45NjQ0NCAxNC4yNDc5TDkuNjI3MTUgMTUuNDA0N0wxMC45OTUgMTguOTYxTDEwLjI5MTggMTkuNzQ0Mkw2LjczOTE2IDE3LjAzNzlIMFYxNy4wMzkxWk0yNCAxNy4wMzkxTDIyLjQyODEgMTEuMTVIMTkuMDQ3N0wxOS4wMzU0IDE0LjI0NzlMMTQuMzczIDE1LjQwNDdMMTMuMDA1IDE4Ljk2MUwxMy43MDggMTkuNzQ0MkwxNy4yNjA4IDE3LjAzNzlIMjRWMTcuMDM5MVpNMTQuMzUzOCA0LjgyMzk3SDkuNjQ2MDhMOS4zMjY0MyA4LjEzNjkyTDEwLjk5NTIgMTguOTU3NUgxMy4wMDUyTDE0LjY3NDkgOC4xMzY5MkwxNC4zNTM4IDQuODIzOTdaIiBmaWxsPSIjRkY4RDVEIi8+CjxwYXRoIGQ9Ik0xLjU3MTg3IDBMMCA2LjE3MTAyTDEuNTcxODcgMTEuMTVINC45NTIxTDkuMzI1MDggOC4xNDA0N0wxLjU3MTg3IDBaTTkuMDMwOTUgMTMuODUwNUg3LjQ5OTY1TDYuNjY1OTYgMTQuNjY3OEw5LjYyODE2IDE1LjQwMjFMOS4wMzA5NSAxMy44NDkzVjEzLjg1MDVaTTIyLjQyODEgMEwyNCA2LjE3MTAyTDIyLjQyODEgMTEuMTVIMTkuMDQ3N0wxNC42NzQ5IDguMTQwNDdMMjIuNDI4MSAwWk0xNC45NzEyIDEzLjg1MDVIMTYuNTA0N0wxNy4zMzg0IDE0LjY2ODhMMTQuMzcyOSAxNS40MDQ3TDE0Ljk3MTIgMTMuODQ5M1YxMy44NTA1Wk0xMy4zNTg4IDIxLjAyNTZMMTMuNzA4MiAxOS43NDY1TDEzLjAwNSAxOC45NjM0SDEwLjk5MzVMMTAuMjkwNCAxOS43NDY1TDEwLjYzOTcgMjEuMDI1NiIgZmlsbD0iIzY2MTgwMCIvPgo8cGF0aCBkPSJNMTMuMzU4OSAyMS4wMjU1VjIzLjEzNzZIMTAuNjQwMVYyMS4wMjU1SDEzLjM1ODlaIiBmaWxsPSIjQzBDNENEIi8+CjxwYXRoIGQ9Ik02Ljc0MDM2IDIwLjgwMzdMMTAuNjQyMiAyMy4xMzY0VjIxLjAyNDNMMTAuMjkyOCAxOS43NDUzTDYuNzQwMzYgMjAuODAzN1pNMTcuMjYwOSAyMC44MDM3TDEzLjM1ODggMjMuMTM2NFYyMS4wMjQzTDEzLjcwODIgMTkuNzQ1M0wxNy4yNjA5IDIwLjgwMzdaIiBmaWxsPSIjRTdFQkY2Ii8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMTkwMzFfMTcxODA5Ij4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=";
@@ -0,0 +1,5 @@
1
+ "use client";
2
+ const icon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzE5MDMxXzE3MTgwOSkiPgo8cGF0aCBkPSJNMjIuNDI4MSAyMi4zNDUzTDE3LjI1ODUgMjAuODA2MUwxMy4zNiAyMy4xMzY2TDEwLjYzOTggMjMuMTM1NEw2LjczODk5IDIwLjgwNjFMMS41NzE3IDIyLjM0NTNMMCAxNy4wMzkxTDEuNTcxODcgMTEuMTVMMCA2LjE3MTAyTDEuNTcxODcgMEw5LjY0NjA4IDQuODIzOTdIMTQuMzUzOEwyMi40MjgxIDBMMjQgNi4xNzEwMkwyMi40MjgxIDExLjE1TDI0IDE3LjAzOTFMMjIuNDI4MSAyMi4zNDUzWiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNMS41NzI4OCAwTDkuNjQ3MjUgNC44MjczNUw5LjMyNjI1IDguMTQwM0wxLjU3Mjg4IDBaTTYuNzQwMzMgMTcuMDQxM0wxMC4yOTMgMTkuNzQ3NUw2Ljc0MDMzIDIwLjgwNTlWMTcuMDQxM1pNMTAuMDA5IDEyLjU2N0w5LjMyNjI1IDguMTQyNjdMNC45NTU2NCAxMS4xNTE0TDQuOTUzMjcgMTEuMTUwMlYxMS4xNTI0TDQuOTY2NzkgMTQuMjQ5M0w2LjczOTE0IDEyLjU2NzJMMTAuMDA5IDEyLjU2N1pNMjIuNDI4MSAwTDE0LjM1MzcgNC44MjczNUwxNC42NzM3IDguMTQwM0wyMi40MjgxIDBaTTE3LjI2MDggMTcuMDQxM0wxMy43MDggMTkuNzQ3NUwxNy4yNjA4IDIwLjgwNTlWMTcuMDQxM1pNMTkuMDQ2NyAxMS4xNTIyVjExLjE1TDE5LjA0NTcgMTEuMTUxMkwxNC42NzQ5IDguMTQyNjdMMTMuOTkyMiAxMi41NjdIMTcuMjYwN0wxOS4wMzQyIDE0LjI0ODlMMTkuMDQ2NyAxMS4xNTIyWiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNNi43MzkxNiAyMC44MDU5TDEuNTcxODcgMjIuMzQ1MUwwIDE3LjA0MTNINi43MzkxNlYyMC44MDU5Wk0xMC4wMDc4IDEyLjU2NThMMTAuOTk0OCAxOC45NjIyTDkuNjI2ODEgMTUuNDA1N0w0Ljk2NDYxIDE0LjI0ODlMNi43Mzc5NyAxMi41NjZMMTAuMDA3OCAxMi41NjU4Wk0xNy4yNjA3IDIwLjgwNTlMMjIuNDI4MSAyMi4zNDUxTDI0IDE3LjA0MTFIMTcuMjYwN0MxNy4yNjA3IDE3LjA0MTMgMTcuMjYwNyAyMC44MDU5IDE3LjI2MDcgMjAuODA1OVpNMTMuOTkyMiAxMi41NjU4TDEzLjAwNTIgMTguOTYyMkwxNC4zNzMgMTUuNDA1N0wxOS4wMzU2IDE0LjI0ODlMMTcuMjYxIDEyLjU2NkwxMy45OTIyIDEyLjU2NThaIiBmaWxsPSIjRTM0ODA3Ii8+CjxwYXRoIGQ9Ik0wIDE3LjAzOTFMMS41NzE4NyAxMS4xNUg0Ljk1MjFMNC45NjQ0NCAxNC4yNDc5TDkuNjI3MTUgMTUuNDA0N0wxMC45OTUgMTguOTYxTDEwLjI5MTggMTkuNzQ0Mkw2LjczOTE2IDE3LjAzNzlIMFYxNy4wMzkxWk0yNCAxNy4wMzkxTDIyLjQyODEgMTEuMTVIMTkuMDQ3N0wxOS4wMzU0IDE0LjI0NzlMMTQuMzczIDE1LjQwNDdMMTMuMDA1IDE4Ljk2MUwxMy43MDggMTkuNzQ0MkwxNy4yNjA4IDE3LjAzNzlIMjRWMTcuMDM5MVpNMTQuMzUzOCA0LjgyMzk3SDkuNjQ2MDhMOS4zMjY0MyA4LjEzNjkyTDEwLjk5NTIgMTguOTU3NUgxMy4wMDUyTDE0LjY3NDkgOC4xMzY5MkwxNC4zNTM4IDQuODIzOTdaIiBmaWxsPSIjRkY4RDVEIi8+CjxwYXRoIGQ9Ik0xLjU3MTg3IDBMMCA2LjE3MTAyTDEuNTcxODcgMTEuMTVINC45NTIxTDkuMzI1MDggOC4xNDA0N0wxLjU3MTg3IDBaTTkuMDMwOTUgMTMuODUwNUg3LjQ5OTY1TDYuNjY1OTYgMTQuNjY3OEw5LjYyODE2IDE1LjQwMjFMOS4wMzA5NSAxMy44NDkzVjEzLjg1MDVaTTIyLjQyODEgMEwyNCA2LjE3MTAyTDIyLjQyODEgMTEuMTVIMTkuMDQ3N0wxNC42NzQ5IDguMTQwNDdMMjIuNDI4MSAwWk0xNC45NzEyIDEzLjg1MDVIMTYuNTA0N0wxNy4zMzg0IDE0LjY2ODhMMTQuMzcyOSAxNS40MDQ3TDE0Ljk3MTIgMTMuODQ5M1YxMy44NTA1Wk0xMy4zNTg4IDIxLjAyNTZMMTMuNzA4MiAxOS43NDY1TDEzLjAwNSAxOC45NjM0SDEwLjk5MzVMMTAuMjkwNCAxOS43NDY1TDEwLjYzOTcgMjEuMDI1NiIgZmlsbD0iIzY2MTgwMCIvPgo8cGF0aCBkPSJNMTMuMzU4OSAyMS4wMjU1VjIzLjEzNzZIMTAuNjQwMVYyMS4wMjU1SDEzLjM1ODlaIiBmaWxsPSIjQzBDNENEIi8+CjxwYXRoIGQ9Ik02Ljc0MDM2IDIwLjgwMzdMMTAuNjQyMiAyMy4xMzY0VjIxLjAyNDNMMTAuMjkyOCAxOS43NDUzTDYuNzQwMzYgMjAuODAzN1pNMTcuMjYwOSAyMC44MDM3TDEzLjM1ODggMjMuMTM2NFYyMS4wMjQzTDEzLjcwODIgMTkuNzQ1M0wxNy4yNjA5IDIwLjgwMzdaIiBmaWxsPSIjRTdFQkY2Ii8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMTkwMzFfMTcxODA5Ij4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=";
3
+ export {
4
+ icon
5
+ };
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@getpara/solana-wallet-connectors",
3
- "version": "2.0.0-fc.2",
3
+ "version": "2.0.0",
4
4
  "dependencies": {
5
- "@getpara/react-common": "2.0.0-fc.2",
6
- "@getpara/web-sdk": "2.0.0-fc.2",
5
+ "@getpara/react-common": "2.0.0",
6
+ "@getpara/web-sdk": "2.0.0",
7
7
  "bs58": "6.0.0"
8
8
  },
9
9
  "devDependencies": {
@@ -23,9 +23,10 @@
23
23
  "dist",
24
24
  "package.json"
25
25
  ],
26
- "gitHead": "65106fd9662a2c32b2071a0dea67ef55b3e4e98f",
26
+ "gitHead": "a64b6aa9b3c481a2d955022f621e495fb55e549e",
27
27
  "main": "dist/index.js",
28
28
  "peerDependencies": {
29
+ "@farcaster/mini-app-solana": "^1.0.0",
29
30
  "@solana-mobile/wallet-adapter-mobile": "2.x",
30
31
  "@solana/wallet-adapter-base": "0.x",
31
32
  "@solana/wallet-adapter-react": "0.x",
@@ -33,6 +34,11 @@
33
34
  "react": ">=18",
34
35
  "react-dom": ">=18"
35
36
  },
37
+ "peerDependenciesMeta": {
38
+ "@farcaster/mini-app-solana": {
39
+ "optional": true
40
+ }
41
+ },
36
42
  "scripts": {
37
43
  "build": "rm -rf dist && yarn typegen && node ./scripts/build.mjs",
38
44
  "test": "vitest run --coverage",