@meshconnect/web-link-sdk 3.2.15 → 3.2.16

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 (101) hide show
  1. package/Link.d.ts +2 -0
  2. package/Link.js +530 -0
  3. package/index.d.ts +3 -0
  4. package/index.js +3 -0
  5. package/package.json +8 -20
  6. package/utils/connectors/evm/chainConfigs.d.ts +2 -0
  7. package/utils/connectors/evm/chainConfigs.js +115 -0
  8. package/utils/connectors/evm/chainSwitching.d.ts +15 -0
  9. package/utils/connectors/evm/chainSwitching.js +242 -0
  10. package/utils/connectors/evm/index.d.ts +8 -0
  11. package/utils/connectors/evm/index.js +8 -0
  12. package/utils/connectors/evm/provider.d.ts +6 -0
  13. package/utils/connectors/evm/provider.js +13 -0
  14. package/utils/connectors/evm/signing.d.ts +1 -0
  15. package/utils/connectors/evm/signing.js +78 -0
  16. package/utils/connectors/evm/transactions.d.ts +28 -0
  17. package/utils/connectors/evm/transactions.js +381 -0
  18. package/utils/connectors/evm/types.d.ts +57 -0
  19. package/utils/connectors/evm/types.js +1 -0
  20. package/utils/connectors/evm/walletConnection.d.ts +20 -0
  21. package/utils/connectors/evm/walletConnection.js +160 -0
  22. package/utils/connectors/evm/walletDiscovery.d.ts +10 -0
  23. package/utils/connectors/evm/walletDiscovery.js +55 -0
  24. package/utils/connectors/solana/connection.d.ts +4 -0
  25. package/utils/connectors/solana/connection.js +108 -0
  26. package/utils/connectors/solana/index.d.ts +5 -0
  27. package/utils/connectors/solana/index.js +5 -0
  28. package/utils/connectors/solana/providerDiscovery.d.ts +3 -0
  29. package/utils/connectors/solana/providerDiscovery.js +127 -0
  30. package/utils/connectors/solana/signing.d.ts +1 -0
  31. package/utils/connectors/solana/signing.js +59 -0
  32. package/utils/connectors/solana/transaction.d.ts +17 -0
  33. package/utils/connectors/solana/transaction.js +362 -0
  34. package/utils/connectors/solana/types.d.ts +71 -0
  35. package/utils/connectors/solana/types.js +8 -0
  36. package/utils/event-types.d.ts +233 -0
  37. package/{src/utils/event-types.test.ts → utils/event-types.js} +5 -15
  38. package/utils/popup.d.ts +3 -0
  39. package/utils/popup.js +36 -0
  40. package/utils/sdk-specs.d.ts +5 -0
  41. package/utils/sdk-specs.js +6 -0
  42. package/utils/style.d.ts +3 -0
  43. package/utils/style.js +13 -0
  44. package/utils/types.d.ts +234 -0
  45. package/utils/types.js +1 -0
  46. package/utils/version.d.ts +1 -0
  47. package/utils/version.js +1 -0
  48. package/utils/wallet/EVMWalletStrategy.d.ts +31 -0
  49. package/utils/wallet/EVMWalletStrategy.js +265 -0
  50. package/utils/wallet/SolanaWalletStrategy.d.ts +33 -0
  51. package/utils/wallet/SolanaWalletStrategy.js +300 -0
  52. package/utils/wallet/WalletStrategy.d.ts +61 -0
  53. package/utils/wallet/WalletStrategy.js +25 -0
  54. package/utils/wallet/WalletStrategyFactory.d.ts +15 -0
  55. package/utils/wallet/WalletStrategyFactory.js +31 -0
  56. package/utils/wallet/index.d.ts +4 -0
  57. package/utils/wallet/index.js +4 -0
  58. package/utils/wallet-browser-event-types.d.ts +116 -0
  59. package/utils/wallet-browser-event-types.js +17 -0
  60. package/jest.setup.ts +0 -4
  61. package/src/Link.test.ts +0 -434
  62. package/src/Link.ts +0 -491
  63. package/src/index.ts +0 -3
  64. package/src/utils/__snapshots__/popup.test.ts.snap +0 -89
  65. package/src/utils/connectors/evm/chainConfigs.ts +0 -120
  66. package/src/utils/connectors/evm/chainSwitching.ts +0 -165
  67. package/src/utils/connectors/evm/index.ts +0 -8
  68. package/src/utils/connectors/evm/provider.ts +0 -22
  69. package/src/utils/connectors/evm/signing.ts +0 -39
  70. package/src/utils/connectors/evm/transactions.ts +0 -356
  71. package/src/utils/connectors/evm/types.ts +0 -63
  72. package/src/utils/connectors/evm/walletConnection.ts +0 -140
  73. package/src/utils/connectors/evm/walletDiscovery.ts +0 -67
  74. package/src/utils/connectors/solana/connection.ts +0 -69
  75. package/src/utils/connectors/solana/index.ts +0 -5
  76. package/src/utils/connectors/solana/providerDiscovery.ts +0 -153
  77. package/src/utils/connectors/solana/signing.ts +0 -18
  78. package/src/utils/connectors/solana/transaction.ts +0 -382
  79. package/src/utils/connectors/solana/types.ts +0 -66
  80. package/src/utils/event-types.ts +0 -350
  81. package/src/utils/popup.test.ts +0 -50
  82. package/src/utils/popup.ts +0 -123
  83. package/src/utils/sdk-specs.test.ts +0 -18
  84. package/src/utils/sdk-specs.ts +0 -7
  85. package/src/utils/style.test.ts +0 -33
  86. package/src/utils/style.ts +0 -15
  87. package/src/utils/types.ts +0 -270
  88. package/src/utils/version.ts +0 -1
  89. package/src/utils/wallet/EVMWalletStrategy.ts +0 -176
  90. package/src/utils/wallet/SolanaWalletStrategy.ts +0 -207
  91. package/src/utils/wallet/WalletStrategy.ts +0 -99
  92. package/src/utils/wallet/WalletStrategyFactory.ts +0 -46
  93. package/src/utils/wallet/__tests__/EVMWalletStrategy.test.ts +0 -233
  94. package/src/utils/wallet/__tests__/SolanaWalletStrategy.test.ts +0 -253
  95. package/src/utils/wallet/__tests__/WalletStrategy.test.ts +0 -77
  96. package/src/utils/wallet/__tests__/WalletStrategyFactory.test.ts +0 -65
  97. package/src/utils/wallet/index.ts +0 -4
  98. package/src/utils/wallet-browser-event-types.ts +0 -190
  99. package/tools/copy.js +0 -26
  100. package/tools/update-version.js +0 -10
  101. package/tsconfig.json +0 -14
