@layerswap/wallet-starknet 1.2.0 → 1.3.0-next.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.
@@ -15,16 +15,9 @@ import { useEffect, useState } from "react";
15
15
  import { mainnet, sepolia } from "@starknet-react/chains";
16
16
  import { Connector, ConnectorNotConnectedError, UserNotConnectedError, StarknetConfig, publicProvider, useConnect, useDisconnect } from '@starknet-react/core';
17
17
  import { KnownInternalNames, useSettingsState } from "@layerswap/widget/internal";
18
- //@ts-ignore
19
- import { ArgentMobileConnector } from "starknetkit/argentMobile";
20
- // @ts-ignore
21
- import { InjectedConnector } from "starknetkit/injected";
22
- // @ts-ignore
23
- import { WebWalletConnector } from "starknetkit/webwallet";
24
- // @ts-ignore
25
- import { ControllerConnector } from "starknetkit/controller";
26
18
  import useStarknetConnection, { resolveStarknetWallet } from "./useStarknetConnection";
27
19
  import { useStarknetStore } from "./starknetWalletStore";
20
+ let getInjectedWalletById;
28
21
  class DiscoveryConnector extends Connector {
29
22
  constructor(wallet, store) {
30
23
  super();
@@ -72,11 +65,19 @@ class DiscoveryConnector extends Connector {
72
65
  }
73
66
  }
74
67
  _DiscoveryConnector_wallet = new WeakMap(), _DiscoveryConnector_store = new WeakMap();
75
- const StarknetProvider = ({ children, walletConnectConfigs }) => {
68
+ const StarknetProvider = ({ children }) => {
76
69
  const [connectors, setConnectors] = useState([]);
77
- const walletConnectConfig = walletConnectConfigs;
78
- const WALLETCONNECT_PROJECT_ID = walletConnectConfig?.projectId;
79
70
  const resolveConnectors = async () => {
71
+ // @ts-ignore
72
+ const injectedModule = await import("starknetkit/injected");
73
+ // @ts-ignore
74
+ const webWalletModule = await import("starknetkit/webwallet");
75
+ // @ts-ignore
76
+ const controllerModule = await import("starknetkit/controller");
77
+ const InjectedConnector = injectedModule.InjectedConnector;
78
+ const WebWalletConnector = webWalletModule.WebWalletConnector;
79
+ const ControllerConnector = controllerModule.ControllerConnector;
80
+ getInjectedWalletById = InjectedConnector?.getInjectedWallet;
80
81
  const isSafari = typeof window !== "undefined"
81
82
  ? /^((?!chrome|android).)*safari/i.test(navigator.userAgent)
82
83
  : false;
@@ -84,10 +85,8 @@ const StarknetProvider = ({ children, walletConnectConfigs }) => {
84
85
  const isIOS = navigator.userAgent.match(/iPhone|iPad|iPod/i);
85
86
  const defaultConnectors = [];
86
87
  if (!isSafari) {
87
- if (!(isAndroid || isIOS)) {
88
- defaultConnectors.push(new InjectedConnector({ options: { id: "argentX" } }));
89
- defaultConnectors.push(new InjectedConnector({ options: { id: "keplr" } }));
90
- }
88
+ defaultConnectors.push(new InjectedConnector({ options: { id: "argentX" } }));
89
+ defaultConnectors.push(new InjectedConnector({ options: { id: "keplr" } }));
91
90
  defaultConnectors.push(new InjectedConnector({ options: { id: "braavos" } }));
92
91
  defaultConnectors.push(new InjectedConnector({ options: { id: "xverse" } }));
93
92
  }
@@ -99,23 +98,20 @@ const StarknetProvider = ({ children, walletConnectConfigs }) => {
99
98
  if (discoverWallets.length)
100
99
  defaultConnectors.push(...discoverWallets.map(w => new DiscoveryConnector(w, isAndroid ? "android" : "ios")));
101
100
  }
102
- defaultConnectors.push(ArgentMobileConnector.init({
103
- options: {
104
- dappName: walletConnectConfig?.name || 'Layerswap',
105
- projectId: WALLETCONNECT_PROJECT_ID,
106
- url: walletConnectConfig?.url || 'https://www.layerswap.io/app/',
107
- description: walletConnectConfig?.description || 'Move crypto across exchanges, blockchains, and wallets.',
108
- }
109
- }));
110
101
  defaultConnectors.push(new ControllerConnector());
111
102
  defaultConnectors.push(new WebWalletConnector());
112
103
  return defaultConnectors;
113
104
  };
114
105
  useEffect(() => {
115
- (async () => {
116
- const result = await resolveConnectors();
117
- setConnectors(result);
118
- })();
106
+ let cancelled = false;
107
+ resolveConnectors().then((result) => {
108
+ if (!cancelled)
109
+ setConnectors(result);
110
+ }).catch(() => {
111
+ if (!cancelled)
112
+ setConnectors([]);
113
+ });
114
+ return () => { cancelled = true; };
119
115
  }, []);
120
116
  const chains = [mainnet, sepolia];
121
117
  return (_jsxs(StarknetConfig, { chains: chains, provider: publicProvider(), connectors: connectors, children: [_jsx(StarknetWalletInitializer, {}), children] }));
@@ -136,7 +132,7 @@ const StarknetWalletInitializer = () => {
136
132
  const checkConnectorsReady = () => {
137
133
  const hasWallet = connectors.some(connector => {
138
134
  try {
139
- const wallet = InjectedConnector.getInjectedWallet(connector.id);
135
+ const wallet = getInjectedWalletById?.(connector.id);
140
136
  return wallet !== null && wallet !== undefined;
141
137
  }
142
138
  catch {
@@ -0,0 +1,4 @@
1
+ import { KnownInternalNames } from "@layerswap/widget/internal";
2
+ export const name = 'Starknet';
3
+ export const id = 'starknet';
4
+ export const starknetNames = [KnownInternalNames.Networks.StarkNetMainnet, KnownInternalNames.Networks.StarkNetSepolia, KnownInternalNames.Networks.StarkNetGoerli];
package/dist/esm/index.js CHANGED
@@ -2,19 +2,18 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import StarknetProviderWrapper from "./StarknetProvider";
3
3
  import useStarknetConnection from "./useStarknetConnection";
4
4
  import { StarknetBalanceProvider } from "./starknetBalanceProvider";
5
- import { StarknetGasProvider } from "./starknetGasProvider";
6
- import { AppSettings } from "@layerswap/widget/internal";
5
+ import { LazyGasProvider } from "@layerswap/widget/types";
6
+ import { AppSettings, KnownInternalNames } from "@layerswap/widget/internal";
7
7
  import { StarknetAddressUtilsProvider } from "./starknetAddressUtilsProvider";
8
8
  import { StarknetNftProvider } from "./starknetNftProvider";
9
9
  import React from "react";
10
10
  import { useStarknetTransfer } from "./useStarknetTransfer";
11
+ const isStarknetNetwork = (name) => KnownInternalNames.Networks.StarkNetMainnet.includes(name) ||
12
+ KnownInternalNames.Networks.StarkNetGoerli.includes(name) ||
13
+ KnownInternalNames.Networks.StarkNetSepolia.includes(name);
11
14
  export { default as useStarknetConnection } from "./useStarknetConnection";
12
15
  export function createStarknetProvider(config = {}) {
13
- const { walletConnectConfigs, customHook, balanceProviders, gasProviders, addressUtilsProviders, nftProviders, transferProviders } = config;
14
- // Create wrapper component with config bound
15
- const WrapperComponent = ({ children }) => {
16
- return (_jsx(StarknetProviderWrapper, { walletConnectConfigs: walletConnectConfigs, children: children }));
17
- };
16
+ const { customHook, balanceProviders, gasProviders, addressUtilsProviders, nftProviders, transferProviders } = config;
18
17
  // Use custom hook if provided, otherwise use default
19
18
  const walletConnectionProvider = customHook || useStarknetConnection;
20
19
  // Use custom providers if provided, otherwise use defaults
@@ -22,7 +21,9 @@ export function createStarknetProvider(config = {}) {
22
21
  const finalBalanceProviders = balanceProviders !== undefined
23
22
  ? (Array.isArray(balanceProviders) ? balanceProviders : [balanceProviders])
24
23
  : defaultBalanceProviders;
25
- const defaultGasProviders = [new StarknetGasProvider()];
24
+ const defaultGasProviders = [
25
+ new LazyGasProvider((n) => isStarknetNetwork(n.name), () => import("./starknetGasProvider").then(m => new m.StarknetGasProvider()))
26
+ ];
26
27
  const finalGasProviders = gasProviders !== undefined
27
28
  ? (Array.isArray(gasProviders) ? gasProviders : [gasProviders])
28
29
  : defaultGasProviders;
@@ -40,7 +41,7 @@ export function createStarknetProvider(config = {}) {
40
41
  : defaultTransferProviders;
41
42
  return {
42
43
  id: "starknet",
43
- wrapper: WrapperComponent,
44
+ wrapper: StarknetProviderWrapper,
44
45
  walletConnectionProvider,
45
46
  addressUtilsProvider: finalAddressUtilsProviders,
46
47
  gasProvider: finalGasProviders,
@@ -60,7 +61,9 @@ export const StarknetProvider = {
60
61
  },
61
62
  walletConnectionProvider: useStarknetConnection,
62
63
  addressUtilsProvider: [new StarknetAddressUtilsProvider()],
63
- gasProvider: [new StarknetGasProvider()],
64
+ gasProvider: [
65
+ new LazyGasProvider((n) => isStarknetNetwork(n.name), () => import("./starknetGasProvider").then(m => new m.StarknetGasProvider()))
66
+ ],
64
67
  balanceProvider: [new StarknetBalanceProvider()],
65
68
  nftProvider: [new StarknetNftProvider()],
66
69
  transferProvider: [useStarknetTransfer],
@@ -1,25 +1,33 @@
1
1
  import { validateAndParseAddress } from "./utils";
2
2
  import { KnownInternalNames } from "@layerswap/widget/internal";
3
+ import { name } from "./constants";
3
4
  export class StarknetAddressUtilsProvider {
5
+ constructor() {
6
+ this.providerName = name;
7
+ }
4
8
  supportsNetwork(network) {
5
9
  return (KnownInternalNames.Networks.StarkNetMainnet.includes(network.name) || KnownInternalNames.Networks.StarkNetSepolia.includes(network.name))
6
10
  || (KnownInternalNames.Networks.ParadexMainnet.includes(network.name) || KnownInternalNames.Networks.ParadexTestnet.includes(network.name));
7
11
  }
8
- isValidAddress(address) {
12
+ isValidAddress(props) {
13
+ const { address } = props;
9
14
  if (!address) {
10
15
  return false;
11
16
  }
12
17
  return validateAndParseAddress(address);
13
18
  }
14
- addressFormat(address) {
19
+ addressFormat(props) {
20
+ const { address } = props;
21
+ if (!address)
22
+ return '';
15
23
  const removeHexPrefix = (hex) => {
16
24
  return hex?.replace("0x", "");
17
25
  };
18
26
  const addHexPrefix = (hex) => {
19
27
  return `0x${hex}`;
20
28
  };
21
- const addAddressPadding = (address) => {
22
- return addHexPrefix(removeHexPrefix(address)?.padStart(64, '0'));
29
+ const addAddressPadding = (addr) => {
30
+ return addHexPrefix(removeHexPrefix(addr)?.padStart(64, '0'));
23
31
  };
24
32
  return addAddressPadding(address?.toLowerCase());
25
33
  }
@@ -3,18 +3,8 @@ import { KnownInternalNames, walletIconResolver } from "@layerswap/widget/intern
3
3
  import { useStarknetStore } from "./starknetWalletStore";
4
4
  import { useStarknetTransfer } from "./useStarknetTransfer";
5
5
  import { resolveStarknetWalletIcon } from "./utils";
6
- const starknetNames = [KnownInternalNames.Networks.StarkNetGoerli, KnownInternalNames.Networks.StarkNetMainnet, KnownInternalNames.Networks.StarkNetSepolia];
6
+ import { name, id, starknetNames } from "./constants";
7
7
  export default function useStarknetConnection({ networks }) {
8
- const commonSupportedNetworks = [
9
- KnownInternalNames.Networks.StarkNetMainnet,
10
- KnownInternalNames.Networks.StarkNetGoerli,
11
- KnownInternalNames.Networks.StarkNetSepolia
12
- ];
13
- const withdrawalSupportedNetworks = [
14
- ...commonSupportedNetworks
15
- ];
16
- const name = 'Starknet';
17
- const id = 'starknet';
18
8
  const { connectors } = useConnect();
19
9
  const { disconnectAsync } = useDisconnect();
20
10
  const starknetWallets = useStarknetStore((state) => state.connectedWallets);
@@ -62,9 +52,9 @@ export default function useStarknetConnection({ networks }) {
62
52
  network: starknetNetwork,
63
53
  disconnectWallets: () => disconnectWallets(starknetConnector.id, result?.account),
64
54
  address: result?.account,
65
- withdrawalSupportedNetworks,
66
- autofillSupportedNetworks: commonSupportedNetworks,
67
- asSourceSupportedNetworks: commonSupportedNetworks,
55
+ withdrawalSupportedNetworks: starknetNames,
56
+ autofillSupportedNetworks: starknetNames,
57
+ asSourceSupportedNetworks: starknetNames,
68
58
  });
69
59
  addAccount(starknetConnector.id, result.account);
70
60
  if (resolvedWallet) {
@@ -89,15 +79,17 @@ export default function useStarknetConnection({ networks }) {
89
79
  console.log(e);
90
80
  }
91
81
  };
92
- const availableWalletsForConnect = connectors.map(connector => {
93
- const name = (!connectorsConfigs.some(c => c.id === connector.id) || connector?.["_wallet"]) ? connector.name : `${connectorsConfigs.find(c => c.id === connector.id)?.name}`;
82
+ const availableConnectors = connectors.map(connector => {
83
+ const configuredName = connectorsConfigs.find(c => c.id === connector.id)?.name;
84
+ const name = configuredName ?? connector.name;
94
85
  return {
95
86
  name: name,
96
87
  id: connector.id,
97
88
  icon: resolveStarknetWalletIcon({ icon: connector.icon }),
98
89
  type: connector?.["_wallet"] ? 'injected' : 'other',
99
90
  installUrl: connectorsConfigs.find(c => c.id === connector.id)?.installLink,
100
- extensionNotFound: !connector?.["_wallet"] && connectorsConfigs.find(c => c.id === connector.id)?.installLink !== undefined
91
+ extensionNotFound: !connector?.["_wallet"] && connectorsConfigs.find(c => c.id === connector.id)?.installLink !== undefined,
92
+ providerName: name
101
93
  };
102
94
  });
103
95
  const switchAccount = async (connector, address) => {
@@ -110,10 +102,10 @@ export default function useStarknetConnection({ networks }) {
110
102
  transfer,
111
103
  connectedWallets: starknetWallets,
112
104
  activeWallet,
113
- withdrawalSupportedNetworks,
114
- autofillSupportedNetworks: commonSupportedNetworks,
115
- asSourceSupportedNetworks: commonSupportedNetworks,
116
- availableWalletsForConnect,
105
+ withdrawalSupportedNetworks: starknetNames,
106
+ autofillSupportedNetworks: starknetNames,
107
+ asSourceSupportedNetworks: starknetNames,
108
+ availableConnectors,
117
109
  name,
118
110
  id,
119
111
  providerIcon: networks.find(n => starknetNames.some(name => name === n.name))?.logo,
@@ -130,9 +122,11 @@ export async function resolveStarknetWallet(props) {
130
122
  const walletAccount = new WalletAccount({ provider: rpcProvider, walletProvider: connector.wallet, address });
131
123
  const accounts = await walletAccount.requestAccounts(true);
132
124
  const account = accounts?.[0];
125
+ const configuredName = connectorsConfigs.find(c => c.id === connector.id)?.name;
126
+ const connectorName = configuredName ?? connector.name;
133
127
  const wallet = {
134
- id: connector.name,
135
- displayName: `${connector.name} - Starknet`,
128
+ id: connectorName,
129
+ displayName: `${connectorName} - Starknet`,
136
130
  address: account,
137
131
  addresses: [account],
138
132
  chainId: walletChain || '',
@@ -163,7 +157,7 @@ const connectorsConfigs = [
163
157
  },
164
158
  {
165
159
  id: "argentX",
166
- name: 'Argent X',
160
+ name: 'Ready X',
167
161
  installLink: "https://chromewebstore.google.com/detail/argent-x-starknet-wallet/dlcobpjiigpikoobohmabehhmhfoodbb"
168
162
  },
169
163
  {
@@ -1,3 +1,3 @@
1
1
  export const resolveStarknetWalletIcon = ({ icon }) => {
2
- return typeof icon === 'string' ? icon : (icon.light.startsWith('data:') ? icon.light : `data:image/svg+xml;base64,${btoa(icon.light.replaceAll('currentColor', '#FFFFFF'))}`);
2
+ return typeof icon === 'string' ? icon : (icon.dark.startsWith('data:') ? icon.dark : `data:image/svg+xml;base64,${btoa(icon.dark.replaceAll('currentColor', '#FFFFFF'))}`);
3
3
  };