@layerswap/wallet-starknet 1.2.1 → 1.3.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,8 +79,9 @@ 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,
@@ -111,10 +102,10 @@ export default function useStarknetConnection({ networks }) {
111
102
  transfer,
112
103
  connectedWallets: starknetWallets,
113
104
  activeWallet,
114
- withdrawalSupportedNetworks,
115
- autofillSupportedNetworks: commonSupportedNetworks,
116
- asSourceSupportedNetworks: commonSupportedNetworks,
117
- availableWalletsForConnect,
105
+ withdrawalSupportedNetworks: starknetNames,
106
+ autofillSupportedNetworks: starknetNames,
107
+ asSourceSupportedNetworks: starknetNames,
108
+ availableConnectors,
118
109
  name,
119
110
  id,
120
111
  providerIcon: networks.find(n => starknetNames.some(name => name === n.name))?.logo,
@@ -131,9 +122,11 @@ export async function resolveStarknetWallet(props) {
131
122
  const walletAccount = new WalletAccount({ provider: rpcProvider, walletProvider: connector.wallet, address });
132
123
  const accounts = await walletAccount.requestAccounts(true);
133
124
  const account = accounts?.[0];
125
+ const configuredName = connectorsConfigs.find(c => c.id === connector.id)?.name;
126
+ const connectorName = configuredName ?? connector.name;
134
127
  const wallet = {
135
- id: connector.name,
136
- displayName: `${connector.name} - Starknet`,
128
+ id: connectorName,
129
+ displayName: `${connectorName} - Starknet`,
137
130
  address: account,
138
131
  addresses: [account],
139
132
  chainId: walletChain || '',
@@ -164,7 +157,7 @@ const connectorsConfigs = [
164
157
  },
165
158
  {
166
159
  id: "argentX",
167
- name: 'Argent X',
160
+ name: 'Ready X',
168
161
  installLink: "https://chromewebstore.google.com/detail/argent-x-starknet-wallet/dlcobpjiigpikoobohmabehhmhfoodbb"
169
162
  },
170
163
  {