@@ -0,0 +1,381 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { ethers } from 'ethers';
38
+ import { getActiveRawProvider } from './provider';
39
+ var isUserRejection = function (error) {
40
+ var _a;
41
+ if (!error)
42
+ return false;
43
+ // Check for various wallet rejection patterns
44
+ var message = ((_a = error.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
45
+ return (error.code === 4001 || // Standard EIP-1193 user rejection code
46
+ message.includes('user rejected') ||
47
+ message.includes('user denied') ||
48
+ message.includes('user cancelled') ||
49
+ message.includes('declined'));
50
+ };
51
+ /**
52
+ * Sends a native EVM transaction
53
+ */
54
+ export var sendEVMTransaction = function (toAddress, amount, fromAddress, gasLimit, maxFeePerGas, maxPriorityFeePerGas) { return __awaiter(void 0, void 0, void 0, function () {
55
+ var activeRawProvider, chainIdHex, chainId, provider, signer, network, tx, receipt, txError_1, error_1;
56
+ return __generator(this, function (_a) {
57
+ switch (_a.label) {
58
+ case 0:
59
+ _a.trys.push([0, 9, , 10]);
60
+ activeRawProvider = getActiveRawProvider();
61
+ if (!activeRawProvider) {
62
+ throw new Error('No active EVM provider');
63
+ }
64
+ return [4 /*yield*/, activeRawProvider.request({
65
+ method: 'eth_chainId'
66
+ })];
67
+ case 1:
68
+ chainIdHex = _a.sent();
69
+ chainId = parseInt(chainIdHex, 16);
70
+ provider = new ethers.BrowserProvider(activeRawProvider);
71
+ return [4 /*yield*/, provider.getSigner(fromAddress)
72
+ // Verify we're still on the same network before proceeding
73
+ ];
74
+ case 2:
75
+ signer = _a.sent();
76
+ return [4 /*yield*/, provider.getNetwork()];
77
+ case 3:
78
+ network = _a.sent();
79
+ if (Number(network.chainId) !== chainId) {
80
+ throw new Error('Network changed during transaction setup');
81
+ }
82
+ _a.label = 4;
83
+ case 4:
84
+ _a.trys.push([4, 7, , 8]);
85
+ return [4 /*yield*/, signer.sendTransaction({
86
+ to: toAddress,
87
+ value: amount,
88
+ gasLimit: gasLimit ? BigInt(Math.floor(gasLimit)) : undefined,
89
+ maxFeePerGas: maxFeePerGas
90
+ ? BigInt(Math.floor(maxFeePerGas))
91
+ : undefined,
92
+ maxPriorityFeePerGas: maxPriorityFeePerGas
93
+ ? BigInt(Math.floor(maxPriorityFeePerGas))
94
+ : undefined
95
+ })];
96
+ case 5:
97
+ tx = _a.sent();
98
+ return [4 /*yield*/, tx.wait()];
99
+ case 6:
100
+ receipt = _a.sent();
101
+ return [2 /*return*/, receipt ? receipt.hash : ''];
102
+ case 7:
103
+ txError_1 = _a.sent();
104
+ if (isUserRejection(txError_1)) {
105
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
106
+ }
107
+ throw txError_1;
108
+ case 8: return [3 /*break*/, 10];
109
+ case 9:
110
+ error_1 = _a.sent();
111
+ console.error('Transaction error:', error_1);
112
+ if (isUserRejection(error_1)) {
113
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
114
+ }
115
+ if (error_1.code === 'NETWORK_ERROR') {
116
+ return [2 /*return*/, new Error('Network changed during transaction. Please try again.')];
117
+ }
118
+ return [2 /*return*/, error_1 instanceof Error
119
+ ? error_1
120
+ : new Error('Failed to send transaction')];
121
+ case 10: return [2 /*return*/];
122
+ }
123
+ });
124
+ }); };
125
+ /**
126
+ * Sends an EVM token transaction
127
+ */
128
+ export var sendEVMTokenTransaction = function (contractAddress, abi, functionName, args, fromAddress) { return __awaiter(void 0, void 0, void 0, function () {
129
+ var activeRawProvider, chainIdHex, chainId, provider, signer, network, contract, txOptions, gasLimit, maxFeePerGas, maxPriorityFeePerGas, tx, receipt, txError_2, error_2;
130
+ return __generator(this, function (_a) {
131
+ switch (_a.label) {
132
+ case 0:
133
+ _a.trys.push([0, 9, , 10]);
134
+ activeRawProvider = getActiveRawProvider();
135
+ if (!activeRawProvider) {
136
+ throw new Error('No active EVM provider');
137
+ }
138
+ return [4 /*yield*/, activeRawProvider.request({
139
+ method: 'eth_chainId'
140
+ })];
141
+ case 1:
142
+ chainIdHex = _a.sent();
143
+ chainId = parseInt(chainIdHex, 16);
144
+ provider = new ethers.BrowserProvider(activeRawProvider);
145
+ return [4 /*yield*/, provider.getSigner(fromAddress)
146
+ // Verify we're still on the same network before proceeding
147
+ ];
148
+ case 2:
149
+ signer = _a.sent();
150
+ return [4 /*yield*/, provider.getNetwork()];
151
+ case 3:
152
+ network = _a.sent();
153
+ if (Number(network.chainId) !== chainId) {
154
+ throw new Error('Network changed during transaction setup');
155
+ }
156
+ contract = new ethers.Contract(contractAddress, abi, signer);
157
+ txOptions = {};
158
+ gasLimit = (args === null || args === void 0 ? void 0 : args[2]) !== undefined ? toSafeNumber(args[2], 'gasLimit') : undefined;
159
+ maxFeePerGas = (args === null || args === void 0 ? void 0 : args[3]) !== undefined
160
+ ? toSafeNumber(args[3], 'maxFeePerGas')
161
+ : undefined;
162
+ maxPriorityFeePerGas = (args === null || args === void 0 ? void 0 : args[4]) !== undefined
163
+ ? toSafeNumber(args[4], 'maxPriorityFeePerGas')
164
+ : undefined;
165
+ txOptions.gasLimit = gasLimit ? BigInt(Math.floor(gasLimit)) : undefined;
166
+ txOptions.maxFeePerGas = maxFeePerGas
167
+ ? BigInt(Math.floor(maxFeePerGas))
168
+ : undefined;
169
+ txOptions.maxPriorityFeePerGas = maxPriorityFeePerGas
170
+ ? BigInt(Math.floor(maxPriorityFeePerGas))
171
+ : undefined;
172
+ _a.label = 4;
173
+ case 4:
174
+ _a.trys.push([4, 7, , 8]);
175
+ return [4 /*yield*/, contract[functionName](args[0], args[1], txOptions)
176
+ // Wait for transaction confirmation
177
+ ];
178
+ case 5:
179
+ tx = _a.sent();
180
+ return [4 /*yield*/, tx.wait()];
181
+ case 6:
182
+ receipt = _a.sent();
183
+ return [2 /*return*/, receipt ? receipt.hash : ''];
184
+ case 7:
185
+ txError_2 = _a.sent();
186
+ if (isUserRejection(txError_2)) {
187
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
188
+ }
189
+ throw txError_2;
190
+ case 8: return [3 /*break*/, 10];
191
+ case 9:
192
+ error_2 = _a.sent();
193
+ console.error('Token transaction error:', error_2);
194
+ if (isUserRejection(error_2)) {
195
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
196
+ }
197
+ if (error_2.code === 'NETWORK_ERROR') {
198
+ return [2 /*return*/, new Error('Network changed during transaction. Please try again.')];
199
+ }
200
+ return [2 /*return*/, error_2 instanceof Error
201
+ ? error_2
202
+ : new Error('Failed to send token transaction')];
203
+ case 10: return [2 /*return*/];
204
+ }
205
+ });
206
+ }); };
207
+ /**
208
+ * Sends an native smart contract transaction
209
+ */
210
+ export var sendNativeSmartContractTransaction = function (contractAddress, abi, functionName, args, fromAddress, value) { return __awaiter(void 0, void 0, void 0, function () {
211
+ var activeRawProvider, chainIdHex, chainId, provider, signer, network, contract, txOptions, gasLimit, maxFeePerGas, maxPriorityFeePerGas, tx, receipt, txError_3, error_3;
212
+ return __generator(this, function (_a) {
213
+ switch (_a.label) {
214
+ case 0:
215
+ _a.trys.push([0, 9, , 10]);
216
+ activeRawProvider = getActiveRawProvider();
217
+ if (!activeRawProvider) {
218
+ throw new Error('No active EVM provider');
219
+ }
220
+ return [4 /*yield*/, activeRawProvider.request({
221
+ method: 'eth_chainId'
222
+ })];
223
+ case 1:
224
+ chainIdHex = _a.sent();
225
+ chainId = parseInt(chainIdHex, 16);
226
+ provider = new ethers.BrowserProvider(activeRawProvider);
227
+ return [4 /*yield*/, provider.getSigner(fromAddress)
228
+ // Verify we're still on the same network before proceeding
229
+ ];
230
+ case 2:
231
+ signer = _a.sent();
232
+ return [4 /*yield*/, provider.getNetwork()];
233
+ case 3:
234
+ network = _a.sent();
235
+ if (Number(network.chainId) !== chainId) {
236
+ throw new Error('Network changed during transaction setup');
237
+ }
238
+ contract = new ethers.Contract(contractAddress, abi, signer);
239
+ txOptions = {};
240
+ gasLimit = (args === null || args === void 0 ? void 0 : args[1]) !== undefined ? toSafeNumber(args[1], 'gasLimit') : undefined;
241
+ maxFeePerGas = (args === null || args === void 0 ? void 0 : args[2]) !== undefined
242
+ ? toSafeNumber(args[2], 'maxFeePerGas')
243
+ : undefined;
244
+ maxPriorityFeePerGas = (args === null || args === void 0 ? void 0 : args[3]) !== undefined
245
+ ? toSafeNumber(args[3], 'maxPriorityFeePerGas')
246
+ : undefined;
247
+ txOptions.gasLimit = gasLimit ? BigInt(Math.floor(gasLimit)) : undefined;
248
+ txOptions.maxFeePerGas = maxFeePerGas
249
+ ? BigInt(Math.floor(maxFeePerGas))
250
+ : undefined;
251
+ txOptions.maxPriorityFeePerGas = maxPriorityFeePerGas
252
+ ? BigInt(Math.floor(maxPriorityFeePerGas))
253
+ : undefined;
254
+ if (value) {
255
+ txOptions.value = value;
256
+ }
257
+ _a.label = 4;
258
+ case 4:
259
+ _a.trys.push([4, 7, , 8]);
260
+ return [4 /*yield*/, contract[functionName](args[0], txOptions)
261
+ // Wait for transaction confirmation
262
+ ];
263
+ case 5:
264
+ tx = _a.sent();
265
+ return [4 /*yield*/, tx.wait()];
266
+ case 6:
267
+ receipt = _a.sent();
268
+ return [2 /*return*/, receipt ? receipt.hash : ''];
269
+ case 7:
270
+ txError_3 = _a.sent();
271
+ if (isUserRejection(txError_3)) {
272
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
273
+ }
274
+ throw txError_3;
275
+ case 8: return [3 /*break*/, 10];
276
+ case 9:
277
+ error_3 = _a.sent();
278
+ console.error('Token transaction error:', error_3);
279
+ if (isUserRejection(error_3)) {
280
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
281
+ }
282
+ if (error_3.code === 'NETWORK_ERROR') {
283
+ return [2 /*return*/, new Error('Network changed during transaction. Please try again.')];
284
+ }
285
+ return [2 /*return*/, error_3 instanceof Error
286
+ ? error_3
287
+ : new Error('Failed to send token transaction')];
288
+ case 10: return [2 /*return*/];
289
+ }
290
+ });
291
+ }); };
292
+ function toSafeNumber(value, name) {
293
+ if (typeof value !== 'number' || Number.isNaN(value)) {
294
+ throw new TypeError("Invalid ".concat(name, ": expected a number, got ").concat(typeof value, " (").concat(value, ")"));
295
+ }
296
+ return value;
297
+ }
298
+ /**
299
+ * Sends a batch of EVM transactions
300
+ */
301
+ export var sendEVMTransactionBatch = function (params) { return __awaiter(void 0, void 0, void 0, function () {
302
+ var activeRawProvider, provider, response, result, txError_4, error_4;
303
+ var _a, _b;
304
+ return __generator(this, function (_c) {
305
+ switch (_c.label) {
306
+ case 0:
307
+ _c.trys.push([0, 10, , 11]);
308
+ activeRawProvider = getActiveRawProvider();
309
+ if (!activeRawProvider) {
310
+ throw new Error('No active EVM provider');
311
+ }
312
+ provider = new ethers.BrowserProvider(activeRawProvider);
313
+ _c.label = 1;
314
+ case 1:
315
+ _c.trys.push([1, 8, , 9]);
316
+ return [4 /*yield*/, provider.send('wallet_sendCalls', [params])
317
+ // Wait for transaction confirmation
318
+ ];
319
+ case 2:
320
+ response = _c.sent();
321
+ result = void 0;
322
+ _c.label = 3;
323
+ case 3: return [4 /*yield*/, provider.send('wallet_getCallsStatus', [response.id])
324
+ // wait 1 second if receipt is not yet available
325
+ ];
326
+ case 4:
327
+ result = _c.sent();
328
+ if (!(result.status == 100)) return [3 /*break*/, 6];
329
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1000); })];
330
+ case 5:
331
+ _c.sent();
332
+ _c.label = 6;
333
+ case 6:
334
+ if (result.status == 100) return [3 /*break*/, 3];
335
+ _c.label = 7;
336
+ case 7: return [2 /*return*/, (result === null || result === void 0 ? void 0 : result.status) != 200
337
+ ? new Error('Failed to send batched transactions')
338
+ : (_b = (_a = result.receipts.find(function (x) { return x; })) === null || _a === void 0 ? void 0 : _a.transactionHash) !== null && _b !== void 0 ? _b : new Error('Failed to get batched transactions receipt')];
339
+ case 8:
340
+ txError_4 = _c.sent();
341
+ if (isUserRejection(txError_4)) {
342
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
343
+ }
344
+ throw txError_4;
345
+ case 9: return [3 /*break*/, 11];
346
+ case 10:
347
+ error_4 = _c.sent();
348
+ console.error('Token transaction error:', error_4);
349
+ if (isUserRejection(error_4)) {
350
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
351
+ }
352
+ if (error_4.code === 'NETWORK_ERROR') {
353
+ return [2 /*return*/, new Error('Network changed during transaction. Please try again.')];
354
+ }
355
+ return [2 /*return*/, error_4 instanceof Error
356
+ ? error_4
357
+ : new Error('Failed to send token transaction')];
358
+ case 11: return [2 /*return*/];
359
+ }
360
+ });
361
+ }); };
362
+ export var getWalletCapabilities = function (from, chainId) { return __awaiter(void 0, void 0, void 0, function () {
363
+ var activeRawProvider, provider, capabilities;
364
+ return __generator(this, function (_a) {
365
+ switch (_a.label) {
366
+ case 0:
367
+ activeRawProvider = getActiveRawProvider();
368
+ if (!activeRawProvider) {
369
+ throw new Error('No active EVM provider');
370
+ }
371
+ provider = new ethers.BrowserProvider(activeRawProvider);
372
+ return [4 /*yield*/, provider.send('wallet_getCapabilities', [
373
+ from,
374
+ [chainId]
375
+ ])];
376
+ case 1:
377
+ capabilities = _a.sent();
378
+ return [2 /*return*/, capabilities[chainId]];
379
+ }
380
+ });
381
+ }); };
@@ -0,0 +1,57 @@
1
+ import { ethers, Eip1193Provider } from 'ethers';
2
+ export interface EVMConnectResult {
3
+ accounts: string[];
4
+ chainId: number;
5
+ isConnected: boolean;
6
+ }
7
+ export interface EVMProvider extends ethers.Eip1193Provider {
8
+ on(event: string, listener: (...args: any[]) => void): void;
9
+ removeListener(event: string, listener: (...args: any[]) => void): void;
10
+ removeAllListeners(): void;
11
+ [key: string]: any;
12
+ }
13
+ export interface InjectedProviderInfo {
14
+ name: string;
15
+ id: string;
16
+ icon?: string;
17
+ injectedData: {
18
+ provider: EVMProvider;
19
+ [key: string]: any;
20
+ };
21
+ }
22
+ export interface ChainConfig {
23
+ name: string;
24
+ nativeCurrency: {
25
+ decimals: number;
26
+ name: string;
27
+ symbol: string;
28
+ };
29
+ rpcUrls: {
30
+ default: {
31
+ http: string[];
32
+ };
33
+ };
34
+ blockExplorers: {
35
+ default: {
36
+ name: string;
37
+ url: string;
38
+ };
39
+ };
40
+ }
41
+ export interface EIP6963ProviderInfo {
42
+ uuid: string;
43
+ name: string;
44
+ icon?: string;
45
+ rdns?: string;
46
+ }
47
+ export interface EIP6963ProviderDetail {
48
+ info: EIP6963ProviderInfo;
49
+ provider: Eip1193Provider;
50
+ }
51
+ export interface EIP6963AnnounceProviderEvent extends CustomEvent {
52
+ type: 'eip6963:announceProvider';
53
+ detail: EIP6963ProviderDetail;
54
+ }
55
+ export interface EIP6963RequestProviderEvent extends Event {
56
+ type: 'eip6963:requestProvider';
57
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { EVMProvider, EVMConnectResult, EIP6963ProviderDetail } from './types';
2
+ declare global {
3
+ interface Window {
4
+ ethereum?: EVMProvider & {
5
+ providers?: EVMProvider[];
6
+ };
7
+ }
8
+ }
9
+ /**
10
+ * Gets an EVM provider for a specific wallet
11
+ */
12
+ export declare const getEVMProvider: (walletName?: string, walletDetail?: EIP6963ProviderDetail) => EVMProvider;
13
+ /**
14
+ * Connects to an EVM wallet
15
+ */
16
+ export declare const connectToEVMWallet: (walletName: string, targetChainId?: number, walletDetail?: EIP6963ProviderDetail) => Promise<EVMConnectResult | Error>;
17
+ /**
18
+ * Disconnects from an EVM wallet
19
+ */
20
+ export declare const disconnectFromEVMWallet: (walletName: string) => Promise<void | Error>;
@@ -0,0 +1,160 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { ethers } from 'ethers';
38
+ import { setActiveEVMProvider, getActiveRawProvider, clearActiveProviders } from './provider';
39
+ import { switchEVMChain } from './chainSwitching';
40
+ import { initializeWalletDiscovery, findAvailableProviders } from './walletDiscovery';
41
+ initializeWalletDiscovery();
42
+ /**
43
+ * Gets an EVM provider for a specific wallet
44
+ */
45
+ export var getEVMProvider = function (walletName, walletDetail) {
46
+ if (walletDetail === null || walletDetail === void 0 ? void 0 : walletDetail.provider) {
47
+ return walletDetail.provider;
48
+ }
49
+ if (!walletName) {
50
+ throw new Error('Wallet name is required');
51
+ }
52
+ var providers = findAvailableProviders();
53
+ var matchingProvider = providers.find(function (p) {
54
+ return p.name.toLowerCase() === walletName.toLowerCase() ||
55
+ p.name.toLowerCase().includes(walletName.toLowerCase());
56
+ });
57
+ if (matchingProvider) {
58
+ return matchingProvider.injectedData.provider;
59
+ }
60
+ if (window.ethereum) {
61
+ return window.ethereum;
62
+ }
63
+ throw new Error("No provider found for wallet ".concat(walletName, ". Please make sure the wallet is installed and enabled."));
64
+ };
65
+ /**
66
+ * Connects to an EVM wallet
67
+ */
68
+ export var connectToEVMWallet = function (walletName, targetChainId, walletDetail) { return __awaiter(void 0, void 0, void 0, function () {
69
+ var provider, browserProvider, existingAccounts, error_1, signer, address, chainId, switchResult, error_2;
70
+ return __generator(this, function (_a) {
71
+ switch (_a.label) {
72
+ case 0:
73
+ _a.trys.push([0, 12, , 13]);
74
+ provider = void 0;
75
+ try {
76
+ provider = getEVMProvider(walletName, walletDetail);
77
+ }
78
+ catch (error) {
79
+ throw new Error("No provider found for wallet ".concat(walletName));
80
+ }
81
+ browserProvider = new ethers.BrowserProvider(provider);
82
+ setActiveEVMProvider(browserProvider, provider);
83
+ existingAccounts = void 0;
84
+ _a.label = 1;
85
+ case 1:
86
+ _a.trys.push([1, 3, , 4]);
87
+ return [4 /*yield*/, provider.request({ method: 'eth_accounts' })];
88
+ case 2:
89
+ existingAccounts = _a.sent();
90
+ return [3 /*break*/, 4];
91
+ case 3:
92
+ error_1 = _a.sent();
93
+ existingAccounts = [];
94
+ return [3 /*break*/, 4];
95
+ case 4:
96
+ if (!(!existingAccounts || existingAccounts.length === 0)) return [3 /*break*/, 6];
97
+ return [4 /*yield*/, browserProvider.send('eth_requestAccounts', [])];
98
+ case 5:
99
+ _a.sent();
100
+ _a.label = 6;
101
+ case 6: return [4 /*yield*/, browserProvider.getSigner()];
102
+ case 7:
103
+ signer = _a.sent();
104
+ return [4 /*yield*/, signer.getAddress()];
105
+ case 8:
106
+ address = _a.sent();
107
+ return [4 /*yield*/, browserProvider
108
+ .getNetwork()
109
+ .then(function (network) { return Number(network.chainId); })];
110
+ case 9:
111
+ chainId = _a.sent();
112
+ if (!(targetChainId && chainId !== targetChainId)) return [3 /*break*/, 11];
113
+ return [4 /*yield*/, switchEVMChain(targetChainId, provider)];
114
+ case 10:
115
+ switchResult = _a.sent();
116
+ if (switchResult instanceof Error) {
117
+ throw switchResult;
118
+ }
119
+ chainId = switchResult.chainId;
120
+ _a.label = 11;
121
+ case 11: return [2 /*return*/, {
122
+ accounts: [address],
123
+ chainId: chainId,
124
+ isConnected: true
125
+ }];
126
+ case 12:
127
+ error_2 = _a.sent();
128
+ console.error('EVM wallet connection error:', error_2);
129
+ return [2 /*return*/, error_2 instanceof Error
130
+ ? error_2
131
+ : new Error("Failed to connect to ".concat(walletName, " wallet"))];
132
+ case 13: return [2 /*return*/];
133
+ }
134
+ });
135
+ }); };
136
+ /**
137
+ * Disconnects from an EVM wallet
138
+ */
139
+ export var disconnectFromEVMWallet = function (walletName) { return __awaiter(void 0, void 0, void 0, function () {
140
+ var provider;
141
+ return __generator(this, function (_a) {
142
+ try {
143
+ provider = getActiveRawProvider();
144
+ if (!provider) {
145
+ return [2 /*return*/];
146
+ }
147
+ if (provider.removeAllListeners) {
148
+ provider.removeAllListeners();
149
+ }
150
+ clearActiveProviders();
151
+ }
152
+ catch (error) {
153
+ console.error('EVM wallet disconnection error:', error);
154
+ return [2 /*return*/, error instanceof Error
155
+ ? error
156
+ : new Error("Failed to disconnect from ".concat(walletName, " wallet"))];
157
+ }
158
+ return [2 /*return*/];
159
+ });
160
+ }); };
@@ -0,0 +1,10 @@
1
+ import { InjectedProviderInfo } from './types';
2
+ /**
3
+ * Initializes EIP-6963 wallet discovery protocol
4
+ * @returns Cleanup function for event listeners
5
+ */
6
+ export declare const initializeWalletDiscovery: () => (() => void);
7
+ /**
8
+ * Finds all available EVM providers using EIP-6963
9
+ */
10
+ export declare const findAvailableProviders: () => InjectedProviderInfo[];