@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.
- package/Link.js +169 -203
- package/package.json +5 -5
- package/utils/connectors/evm/chainConfigs.d.ts +2 -0
- package/utils/connectors/evm/chainConfigs.js +115 -0
- package/utils/connectors/evm/chainSwitching.d.ts +15 -0
- package/utils/connectors/evm/chainSwitching.js +242 -0
- package/utils/connectors/evm/index.d.ts +8 -0
- package/utils/connectors/evm/index.js +8 -0
- package/utils/connectors/evm/provider.d.ts +6 -0
- package/utils/connectors/evm/provider.js +13 -0
- package/utils/connectors/evm/signing.d.ts +1 -0
- package/utils/connectors/evm/signing.js +78 -0
- package/utils/connectors/evm/transactions.d.ts +9 -0
- package/utils/connectors/evm/transactions.js +201 -0
- package/utils/connectors/evm/types.d.ts +58 -0
- package/utils/connectors/evm/types.js +1 -0
- package/utils/connectors/evm/walletConnection.d.ts +20 -0
- package/utils/connectors/evm/walletConnection.js +161 -0
- package/utils/connectors/evm/walletDiscovery.d.ts +10 -0
- package/utils/connectors/evm/walletDiscovery.js +55 -0
- package/utils/connectors/solana/connection.d.ts +3 -0
- package/utils/connectors/solana/connection.js +94 -0
- package/utils/connectors/solana/index.d.ts +5 -0
- package/utils/connectors/solana/index.js +5 -0
- package/utils/connectors/solana/providerDiscovery.d.ts +3 -0
- package/utils/connectors/solana/providerDiscovery.js +75 -0
- package/utils/connectors/solana/signing.d.ts +1 -0
- package/utils/connectors/solana/signing.js +59 -0
- package/utils/connectors/solana/transaction.d.ts +2 -0
- package/utils/connectors/solana/transaction.js +158 -0
- package/utils/connectors/solana/types.d.ts +68 -0
- package/utils/connectors/solana/types.js +8 -0
- package/utils/event-types.d.ts +10 -2
- package/utils/event-types.js +2 -1
- package/utils/types.d.ts +38 -29
- package/utils/version.d.ts +1 -1
- package/utils/version.js +1 -1
- package/utils/wallet/EVMWalletStrategy.d.ts +23 -0
- package/utils/wallet/EVMWalletStrategy.js +205 -0
- package/utils/wallet/SolanaWalletStrategy.d.ts +29 -0
- package/utils/wallet/SolanaWalletStrategy.js +194 -0
- package/utils/wallet/WalletStrategy.d.ts +45 -0
- package/utils/wallet/WalletStrategy.js +25 -0
- package/utils/wallet/WalletStrategyFactory.d.ts +15 -0
- package/utils/wallet/WalletStrategyFactory.js +31 -0
- package/utils/wallet/index.d.ts +4 -0
- package/utils/wallet/index.js +4 -0
- package/utils/wallet-browser-event-types.d.ts +16 -2
- package/utils/wagmiCoreConnectorsUtils.d.ts +0 -11
- 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,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>;
|