@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.
- package/dist/esm/StarknetProvider.js +24 -28
- package/dist/esm/constants.js +4 -0
- package/dist/esm/index.js +13 -10
- package/dist/esm/starknetAddressUtilsProvider.js +12 -4
- package/dist/esm/useStarknetConnection.js +18 -24
- package/dist/esm/utils/resolveStarknetWalletIcon.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/StarknetProvider.d.ts +0 -2
- package/dist/types/StarknetProvider.d.ts.map +1 -1
- package/dist/types/constants.d.ts +4 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/index.d.ts +0 -8
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/starknetAddressUtilsProvider.d.ts +4 -3
- package/dist/types/starknetAddressUtilsProvider.d.ts.map +1 -1
- package/dist/types/useStarknetConnection.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -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
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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 =
|
|
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 {
|
|
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 {
|
|
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 = [
|
|
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:
|
|
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: [
|
|
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(
|
|
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(
|
|
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 = (
|
|
22
|
-
return addHexPrefix(removeHexPrefix(
|
|
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
|
-
|
|
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:
|
|
67
|
-
asSourceSupportedNetworks:
|
|
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
|
|
93
|
-
const
|
|
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:
|
|
115
|
-
asSourceSupportedNetworks:
|
|
116
|
-
|
|
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:
|
|
135
|
-
displayName: `${
|
|
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: '
|
|
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.
|
|
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
|
};
|