@earthworm/wallet-sdk 0.2.2 → 0.2.5
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/README.md +16 -19
- package/dist/account-sync-EPEP5KUV.js +2 -0
- package/dist/chunk-F7UNIZSN.js +1079 -0
- package/dist/chunk-HLZ3QZTH.js +19 -0
- package/dist/chunk-XTONTXHH.js +40 -0
- package/dist/index.d.ts +443 -259
- package/dist/index.js +122 -695
- package/dist/network-BRDZGVT6.js +2 -0
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -1,27 +1,84 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const decimal = Number.parseInt(chainId, 16);
|
|
6
|
-
if (Number.isFinite(decimal)) return decimal;
|
|
7
|
-
if (fallback !== void 0) return fallback;
|
|
8
|
-
return Number.NaN;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// src/utils/env.ts
|
|
12
|
-
var isBrowser = typeof window !== "undefined";
|
|
13
|
-
function assertBrowser(apiName) {
|
|
14
|
-
if (!isBrowser) {
|
|
15
|
-
throw new Error(`[wallet-sdk] ${apiName} is only available in the browser`);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
1
|
+
export { applyWalletAccountsChangedEffect } from './chunk-HLZ3QZTH.js';
|
|
2
|
+
export { ensureTargetNetwork, switchToConfiguredNetwork } from './chunk-XTONTXHH.js';
|
|
3
|
+
import { isBrowser } from './chunk-F7UNIZSN.js';
|
|
4
|
+
export { BSC_NETWORK, BSC_TESTNET_NETWORK, ERC20_ABI, ERC20_DECIMALS, ERC20_DECIMALS_ABI, SUPPORTED_BSC_CHAIN_IDS, USDT_CONFIG, WalletEvents, assertBrowser, bindBrowserProvider, bindWalletProvider, clearJsonRpcReadProviderCache, clearWalletRuntime, connectWallet, connectWalletAccount, createJsonRpcReadProvider, disconnectWallet, emitWalletEvent, getActiveWalletKey, getConfiguredReadProvider, getConnectedAddress, getContractDecimals, getContractPrice, getReadProviderWithFallback, getSelectedWalletProvider, getSharedBrowserProvider, getWalletAccounts, getWalletBrowserProvider, getWalletEventProvider, getWalletSdkConfig, getWalletSigner, hasDeployedContract, initWalletSdk, isBrowser, isContractDeployed, isWalletConnected, isWalletSdkInitialized, normalizeSupportedBscChainId, readConfiguredUsdtDecimals, readErc20Balance, readErc20Decimals, readUsdtBalance, refreshWalletAccounts, refreshWalletReadProvider, requestWallet, resetWalletSdkConfig, resolveChainConfig, resolveWalletKey, setWalletEventProvider, setWalletReadProvider, switchWalletAccount, syncConnectedWalletAccount, syncWalletAccountAddress, syncWalletRuntimeProvider, toChainIdDecimal, walletEvents } from './chunk-F7UNIZSN.js';
|
|
18
5
|
|
|
19
6
|
// src/wallet/eip6963.ts
|
|
20
|
-
var
|
|
21
|
-
var
|
|
22
|
-
var
|
|
7
|
+
var EIP6963_ANNOUNCE = "eip6963:announceProvider";
|
|
8
|
+
var EIP6963_REQUEST = "eip6963:requestProvider";
|
|
9
|
+
var TIP6963_ANNOUNCE = "TIP6963:announceProvider";
|
|
10
|
+
var TIP6963_REQUEST = "TIP6963:requestProvider";
|
|
11
|
+
var Wallet6963Name = /* @__PURE__ */ ((Wallet6963Name2) => {
|
|
12
|
+
Wallet6963Name2["MetaMask"] = "metamask";
|
|
13
|
+
Wallet6963Name2["Coinbase"] = "coinbase";
|
|
14
|
+
Wallet6963Name2["TokenPocket"] = "tokenpocket";
|
|
15
|
+
Wallet6963Name2["TronLink"] = "tronlink";
|
|
16
|
+
return Wallet6963Name2;
|
|
17
|
+
})(Wallet6963Name || {});
|
|
18
|
+
var Wallet6963Rdns = /* @__PURE__ */ ((Wallet6963Rdns2) => {
|
|
19
|
+
Wallet6963Rdns2["MetaMask"] = "io.metamask";
|
|
20
|
+
Wallet6963Rdns2["Coinbase"] = "com.coinbase.wallet";
|
|
21
|
+
Wallet6963Rdns2["TokenPocket"] = "com.tokenpocket";
|
|
22
|
+
Wallet6963Rdns2["TronLink"] = "org.tronlink.www";
|
|
23
|
+
Wallet6963Rdns2["TronLinkAlt"] = "io.tronlink";
|
|
24
|
+
return Wallet6963Rdns2;
|
|
25
|
+
})(Wallet6963Rdns || {});
|
|
26
|
+
function normalizeWalletName(name) {
|
|
27
|
+
return name.toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
function matchExactWalletName(name, walletName) {
|
|
30
|
+
return normalizeWalletName(name) === walletName;
|
|
31
|
+
}
|
|
32
|
+
function matchIncludesWalletName(name, walletName) {
|
|
33
|
+
return normalizeWalletName(name).includes(walletName);
|
|
34
|
+
}
|
|
35
|
+
var WALLET_6963_MATCHERS = {
|
|
36
|
+
metamask: {
|
|
37
|
+
rdns: ["io.metamask" /* MetaMask */],
|
|
38
|
+
matchName: (name) => matchExactWalletName(name, "metamask" /* MetaMask */)
|
|
39
|
+
},
|
|
40
|
+
coinbase: {
|
|
41
|
+
rdns: ["com.coinbase.wallet" /* Coinbase */],
|
|
42
|
+
matchName: (name) => matchIncludesWalletName(name, "coinbase" /* Coinbase */)
|
|
43
|
+
},
|
|
44
|
+
tokenpocket: {
|
|
45
|
+
rdns: ["com.tokenpocket" /* TokenPocket */],
|
|
46
|
+
matchName: (name) => matchIncludesWalletName(name, "tokenpocket" /* TokenPocket */)
|
|
47
|
+
},
|
|
48
|
+
tronlink: {
|
|
49
|
+
rdns: ["org.tronlink.www" /* TronLink */, "io.tronlink" /* TronLinkAlt */],
|
|
50
|
+
matchName: (name) => matchIncludesWalletName(name, "tronlink" /* TronLink */)
|
|
51
|
+
}
|
|
52
|
+
};
|
|
23
53
|
var discoveredProviders = [];
|
|
24
54
|
var discoveryPromise = null;
|
|
55
|
+
function getProviderDedupKey(detail) {
|
|
56
|
+
const rdns = detail.info.rdns?.trim().toLowerCase();
|
|
57
|
+
if (rdns) {
|
|
58
|
+
return `rdns:${rdns}`;
|
|
59
|
+
}
|
|
60
|
+
return `name:${normalizeWalletName(detail.info.name)}`;
|
|
61
|
+
}
|
|
62
|
+
function collectProviderDetail(providers, detail) {
|
|
63
|
+
if (!detail?.provider) return;
|
|
64
|
+
if (providers.some((item) => item.info.uuid === detail.info.uuid)) return;
|
|
65
|
+
const dedupKey = getProviderDedupKey(detail);
|
|
66
|
+
if (providers.some((item) => getProviderDedupKey(item) === dedupKey)) return;
|
|
67
|
+
providers.push(detail);
|
|
68
|
+
}
|
|
69
|
+
function matchesWallet6963(detail, matcher) {
|
|
70
|
+
const rdns = detail.info.rdns.toLowerCase();
|
|
71
|
+
return matcher.rdns.includes(rdns) || matcher.matchName(detail.info.name);
|
|
72
|
+
}
|
|
73
|
+
function defineWallet6963Provider(matcher) {
|
|
74
|
+
const find = () => findDiscoveredProvider((detail) => matchesWallet6963(detail, matcher));
|
|
75
|
+
const has = () => Boolean(find());
|
|
76
|
+
return { find, has };
|
|
77
|
+
}
|
|
78
|
+
var metamask6963 = defineWallet6963Provider(WALLET_6963_MATCHERS.metamask);
|
|
79
|
+
var coinbase6963 = defineWallet6963Provider(WALLET_6963_MATCHERS.coinbase);
|
|
80
|
+
var tokenPocket6963 = defineWallet6963Provider(WALLET_6963_MATCHERS.tokenpocket);
|
|
81
|
+
var tronLink6963 = defineWallet6963Provider(WALLET_6963_MATCHERS.tronlink);
|
|
25
82
|
function discoverWalletProviders(timeoutMs = 500) {
|
|
26
83
|
if (!isBrowser) {
|
|
27
84
|
return Promise.resolve([]);
|
|
@@ -32,58 +89,35 @@ function discoverWalletProviders(timeoutMs = 500) {
|
|
|
32
89
|
discoveryPromise = new Promise((resolve) => {
|
|
33
90
|
const providers = [];
|
|
34
91
|
const onAnnounce = (event) => {
|
|
35
|
-
|
|
36
|
-
if (!detail?.provider) return;
|
|
37
|
-
if (providers.some((item) => item.info.uuid === detail.info.uuid)) return;
|
|
38
|
-
providers.push(detail);
|
|
92
|
+
collectProviderDetail(providers, event.detail);
|
|
39
93
|
};
|
|
40
|
-
window.addEventListener(
|
|
41
|
-
window.
|
|
94
|
+
window.addEventListener(EIP6963_ANNOUNCE, onAnnounce);
|
|
95
|
+
window.addEventListener(TIP6963_ANNOUNCE, onAnnounce);
|
|
96
|
+
window.dispatchEvent(new Event(EIP6963_REQUEST));
|
|
97
|
+
window.dispatchEvent(new Event(TIP6963_REQUEST));
|
|
42
98
|
window.setTimeout(() => {
|
|
43
|
-
window.removeEventListener(
|
|
99
|
+
window.removeEventListener(EIP6963_ANNOUNCE, onAnnounce);
|
|
100
|
+
window.removeEventListener(TIP6963_ANNOUNCE, onAnnounce);
|
|
44
101
|
discoveredProviders = providers;
|
|
45
102
|
resolve(providers);
|
|
46
103
|
}, timeoutMs);
|
|
47
104
|
});
|
|
48
105
|
return discoveryPromise;
|
|
49
106
|
}
|
|
107
|
+
if (isBrowser) {
|
|
108
|
+
void discoverWalletProviders();
|
|
109
|
+
}
|
|
50
110
|
function findDiscoveredProvider(match) {
|
|
51
111
|
return discoveredProviders.find(match)?.provider;
|
|
52
112
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
function findTokenPocketEip6963Provider() {
|
|
64
|
-
return findDiscoveredProvider(
|
|
65
|
-
(detail) => detail.info.rdns === TOKENPOCKET_RDNS || detail.info.name.toLowerCase().includes("tokenpocket")
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
function hasMetaMaskEip6963Provider() {
|
|
69
|
-
return Boolean(findMetaMaskEip6963Provider());
|
|
70
|
-
}
|
|
71
|
-
function hasCoinbaseEip6963Provider() {
|
|
72
|
-
return Boolean(findCoinbaseEip6963Provider());
|
|
73
|
-
}
|
|
74
|
-
function hasTokenPocketEip6963Provider() {
|
|
75
|
-
return Boolean(findTokenPocketEip6963Provider());
|
|
76
|
-
}
|
|
77
|
-
var providerCache = /* @__PURE__ */ new WeakMap();
|
|
78
|
-
function getSharedBrowserProvider(ethereum) {
|
|
79
|
-
const cached = providerCache.get(ethereum);
|
|
80
|
-
if (cached) {
|
|
81
|
-
return cached;
|
|
82
|
-
}
|
|
83
|
-
const provider = new BrowserProvider(ethereum);
|
|
84
|
-
providerCache.set(ethereum, provider);
|
|
85
|
-
return provider;
|
|
86
|
-
}
|
|
113
|
+
var findMetaMaskEip6963Provider = metamask6963.find;
|
|
114
|
+
var findCoinbaseEip6963Provider = coinbase6963.find;
|
|
115
|
+
var findTokenPocketEip6963Provider = tokenPocket6963.find;
|
|
116
|
+
var findTronLinkEip6963Provider = tronLink6963.find;
|
|
117
|
+
var hasMetaMaskEip6963Provider = metamask6963.has;
|
|
118
|
+
var hasCoinbaseEip6963Provider = coinbase6963.has;
|
|
119
|
+
var hasTokenPocketEip6963Provider = tokenPocket6963.has;
|
|
120
|
+
var hasTronLinkEip6963Provider = tronLink6963.has;
|
|
87
121
|
|
|
88
122
|
// src/wallet/injected-providers.ts
|
|
89
123
|
var isRequestableProvider = (provider) => {
|
|
@@ -99,7 +133,7 @@ function getInjectedEthereumProviders() {
|
|
|
99
133
|
}
|
|
100
134
|
var isMetaMaskLikeProvider = (provider) => {
|
|
101
135
|
return Boolean(
|
|
102
|
-
provider.isMetaMask && !provider.isCoinbaseWallet && !provider.isTronLink && !provider.isTronLinkWallet
|
|
136
|
+
provider.isMetaMask && !provider.isCoinbaseWallet && !provider.isTokenPocket && !provider.isTronLink && !provider.isTronLinkWallet
|
|
103
137
|
);
|
|
104
138
|
};
|
|
105
139
|
var isCoinbaseLikeProvider = (provider) => {
|
|
@@ -193,6 +227,27 @@ function resolveTokenPocketInjectedProvider() {
|
|
|
193
227
|
}
|
|
194
228
|
return void 0;
|
|
195
229
|
}
|
|
230
|
+
function resolveTronLinkInjectedProvider() {
|
|
231
|
+
const fromEip6963 = findTronLinkEip6963Provider();
|
|
232
|
+
if (fromEip6963 && isRequestableProvider(fromEip6963)) {
|
|
233
|
+
return fromEip6963;
|
|
234
|
+
}
|
|
235
|
+
const ethereum = window.ethereum;
|
|
236
|
+
const fromProviders = getInjectedEthereumProviders().find(isTronLinkLikeProvider);
|
|
237
|
+
if (fromProviders) {
|
|
238
|
+
return fromProviders;
|
|
239
|
+
}
|
|
240
|
+
if (ethereum && isTronLinkLikeProvider(ethereum)) {
|
|
241
|
+
return ethereum;
|
|
242
|
+
}
|
|
243
|
+
if (isRequestableProvider(window.tronLink)) {
|
|
244
|
+
return window.tronLink;
|
|
245
|
+
}
|
|
246
|
+
if (isRequestableProvider(window.tron)) {
|
|
247
|
+
return window.tron;
|
|
248
|
+
}
|
|
249
|
+
return void 0;
|
|
250
|
+
}
|
|
196
251
|
function hasMetaMaskInjectedProvider() {
|
|
197
252
|
return Boolean(resolveMetaMaskInjectedProvider());
|
|
198
253
|
}
|
|
@@ -204,6 +259,9 @@ function hasCoinbaseInjectedProvider() {
|
|
|
204
259
|
function hasTokenPocketInjectedProvider() {
|
|
205
260
|
return Boolean(resolveTokenPocketInjectedProvider());
|
|
206
261
|
}
|
|
262
|
+
function hasTronLinkInjectedProvider() {
|
|
263
|
+
return Boolean(resolveTronLinkInjectedProvider());
|
|
264
|
+
}
|
|
207
265
|
var cachedAggregatorProvider;
|
|
208
266
|
var cachedAggregatorProviderCount = 0;
|
|
209
267
|
var isMultiWalletAggregator = (provider) => {
|
|
@@ -265,637 +323,6 @@ function hasAggregatedInjectedProvider() {
|
|
|
265
323
|
return isRequestableProvider(window.ethereum);
|
|
266
324
|
}
|
|
267
325
|
|
|
268
|
-
// src/abi/erc20.ts
|
|
269
|
-
var ERC20_ABI = [
|
|
270
|
-
{
|
|
271
|
-
constant: true,
|
|
272
|
-
inputs: [],
|
|
273
|
-
name: "name",
|
|
274
|
-
outputs: [
|
|
275
|
-
{
|
|
276
|
-
name: "",
|
|
277
|
-
type: "string"
|
|
278
|
-
}
|
|
279
|
-
],
|
|
280
|
-
payable: false,
|
|
281
|
-
stateMutability: "view",
|
|
282
|
-
type: "function"
|
|
283
|
-
},
|
|
284
|
-
{
|
|
285
|
-
constant: false,
|
|
286
|
-
inputs: [
|
|
287
|
-
{
|
|
288
|
-
name: "_spender",
|
|
289
|
-
type: "address"
|
|
290
|
-
},
|
|
291
|
-
{
|
|
292
|
-
name: "_value",
|
|
293
|
-
type: "uint256"
|
|
294
|
-
}
|
|
295
|
-
],
|
|
296
|
-
name: "approve",
|
|
297
|
-
outputs: [
|
|
298
|
-
{
|
|
299
|
-
name: "success",
|
|
300
|
-
type: "bool"
|
|
301
|
-
}
|
|
302
|
-
],
|
|
303
|
-
payable: false,
|
|
304
|
-
stateMutability: "nonpayable",
|
|
305
|
-
type: "function"
|
|
306
|
-
},
|
|
307
|
-
{
|
|
308
|
-
constant: true,
|
|
309
|
-
inputs: [],
|
|
310
|
-
name: "totalSupply",
|
|
311
|
-
outputs: [
|
|
312
|
-
{
|
|
313
|
-
name: "",
|
|
314
|
-
type: "uint256"
|
|
315
|
-
}
|
|
316
|
-
],
|
|
317
|
-
payable: false,
|
|
318
|
-
stateMutability: "view",
|
|
319
|
-
type: "function"
|
|
320
|
-
},
|
|
321
|
-
{
|
|
322
|
-
constant: false,
|
|
323
|
-
inputs: [
|
|
324
|
-
{
|
|
325
|
-
name: "_from",
|
|
326
|
-
type: "address"
|
|
327
|
-
},
|
|
328
|
-
{
|
|
329
|
-
name: "_to",
|
|
330
|
-
type: "address"
|
|
331
|
-
},
|
|
332
|
-
{
|
|
333
|
-
name: "_value",
|
|
334
|
-
type: "uint256"
|
|
335
|
-
}
|
|
336
|
-
],
|
|
337
|
-
name: "transferFrom",
|
|
338
|
-
outputs: [
|
|
339
|
-
{
|
|
340
|
-
name: "success",
|
|
341
|
-
type: "bool"
|
|
342
|
-
}
|
|
343
|
-
],
|
|
344
|
-
payable: false,
|
|
345
|
-
stateMutability: "nonpayable",
|
|
346
|
-
type: "function"
|
|
347
|
-
},
|
|
348
|
-
{
|
|
349
|
-
constant: true,
|
|
350
|
-
inputs: [],
|
|
351
|
-
name: "decimals",
|
|
352
|
-
outputs: [
|
|
353
|
-
{
|
|
354
|
-
name: "",
|
|
355
|
-
type: "uint8"
|
|
356
|
-
}
|
|
357
|
-
],
|
|
358
|
-
payable: false,
|
|
359
|
-
stateMutability: "view",
|
|
360
|
-
type: "function"
|
|
361
|
-
},
|
|
362
|
-
{
|
|
363
|
-
constant: false,
|
|
364
|
-
inputs: [
|
|
365
|
-
{
|
|
366
|
-
name: "_value",
|
|
367
|
-
type: "uint256"
|
|
368
|
-
}
|
|
369
|
-
],
|
|
370
|
-
name: "burn",
|
|
371
|
-
outputs: [],
|
|
372
|
-
payable: false,
|
|
373
|
-
stateMutability: "nonpayable",
|
|
374
|
-
type: "function"
|
|
375
|
-
},
|
|
376
|
-
{
|
|
377
|
-
constant: true,
|
|
378
|
-
inputs: [
|
|
379
|
-
{
|
|
380
|
-
name: "_owner",
|
|
381
|
-
type: "address"
|
|
382
|
-
}
|
|
383
|
-
],
|
|
384
|
-
name: "balanceOf",
|
|
385
|
-
outputs: [
|
|
386
|
-
{
|
|
387
|
-
name: "balance",
|
|
388
|
-
type: "uint256"
|
|
389
|
-
}
|
|
390
|
-
],
|
|
391
|
-
payable: false,
|
|
392
|
-
stateMutability: "view",
|
|
393
|
-
type: "function"
|
|
394
|
-
},
|
|
395
|
-
{
|
|
396
|
-
constant: false,
|
|
397
|
-
inputs: [
|
|
398
|
-
{
|
|
399
|
-
name: "_from",
|
|
400
|
-
type: "address"
|
|
401
|
-
},
|
|
402
|
-
{
|
|
403
|
-
name: "_value",
|
|
404
|
-
type: "uint256"
|
|
405
|
-
}
|
|
406
|
-
],
|
|
407
|
-
name: "burnFrom",
|
|
408
|
-
outputs: [],
|
|
409
|
-
payable: false,
|
|
410
|
-
stateMutability: "nonpayable",
|
|
411
|
-
type: "function"
|
|
412
|
-
},
|
|
413
|
-
{
|
|
414
|
-
constant: false,
|
|
415
|
-
inputs: [
|
|
416
|
-
{
|
|
417
|
-
name: "_to",
|
|
418
|
-
type: "address[]"
|
|
419
|
-
},
|
|
420
|
-
{
|
|
421
|
-
name: "_value",
|
|
422
|
-
type: "uint256[]"
|
|
423
|
-
}
|
|
424
|
-
],
|
|
425
|
-
name: "transferArray",
|
|
426
|
-
outputs: [],
|
|
427
|
-
payable: false,
|
|
428
|
-
stateMutability: "nonpayable",
|
|
429
|
-
type: "function"
|
|
430
|
-
},
|
|
431
|
-
{
|
|
432
|
-
constant: true,
|
|
433
|
-
inputs: [],
|
|
434
|
-
name: "symbol",
|
|
435
|
-
outputs: [
|
|
436
|
-
{
|
|
437
|
-
name: "",
|
|
438
|
-
type: "string"
|
|
439
|
-
}
|
|
440
|
-
],
|
|
441
|
-
payable: false,
|
|
442
|
-
stateMutability: "view",
|
|
443
|
-
type: "function"
|
|
444
|
-
},
|
|
445
|
-
{
|
|
446
|
-
constant: false,
|
|
447
|
-
inputs: [
|
|
448
|
-
{
|
|
449
|
-
name: "_to",
|
|
450
|
-
type: "address"
|
|
451
|
-
},
|
|
452
|
-
{
|
|
453
|
-
name: "_value",
|
|
454
|
-
type: "uint256"
|
|
455
|
-
}
|
|
456
|
-
],
|
|
457
|
-
name: "transfer",
|
|
458
|
-
outputs: [
|
|
459
|
-
{
|
|
460
|
-
name: "success",
|
|
461
|
-
type: "bool"
|
|
462
|
-
}
|
|
463
|
-
],
|
|
464
|
-
payable: false,
|
|
465
|
-
stateMutability: "nonpayable",
|
|
466
|
-
type: "function"
|
|
467
|
-
},
|
|
468
|
-
{
|
|
469
|
-
constant: true,
|
|
470
|
-
inputs: [
|
|
471
|
-
{
|
|
472
|
-
name: "_owner",
|
|
473
|
-
type: "address"
|
|
474
|
-
},
|
|
475
|
-
{
|
|
476
|
-
name: "_spender",
|
|
477
|
-
type: "address"
|
|
478
|
-
}
|
|
479
|
-
],
|
|
480
|
-
name: "allowance",
|
|
481
|
-
outputs: [
|
|
482
|
-
{
|
|
483
|
-
name: "remaining",
|
|
484
|
-
type: "uint256"
|
|
485
|
-
}
|
|
486
|
-
],
|
|
487
|
-
payable: false,
|
|
488
|
-
stateMutability: "view",
|
|
489
|
-
type: "function"
|
|
490
|
-
},
|
|
491
|
-
{
|
|
492
|
-
inputs: [
|
|
493
|
-
{
|
|
494
|
-
name: "_tokenName",
|
|
495
|
-
type: "string"
|
|
496
|
-
},
|
|
497
|
-
{
|
|
498
|
-
name: "_tokenSymbol",
|
|
499
|
-
type: "string"
|
|
500
|
-
},
|
|
501
|
-
{
|
|
502
|
-
name: "_decimalUnits",
|
|
503
|
-
type: "uint8"
|
|
504
|
-
},
|
|
505
|
-
{
|
|
506
|
-
name: "_initialAmount",
|
|
507
|
-
type: "uint256"
|
|
508
|
-
}
|
|
509
|
-
],
|
|
510
|
-
payable: false,
|
|
511
|
-
stateMutability: "nonpayable",
|
|
512
|
-
type: "constructor"
|
|
513
|
-
},
|
|
514
|
-
{
|
|
515
|
-
anonymous: false,
|
|
516
|
-
inputs: [
|
|
517
|
-
{
|
|
518
|
-
indexed: true,
|
|
519
|
-
name: "from",
|
|
520
|
-
type: "address"
|
|
521
|
-
},
|
|
522
|
-
{
|
|
523
|
-
indexed: true,
|
|
524
|
-
name: "to",
|
|
525
|
-
type: "address"
|
|
526
|
-
},
|
|
527
|
-
{
|
|
528
|
-
indexed: false,
|
|
529
|
-
name: "value",
|
|
530
|
-
type: "uint256"
|
|
531
|
-
}
|
|
532
|
-
],
|
|
533
|
-
name: "Transfer",
|
|
534
|
-
type: "event"
|
|
535
|
-
},
|
|
536
|
-
{
|
|
537
|
-
anonymous: false,
|
|
538
|
-
inputs: [
|
|
539
|
-
{
|
|
540
|
-
indexed: true,
|
|
541
|
-
name: "owner",
|
|
542
|
-
type: "address"
|
|
543
|
-
},
|
|
544
|
-
{
|
|
545
|
-
indexed: true,
|
|
546
|
-
name: "spender",
|
|
547
|
-
type: "address"
|
|
548
|
-
},
|
|
549
|
-
{
|
|
550
|
-
indexed: false,
|
|
551
|
-
name: "value",
|
|
552
|
-
type: "uint256"
|
|
553
|
-
}
|
|
554
|
-
],
|
|
555
|
-
name: "Approval",
|
|
556
|
-
type: "event"
|
|
557
|
-
}
|
|
558
|
-
];
|
|
559
|
-
|
|
560
|
-
// src/config/networks.ts
|
|
561
|
-
var BSC_NETWORK = {
|
|
562
|
-
chainId: "0x38",
|
|
563
|
-
chainName: "BNB Smart Chain",
|
|
564
|
-
nativeCurrency: {
|
|
565
|
-
name: "BNB",
|
|
566
|
-
symbol: "BNB",
|
|
567
|
-
decimals: 18
|
|
568
|
-
},
|
|
569
|
-
rpcUrls: [
|
|
570
|
-
"https://bsc-dataseed.binance.org/",
|
|
571
|
-
"https://bsc-dataseed1.binance.org/",
|
|
572
|
-
"https://bsc-dataseed2.binance.org/"
|
|
573
|
-
],
|
|
574
|
-
blockExplorerUrls: ["https://bscscan.com"]
|
|
575
|
-
};
|
|
576
|
-
var BSC_TESTNET_NETWORK = {
|
|
577
|
-
chainId: "0x61",
|
|
578
|
-
chainName: "BNB Smart Chain Testnet",
|
|
579
|
-
nativeCurrency: {
|
|
580
|
-
name: "tBNB",
|
|
581
|
-
symbol: "tBNB",
|
|
582
|
-
decimals: 18
|
|
583
|
-
},
|
|
584
|
-
rpcUrls: [
|
|
585
|
-
"https://data-seed-prebsc-1-s1.bnbchain.org:8545/",
|
|
586
|
-
"https://data-seed-prebsc-2-s1.bnbchain.org:8545/",
|
|
587
|
-
"https://data-seed-prebsc-1-s2.bnbchain.org:8545/"
|
|
588
|
-
],
|
|
589
|
-
blockExplorerUrls: ["https://testnet.bscscan.com"]
|
|
590
|
-
};
|
|
591
|
-
|
|
592
|
-
// src/config/resolve-chain.ts
|
|
593
|
-
var USDT_CONTRACT_ADDRESSES = {
|
|
594
|
-
[BSC_NETWORK.chainId]: "0x55d398326f99059fF775485246999027B3197955",
|
|
595
|
-
[BSC_TESTNET_NETWORK.chainId]: "0x66E972502A34A625828C544a1914E8D8cc2A9dE5"
|
|
596
|
-
};
|
|
597
|
-
function resolveUsdtContractAddress(chainId) {
|
|
598
|
-
const address = USDT_CONTRACT_ADDRESSES[chainId];
|
|
599
|
-
if (!address) {
|
|
600
|
-
throw new Error(`[wallet-sdk] Unsupported chainId for USDT: ${chainId}`);
|
|
601
|
-
}
|
|
602
|
-
return address;
|
|
603
|
-
}
|
|
604
|
-
function resolveChainByMainnet(isMainnet) {
|
|
605
|
-
return isMainnet ? BSC_NETWORK : BSC_TESTNET_NETWORK;
|
|
606
|
-
}
|
|
607
|
-
function resolveUsdtByMainnet(isMainnet) {
|
|
608
|
-
return resolveUsdtContractAddress(resolveChainByMainnet(isMainnet).chainId);
|
|
609
|
-
}
|
|
610
|
-
function resolveChainConfig(chainId) {
|
|
611
|
-
if (chainId === BSC_NETWORK.chainId) {
|
|
612
|
-
return BSC_NETWORK;
|
|
613
|
-
}
|
|
614
|
-
if (chainId === BSC_TESTNET_NETWORK.chainId) {
|
|
615
|
-
return BSC_TESTNET_NETWORK;
|
|
616
|
-
}
|
|
617
|
-
throw new Error(`[wallet-sdk] Unsupported chainId: ${chainId}`);
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
// src/config/usdt.ts
|
|
621
|
-
var USDT_CONFIG = {
|
|
622
|
-
symbol: "USDT",
|
|
623
|
-
name: "Tether USD",
|
|
624
|
-
decimals: 18,
|
|
625
|
-
contractAbi: ERC20_ABI
|
|
626
|
-
};
|
|
627
|
-
var ERC20_DECIMALS = USDT_CONFIG.decimals;
|
|
628
|
-
|
|
629
|
-
// src/core/contract.ts
|
|
630
|
-
var ERC20_DECIMALS_ABI = ["function decimals() view returns (uint8)"];
|
|
631
|
-
async function hasDeployedContract(readProvider, address) {
|
|
632
|
-
const code = await readProvider.getCode(address);
|
|
633
|
-
return Boolean(code && code !== "0x");
|
|
634
|
-
}
|
|
635
|
-
async function readErc20Decimals(readProvider, tokenAddress, erc20Abi = ERC20_DECIMALS_ABI, fallback = ERC20_DECIMALS) {
|
|
636
|
-
if (!await hasDeployedContract(readProvider, tokenAddress)) {
|
|
637
|
-
throw new Error(`[wallet-sdk] Token contract not deployed: ${tokenAddress}`);
|
|
638
|
-
}
|
|
639
|
-
try {
|
|
640
|
-
const tokenContract = new Contract(tokenAddress, erc20Abi, readProvider);
|
|
641
|
-
const decimals = Number(await tokenContract.getFunction("decimals").staticCall());
|
|
642
|
-
return Number.isFinite(decimals) && decimals >= 0 ? decimals : fallback;
|
|
643
|
-
} catch {
|
|
644
|
-
return fallback;
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
// src/core/init.ts
|
|
649
|
-
var CONFIG_KEY = "__WALLET_SDK_CONFIG__";
|
|
650
|
-
function getStoredConfig() {
|
|
651
|
-
return globalThis[CONFIG_KEY] ?? null;
|
|
652
|
-
}
|
|
653
|
-
function storeConfig(config) {
|
|
654
|
-
globalThis[CONFIG_KEY] = config;
|
|
655
|
-
}
|
|
656
|
-
function buildConfig(options) {
|
|
657
|
-
const chain = resolveChainByMainnet(options.isMainnet);
|
|
658
|
-
return {
|
|
659
|
-
isMainnet: options.isMainnet,
|
|
660
|
-
chainId: chain.chainId,
|
|
661
|
-
chain,
|
|
662
|
-
contract: {
|
|
663
|
-
address: options.contract.address,
|
|
664
|
-
abi: options.contract.abi
|
|
665
|
-
},
|
|
666
|
-
usdt: {
|
|
667
|
-
address: resolveUsdtByMainnet(options.isMainnet),
|
|
668
|
-
abi: USDT_CONFIG.contractAbi,
|
|
669
|
-
symbol: USDT_CONFIG.symbol,
|
|
670
|
-
name: USDT_CONFIG.name,
|
|
671
|
-
decimals: USDT_CONFIG.decimals
|
|
672
|
-
}
|
|
673
|
-
};
|
|
674
|
-
}
|
|
675
|
-
function initWalletSdk(options) {
|
|
676
|
-
const config = buildConfig(options);
|
|
677
|
-
storeConfig(config);
|
|
678
|
-
return config;
|
|
679
|
-
}
|
|
680
|
-
function getWalletSdkConfig() {
|
|
681
|
-
const config = getStoredConfig();
|
|
682
|
-
if (!config) {
|
|
683
|
-
throw new Error("[wallet-sdk] initWalletSdk() must be called before using the library");
|
|
684
|
-
}
|
|
685
|
-
return config;
|
|
686
|
-
}
|
|
687
|
-
function isWalletSdkInitialized() {
|
|
688
|
-
return getStoredConfig() !== null;
|
|
689
|
-
}
|
|
690
|
-
function resetWalletSdkConfig() {
|
|
691
|
-
delete globalThis[CONFIG_KEY];
|
|
692
|
-
}
|
|
693
|
-
function createJsonRpcReadProvider(rpcUrl, chainIdHex, cache) {
|
|
694
|
-
if (cache?.current) return cache.current;
|
|
695
|
-
const provider = new JsonRpcProvider(rpcUrl, toChainIdDecimal(chainIdHex), {
|
|
696
|
-
staticNetwork: true
|
|
697
|
-
});
|
|
698
|
-
if (cache) {
|
|
699
|
-
cache.current = provider;
|
|
700
|
-
}
|
|
701
|
-
return provider;
|
|
702
|
-
}
|
|
703
|
-
function getReadProviderWithFallback(walletProvider, rpcConfig, fallbackCache) {
|
|
704
|
-
if (walletProvider) return walletProvider;
|
|
705
|
-
const rpcUrl = rpcConfig.rpcUrls[0];
|
|
706
|
-
if (!rpcUrl || !rpcConfig.chainId) {
|
|
707
|
-
throw new Error("RPC config is missing");
|
|
708
|
-
}
|
|
709
|
-
return createJsonRpcReadProvider(rpcUrl, rpcConfig.chainId, fallbackCache);
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
// src/core/contract-read.ts
|
|
713
|
-
var readProviderCache = { current: null };
|
|
714
|
-
var walletReadProvider = null;
|
|
715
|
-
function setWalletReadProvider(provider) {
|
|
716
|
-
walletReadProvider = provider;
|
|
717
|
-
}
|
|
718
|
-
function getConfiguredReadProvider() {
|
|
719
|
-
const { chain } = getWalletSdkConfig();
|
|
720
|
-
return getReadProviderWithFallback(walletReadProvider, chain, readProviderCache);
|
|
721
|
-
}
|
|
722
|
-
async function isContractDeployed(contractAddress) {
|
|
723
|
-
return hasDeployedContract(getConfiguredReadProvider(), contractAddress);
|
|
724
|
-
}
|
|
725
|
-
async function getContractDecimals(contractAddress, options) {
|
|
726
|
-
const readProvider = getConfiguredReadProvider();
|
|
727
|
-
if (!await hasDeployedContract(readProvider, contractAddress)) {
|
|
728
|
-
throw new Error(`[wallet-sdk] Contract not deployed: ${contractAddress}`);
|
|
729
|
-
}
|
|
730
|
-
const tokenContract = new Contract(contractAddress, options.abi, readProvider);
|
|
731
|
-
const decimals = await tokenContract.getFunction(options.method).staticCall();
|
|
732
|
-
return Number(decimals);
|
|
733
|
-
}
|
|
734
|
-
async function getContractPrice(contractAddress, options) {
|
|
735
|
-
const readProvider = getConfiguredReadProvider();
|
|
736
|
-
if (!await hasDeployedContract(readProvider, contractAddress)) {
|
|
737
|
-
throw new Error(`[wallet-sdk] Contract not deployed: ${contractAddress}`);
|
|
738
|
-
}
|
|
739
|
-
const tokenContract = new Contract(contractAddress, options.abi, readProvider);
|
|
740
|
-
const price = await tokenContract.getFunction(options.method).staticCall();
|
|
741
|
-
const decimals = await getContractDecimals(contractAddress, { abi: options.abi, method: "decimals" });
|
|
742
|
-
return formatUnits(price, decimals);
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
// src/core/network.ts
|
|
746
|
-
async function ensureTargetNetwork(options) {
|
|
747
|
-
const currentChainId = await options.getCurrentChainId();
|
|
748
|
-
if (currentChainId.toLowerCase() === options.targetChainId.toLowerCase()) return;
|
|
749
|
-
try {
|
|
750
|
-
await options.switchChain(options.targetChainId);
|
|
751
|
-
} catch (err) {
|
|
752
|
-
const error = err;
|
|
753
|
-
if (error?.code !== 4902 && error?.info?.error?.code !== 4902) {
|
|
754
|
-
throw err;
|
|
755
|
-
}
|
|
756
|
-
await options.addChain(options.chainParams);
|
|
757
|
-
await options.switchChain(options.targetChainId);
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
// src/wallet/common.ts
|
|
762
|
-
function bindBrowserProvider(eip1193, cache) {
|
|
763
|
-
const nextProvider = getSharedBrowserProvider(eip1193);
|
|
764
|
-
if (cache.value !== nextProvider) {
|
|
765
|
-
cache.value = nextProvider;
|
|
766
|
-
}
|
|
767
|
-
return nextProvider;
|
|
768
|
-
}
|
|
769
|
-
async function requestWallet(eip1193, method, params) {
|
|
770
|
-
return eip1193.request({
|
|
771
|
-
method,
|
|
772
|
-
...params === void 0 ? {} : { params }
|
|
773
|
-
});
|
|
774
|
-
}
|
|
775
|
-
async function connectWalletAccount(requestAccounts, getProvider, setSigner, markConnected) {
|
|
776
|
-
const accounts = await requestAccounts() || [];
|
|
777
|
-
if (!accounts.length) {
|
|
778
|
-
throw new Error("No accounts returned");
|
|
779
|
-
}
|
|
780
|
-
const sourceProvider = getProvider();
|
|
781
|
-
const nextSigner = await sourceProvider.getSigner();
|
|
782
|
-
const address = await nextSigner.getAddress();
|
|
783
|
-
setSigner(nextSigner);
|
|
784
|
-
markConnected();
|
|
785
|
-
return { address, signer: nextSigner };
|
|
786
|
-
}
|
|
787
|
-
async function syncWalletAccountAddress(getProvider, setSigner, markConnected, nextAddress) {
|
|
788
|
-
const sourceProvider = getProvider();
|
|
789
|
-
const nextSigner = nextAddress ? await sourceProvider.getSigner(nextAddress) : await sourceProvider.getSigner();
|
|
790
|
-
const address = nextAddress || await nextSigner.getAddress();
|
|
791
|
-
setSigner(nextSigner);
|
|
792
|
-
markConnected();
|
|
793
|
-
return { address, signer: nextSigner };
|
|
794
|
-
}
|
|
795
|
-
function clearWalletRuntime(cache) {
|
|
796
|
-
cache.provider.value = null;
|
|
797
|
-
cache.signer.value = null;
|
|
798
|
-
if (cache.selectedProvider) {
|
|
799
|
-
cache.selectedProvider.value = null;
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
// src/wallet/events.ts
|
|
804
|
-
var eventHandlers = {};
|
|
805
|
-
var providerBridges = /* @__PURE__ */ new WeakMap();
|
|
806
|
-
var walletEventProvider = null;
|
|
807
|
-
var boundProvider = null;
|
|
808
|
-
function hasRegisteredHandlers() {
|
|
809
|
-
return Object.values(eventHandlers).some((handlers) => handlers && handlers.size > 0);
|
|
810
|
-
}
|
|
811
|
-
function dispatch(event, payload) {
|
|
812
|
-
const handlers = eventHandlers[event];
|
|
813
|
-
if (!handlers) return;
|
|
814
|
-
for (const handler of handlers) {
|
|
815
|
-
void handler(payload);
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
function unbindProvider(provider) {
|
|
819
|
-
const bridgeHandlers = providerBridges.get(provider);
|
|
820
|
-
if (!bridgeHandlers) return;
|
|
821
|
-
for (const [event, handler] of Object.entries(bridgeHandlers)) {
|
|
822
|
-
provider.removeListener(event, handler);
|
|
823
|
-
}
|
|
824
|
-
providerBridges.delete(provider);
|
|
825
|
-
}
|
|
826
|
-
function syncProviderBinding() {
|
|
827
|
-
if (boundProvider) {
|
|
828
|
-
unbindProvider(boundProvider);
|
|
829
|
-
boundProvider = null;
|
|
830
|
-
}
|
|
831
|
-
if (!walletEventProvider || !hasRegisteredHandlers()) {
|
|
832
|
-
return;
|
|
833
|
-
}
|
|
834
|
-
const bridgeHandlers = {};
|
|
835
|
-
if (eventHandlers.accountsChanged?.size) {
|
|
836
|
-
bridgeHandlers.accountsChanged = (...args) => {
|
|
837
|
-
dispatch("accountsChanged", args[0] ?? []);
|
|
838
|
-
};
|
|
839
|
-
}
|
|
840
|
-
if (eventHandlers.chainChanged?.size) {
|
|
841
|
-
bridgeHandlers.chainChanged = (...args) => {
|
|
842
|
-
dispatch("chainChanged", String(args[0] ?? ""));
|
|
843
|
-
};
|
|
844
|
-
}
|
|
845
|
-
for (const [event, handler] of Object.entries(bridgeHandlers)) {
|
|
846
|
-
walletEventProvider.removeListener(event, handler);
|
|
847
|
-
walletEventProvider.on(event, handler);
|
|
848
|
-
}
|
|
849
|
-
providerBridges.set(walletEventProvider, bridgeHandlers);
|
|
850
|
-
boundProvider = walletEventProvider;
|
|
851
|
-
}
|
|
852
|
-
function setWalletEventProvider(provider) {
|
|
853
|
-
walletEventProvider = provider;
|
|
854
|
-
syncProviderBinding();
|
|
855
|
-
}
|
|
856
|
-
function getWalletEventProvider() {
|
|
857
|
-
if (!walletEventProvider) {
|
|
858
|
-
throw new Error("[wallet-sdk] Wallet event provider is not set");
|
|
859
|
-
}
|
|
860
|
-
return walletEventProvider;
|
|
861
|
-
}
|
|
862
|
-
function registerEvent(event, listener) {
|
|
863
|
-
assertBrowser("walletEvents.on");
|
|
864
|
-
if (!eventHandlers[event]) {
|
|
865
|
-
eventHandlers[event] = /* @__PURE__ */ new Set();
|
|
866
|
-
}
|
|
867
|
-
eventHandlers[event].add(listener);
|
|
868
|
-
syncProviderBinding();
|
|
869
|
-
}
|
|
870
|
-
function unregisterEvent(event, listener) {
|
|
871
|
-
if (!isBrowser) return;
|
|
872
|
-
if (listener) {
|
|
873
|
-
eventHandlers[event]?.delete(listener);
|
|
874
|
-
} else {
|
|
875
|
-
eventHandlers[event]?.clear();
|
|
876
|
-
}
|
|
877
|
-
syncProviderBinding();
|
|
878
|
-
}
|
|
879
|
-
function clearEvents() {
|
|
880
|
-
if (!isBrowser) return;
|
|
881
|
-
for (const event of Object.keys(eventHandlers)) {
|
|
882
|
-
eventHandlers[event]?.clear();
|
|
883
|
-
}
|
|
884
|
-
syncProviderBinding();
|
|
885
|
-
}
|
|
886
|
-
var WalletEventsEmitter = class {
|
|
887
|
-
on(event, listener) {
|
|
888
|
-
registerEvent(event, listener);
|
|
889
|
-
}
|
|
890
|
-
off(event, listener) {
|
|
891
|
-
unregisterEvent(event, listener);
|
|
892
|
-
}
|
|
893
|
-
clear() {
|
|
894
|
-
clearEvents();
|
|
895
|
-
}
|
|
896
|
-
};
|
|
897
|
-
var walletEvents = new WalletEventsEmitter();
|
|
898
|
-
|
|
899
326
|
// src/wallet/detection.ts
|
|
900
327
|
function isEthereumProvider() {
|
|
901
328
|
if (!isBrowser) return false;
|
|
@@ -915,7 +342,7 @@ function isInjectedProvider() {
|
|
|
915
342
|
}
|
|
916
343
|
function isTronLinkProvider() {
|
|
917
344
|
if (!isBrowser) return false;
|
|
918
|
-
return
|
|
345
|
+
return hasTronLinkInjectedProvider() || hasTronLinkEip6963Provider();
|
|
919
346
|
}
|
|
920
347
|
|
|
921
|
-
export {
|
|
348
|
+
export { Wallet6963Name, Wallet6963Rdns, discoverWalletProviders, findCoinbaseEip6963Provider, findDiscoveredProvider, findMetaMaskEip6963Provider, findTokenPocketEip6963Provider, findTronLinkEip6963Provider, getAggregatedInjectedProvider, getInjectedEthereumProviders, hasAggregatedInjectedProvider, hasCoinbaseEip6963Provider, hasCoinbaseInjectedProvider, hasMetaMaskEip6963Provider, hasMetaMaskInjectedProvider, hasRecoverableAggregatorProvider, hasTokenPocketEip6963Provider, hasTokenPocketInjectedProvider, hasTronLinkEip6963Provider, hasTronLinkInjectedProvider, isCoinbaseProvider, isEthereumProvider, isInjectedProvider, isTokenPocketProvider, isTronLinkProvider, rememberAggregatorProvider, resolveCoinbaseInjectedProvider, resolveMetaMaskInjectedProvider, resolveTokenPocketInjectedProvider, resolveTronLinkInjectedProvider };
|