@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.
Files changed (81) hide show
  1. package/dist/esm/FuelProvider.js +27 -0
  2. package/dist/esm/connectors/bako-safe/Bako.js +29 -0
  3. package/dist/esm/connectors/bako-safe/BakoSafeConnector.js +268 -0
  4. package/dist/esm/connectors/bako-safe/BakoSafeStorage.js +20 -0
  5. package/dist/esm/connectors/bako-safe/DAPPWindow.js +130 -0
  6. package/dist/esm/connectors/bako-safe/SocketClient.js +74 -0
  7. package/dist/esm/connectors/bako-safe/constants.js +16 -0
  8. package/dist/esm/connectors/bako-safe/index.js +1 -0
  9. package/dist/esm/connectors/bako-safe/request.js +15 -0
  10. package/dist/esm/connectors/bako-safe/types.js +25 -0
  11. package/dist/esm/connectors/fuel-wallet/FuelWalletConnector.js +234 -0
  12. package/dist/esm/connectors/fuel-wallet/constants.js +4 -0
  13. package/dist/esm/connectors/fuel-wallet/index.js +3 -0
  14. package/dist/esm/connectors/fuel-wallet/types.js +9 -0
  15. package/dist/esm/connectors/fuelet-wallet/FueletWalletConnector.js +19 -0
  16. package/dist/esm/connectors/fuelet-wallet/constants.js +2 -0
  17. package/dist/esm/connectors/fuelet-wallet/index.js +1 -0
  18. package/dist/esm/fuelAddressUtilsProvider.js +19 -0
  19. package/dist/esm/fuelBalanceProvider.js +61 -0
  20. package/dist/esm/fuelGasProvider.js +38 -0
  21. package/dist/esm/index.js +13 -0
  22. package/dist/esm/jsons/FUELWATCHDOG.json +96 -0
  23. package/dist/esm/services/transferService/transactionBuilder.js +11 -0
  24. package/dist/esm/useFuelConnection.js +232 -0
  25. package/dist/esm/utils/KnownFuelConnectors.js +24 -0
  26. package/dist/esm/utils/index.js +2 -0
  27. package/dist/esm/utils/resolveIcon.js +9 -0
  28. package/dist/tsconfig.tsbuildinfo +1 -0
  29. package/dist/types/FuelProvider.d.ts +5 -0
  30. package/dist/types/FuelProvider.d.ts.map +1 -0
  31. package/dist/types/connectors/bako-safe/Bako.d.ts +16 -0
  32. package/dist/types/connectors/bako-safe/Bako.d.ts.map +1 -0
  33. package/dist/types/connectors/bako-safe/BakoSafeConnector.d.ts +65 -0
  34. package/dist/types/connectors/bako-safe/BakoSafeConnector.d.ts.map +1 -0
  35. package/dist/types/connectors/bako-safe/BakoSafeStorage.d.ts +11 -0
  36. package/dist/types/connectors/bako-safe/BakoSafeStorage.d.ts.map +1 -0
  37. package/dist/types/connectors/bako-safe/DAPPWindow.d.ts +26 -0
  38. package/dist/types/connectors/bako-safe/DAPPWindow.d.ts.map +1 -0
  39. package/dist/types/connectors/bako-safe/SocketClient.d.ts +17 -0
  40. package/dist/types/connectors/bako-safe/SocketClient.d.ts.map +1 -0
  41. package/dist/types/connectors/bako-safe/constants.d.ts +14 -0
  42. package/dist/types/connectors/bako-safe/constants.d.ts.map +1 -0
  43. package/dist/types/connectors/bako-safe/index.d.ts +2 -0
  44. package/dist/types/connectors/bako-safe/index.d.ts.map +1 -0
  45. package/dist/types/connectors/bako-safe/request.d.ts +7 -0
  46. package/dist/types/connectors/bako-safe/request.d.ts.map +1 -0
  47. package/dist/types/connectors/bako-safe/types.d.ts +55 -0
  48. package/dist/types/connectors/bako-safe/types.d.ts.map +1 -0
  49. package/dist/types/connectors/fuel-wallet/FuelWalletConnector.d.ts +52 -0
  50. package/dist/types/connectors/fuel-wallet/FuelWalletConnector.d.ts.map +1 -0
  51. package/dist/types/connectors/fuel-wallet/constants.d.ts +5 -0
  52. package/dist/types/connectors/fuel-wallet/constants.d.ts.map +1 -0
  53. package/dist/types/connectors/fuel-wallet/index.d.ts +4 -0
  54. package/dist/types/connectors/fuel-wallet/index.d.ts.map +1 -0
  55. package/dist/types/connectors/fuel-wallet/types.d.ts +51 -0
  56. package/dist/types/connectors/fuel-wallet/types.d.ts.map +1 -0
  57. package/dist/types/connectors/fuelet-wallet/FueletWalletConnector.d.ts +8 -0
  58. package/dist/types/connectors/fuelet-wallet/FueletWalletConnector.d.ts.map +1 -0
  59. package/dist/types/connectors/fuelet-wallet/constants.d.ts +3 -0
  60. package/dist/types/connectors/fuelet-wallet/constants.d.ts.map +1 -0
  61. package/dist/types/connectors/fuelet-wallet/index.d.ts +2 -0
  62. package/dist/types/connectors/fuelet-wallet/index.d.ts.map +1 -0
  63. package/dist/types/fuelAddressUtilsProvider.d.ts +6 -0
  64. package/dist/types/fuelAddressUtilsProvider.d.ts.map +1 -0
  65. package/dist/types/fuelBalanceProvider.d.ts +6 -0
  66. package/dist/types/fuelBalanceProvider.d.ts.map +1 -0
  67. package/dist/types/fuelGasProvider.d.ts +6 -0
  68. package/dist/types/fuelGasProvider.d.ts.map +1 -0
  69. package/dist/types/index.d.ts +3 -0
  70. package/dist/types/index.d.ts.map +1 -0
  71. package/dist/types/services/transferService/transactionBuilder.d.ts +7 -0
  72. package/dist/types/services/transferService/transactionBuilder.d.ts.map +1 -0
  73. package/dist/types/useFuelConnection.d.ts +3 -0
  74. package/dist/types/useFuelConnection.d.ts.map +1 -0
  75. package/dist/types/utils/KnownFuelConnectors.d.ts +6 -0
  76. package/dist/types/utils/KnownFuelConnectors.d.ts.map +1 -0
  77. package/dist/types/utils/index.d.ts +3 -0
  78. package/dist/types/utils/index.d.ts.map +1 -0
  79. package/dist/types/utils/resolveIcon.d.ts +6 -0
  80. package/dist/types/utils/resolveIcon.d.ts.map +1 -0
  81. package/package.json +72 -0
