@meshconnect/web-link-sdk 3.0.12 → 3.1.0-rc.1

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 (50) hide show
  1. package/Link.js +169 -203
  2. package/package.json +5 -5
  3. package/utils/connectors/evm/chainConfigs.d.ts +2 -0
  4. package/utils/connectors/evm/chainConfigs.js +115 -0
  5. package/utils/connectors/evm/chainSwitching.d.ts +15 -0
  6. package/utils/connectors/evm/chainSwitching.js +242 -0
  7. package/utils/connectors/evm/index.d.ts +8 -0
  8. package/utils/connectors/evm/index.js +8 -0
  9. package/utils/connectors/evm/provider.d.ts +6 -0
  10. package/utils/connectors/evm/provider.js +13 -0
  11. package/utils/connectors/evm/signing.d.ts +1 -0
  12. package/utils/connectors/evm/signing.js +78 -0
  13. package/utils/connectors/evm/transactions.d.ts +9 -0
  14. package/utils/connectors/evm/transactions.js +201 -0
  15. package/utils/connectors/evm/types.d.ts +58 -0
  16. package/utils/connectors/evm/types.js +1 -0
  17. package/utils/connectors/evm/walletConnection.d.ts +20 -0
  18. package/utils/connectors/evm/walletConnection.js +161 -0
  19. package/utils/connectors/evm/walletDiscovery.d.ts +10 -0
  20. package/utils/connectors/evm/walletDiscovery.js +55 -0
  21. package/utils/connectors/solana/connection.d.ts +3 -0
  22. package/utils/connectors/solana/connection.js +94 -0
  23. package/utils/connectors/solana/index.d.ts +5 -0
  24. package/utils/connectors/solana/index.js +5 -0
  25. package/utils/connectors/solana/providerDiscovery.d.ts +3 -0
  26. package/utils/connectors/solana/providerDiscovery.js +75 -0
  27. package/utils/connectors/solana/signing.d.ts +1 -0
  28. package/utils/connectors/solana/signing.js +59 -0
  29. package/utils/connectors/solana/transaction.d.ts +2 -0
  30. package/utils/connectors/solana/transaction.js +158 -0
  31. package/utils/connectors/solana/types.d.ts +68 -0
  32. package/utils/connectors/solana/types.js +8 -0
  33. package/utils/event-types.d.ts +10 -2
  34. package/utils/event-types.js +2 -1
  35. package/utils/types.d.ts +38 -29
  36. package/utils/version.d.ts +1 -1
  37. package/utils/version.js +1 -1
  38. package/utils/wallet/EVMWalletStrategy.d.ts +23 -0
  39. package/utils/wallet/EVMWalletStrategy.js +205 -0
  40. package/utils/wallet/SolanaWalletStrategy.d.ts +29 -0
  41. package/utils/wallet/SolanaWalletStrategy.js +194 -0
  42. package/utils/wallet/WalletStrategy.d.ts +45 -0
  43. package/utils/wallet/WalletStrategy.js +25 -0
  44. package/utils/wallet/WalletStrategyFactory.d.ts +15 -0
  45. package/utils/wallet/WalletStrategyFactory.js +31 -0
  46. package/utils/wallet/index.d.ts +4 -0
  47. package/utils/wallet/index.js +4 -0
  48. package/utils/wallet-browser-event-types.d.ts +16 -2
  49. package/utils/wagmiCoreConnectorsUtils.d.ts +0 -11
  50. package/utils/wagmiCoreConnectorsUtils.js +0 -396
