@layerswap/wallet-fuel 1.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/dist/esm/FuelProvider.js +27 -0
- package/dist/esm/connectors/bako-safe/Bako.js +29 -0
- package/dist/esm/connectors/bako-safe/BakoSafeConnector.js +268 -0
- package/dist/esm/connectors/bako-safe/BakoSafeStorage.js +20 -0
- package/dist/esm/connectors/bako-safe/DAPPWindow.js +130 -0
- package/dist/esm/connectors/bako-safe/SocketClient.js +74 -0
- package/dist/esm/connectors/bako-safe/constants.js +16 -0
- package/dist/esm/connectors/bako-safe/index.js +1 -0
- package/dist/esm/connectors/bako-safe/request.js +15 -0
- package/dist/esm/connectors/bako-safe/types.js +25 -0
- package/dist/esm/connectors/fuel-wallet/FuelWalletConnector.js +234 -0
- package/dist/esm/connectors/fuel-wallet/constants.js +4 -0
- package/dist/esm/connectors/fuel-wallet/index.js +3 -0
- package/dist/esm/connectors/fuel-wallet/types.js +9 -0
- package/dist/esm/connectors/fuelet-wallet/FueletWalletConnector.js +19 -0
- package/dist/esm/connectors/fuelet-wallet/constants.js +2 -0
- package/dist/esm/connectors/fuelet-wallet/index.js +1 -0
- package/dist/esm/fuelAddressUtilsProvider.js +19 -0
- package/dist/esm/fuelBalanceProvider.js +61 -0
- package/dist/esm/fuelGasProvider.js +38 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/jsons/FUELWATCHDOG.json +96 -0
- package/dist/esm/services/transferService/transactionBuilder.js +11 -0
- package/dist/esm/useFuelConnection.js +232 -0
- package/dist/esm/utils/KnownFuelConnectors.js +24 -0
- package/dist/esm/utils/index.js +2 -0
- package/dist/esm/utils/resolveIcon.js +9 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/FuelProvider.d.ts +5 -0
- package/dist/types/FuelProvider.d.ts.map +1 -0
- package/dist/types/connectors/bako-safe/Bako.d.ts +16 -0
- package/dist/types/connectors/bako-safe/Bako.d.ts.map +1 -0
- package/dist/types/connectors/bako-safe/BakoSafeConnector.d.ts +65 -0
- package/dist/types/connectors/bako-safe/BakoSafeConnector.d.ts.map +1 -0
- package/dist/types/connectors/bako-safe/BakoSafeStorage.d.ts +11 -0
- package/dist/types/connectors/bako-safe/BakoSafeStorage.d.ts.map +1 -0
- package/dist/types/connectors/bako-safe/DAPPWindow.d.ts +26 -0
- package/dist/types/connectors/bako-safe/DAPPWindow.d.ts.map +1 -0
- package/dist/types/connectors/bako-safe/SocketClient.d.ts +17 -0
- package/dist/types/connectors/bako-safe/SocketClient.d.ts.map +1 -0
- package/dist/types/connectors/bako-safe/constants.d.ts +14 -0
- package/dist/types/connectors/bako-safe/constants.d.ts.map +1 -0
- package/dist/types/connectors/bako-safe/index.d.ts +2 -0
- package/dist/types/connectors/bako-safe/index.d.ts.map +1 -0
- package/dist/types/connectors/bako-safe/request.d.ts +7 -0
- package/dist/types/connectors/bako-safe/request.d.ts.map +1 -0
- package/dist/types/connectors/bako-safe/types.d.ts +55 -0
- package/dist/types/connectors/bako-safe/types.d.ts.map +1 -0
- package/dist/types/connectors/fuel-wallet/FuelWalletConnector.d.ts +52 -0
- package/dist/types/connectors/fuel-wallet/FuelWalletConnector.d.ts.map +1 -0
- package/dist/types/connectors/fuel-wallet/constants.d.ts +5 -0
- package/dist/types/connectors/fuel-wallet/constants.d.ts.map +1 -0
- package/dist/types/connectors/fuel-wallet/index.d.ts +4 -0
- package/dist/types/connectors/fuel-wallet/index.d.ts.map +1 -0
- package/dist/types/connectors/fuel-wallet/types.d.ts +51 -0
- package/dist/types/connectors/fuel-wallet/types.d.ts.map +1 -0
- package/dist/types/connectors/fuelet-wallet/FueletWalletConnector.d.ts +8 -0
- package/dist/types/connectors/fuelet-wallet/FueletWalletConnector.d.ts.map +1 -0
- package/dist/types/connectors/fuelet-wallet/constants.d.ts +3 -0
- package/dist/types/connectors/fuelet-wallet/constants.d.ts.map +1 -0
- package/dist/types/connectors/fuelet-wallet/index.d.ts +2 -0
- package/dist/types/connectors/fuelet-wallet/index.d.ts.map +1 -0
- package/dist/types/fuelAddressUtilsProvider.d.ts +6 -0
- package/dist/types/fuelAddressUtilsProvider.d.ts.map +1 -0
- package/dist/types/fuelBalanceProvider.d.ts +6 -0
- package/dist/types/fuelBalanceProvider.d.ts.map +1 -0
- package/dist/types/fuelGasProvider.d.ts +6 -0
- package/dist/types/fuelGasProvider.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/services/transferService/transactionBuilder.d.ts +7 -0
- package/dist/types/services/transferService/transactionBuilder.d.ts.map +1 -0
- package/dist/types/useFuelConnection.d.ts +3 -0
- package/dist/types/useFuelConnection.d.ts.map +1 -0
- package/dist/types/utils/KnownFuelConnectors.d.ts +6 -0
- package/dist/types/utils/KnownFuelConnectors.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +3 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/resolveIcon.d.ts +6 -0
- package/dist/types/utils/resolveIcon.d.ts.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { useConnectors, useFuel as useGlobalFuel, } from '@fuels/react';
|
|
2
|
+
import { FuelConnectorEventTypes, Provider, } from '@fuel-ts/account';
|
|
3
|
+
import { Address } from '@fuel-ts/address';
|
|
4
|
+
import { useWalletStore, sleep, KnownInternalNames } from "@layerswap/widget/internal";
|
|
5
|
+
import { useEffect, useMemo } from "react";
|
|
6
|
+
import { transactionBuilder } from "./services/transferService/transactionBuilder";
|
|
7
|
+
import { BAKO_STATE } from "./connectors/bako-safe/Bako";
|
|
8
|
+
import { TransactionMessageType } from "@layerswap/widget/types";
|
|
9
|
+
import { resolveFuelWalletConnectorIcon } from './utils';
|
|
10
|
+
export default function useFuelConnection({ networks }) {
|
|
11
|
+
const commonSupportedNetworks = [
|
|
12
|
+
KnownInternalNames.Networks.FuelTestnet,
|
|
13
|
+
KnownInternalNames.Networks.FuelDevnet,
|
|
14
|
+
KnownInternalNames.Networks.FuelMainnet
|
|
15
|
+
];
|
|
16
|
+
const name = 'Fuel';
|
|
17
|
+
const id = 'fuel';
|
|
18
|
+
const { connectors } = useConnectors();
|
|
19
|
+
const { fuel } = useGlobalFuel();
|
|
20
|
+
const wallets = useWalletStore((state) => state.connectedWallets);
|
|
21
|
+
const addWallet = useWalletStore((state) => state.connectWallet);
|
|
22
|
+
const removeWallet = useWalletStore((state) => state.disconnectWallet);
|
|
23
|
+
const connectedWallets = wallets.filter(wallet => wallet.providerName === name);
|
|
24
|
+
const connectWallet = async ({ connector }) => {
|
|
25
|
+
const attemptConnection = async (isRetry = false) => {
|
|
26
|
+
try {
|
|
27
|
+
const fuelConnector = connectors.find(w => w.name === connector.name);
|
|
28
|
+
BAKO_STATE.state.last_req = undefined;
|
|
29
|
+
BAKO_STATE.period_durtion = 120000;
|
|
30
|
+
await fuelConnector?.connect();
|
|
31
|
+
const addresses = (await fuelConnector?.accounts())?.map(a => new Address(a).toB256());
|
|
32
|
+
if (addresses && fuelConnector) {
|
|
33
|
+
const result = await resolveFuelWallet({
|
|
34
|
+
address: addresses[0],
|
|
35
|
+
addresses: addresses,
|
|
36
|
+
connector: fuelConnector,
|
|
37
|
+
disconnectWallet,
|
|
38
|
+
name,
|
|
39
|
+
commonSupportedNetworks,
|
|
40
|
+
networkIcon: networks.find(n => commonSupportedNetworks.some(name => name === n.name))?.logo
|
|
41
|
+
});
|
|
42
|
+
addWallet(result);
|
|
43
|
+
await switchAccount(result);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
// For Bako Safe, retry once if error is 'false' (connection timeout/user closed popup)
|
|
49
|
+
if (connector.name === 'Bako Safe' && e === false && !isRetry) {
|
|
50
|
+
console.log('Bako Safe connection failed with false, retrying once...');
|
|
51
|
+
await sleep(1000);
|
|
52
|
+
return await attemptConnection(true);
|
|
53
|
+
}
|
|
54
|
+
console.log(e);
|
|
55
|
+
throw new Error(e);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
return await attemptConnection();
|
|
59
|
+
};
|
|
60
|
+
const disconnectWallet = async (connectorName) => {
|
|
61
|
+
try {
|
|
62
|
+
const fuelConnector = connectors.find(c => c.name === connectorName);
|
|
63
|
+
if (!fuelConnector)
|
|
64
|
+
throw new Error('Connector not found');
|
|
65
|
+
await fuelConnector.disconnect();
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
console.log(e);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
removeWallet(name, connectorName);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const disconnectWallets = async () => {
|
|
75
|
+
try {
|
|
76
|
+
BAKO_STATE.state.last_req = undefined;
|
|
77
|
+
BAKO_STATE.period_durtion = 10000;
|
|
78
|
+
for (const connector of connectors.filter(c => c.connected)) {
|
|
79
|
+
await connector.disconnect();
|
|
80
|
+
removeWallet(name);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
console.log(e);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const switchAccount = async (wallet) => {
|
|
88
|
+
try {
|
|
89
|
+
const res = await fuel.selectConnector(wallet.id);
|
|
90
|
+
if (!res)
|
|
91
|
+
throw new Error('Could not switch account');
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
console.log(e);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const switchChain = async (connector, chainId) => {
|
|
98
|
+
try {
|
|
99
|
+
const fuelConnector = connectors.find(c => c.name === connector.id);
|
|
100
|
+
if (!fuelConnector)
|
|
101
|
+
throw new Error('Connector not found');
|
|
102
|
+
const res = await fuelConnector.selectNetwork({ chainId: Number(chainId) });
|
|
103
|
+
if (!res)
|
|
104
|
+
throw new Error('Could not switch chain');
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
console.log(e);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const transfer = async (params) => {
|
|
111
|
+
const { callData, network, selectedWallet, swapId } = params;
|
|
112
|
+
const fuelProvider = new Provider(network.node_url);
|
|
113
|
+
const fuelWallet = await fuel.getWallet(selectedWallet.address, fuelProvider);
|
|
114
|
+
if (!fuelWallet)
|
|
115
|
+
throw Error("Fuel wallet not found");
|
|
116
|
+
try {
|
|
117
|
+
const scriptTransaction = await transactionBuilder({ fuelWallet, callData });
|
|
118
|
+
await fuelProvider.simulate(scriptTransaction);
|
|
119
|
+
const transactionResponse = await fuelWallet.sendTransaction(scriptTransaction);
|
|
120
|
+
if (swapId && transactionResponse) {
|
|
121
|
+
return transactionResponse.id;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const e = new Error();
|
|
126
|
+
e.message = error.message;
|
|
127
|
+
if (error === "The account(s) sending the transaction don't have enough funds to cover the transaction."
|
|
128
|
+
|| error === "the target cannot be met due to no coins available or exceeding the 255 coin limit.") {
|
|
129
|
+
error.name = TransactionMessageType.InsufficientFunds;
|
|
130
|
+
throw e;
|
|
131
|
+
}
|
|
132
|
+
else if (error === "Request cancelled without user response!" || error === "User rejected the transaction!" || error === "User canceled sending transaction") {
|
|
133
|
+
e.name = TransactionMessageType.TransactionRejected;
|
|
134
|
+
throw e;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
e.name = TransactionMessageType.UexpectedErrorMessage;
|
|
138
|
+
throw e;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const connectedConnectors = useMemo(() => connectors.filter(w => w.connected), [connectors]);
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
(async () => {
|
|
145
|
+
resolveWallet();
|
|
146
|
+
})();
|
|
147
|
+
}, [connectedConnectors]);
|
|
148
|
+
const resolveWallet = async () => {
|
|
149
|
+
for (const connector of connectedConnectors) {
|
|
150
|
+
try {
|
|
151
|
+
const addresses = (await connector.accounts()).map(a => Address.fromAddressOrString(a).toB256());
|
|
152
|
+
if (connector.connected && addresses.length > 0) {
|
|
153
|
+
const w = await resolveFuelWallet({
|
|
154
|
+
address: addresses?.[0],
|
|
155
|
+
addresses,
|
|
156
|
+
connector,
|
|
157
|
+
disconnectWallet,
|
|
158
|
+
name,
|
|
159
|
+
commonSupportedNetworks: commonSupportedNetworks,
|
|
160
|
+
networkIcon: networks.find(n => commonSupportedNetworks.some(name => name === n.name))?.logo
|
|
161
|
+
});
|
|
162
|
+
addWallet(w);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
console.log(e);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
const disposers = connectors.map((c) => {
|
|
172
|
+
const handler = async () => {
|
|
173
|
+
await resolveWallet();
|
|
174
|
+
};
|
|
175
|
+
c.on(FuelConnectorEventTypes.currentNetwork, handler);
|
|
176
|
+
return { connector: c, handler };
|
|
177
|
+
});
|
|
178
|
+
return () => {
|
|
179
|
+
disposers.forEach(({ connector, handler }) => {
|
|
180
|
+
connector.off(FuelConnectorEventTypes.currentNetwork, handler);
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
}, [connectors]);
|
|
184
|
+
const availableWalletsForConnect = connectors.map(c => {
|
|
185
|
+
const isInstalled = c.installed && !c['dAppWindow'];
|
|
186
|
+
return {
|
|
187
|
+
name: c.name,
|
|
188
|
+
id: c.name,
|
|
189
|
+
icon: typeof c.metadata.image === 'string' ? c.metadata.image : (c.metadata.image?.dark.startsWith('data:') ? c.metadata.image.dark : `data:image/svg+xml;base64,${c.metadata.image && btoa(c.metadata.image.dark)}`),
|
|
190
|
+
type: isInstalled ? 'injected' : 'other',
|
|
191
|
+
installUrl: c.installed ? undefined : c.metadata.install.link,
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
const provider = {
|
|
195
|
+
connectWallet,
|
|
196
|
+
disconnectWallets,
|
|
197
|
+
switchAccount,
|
|
198
|
+
switchChain,
|
|
199
|
+
transfer,
|
|
200
|
+
availableWalletsForConnect,
|
|
201
|
+
autofillSupportedNetworks: commonSupportedNetworks,
|
|
202
|
+
withdrawalSupportedNetworks: commonSupportedNetworks,
|
|
203
|
+
asSourceSupportedNetworks: commonSupportedNetworks,
|
|
204
|
+
activeWallet: connectedWallets?.[0],
|
|
205
|
+
connectedWallets,
|
|
206
|
+
name,
|
|
207
|
+
id,
|
|
208
|
+
};
|
|
209
|
+
return provider;
|
|
210
|
+
}
|
|
211
|
+
const resolveFuelWallet = async ({ address, addresses, commonSupportedNetworks, connector, disconnectWallet, name, networkIcon }) => {
|
|
212
|
+
let fuelCurrentConnector = undefined;
|
|
213
|
+
let customConnectorname = undefined;
|
|
214
|
+
const network = await connector.currentNetwork();
|
|
215
|
+
const chainId = network.chainId || network.url.toLowerCase().includes('testnet') ? 0 : 9889;
|
|
216
|
+
const w = {
|
|
217
|
+
id: connector.name,
|
|
218
|
+
address: address,
|
|
219
|
+
addresses: addresses,
|
|
220
|
+
isActive: true,
|
|
221
|
+
chainId: chainId,
|
|
222
|
+
disconnect: () => disconnectWallet(connector.name),
|
|
223
|
+
displayName: `${fuelCurrentConnector || connector.name} - Fuel`,
|
|
224
|
+
providerName: name,
|
|
225
|
+
icon: resolveFuelWalletConnectorIcon({ connector: customConnectorname || connector.name, address: address, iconUrl: typeof connector.metadata.image === 'string' ? connector.metadata.image : (connector.metadata.image?.dark.startsWith('data:') ? connector.metadata.image.dark : `data:image/svg+xml;base64,${connector.metadata.image && btoa(connector.metadata.image.dark)}`) }),
|
|
226
|
+
autofillSupportedNetworks: commonSupportedNetworks,
|
|
227
|
+
withdrawalSupportedNetworks: commonSupportedNetworks,
|
|
228
|
+
asSourceSupportedNetworks: commonSupportedNetworks,
|
|
229
|
+
networkIcon
|
|
230
|
+
};
|
|
231
|
+
return w;
|
|
232
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BakoSafeIcon, FuelIcon, FueletIcon, SolanaIcon, EthereumIcon } from "@layerswap/widget/internal";
|
|
2
|
+
const KnownFuelConnectors = [
|
|
3
|
+
{
|
|
4
|
+
id: 'bako safe',
|
|
5
|
+
icon: BakoSafeIcon
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
id: 'fuel wallet',
|
|
9
|
+
icon: FuelIcon
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: 'fuelet wallet',
|
|
13
|
+
icon: FueletIcon
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: 'ethereum wallets',
|
|
17
|
+
icon: EthereumIcon
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 'solana wallets',
|
|
21
|
+
icon: SolanaIcon
|
|
22
|
+
}
|
|
23
|
+
];
|
|
24
|
+
export default KnownFuelConnectors;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { walletIconResolver } from "@layerswap/widget/internal";
|
|
2
|
+
import KnownFuelConnectors from "./KnownFuelConnectors";
|
|
3
|
+
export const resolveFuelWalletConnectorIcon = ({ connector, address, iconUrl }) => {
|
|
4
|
+
const knownConnector = KnownFuelConnectors.find(c => c.id.toLowerCase() === connector?.toLowerCase());
|
|
5
|
+
if (knownConnector && knownConnector.icon)
|
|
6
|
+
return knownConnector.icon;
|
|
7
|
+
else
|
|
8
|
+
return walletIconResolver(address, iconUrl);
|
|
9
|
+
};
|