@@ -0,0 +1,234 @@
1
+ import { Address, FuelConnector, FuelConnectorEventType, FuelConnectorEventTypes, Provider, transactionRequestify, } from 'fuels';
2
+ import { JSONRPCClient } from 'json-rpc-2.0';
3
+ import { APP_IMAGE, CONNECTOR_SCRIPT, CONTENT_SCRIPT_NAME, EVENT_MESSAGE, } from './constants';
4
+ import { MessageTypes, } from './types';
5
+ export class FuelWalletConnector extends FuelConnector {
6
+ constructor(name = 'Fuel Wallet') {
7
+ super();
8
+ this.name = '';
9
+ this.connected = false;
10
+ this.installed = false;
11
+ this.external = false;
12
+ this.events = FuelConnectorEventTypes;
13
+ this.metadata = {
14
+ image: APP_IMAGE,
15
+ install: {
16
+ action: 'Install',
17
+ description: 'To connect your Fuel Wallet, install the browser extension.',
18
+ link: 'https://chrome.google.com/webstore/detail/fuel-wallet/dldjpboieedgcmpkchcjcbijingjcgok',
19
+ },
20
+ };
21
+ this.onMessage = (message) => {
22
+ const messageFroze = Object.freeze(message);
23
+ if (!this.acceptMessage(messageFroze))
24
+ return;
25
+ const { data: event } = messageFroze;
26
+ this.onCommunicationMessage(event);
27
+ };
28
+ this.onCommunicationMessage = (message) => {
29
+ switch (message.type) {
30
+ case MessageTypes.response:
31
+ this.onResponse(message);
32
+ break;
33
+ case MessageTypes.event:
34
+ this.onEvent(message);
35
+ break;
36
+ default:
37
+ }
38
+ };
39
+ this.name = name;
40
+ this.setMaxListeners(100);
41
+ this.client = new JSONRPCClient(this.sendRequest.bind(this), this.createRequestId);
42
+ this.setupListener();
43
+ this.setupConnector();
44
+ }
45
+ /**
46
+ * ============================================================
47
+ * Application communication methods
48
+ * ============================================================
49
+ */
50
+ async setupConnector() {
51
+ if (typeof window !== 'undefined') {
52
+ this.ping()
53
+ .then(() => {
54
+ window.dispatchEvent(new CustomEvent(FuelConnectorEventType, { detail: this }));
55
+ })
56
+ .catch(() => { });
57
+ }
58
+ }
59
+ acceptMessage(message) {
60
+ const { data: event } = message;
61
+ return (message.origin === window.origin &&
62
+ event.type !== MessageTypes.request &&
63
+ event.connectorName === this.name &&
64
+ event.target === CONNECTOR_SCRIPT);
65
+ }
66
+ setupListener() {
67
+ if (typeof window === 'undefined')
68
+ return;
69
+ window.addEventListener(EVENT_MESSAGE, this.onMessage.bind(this));
70
+ }
71
+ createRequestId() {
72
+ return crypto.randomUUID();
73
+ }
74
+ postMessage(message, origin) {
75
+ window.postMessage(message, origin || window.origin);
76
+ }
77
+ async sendRequest(request) {
78
+ if (!request)
79
+ return;
80
+ this.postMessage({
81
+ type: MessageTypes.request,
82
+ target: CONTENT_SCRIPT_NAME,
83
+ connectorName: this.name,
84
+ request,
85
+ });
86
+ }
87
+ onResponse(message) {
88
+ this.client.receive(message.response);
89
+ }
90
+ onEvent(message) {
91
+ message.events.forEach((eventData) => {
92
+ if (eventData.event === 'start') {
93
+ this.setupConnector();
94
+ }
95
+ else {
96
+ this.emit(eventData.event, ...eventData.params);
97
+ }
98
+ });
99
+ }
100
+ /**
101
+ * ============================================================
102
+ * Connector methods
103
+ * ============================================================
104
+ */
105
+ async ping() {
106
+ return this.client.timeout(800).request('ping', {});
107
+ }
108
+ async isConnected() {
109
+ // If the wallet not exists or not connected, return false
110
+ try {
111
+ return await this.client.request('isConnected', {});
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
117
+ async connect() {
118
+ return this.client.request('connect', {});
119
+ }
120
+ async disconnect() {
121
+ return this.client.request('disconnect', {});
122
+ }
123
+ async accounts() {
124
+ const accounts = await this.client.request('accounts', {});
125
+ return accounts;
126
+ }
127
+ async currentAccount() {
128
+ const account = await this.client.request('currentAccount', {});
129
+ if (!account)
130
+ return null;
131
+ return Address.fromDynamicInput(account).toString();
132
+ }
133
+ async signMessage(address, message) {
134
+ if (!message.trim()) {
135
+ throw new Error('Message is required');
136
+ }
137
+ return this.client.request('signMessage', {
138
+ address,
139
+ message,
140
+ });
141
+ }
142
+ async sendTransaction(address, transaction) {
143
+ if (!transaction) {
144
+ throw new Error('Transaction is required');
145
+ }
146
+ // Transform transaction object to a transaction request
147
+ const txRequest = transactionRequestify(transaction);
148
+ /**
149
+ * @todo We should remove this once the chainId standard start to be used and chainId is required
150
+ * to be correct according to the network the transaction wants to target.
151
+ */
152
+ const network = await this.currentNetwork();
153
+ const provider = {
154
+ url: network.url,
155
+ };
156
+ return this.client.request('sendTransaction', {
157
+ address,
158
+ transaction: JSON.stringify(txRequest),
159
+ provider,
160
+ });
161
+ }
162
+ async assets() {
163
+ return this.client.request('assets', {});
164
+ }
165
+ async addAsset(asset) {
166
+ return this.addAssets([asset]);
167
+ }
168
+ async addAssets(assets) {
169
+ /**
170
+ * @todo: Remove this once Fuel Wallet supports assets with multiple networks
171
+ */
172
+ const assetsData = assets.map((asset) => {
173
+ const fuelNetworkAsset = asset.networks.find((n) => n.type === 'fuel');
174
+ if (!fuelNetworkAsset) {
175
+ throw new Error('Asset for Fuel Network not found!');
176
+ }
177
+ return {
178
+ ...asset,
179
+ imageUrl: asset.icon,
180
+ decimals: fuelNetworkAsset.decimals,
181
+ assetId: fuelNetworkAsset.assetId,
182
+ };
183
+ });
184
+ return this.client.request('addAssets', {
185
+ assets: assetsData,
186
+ });
187
+ }
188
+ async addABI(contractId, abi) {
189
+ return this.client.request('addAbi', {
190
+ abiMap: {
191
+ [contractId]: abi,
192
+ },
193
+ });
194
+ }
195
+ async getABI(contractId) {
196
+ return this.client.request('getAbi', {
197
+ contractId,
198
+ });
199
+ }
200
+ async hasABI(contractId) {
201
+ const abi = await this.getABI(contractId);
202
+ return !!abi;
203
+ }
204
+ async currentNetwork() {
205
+ return this.client.request('network', {});
206
+ }
207
+ async selectNetwork(network) {
208
+ return this.client.request('selectNetwork', {
209
+ network,
210
+ });
211
+ }
212
+ async networks() {
213
+ return this.client.request('networks', {});
214
+ }
215
+ async addNetwork(networkUrl) {
216
+ /**
217
+ * @todo: Remove fetch provider once Fuel Wallet supports adding networks
218
+ * by URL
219
+ */
220
+ const provider = new Provider(networkUrl);
221
+ return this.client.request('addNetwork', {
222
+ network: {
223
+ url: provider.url,
224
+ name: (await provider.getChain()).name,
225
+ },
226
+ });
227
+ }
228
+ async version() {
229
+ return this.client.request('version', {
230
+ app: '0.0.0',
231
+ network: '0.0.0',
232
+ });
233
+ }
234
+ }
@@ -0,0 +1,4 @@
1
+ export const CONNECTOR_SCRIPT = 'FuelConnectorScript';
2
+ export const CONTENT_SCRIPT_NAME = 'FuelContentScript';
3
+ export const EVENT_MESSAGE = 'message';
4
+ export const APP_IMAGE = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCA0OTEgNDk2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRoZW1lPSJkYXJrIj48dGl0bGU+RnVlbCBXYWxsZXQgSWNvbjwvdGl0bGU+PHJlY3QgeD0iNDIuNTUzNSIgeT0iMjguMzQzOCIgd2lkdGg9IjM5Ny4xNTQiIGhlaWdodD0iNDI1LjE0MyIgZmlsbD0iIzA4MDgwOCI+PC9yZWN0PjxwYXRoIGQ9Ik0zMi42MTc4IDBDMTQuNTY5NyAwIDAgMTQuNzMyNyAwIDMyLjk4MjZWNDk2SDQwNS44NTJDNDE5LjU2OCA0OTYgNDMyLjc1OSA0OTAuNDkyIDQ0Mi40NzMgNDgwLjY3TDQ3NS4zNTMgNDQ3LjQyMkM0ODUuMDY2IDQzNy42IDQ5MC41MTMgNDI0LjI2MSA0OTAuNTEzIDQxMC4zOTFWMEgzMi42MTc4Wk0zMjAuMjcxIDYzLjc3NTJMMTYwLjcyNiAyMjUuMTA1QzE1Ni43ODggMjI5LjA4NiAxNTEuNDA3IDIzMS4zNDMgMTQ1LjgyOCAyMzEuMzQzQzEzNy42OSAyMzEuMzQzIDEzMC4yMDggMjI2LjU2NSAxMjYuNzMgMjE5LjEzMkw2NC45MDc0IDg3LjAwMjRDNTkuODUzOSA3Ni4xODUyIDY3LjY2MzggNjMuNzc1MiA3OS40NzcxIDYzLjc3NTJIMzIwLjI3MVpNNjMuMDY5NyA0MzIuMjI1VjI3NS4yNzVDNjMuMDY5NyAyNjYuOTE0IDY5Ljc2MzkgMjYwLjE0NSA3OC4wMzMyIDI2MC4xNDVIMjMzLjI0Nkw2My4wNjk3IDQzMi4yMjVaTTI0Ni4xMSAyMzEuMzQzSDE5NC43MjJMMzQ5LjM0NSA3NC45OTA2QzM1Ni40MzMgNjcuODIzNCAzNjYuMDggNjMuNzc1MiAzNzYuMTIxIDYzLjc3NTJINDI3LjUwOUwyNzIuODg3IDIyMC4xMjdDMjY1Ljc5OSAyMjcuMjk1IDI1Ni4xNTEgMjMxLjM0MyAyNDYuMTEgMjMxLjM0M1oiIGZpbGw9IiMwMEY1OEMiPjwvcGF0aD48L3N2Zz4=';
@@ -0,0 +1,3 @@
1
+ export * from './constants';
2
+ export { FuelWalletConnector } from './FuelWalletConnector';
3
+ export * from './types';
@@ -0,0 +1,9 @@
1
+ export var MessageTypes;
2
+ (function (MessageTypes) {
3
+ MessageTypes["ping"] = "ping";
4
+ MessageTypes["uiEvent"] = "uiEvent";
5
+ MessageTypes["event"] = "event";
6
+ MessageTypes["request"] = "request";
7
+ MessageTypes["response"] = "response";
8
+ MessageTypes["removeConnection"] = "removeConnection";
9
+ })(MessageTypes || (MessageTypes = {}));
@@ -0,0 +1,19 @@
1
+ import { APP_IMAGE_DARK, APP_IMAGE_LIGHT } from './constants';
2
+ import { FuelWalletConnector } from '../fuel-wallet';
3
+ export class FueletWalletConnector extends FuelWalletConnector {
4
+ constructor() {
5
+ super('Fuelet Wallet');
6
+ this.name = 'Fuelet Wallet';
7
+ this.metadata = {
8
+ image: {
9
+ light: APP_IMAGE_LIGHT,
10
+ dark: APP_IMAGE_DARK,
11
+ },
12
+ install: {
13
+ action: 'Install',
14
+ description: 'Install Fuelet Wallet in order to connect it.',
15
+ link: 'https://fuelet.app/download/',
16
+ },
17
+ };
18
+ }
19
+ }
@@ -0,0 +1,2 @@
1
+ export const APP_IMAGE_DARK = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+RnVlbGV0IEljb248L3RpdGxlPjxwYXRoIGQ9Ik0yMCA0MEMxNC45MzU1IDQwIDEwLjMxNDUgMzguMTE0IDYuNzkwNSAzNS4wMTA1TDE4LjE0NiAyNi45MDdDMTguODQ1IDI2LjQwODUgMTkuODA2NSAyNi45NjQ1IDE5LjcyMiAyNy44MTk1TDE5LjI3NDUgMzIuMzYwNUMxOS4xODIgMzMuMjk1IDIwLjMxMjUgMzMuODI5NSAyMC45NzY1IDMzLjE2NTVMMjcuMDcxIDI3LjA3MUMzMS4wNjIgMjMuMDggMzAuOTc0NSAxNi41NTU1IDI2LjgwODUgMTIuNjc1NUMyMi44NDA1IDguOTggMTYuNTkzNSA5LjI2NCAxMi43NTk1IDEzLjA5ODVMNi44NTMgMTkuMDA0NUM2LjE4NyAxOS42NzEgNi43Mjc1IDIwLjgwNDUgNy42NjQ1IDIwLjcwNjVMMTIuMjA5IDIwLjIzMUMxMy4wNjU1IDIwLjE0MTUgMTMuNjI3NSAyMS4xMDUgMTMuMTI3IDIxLjgwNjVMNC45ODk1IDMzLjIwOTVDMS44ODYgMjkuNjg1NSAwIDI1LjA2NDUgMCAyMEMwIDguOTU0NSA4Ljk1NDUgMCAyMCAwQzMxLjA0NTUgMCA0MCA4Ljk1NDUgNDAgMjBDNDAgMzEuMDQ1NSAzMS4wNDU1IDQwIDIwIDQwWiIgZmlsbD0id2hpdGUiPjwvcGF0aD48L3N2Zz4=';
2
+ export const APP_IMAGE_LIGHT = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+RnVlbGV0IEljb248L3RpdGxlPjxwYXRoIGQ9Ik0yMCA0MEMxNC45MzU1IDQwIDEwLjMxNDUgMzguMTE0IDYuNzkwNSAzNS4wMTA1TDE4LjE0NiAyNi45MDdDMTguODQ1IDI2LjQwODUgMTkuODA2NSAyNi45NjQ1IDE5LjcyMiAyNy44MTk1TDE5LjI3NDUgMzIuMzYwNUMxOS4xODIgMzMuMjk1IDIwLjMxMjUgMzMuODI5NSAyMC45NzY1IDMzLjE2NTVMMjcuMDcxIDI3LjA3MUMzMS4wNjIgMjMuMDggMzAuOTc0NSAxNi41NTU1IDI2LjgwODUgMTIuNjc1NUMyMi44NDA1IDguOTggMTYuNTkzNSA5LjI2NCAxMi43NTk1IDEzLjA5ODVMNi44NTMgMTkuMDA0NUM2LjE4NyAxOS42NzEgNi43Mjc1IDIwLjgwNDUgNy42NjQ1IDIwLjcwNjVMMTIuMjA5IDIwLjIzMUMxMy4wNjU1IDIwLjE0MTUgMTMuNjI3NSAyMS4xMDUgMTMuMTI3IDIxLjgwNjVMNC45ODk1IDMzLjIwOTVDMS44ODYgMjkuNjg1NSAwIDI1LjA2NDUgMCAyMEMwIDguOTU0NSA4Ljk1NDUgMCAyMCAwQzMxLjA0NTUgMCA0MCA4Ljk1NDUgNDAgMjBDNDAgMzEuMDQ1NSAzMS4wNDU1IDQwIDIwIDQwWiIgZmlsbD0iIzI4MjgyRiI+PC9wYXRoPjwvc3ZnPg==';
@@ -0,0 +1 @@
1
+ export { FueletWalletConnector } from './FueletWalletConnector';
@@ -0,0 +1,19 @@
1
+ import { KnownInternalNames } from "@layerswap/widget/internal";
2
+ export class FuelAddressUtilsProvider {
3
+ supportsNetwork(network) {
4
+ return (KnownInternalNames.Networks.FuelMainnet.includes(network.name) || KnownInternalNames.Networks.FuelTestnet.includes(network.name));
5
+ }
6
+ isValidAddress(address) {
7
+ if (!address) {
8
+ return false;
9
+ }
10
+ const hexRegex = /^[0-9a-fA-F]+$/;
11
+ if (address.startsWith("0x")) {
12
+ address = address.slice(2); // Remove the "0x" prefix
13
+ }
14
+ else {
15
+ return false;
16
+ }
17
+ return address.length === 64 && hexRegex.test(address);
18
+ }
19
+ }
@@ -0,0 +1,61 @@
1
+ import { retryWithExponentialBackoff, fetchWithTimeout, KnownInternalNames, formatUnits } from "@layerswap/widget/internal";
2
+ import { BalanceProvider } from "@layerswap/widget/types";
3
+ export class FuelBalanceProvider extends BalanceProvider {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.supportsNetwork = (network) => {
7
+ return KnownInternalNames.Networks.FuelMainnet.includes(network.name) || KnownInternalNames.Networks.FuelTestnet.includes(network.name);
8
+ };
9
+ this.fetchBalance = async (address, network, options) => {
10
+ let balances = [];
11
+ if (!network?.tokens)
12
+ return;
13
+ const BALANCES_QUERY = `query Balances($filter: BalanceFilterInput) {
14
+ balances(filter: $filter, first: 5) {
15
+ nodes {
16
+ amount
17
+ assetId
18
+ }
19
+ }
20
+ }`;
21
+ const BALANCES_ARGS = {
22
+ filter: {
23
+ owner: address,
24
+ },
25
+ };
26
+ try {
27
+ const response = await retryWithExponentialBackoff(async () => await fetchWithTimeout(network.node_url, {
28
+ method: 'POST',
29
+ headers: {
30
+ 'Content-Type': 'application/json',
31
+ Accept: 'application/json',
32
+ },
33
+ body: JSON.stringify({
34
+ query: BALANCES_QUERY,
35
+ variables: BALANCES_ARGS,
36
+ }),
37
+ timeoutMs: options?.timeoutMs ?? 60000,
38
+ }), options?.retryCount ?? 3);
39
+ const json = await response.json();
40
+ for (let i = 0; i < network.tokens.length; i++) {
41
+ const token = network.tokens[i];
42
+ const balance = json.data.balances.nodes.find(b => b?.assetId === token.contract) || null;
43
+ const balanceObj = {
44
+ network: network.name,
45
+ amount: balance?.amount ? Number(formatUnits(BigInt(Number(balance?.amount)), token.decimals)) : undefined,
46
+ decimals: token.decimals,
47
+ isNativeCurrency: network.token?.symbol === token.symbol,
48
+ token: token.symbol,
49
+ request_time: new Date().toJSON(),
50
+ error: balance?.amount === undefined ? `Could not fetch balance for ${token.symbol}` : undefined
51
+ };
52
+ balances.push(balanceObj);
53
+ }
54
+ }
55
+ catch (e) {
56
+ return network.tokens.map((currency) => (this.resolveTokenBalanceFetchError(e, currency, network)));
57
+ }
58
+ return balances;
59
+ };
60
+ }
61
+ }
@@ -0,0 +1,38 @@
1
+ import WatchdogAbi from './jsons/FUELWATCHDOG.json';
2
+ import { KnownInternalNames, formatUnits } from "@layerswap/widget/internal";
3
+ export class FuelGasProvider {
4
+ supportsNetwork(network) {
5
+ return (KnownInternalNames.Networks.FuelMainnet.includes(network.name) || KnownInternalNames.Networks.FuelTestnet.includes(network.name));
6
+ }
7
+ async getGas({ address, network, token }) {
8
+ if (!network.metadata?.watchdog_contract)
9
+ throw new Error("Watchdog contract not found");
10
+ if (!network?.token)
11
+ throw new Error("No native token provided");
12
+ try {
13
+ const { Provider, Contract, Address } = await import('fuels');
14
+ const provider = new Provider(network?.node_url);
15
+ const contract = new Contract(network.metadata?.watchdog_contract, WatchdogAbi, provider);
16
+ const asset_id = await provider.getBaseAssetId();
17
+ const assetAddress = Address.fromB256(token.contract || asset_id);
18
+ const assetId = assetAddress.toAssetId();
19
+ const parsedAmount = 0.005 * Math.pow(10, token?.decimals);
20
+ const receiver = { bits: Address.fromDynamicInput('0x0B1956a6737cb62fF5E66479F7770315fb5055BB75888b6C2Be43155F6dF1704').toB256() };
21
+ const scope = contract.functions
22
+ .watch(42069, receiver)
23
+ .txParams({
24
+ variableOutputs: 1,
25
+ })
26
+ .callParams({
27
+ forward: [parsedAmount, assetId.bits],
28
+ });
29
+ const { maxFee } = await scope.getTransactionCost();
30
+ const formatedGas = Number((Number(formatUnits(BigInt(Number(maxFee)), network.token.decimals)) * 2).toFixed(network.token.decimals));
31
+ if (formatedGas)
32
+ return { gas: formatedGas, token: network.token };
33
+ }
34
+ catch (e) {
35
+ console.log(e);
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,13 @@
1
+ import { FuelAddressUtilsProvider } from "./fuelAddressUtilsProvider";
2
+ import { FuelBalanceProvider } from "./fuelBalanceProvider";
3
+ import { FuelGasProvider } from "./fuelGasProvider";
4
+ import FuelProviderWrapper from "./FuelProvider";
5
+ import useFuelConnection from "./useFuelConnection";
6
+ export const FuelProvider = {
7
+ id: "fuel",
8
+ wrapper: FuelProviderWrapper,
9
+ walletConnectionProvider: useFuelConnection,
10
+ addressUtilsProvider: new FuelAddressUtilsProvider(),
11
+ balanceProvider: new FuelBalanceProvider(),
12
+ gasProvider: new FuelGasProvider(),
13
+ };
@@ -0,0 +1,96 @@
1
+ {
2
+ "programType": "contract",
3
+ "specVersion": "1",
4
+ "encodingVersion": "1",
5
+ "concreteTypes": [
6
+ {
7
+ "type": "()",
8
+ "concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
9
+ },
10
+ {
11
+ "type": "str",
12
+ "concreteTypeId": "8c25cb3686462e9a86d2883c5688a22fe738b0bbc85f458d2d2b5f3f667c6d5a"
13
+ },
14
+ {
15
+ "type": "struct SwapID",
16
+ "concreteTypeId": "fe04d267f8e97aed4f214782e62e801a27fa2df26a2c7585be443083908a349d",
17
+ "metadataTypeId": 1
18
+ },
19
+ {
20
+ "type": "struct std::address::Address",
21
+ "concreteTypeId": "f597b637c3b0f588fb8d7086c6f4735caa3122b85f0423b82e489f9bb58e2308",
22
+ "metadataTypeId": 2
23
+ },
24
+ {
25
+ "type": "u256",
26
+ "concreteTypeId": "1b5759d94094368cfd443019e7ca5ec4074300e544e5ea993a979f5da627261e"
27
+ }
28
+ ],
29
+ "metadataTypes": [
30
+ {
31
+ "type": "b256",
32
+ "metadataTypeId": 0
33
+ },
34
+ {
35
+ "type": "struct SwapID",
36
+ "metadataTypeId": 1,
37
+ "components": [
38
+ {
39
+ "name": "num",
40
+ "typeId": "1b5759d94094368cfd443019e7ca5ec4074300e544e5ea993a979f5da627261e"
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ "type": "struct std::address::Address",
46
+ "metadataTypeId": 2,
47
+ "components": [
48
+ {
49
+ "name": "bits",
50
+ "typeId": 0
51
+ }
52
+ ]
53
+ }
54
+ ],
55
+ "functions": [
56
+ {
57
+ "inputs": [
58
+ {
59
+ "name": "ID",
60
+ "concreteTypeId": "1b5759d94094368cfd443019e7ca5ec4074300e544e5ea993a979f5da627261e"
61
+ },
62
+ {
63
+ "name": "recipient",
64
+ "concreteTypeId": "f597b637c3b0f588fb8d7086c6f4735caa3122b85f0423b82e489f9bb58e2308"
65
+ }
66
+ ],
67
+ "name": "watch",
68
+ "output": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d",
69
+ "attributes": [
70
+ {
71
+ "name": "payable",
72
+ "arguments": []
73
+ },
74
+ {
75
+ "name": "storage",
76
+ "arguments": [
77
+ "read",
78
+ "write"
79
+ ]
80
+ }
81
+ ]
82
+ }
83
+ ],
84
+ "loggedTypes": [
85
+ {
86
+ "logId": "10098701174489624218",
87
+ "concreteTypeId": "8c25cb3686462e9a86d2883c5688a22fe738b0bbc85f458d2d2b5f3f667c6d5a"
88
+ },
89
+ {
90
+ "logId": "18303986129540053741",
91
+ "concreteTypeId": "fe04d267f8e97aed4f214782e62e801a27fa2df26a2c7585be443083908a349d"
92
+ }
93
+ ],
94
+ "messagesTypes": [],
95
+ "configurables": []
96
+ }
@@ -0,0 +1,11 @@
1
+ import { coinQuantityfy, ScriptTransactionRequest } from 'fuels';
2
+ export const transactionBuilder = async (params) => {
3
+ const { fuelWallet, callData } = params;
4
+ var parsedCallData = JSON.parse(callData);
5
+ var scriptTransaction = ScriptTransactionRequest.from(parsedCallData.script);
6
+ var quantitiesParsed = parsedCallData.quantities.map(q => coinQuantityfy(q));
7
+ await scriptTransaction.estimateAndFund(fuelWallet, {
8
+ quantities: quantitiesParsed
9
+ });
10
+ return scriptTransaction;
11
+ };