@@ -0,0 +1,242 @@
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
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
38
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
39
+ if (ar || !(i in from)) {
40
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
41
+ ar[i] = from[i];
42
+ }
43
+ }
44
+ return to.concat(ar || Array.prototype.slice.call(from));
45
+ };
46
+ import { getChainConfiguration } from './chainConfigs';
47
+ import { getActiveRawProvider } from './provider';
48
+ // Chain switch status tracking
49
+ var isChainSwitching = false;
50
+ var chainSwitchError = null;
51
+ var MAX_RETRY_ATTEMPTS = 3;
52
+ var RETRY_DELAY = 1000;
53
+ /**
54
+ * Waits for a pending chain switch to complete
55
+ */
56
+ var waitForPendingSwitch = function (provider_1, chainIdHex_1) {
57
+ var args_1 = [];
58
+ for (var _i = 2; _i < arguments.length; _i++) {
59
+ args_1[_i - 2] = arguments[_i];
60
+ }
61
+ return __awaiter(void 0, __spreadArray([provider_1, chainIdHex_1], args_1, true), void 0, function (provider, chainIdHex, attempt) {
62
+ var currentChainHex, error_1;
63
+ if (attempt === void 0) { attempt = 0; }
64
+ return __generator(this, function (_a) {
65
+ switch (_a.label) {
66
+ case 0:
67
+ _a.trys.push([0, 3, , 6]);
68
+ return [4 /*yield*/, provider.request({ method: 'eth_chainId' })];
69
+ case 1:
70
+ currentChainHex = _a.sent();
71
+ if (currentChainHex === chainIdHex) {
72
+ return [2 /*return*/]; // Switch completed
73
+ }
74
+ if (attempt >= MAX_RETRY_ATTEMPTS) {
75
+ throw new Error('Chain switch timeout');
76
+ }
77
+ // Wait and retry
78
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, RETRY_DELAY); })];
79
+ case 2:
80
+ // Wait and retry
81
+ _a.sent();
82
+ return [2 /*return*/, waitForPendingSwitch(provider, chainIdHex, attempt + 1)];
83
+ case 3:
84
+ error_1 = _a.sent();
85
+ if (!(error_1.code === -32002)) return [3 /*break*/, 5];
86
+ // Still pending, wait and retry
87
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, RETRY_DELAY); })];
88
+ case 4:
89
+ // Still pending, wait and retry
90
+ _a.sent();
91
+ return [2 /*return*/, waitForPendingSwitch(provider, chainIdHex, attempt + 1)];
92
+ case 5: throw error_1;
93
+ case 6: return [2 /*return*/];
94
+ }
95
+ });
96
+ });
97
+ };
98
+ /**
99
+ * Switches the current EVM chain
100
+ */
101
+ export var switchEVMChain = function (chainId, provider) { return __awaiter(void 0, void 0, void 0, function () {
102
+ var targetProvider, chainIdHex, switchError_1, accounts, error_2;
103
+ return __generator(this, function (_a) {
104
+ switch (_a.label) {
105
+ case 0:
106
+ _a.trys.push([0, 7, , 9]);
107
+ targetProvider = provider || getActiveRawProvider();
108
+ if (!targetProvider) {
109
+ throw new Error('No active EVM provider');
110
+ }
111
+ chainIdHex = "0x".concat(chainId.toString(16));
112
+ _a.label = 1;
113
+ case 1:
114
+ _a.trys.push([1, 3, , 5]);
115
+ return [4 /*yield*/, switchChain(targetProvider, chainIdHex)];
116
+ case 2:
117
+ _a.sent();
118
+ return [3 /*break*/, 5];
119
+ case 3:
120
+ switchError_1 = _a.sent();
121
+ return [4 /*yield*/, handleSwitchError(switchError_1, targetProvider, chainId, chainIdHex)];
122
+ case 4:
123
+ _a.sent();
124
+ return [3 /*break*/, 5];
125
+ case 5: return [4 /*yield*/, targetProvider.request({ method: 'eth_accounts' })];
126
+ case 6:
127
+ accounts = _a.sent();
128
+ return [2 /*return*/, { chainId: chainId, accounts: accounts }];
129
+ case 7:
130
+ error_2 = _a.sent();
131
+ if (isUserRejection(error_2)) {
132
+ return [2 /*return*/, new Error('User rejected chain switch')];
133
+ }
134
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1000); })];
135
+ case 8:
136
+ _a.sent();
137
+ console.error('Chain switch error:', error_2);
138
+ return [2 /*return*/, error_2 instanceof Error ? error_2 : new Error('Failed to switch chain')];
139
+ case 9: return [2 /*return*/];
140
+ }
141
+ });
142
+ }); };
143
+ /**
144
+ * Attempts to switch to a specific chain
145
+ */
146
+ var switchChain = function (provider, chainIdHex) { return __awaiter(void 0, void 0, void 0, function () {
147
+ return __generator(this, function (_a) {
148
+ switch (_a.label) {
149
+ case 0: return [4 /*yield*/, provider.request({
150
+ method: 'wallet_switchEthereumChain',
151
+ params: [{ chainId: chainIdHex }]
152
+ })];
153
+ case 1:
154
+ _a.sent();
155
+ return [2 /*return*/];
156
+ }
157
+ });
158
+ }); };
159
+ /**
160
+ * Handles chain switch errors
161
+ */
162
+ var handleSwitchError = function (error, provider, chainId, chainIdHex) { return __awaiter(void 0, void 0, void 0, function () {
163
+ return __generator(this, function (_a) {
164
+ switch (_a.label) {
165
+ case 0:
166
+ if (error.code === 4001) {
167
+ throw new Error('User rejected chain switch');
168
+ }
169
+ if (!(error.code === -32002)) return [3 /*break*/, 2];
170
+ // Request already pending, wait for it
171
+ return [4 /*yield*/, waitForPendingSwitch(provider, chainIdHex)];
172
+ case 1:
173
+ // Request already pending, wait for it
174
+ _a.sent();
175
+ return [2 /*return*/];
176
+ case 2:
177
+ if (!(error.code === 4902 || error.code === -32603)) return [3 /*break*/, 5];
178
+ return [4 /*yield*/, addChain(provider, chainId, chainIdHex)];
179
+ case 3:
180
+ _a.sent();
181
+ return [4 /*yield*/, switchChain(provider, chainIdHex)];
182
+ case 4:
183
+ _a.sent();
184
+ return [3 /*break*/, 6];
185
+ case 5: throw error;
186
+ case 6: return [2 /*return*/];
187
+ }
188
+ });
189
+ }); };
190
+ /**
191
+ * Adds a new chain to the wallet
192
+ */
193
+ var addChain = function (provider, chainId, chainIdHex) { return __awaiter(void 0, void 0, void 0, function () {
194
+ var chainConfig, addError_1;
195
+ return __generator(this, function (_a) {
196
+ switch (_a.label) {
197
+ case 0:
198
+ chainConfig = getChainConfiguration(chainId);
199
+ if (!chainConfig) {
200
+ throw new Error("No configuration found for chain ".concat(chainId));
201
+ }
202
+ _a.label = 1;
203
+ case 1:
204
+ _a.trys.push([1, 3, , 4]);
205
+ return [4 /*yield*/, provider.request({
206
+ method: 'wallet_addEthereumChain',
207
+ params: [
208
+ {
209
+ chainId: chainIdHex,
210
+ chainName: chainConfig.name,
211
+ nativeCurrency: chainConfig.nativeCurrency,
212
+ rpcUrls: chainConfig.rpcUrls.default.http,
213
+ blockExplorerUrls: [chainConfig.blockExplorers.default.url]
214
+ }
215
+ ]
216
+ })];
217
+ case 2:
218
+ _a.sent();
219
+ return [3 /*break*/, 4];
220
+ case 3:
221
+ addError_1 = _a.sent();
222
+ if (addError_1.code === 4001) {
223
+ throw new Error('User rejected chain add');
224
+ }
225
+ throw addError_1;
226
+ case 4: return [2 /*return*/];
227
+ }
228
+ });
229
+ }); };
230
+ /**
231
+ * Checks if an error is a user rejection
232
+ */
233
+ var isUserRejection = function (error) {
234
+ return error instanceof Error && error.message.includes('rejected');
235
+ };
236
+ /**
237
+ * Gets the current chain switch status
238
+ */
239
+ export var getChainSwitchStatus = function () { return ({
240
+ isChainSwitching: isChainSwitching,
241
+ chainSwitchError: chainSwitchError
242
+ }); };
@@ -0,0 +1,8 @@
1
+ export * from './types';
2
+ export * from './walletConnection';
3
+ export * from './transactions';
4
+ export * from './chainSwitching';
5
+ export * from './walletDiscovery';
6
+ export * from './provider';
7
+ export * from './chainConfigs';
8
+ export * from './signing';
@@ -0,0 +1,8 @@
1
+ export * from './types';
2
+ export * from './walletConnection';
3
+ export * from './transactions';
4
+ export * from './chainSwitching';
5
+ export * from './walletDiscovery';
6
+ export * from './provider';
7
+ export * from './chainConfigs';
8
+ export * from './signing';
@@ -0,0 +1,6 @@
1
+ import { ethers } from 'ethers';
2
+ import { EVMProvider } from './types';
3
+ export declare const setActiveEVMProvider: (provider: ethers.BrowserProvider, rawProvider: EVMProvider) => void;
4
+ export declare const getActiveEVMProvider: () => ethers.BrowserProvider | null;
5
+ export declare const getActiveRawProvider: () => EVMProvider | null;
6
+ export declare const clearActiveProviders: () => void;
@@ -0,0 +1,13 @@
1
+ // Keep track of the active provider
2
+ var activeEVMProvider = null;
3
+ var activeRawProvider = null;
4
+ export var setActiveEVMProvider = function (provider, rawProvider) {
5
+ activeEVMProvider = provider;
6
+ activeRawProvider = rawProvider;
7
+ };
8
+ export var getActiveEVMProvider = function () { return activeEVMProvider; };
9
+ export var getActiveRawProvider = function () { return activeRawProvider; };
10
+ export var clearActiveProviders = function () {
11
+ activeEVMProvider = null;
12
+ activeRawProvider = null;
13
+ };
@@ -0,0 +1 @@
1
+ export declare const signEVMMessage: (walletName: string, address: string, message: string) => Promise<string | Error>;
@@ -0,0 +1,78 @@
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 { getActiveEVMProvider, getActiveRawProvider } from './provider';
39
+ export var signEVMMessage = function (walletName, address, message) { return __awaiter(void 0, void 0, void 0, function () {
40
+ var activeProvider, activeRawProvider, messageHex, signature_1, provider, signer, signature, error_1;
41
+ return __generator(this, function (_a) {
42
+ switch (_a.label) {
43
+ case 0:
44
+ _a.trys.push([0, 5, , 6]);
45
+ activeProvider = getActiveEVMProvider();
46
+ activeRawProvider = getActiveRawProvider();
47
+ if (!activeProvider || !activeRawProvider) {
48
+ throw new Error('No active EVM provider');
49
+ }
50
+ if (!(walletName.toLowerCase() === 'rainbow')) return [3 /*break*/, 2];
51
+ messageHex = ethers.hexlify(ethers.toUtf8Bytes(message));
52
+ return [4 /*yield*/, activeRawProvider.request({
53
+ method: 'personal_sign',
54
+ // EIP-191 standard order: address first, then message
55
+ params: [address.toLowerCase(), messageHex]
56
+ })];
57
+ case 1:
58
+ signature_1 = _a.sent();
59
+ return [2 /*return*/, signature_1];
60
+ case 2:
61
+ provider = new ethers.BrowserProvider(activeRawProvider);
62
+ return [4 /*yield*/, provider.getSigner(address)];
63
+ case 3:
64
+ signer = _a.sent();
65
+ return [4 /*yield*/, signer.signMessage(message)];
66
+ case 4:
67
+ signature = _a.sent();
68
+ return [2 /*return*/, signature];
69
+ case 5:
70
+ error_1 = _a.sent();
71
+ console.error('EVM message signing error:', error_1);
72
+ return [2 /*return*/, error_1 instanceof Error
73
+ ? error_1
74
+ : new Error("Failed to sign message with ".concat(walletName, " wallet"))];
75
+ case 6: return [2 /*return*/];
76
+ }
77
+ });
78
+ }); };
@@ -0,0 +1,9 @@
1
+ import { ethers } from 'ethers';
2
+ /**
3
+ * Sends a native EVM transaction
4
+ */
5
+ export declare const sendEVMTransaction: (toAddress: string, amount: bigint, fromAddress: string) => Promise<string | Error>;
6
+ /**
7
+ * Sends an EVM token transaction
8
+ */
9
+ export declare const sendEVMTokenTransaction: (contractAddress: string, abi: ethers.InterfaceAbi, functionName: string, args: unknown[], fromAddress: string, value?: bigint) => Promise<string | Error>;
@@ -0,0 +1,201 @@
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
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
38
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
39
+ if (ar || !(i in from)) {
40
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
41
+ ar[i] = from[i];
42
+ }
43
+ }
44
+ return to.concat(ar || Array.prototype.slice.call(from));
45
+ };
46
+ import { ethers } from 'ethers';
47
+ import { getActiveRawProvider } from './provider';
48
+ var isUserRejection = function (error) {
49
+ var _a;
50
+ if (!error)
51
+ return false;
52
+ // Check for various wallet rejection patterns
53
+ var message = ((_a = error.message) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
54
+ return (error.code === 4001 || // Standard EIP-1193 user rejection code
55
+ message.includes('user rejected') ||
56
+ message.includes('user denied') ||
57
+ message.includes('user cancelled') ||
58
+ message.includes('declined'));
59
+ };
60
+ /**
61
+ * Sends a native EVM transaction
62
+ */
63
+ export var sendEVMTransaction = function (toAddress, amount, fromAddress) { return __awaiter(void 0, void 0, void 0, function () {
64
+ var activeRawProvider, chainIdHex, chainId, provider, signer, network, tx, receipt, txError_1, error_1;
65
+ return __generator(this, function (_a) {
66
+ switch (_a.label) {
67
+ case 0:
68
+ _a.trys.push([0, 9, , 10]);
69
+ activeRawProvider = getActiveRawProvider();
70
+ if (!activeRawProvider) {
71
+ throw new Error('No active EVM provider');
72
+ }
73
+ return [4 /*yield*/, activeRawProvider.request({
74
+ method: 'eth_chainId'
75
+ })];
76
+ case 1:
77
+ chainIdHex = _a.sent();
78
+ chainId = parseInt(chainIdHex, 16);
79
+ provider = new ethers.BrowserProvider(activeRawProvider);
80
+ return [4 /*yield*/, provider.getSigner(fromAddress)
81
+ // Verify we're still on the same network before proceeding
82
+ ];
83
+ case 2:
84
+ signer = _a.sent();
85
+ return [4 /*yield*/, provider.getNetwork()];
86
+ case 3:
87
+ network = _a.sent();
88
+ if (Number(network.chainId) !== chainId) {
89
+ throw new Error('Network changed during transaction setup');
90
+ }
91
+ _a.label = 4;
92
+ case 4:
93
+ _a.trys.push([4, 7, , 8]);
94
+ return [4 /*yield*/, signer.sendTransaction({
95
+ to: toAddress,
96
+ value: amount
97
+ })];
98
+ case 5:
99
+ tx = _a.sent();
100
+ return [4 /*yield*/, tx.wait()];
101
+ case 6:
102
+ receipt = _a.sent();
103
+ return [2 /*return*/, receipt ? receipt.hash : ''];
104
+ case 7:
105
+ txError_1 = _a.sent();
106
+ if (isUserRejection(txError_1)) {
107
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
108
+ }
109
+ throw txError_1;
110
+ case 8: return [3 /*break*/, 10];
111
+ case 9:
112
+ error_1 = _a.sent();
113
+ console.error('Transaction error:', error_1);
114
+ if (isUserRejection(error_1)) {
115
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
116
+ }
117
+ if (error_1.code === 'NETWORK_ERROR') {
118
+ return [2 /*return*/, new Error('Network changed during transaction. Please try again.')];
119
+ }
120
+ return [2 /*return*/, error_1 instanceof Error
121
+ ? error_1
122
+ : new Error('Failed to send transaction')];
123
+ case 10: return [2 /*return*/];
124
+ }
125
+ });
126
+ }); };
127
+ /**
128
+ * Sends an EVM token transaction
129
+ */
130
+ export var sendEVMTokenTransaction = function (contractAddress, abi, functionName, args, fromAddress, value) { return __awaiter(void 0, void 0, void 0, function () {
131
+ var activeRawProvider, chainIdHex, chainId, provider, signer, network, contract, txOptions, feeData, tx, receipt, txError_2, error_2;
132
+ return __generator(this, function (_a) {
133
+ switch (_a.label) {
134
+ case 0:
135
+ _a.trys.push([0, 10, , 11]);
136
+ activeRawProvider = getActiveRawProvider();
137
+ if (!activeRawProvider) {
138
+ throw new Error('No active EVM provider');
139
+ }
140
+ return [4 /*yield*/, activeRawProvider.request({
141
+ method: 'eth_chainId'
142
+ })];
143
+ case 1:
144
+ chainIdHex = _a.sent();
145
+ chainId = parseInt(chainIdHex, 16);
146
+ provider = new ethers.BrowserProvider(activeRawProvider);
147
+ return [4 /*yield*/, provider.getSigner(fromAddress)
148
+ // Verify we're still on the same network before proceeding
149
+ ];
150
+ case 2:
151
+ signer = _a.sent();
152
+ return [4 /*yield*/, provider.getNetwork()];
153
+ case 3:
154
+ network = _a.sent();
155
+ if (Number(network.chainId) !== chainId) {
156
+ throw new Error('Network changed during transaction setup');
157
+ }
158
+ contract = new ethers.Contract(contractAddress, abi, signer);
159
+ txOptions = {};
160
+ return [4 /*yield*/, provider.getFeeData()];
161
+ case 4:
162
+ feeData = _a.sent();
163
+ txOptions.gasPrice = feeData.gasPrice
164
+ ? (feeData.gasPrice * BigInt(120)) / BigInt(100)
165
+ : undefined;
166
+ if (value) {
167
+ txOptions.value = value;
168
+ }
169
+ _a.label = 5;
170
+ case 5:
171
+ _a.trys.push([5, 8, , 9]);
172
+ return [4 /*yield*/, contract[functionName].apply(contract, __spreadArray(__spreadArray([], args, false), [txOptions], false))];
173
+ case 6:
174
+ tx = _a.sent();
175
+ return [4 /*yield*/, tx.wait()];
176
+ case 7:
177
+ receipt = _a.sent();
178
+ return [2 /*return*/, receipt ? receipt.hash : ''];
179
+ case 8:
180
+ txError_2 = _a.sent();
181
+ if (isUserRejection(txError_2)) {
182
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
183
+ }
184
+ throw txError_2;
185
+ case 9: return [3 /*break*/, 11];
186
+ case 10:
187
+ error_2 = _a.sent();
188
+ console.error('Token transaction error:', error_2);
189
+ if (isUserRejection(error_2)) {
190
+ return [2 /*return*/, new Error('Transaction was rejected by user')];
191
+ }
192
+ if (error_2.code === 'NETWORK_ERROR') {
193
+ return [2 /*return*/, new Error('Network changed during transaction. Please try again.')];
194
+ }
195
+ return [2 /*return*/, error_2 instanceof Error
196
+ ? error_2
197
+ : new Error('Failed to send token transaction')];
198
+ case 11: return [2 /*return*/];
199
+ }
200
+ });
201
+ }); };
@@ -0,0 +1,58 @@
1
+ import { ethers } from 'ethers';
2
+ import { Eip1193Provider } from 'ethers';
3
+ export interface EVMConnectResult {
4
+ accounts: string[];
5
+ chainId: number;
6
+ isConnected: boolean;
7
+ }
8
+ export interface EVMProvider extends ethers.Eip1193Provider {
9
+ on(event: string, listener: (...args: any[]) => void): void;
10
+ removeListener(event: string, listener: (...args: any[]) => void): void;
11
+ removeAllListeners(): void;
12
+ [key: string]: any;
13
+ }
14
+ export interface InjectedProviderInfo {
15
+ name: string;
16
+ id: string;
17
+ icon?: string;
18
+ injectedData: {
19
+ provider: EVMProvider;
20
+ [key: string]: any;
21
+ };
22
+ }
23
+ export interface ChainConfig {
24
+ name: string;
25
+ nativeCurrency: {
26
+ decimals: number;
27
+ name: string;
28
+ symbol: string;
29
+ };
30
+ rpcUrls: {
31
+ default: {
32
+ http: string[];
33
+ };
34
+ };
35
+ blockExplorers: {
36
+ default: {
37
+ name: string;
38
+ url: string;
39
+ };
40
+ };
41
+ }
42
+ export interface EIP6963ProviderInfo {
43
+ uuid: string;
44
+ name: string;
45
+ icon?: string;
46
+ rdns?: string;
47
+ }
48
+ export interface EIP6963ProviderDetail {
49
+ info: EIP6963ProviderInfo;
50
+ provider: Eip1193Provider;
51
+ }
52
+ export interface EIP6963AnnounceProviderEvent extends CustomEvent {
53
+ type: 'eip6963:announceProvider';
54
+ detail: EIP6963ProviderDetail;
55
+ }
56
+ export interface EIP6963RequestProviderEvent extends Event {
57
+ type: 'eip6963:requestProvider';
58
+ }
@@ -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>;