@meshconnect/uwc-injected-connector 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/eip6963-discovery.d.ts +47 -0
- package/dist/eip6963-discovery.d.ts.map +1 -0
- package/dist/eip6963-discovery.js +58 -0
- package/dist/eip6963-discovery.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/injected-connector.d.ts +40 -0
- package/dist/injected-connector.d.ts.map +1 -0
- package/dist/injected-connector.js +183 -0
- package/dist/injected-connector.js.map +1 -0
- package/dist/injected-connector.old.d.ts +44 -0
- package/dist/injected-connector.old.d.ts.map +1 -0
- package/dist/injected-connector.old.js +491 -0
- package/dist/injected-connector.old.js.map +1 -0
- package/dist/providers/evm-provider.d.ts +18 -0
- package/dist/providers/evm-provider.d.ts.map +1 -0
- package/dist/providers/evm-provider.js +86 -0
- package/dist/providers/evm-provider.js.map +1 -0
- package/dist/providers/solana-provider.d.ts +22 -0
- package/dist/providers/solana-provider.d.ts.map +1 -0
- package/dist/providers/solana-provider.js +137 -0
- package/dist/providers/solana-provider.js.map +1 -0
- package/dist/services/connection-manager.d.ts +56 -0
- package/dist/services/connection-manager.d.ts.map +1 -0
- package/dist/services/connection-manager.js +303 -0
- package/dist/services/connection-manager.js.map +1 -0
- package/dist/services/ethereum-transaction-service.d.ts +28 -0
- package/dist/services/ethereum-transaction-service.d.ts.map +1 -0
- package/dist/services/ethereum-transaction-service.js +143 -0
- package/dist/services/ethereum-transaction-service.js.map +1 -0
- package/dist/services/ethereum-wallet-service.d.ts +55 -0
- package/dist/services/ethereum-wallet-service.d.ts.map +1 -0
- package/dist/services/ethereum-wallet-service.js +133 -0
- package/dist/services/ethereum-wallet-service.js.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/signature-service.d.ts +16 -0
- package/dist/services/signature-service.d.ts.map +1 -0
- package/dist/services/signature-service.js +63 -0
- package/dist/services/signature-service.js.map +1 -0
- package/dist/services/solana-transaction-service.d.ts +14 -0
- package/dist/services/solana-transaction-service.d.ts.map +1 -0
- package/dist/services/solana-transaction-service.js +48 -0
- package/dist/services/solana-transaction-service.js.map +1 -0
- package/dist/services/solana-wallet-service.d.ts +55 -0
- package/dist/services/solana-wallet-service.d.ts.map +1 -0
- package/dist/services/solana-wallet-service.js +129 -0
- package/dist/services/solana-wallet-service.js.map +1 -0
- package/dist/services/storage-service.d.ts +19 -0
- package/dist/services/storage-service.d.ts.map +1 -0
- package/dist/services/storage-service.js +41 -0
- package/dist/services/storage-service.js.map +1 -0
- package/dist/services/transaction-service.d.ts +28 -0
- package/dist/services/transaction-service.d.ts.map +1 -0
- package/dist/services/transaction-service.js +67 -0
- package/dist/services/transaction-service.js.map +1 -0
- package/dist/utils/error-utils.d.ts +6 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +55 -0
- package/dist/utils/error-utils.js.map +1 -0
- package/dist/wallet-standard-discovery.d.ts +24 -0
- package/dist/wallet-standard-discovery.d.ts.map +1 -0
- package/dist/wallet-standard-discovery.js +74 -0
- package/dist/wallet-standard-discovery.js.map +1 -0
- package/package.json +42 -0
- package/src/eip6963-discovery.ts +103 -0
- package/src/index.ts +7 -0
- package/src/injected-connector.ts +265 -0
- package/src/services/connection-manager.ts +437 -0
- package/src/services/ethereum-transaction-service.ts +196 -0
- package/src/services/ethereum-wallet-service.ts +161 -0
- package/src/services/index.ts +7 -0
- package/src/services/signature-service.ts +84 -0
- package/src/services/solana-transaction-service.ts +68 -0
- package/src/services/solana-wallet-service.ts +161 -0
- package/src/services/storage-service.ts +44 -0
- package/src/services/transaction-service.ts +106 -0
- package/src/utils/error-utils.ts +62 -0
- package/src/wallet-standard-discovery.ts +102 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { getSolanaWallets } from '../wallet-standard-discovery';
|
|
2
|
+
import { StorageService } from './storage-service';
|
|
3
|
+
/**
|
|
4
|
+
* Service for managing Solana wallet connections
|
|
5
|
+
*/
|
|
6
|
+
export class SolanaWalletService {
|
|
7
|
+
detectedWallets = [];
|
|
8
|
+
connectedAdapter = null;
|
|
9
|
+
account = null;
|
|
10
|
+
storageService;
|
|
11
|
+
constructor(storageService) {
|
|
12
|
+
this.storageService = storageService;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Initialize wallet discovery
|
|
16
|
+
*/
|
|
17
|
+
initializeDiscovery() {
|
|
18
|
+
this.detectedWallets = getSolanaWallets();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get detected wallets
|
|
22
|
+
*/
|
|
23
|
+
getDetectedWallets() {
|
|
24
|
+
return this.detectedWallets;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Find wallet by UUID
|
|
28
|
+
*/
|
|
29
|
+
findWalletByUuid(uuid) {
|
|
30
|
+
return this.detectedWallets.find(w => w.uuid === uuid);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a Solana wallet is already connected
|
|
34
|
+
*/
|
|
35
|
+
async checkExistingConnection(adapter, walletUuid) {
|
|
36
|
+
try {
|
|
37
|
+
// Check if adapter has a publicKey (means it's connected)
|
|
38
|
+
if (adapter.publicKey) {
|
|
39
|
+
return adapter.publicKey.toBase58();
|
|
40
|
+
}
|
|
41
|
+
// If this wallet was previously connected, try to reconnect
|
|
42
|
+
// This should work without prompting for wallets that support it
|
|
43
|
+
if (this.storageService.wasSolanaWalletPreviouslyConnected(walletUuid)) {
|
|
44
|
+
if ('connecting' in adapter &&
|
|
45
|
+
!adapter.connecting &&
|
|
46
|
+
'connect' in adapter) {
|
|
47
|
+
try {
|
|
48
|
+
// Type assertion needed because TypeScript can't narrow the type properly
|
|
49
|
+
await adapter.connect();
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
|
+
const publicKey = adapter.publicKey;
|
|
52
|
+
if (publicKey && 'toBase58' in publicKey) {
|
|
53
|
+
return publicKey.toBase58();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Silent fail - wallet requires user interaction or doesn't support silent reconnect
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Connect to wallet
|
|
69
|
+
*/
|
|
70
|
+
async connect(adapter, walletUuid) {
|
|
71
|
+
// Connect to the Solana wallet
|
|
72
|
+
await adapter.connect();
|
|
73
|
+
if (!adapter.publicKey) {
|
|
74
|
+
throw new Error('No public key returned from wallet');
|
|
75
|
+
}
|
|
76
|
+
const address = adapter.publicKey.toBase58();
|
|
77
|
+
this.connectedAdapter = adapter;
|
|
78
|
+
this.account = address;
|
|
79
|
+
// Store this wallet as connected
|
|
80
|
+
this.storageService.storeSolanaWalletUUID(walletUuid);
|
|
81
|
+
return address;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Build available addresses for all supported networks
|
|
85
|
+
*/
|
|
86
|
+
buildAvailableAddresses(supportedNetworkIds, address) {
|
|
87
|
+
const addresses = [];
|
|
88
|
+
supportedNetworkIds.forEach(networkId => {
|
|
89
|
+
if (networkId.startsWith('solana:')) {
|
|
90
|
+
addresses.push({
|
|
91
|
+
address,
|
|
92
|
+
networkId: networkId
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return addresses;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Set connection state
|
|
100
|
+
*/
|
|
101
|
+
setConnectionState(adapter, account, walletUuid) {
|
|
102
|
+
this.connectedAdapter = adapter;
|
|
103
|
+
this.account = account;
|
|
104
|
+
// Store wallet UUID if provided and connected
|
|
105
|
+
if (adapter && account && walletUuid) {
|
|
106
|
+
this.storageService.storeSolanaWalletUUID(walletUuid);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get current account
|
|
111
|
+
*/
|
|
112
|
+
getAccount() {
|
|
113
|
+
return this.account;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get connected adapter
|
|
117
|
+
*/
|
|
118
|
+
getConnectedAdapter() {
|
|
119
|
+
return this.connectedAdapter;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Disconnect (clear state only, don't actually disconnect from wallet)
|
|
123
|
+
*/
|
|
124
|
+
disconnect() {
|
|
125
|
+
this.connectedAdapter = null;
|
|
126
|
+
this.account = null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=solana-wallet-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-wallet-service.js","sourceRoot":"","sources":["../../src/services/solana-wallet-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for managing localStorage operations for wallet connections
|
|
3
|
+
*/
|
|
4
|
+
export declare class StorageService {
|
|
5
|
+
private readonly STORAGE_KEY_SOLANA_WALLETS;
|
|
6
|
+
/**
|
|
7
|
+
* Get previously connected Solana wallet UUIDs from localStorage
|
|
8
|
+
*/
|
|
9
|
+
getStoredSolanaWalletUUIDs(): string[];
|
|
10
|
+
/**
|
|
11
|
+
* Store a Solana wallet UUID as connected in localStorage
|
|
12
|
+
*/
|
|
13
|
+
storeSolanaWalletUUID(uuid: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a Solana wallet UUID was previously connected
|
|
16
|
+
*/
|
|
17
|
+
wasSolanaWalletPreviouslyConnected(uuid: string): boolean;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=storage-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-service.d.ts","sourceRoot":"","sources":["../../src/services/storage-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAiC;IAE5E;;OAEG;IACH,0BAA0B,IAAI,MAAM,EAAE;IAStC;;OAEG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAezC;;OAEG;IACH,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAI1D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for managing localStorage operations for wallet connections
|
|
3
|
+
*/
|
|
4
|
+
export class StorageService {
|
|
5
|
+
STORAGE_KEY_SOLANA_WALLETS = 'uwc_connected_solana_wallets';
|
|
6
|
+
/**
|
|
7
|
+
* Get previously connected Solana wallet UUIDs from localStorage
|
|
8
|
+
*/
|
|
9
|
+
getStoredSolanaWalletUUIDs() {
|
|
10
|
+
try {
|
|
11
|
+
const stored = localStorage.getItem(this.STORAGE_KEY_SOLANA_WALLETS);
|
|
12
|
+
return stored ? JSON.parse(stored) : [];
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Store a Solana wallet UUID as connected in localStorage
|
|
20
|
+
*/
|
|
21
|
+
storeSolanaWalletUUID(uuid) {
|
|
22
|
+
try {
|
|
23
|
+
const existing = this.getStoredSolanaWalletUUIDs();
|
|
24
|
+
if (!existing.includes(uuid)) {
|
|
25
|
+
existing.push(uuid);
|
|
26
|
+
localStorage.setItem(this.STORAGE_KEY_SOLANA_WALLETS, JSON.stringify(existing));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Silently fail if localStorage is not available
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if a Solana wallet UUID was previously connected
|
|
35
|
+
*/
|
|
36
|
+
wasSolanaWalletPreviouslyConnected(uuid) {
|
|
37
|
+
const storedUUIDs = this.getStoredSolanaWalletUUIDs();
|
|
38
|
+
return storedUUIDs.includes(uuid);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=storage-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-service.js","sourceRoot":"","sources":["../../src/services/storage-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,cAAc;IACR,0BAA0B,GAAG,8BAA8B,CAAA;IAE5E;;OAEG;IACH,0BAA0B;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;YACpE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,IAAY;QAChC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAA;YAClD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACnB,YAAY,CAAC,OAAO,CAClB,IAAI,CAAC,0BAA0B,EAC/B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CACzB,CAAA;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kCAAkC,CAAC,IAAY;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAA;QACrD,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EthereumProvider } from '../eip6963-discovery';
|
|
2
|
+
import type { WalletAdapter } from '@solana/wallet-adapter-base';
|
|
3
|
+
import type { TransactionRequest, TransactionResult, SolanaNativeTransferRequest, NetworkRpcMap } from '@meshconnect/uwc-types';
|
|
4
|
+
/**
|
|
5
|
+
* Service for handling transaction operations across different wallet types
|
|
6
|
+
*/
|
|
7
|
+
export declare class TransactionService {
|
|
8
|
+
private ethereumService;
|
|
9
|
+
private solanaService;
|
|
10
|
+
constructor(networkRpcMap?: NetworkRpcMap);
|
|
11
|
+
/**
|
|
12
|
+
* Send a transaction for Ethereum
|
|
13
|
+
*/
|
|
14
|
+
sendEthereumTransaction(request: TransactionRequest, provider: EthereumProvider): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Send a transaction for Solana
|
|
17
|
+
*/
|
|
18
|
+
sendSolanaTransaction(request: SolanaNativeTransferRequest, adapter: WalletAdapter): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Send a transaction based on namespace
|
|
21
|
+
*/
|
|
22
|
+
sendTransaction(request: TransactionRequest, namespace: 'eip155' | 'solana', provider: EthereumProvider | WalletAdapter): Promise<TransactionResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Get EVM wallet capabilities
|
|
25
|
+
*/
|
|
26
|
+
getEVMCapabilities(provider: EthereumProvider, from: string, chainId: string): Promise<import("@meshconnect/uwc-types").EVMCapabilities>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=transaction-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-service.d.ts","sourceRoot":"","sources":["../../src/services/transaction-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAIjB,2BAA2B,EAC3B,aAAa,EACd,MAAM,wBAAwB,CAAA;AAK/B;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,aAAa,CAA0B;gBAEnC,aAAa,GAAE,aAAkB;IAK7C;;OAEG;IACG,uBAAuB,CAC3B,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC;IA6BlB;;OAEG;IACG,qBAAqB,CACzB,OAAO,EAAE,2BAA2B,EACpC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC;IAIlB;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,QAAQ,GAAG,QAAQ,EAC9B,QAAQ,EAAE,gBAAgB,GAAG,aAAa,GACzC,OAAO,CAAC,iBAAiB,CAAC;IAgB7B;;OAEG;IACG,kBAAkB,CACtB,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM;CAIlB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { EthereumTransactionService } from './ethereum-transaction-service';
|
|
2
|
+
import { SolanaTransactionService } from './solana-transaction-service';
|
|
3
|
+
import { parseError } from '../utils/error-utils';
|
|
4
|
+
/**
|
|
5
|
+
* Service for handling transaction operations across different wallet types
|
|
6
|
+
*/
|
|
7
|
+
export class TransactionService {
|
|
8
|
+
ethereumService;
|
|
9
|
+
solanaService;
|
|
10
|
+
constructor(networkRpcMap = {}) {
|
|
11
|
+
this.ethereumService = new EthereumTransactionService();
|
|
12
|
+
this.solanaService = new SolanaTransactionService(networkRpcMap);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Send a transaction for Ethereum
|
|
16
|
+
*/
|
|
17
|
+
async sendEthereumTransaction(request, provider) {
|
|
18
|
+
try {
|
|
19
|
+
// Handle different types of EVM transactions
|
|
20
|
+
if ('contractAddress' in request && 'abi' in request) {
|
|
21
|
+
// Contract call
|
|
22
|
+
return await this.ethereumService.sendContractCall(provider, request);
|
|
23
|
+
}
|
|
24
|
+
else if ('calls' in request) {
|
|
25
|
+
// Batch transaction
|
|
26
|
+
return await this.ethereumService.sendBatch(provider, request);
|
|
27
|
+
}
|
|
28
|
+
else if ('amount' in request && typeof request.amount === 'bigint') {
|
|
29
|
+
// Native transfer
|
|
30
|
+
return await this.ethereumService.sendNativeTransfer(provider, request);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
throw new Error('Invalid transaction request type');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
parseError(error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Send a transaction for Solana
|
|
42
|
+
*/
|
|
43
|
+
async sendSolanaTransaction(request, adapter) {
|
|
44
|
+
return await this.solanaService.sendNativeTransfer(adapter, request);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Send a transaction based on namespace
|
|
48
|
+
*/
|
|
49
|
+
async sendTransaction(request, namespace, provider) {
|
|
50
|
+
if (namespace === 'eip155') {
|
|
51
|
+
return await this.sendEthereumTransaction(request, provider);
|
|
52
|
+
}
|
|
53
|
+
else if (namespace === 'solana') {
|
|
54
|
+
return await this.sendSolanaTransaction(request, provider);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
throw parseError(new Error(`Unsupported namespace: ${namespace}`));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get EVM wallet capabilities
|
|
62
|
+
*/
|
|
63
|
+
async getEVMCapabilities(provider, from, chainId) {
|
|
64
|
+
return await this.ethereumService.getCapabilities(provider, from, chainId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=transaction-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-service.js","sourceRoot":"","sources":["../../src/services/transaction-service.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACrB,eAAe,CAA4B;IAC3C,aAAa,CAA0B;IAE/C,YAAY,gBAA+B,EAAE;QAC3C,IAAI,CAAC,eAAe,GAAG,IAAI,0BAA0B,EAAE,CAAA;QACvD,IAAI,CAAC,aAAa,GAAG,IAAI,wBAAwB,CAAC,aAAa,CAAC,CAAA;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB,CAC3B,OAA2B,EAC3B,QAA0B;QAE1B,IAAI,CAAC;YACH,6CAA6C;YAC7C,IAAI,iBAAiB,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;gBACrD,gBAAgB;gBAChB,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAChD,QAAQ,EACR,OAAiC,CAClC,CAAA;YACH,CAAC;iBAAM,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBAC9B,oBAAoB;gBACpB,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CACzC,QAAQ,EACR,OAAqC,CACtC,CAAA;YACH,CAAC;iBAAM,IAAI,QAAQ,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACrE,kBAAkB;gBAClB,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAClD,QAAQ,EACR,OAAmC,CACpC,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CACzB,OAAoC,EACpC,OAAsB;QAEtB,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACnB,OAA2B,EAC3B,SAA8B,EAC9B,QAA0C;QAE1C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,MAAM,IAAI,CAAC,uBAAuB,CACvC,OAAO,EACP,QAA4B,CAC7B,CAAA;QACH,CAAC;aAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,MAAM,IAAI,CAAC,qBAAqB,CACrC,OAAsC,EACtC,QAAyB,CAC1B,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,CAAC,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,QAA0B,EAC1B,IAAY,EACZ,OAAe;QAEf,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAC5E,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-utils.d.ts","sourceRoot":"","sources":["../../src/utils/error-utils.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAsDhD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { WalletConnectorError } from '@meshconnect/uwc-types';
|
|
2
|
+
/**
|
|
3
|
+
* Parse an error and throw a WalletConnectorError
|
|
4
|
+
* Detects if the error is a user rejection or an unknown error
|
|
5
|
+
*/
|
|
6
|
+
export function parseError(error) {
|
|
7
|
+
let message;
|
|
8
|
+
let isRejected = false;
|
|
9
|
+
// Handle different error formats
|
|
10
|
+
if (error && typeof error === 'object') {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
const errorObj = error;
|
|
13
|
+
// Check for EIP-1193 error code
|
|
14
|
+
if (errorObj.code === 4001 || errorObj.code === 'ACTION_REJECTED') {
|
|
15
|
+
isRejected = true;
|
|
16
|
+
}
|
|
17
|
+
// Extract message
|
|
18
|
+
if (errorObj.message) {
|
|
19
|
+
message = errorObj.message;
|
|
20
|
+
}
|
|
21
|
+
else if (errorObj.error?.message) {
|
|
22
|
+
message = errorObj.error.message;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
message = String(error);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
message = String(error);
|
|
30
|
+
}
|
|
31
|
+
// If not already marked as rejected, check message patterns
|
|
32
|
+
if (!isRejected) {
|
|
33
|
+
const rejectionPatterns = [
|
|
34
|
+
'user rejected',
|
|
35
|
+
'user denied',
|
|
36
|
+
'user cancelled',
|
|
37
|
+
'user canceled',
|
|
38
|
+
'rejected by user',
|
|
39
|
+
'denied by user',
|
|
40
|
+
'cancelled by user',
|
|
41
|
+
'canceled by user',
|
|
42
|
+
'user disapproved',
|
|
43
|
+
'user declined',
|
|
44
|
+
'action_rejected'
|
|
45
|
+
];
|
|
46
|
+
const lowerMessage = message.toLowerCase();
|
|
47
|
+
isRejected = rejectionPatterns.some(pattern => lowerMessage.includes(pattern.toLowerCase()));
|
|
48
|
+
}
|
|
49
|
+
const walletError = {
|
|
50
|
+
type: isRejected ? 'rejected' : 'unknown',
|
|
51
|
+
message
|
|
52
|
+
};
|
|
53
|
+
throw new WalletConnectorError(walletError);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=error-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-utils.js","sourceRoot":"","sources":["../../src/utils/error-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,OAAe,CAAA;IACnB,IAAI,UAAU,GAAG,KAAK,CAAA;IAEtB,iCAAiC;IACjC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,KAAY,CAAA;QAE7B,gCAAgC;QAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAClE,UAAU,GAAG,IAAI,CAAA;QACnB,CAAC;QAED,kBAAkB;QAClB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC5B,CAAC;aAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YACnC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,iBAAiB,GAAG;YACxB,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,eAAe;YACf,kBAAkB;YAClB,gBAAgB;YAChB,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;YAClB,eAAe;YACf,iBAAiB;SAClB,CAAA;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAC1C,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC5C,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAC7C,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAgB;QAC/B,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACzC,OAAO;KACR,CAAA;IAED,MAAM,IAAI,oBAAoB,CAAC,WAAW,CAAC,CAAA;AAC7C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Standard Discovery for Solana Wallets
|
|
3
|
+
*
|
|
4
|
+
* Simple implementation to get Solana wallets using the Wallet Standard API
|
|
5
|
+
*/
|
|
6
|
+
import type { Wallet } from '@wallet-standard/base';
|
|
7
|
+
import type { WalletAdapter } from '@solana/wallet-adapter-base';
|
|
8
|
+
export interface WalletStandardInfo {
|
|
9
|
+
uuid: string;
|
|
10
|
+
name: string;
|
|
11
|
+
chains: string[];
|
|
12
|
+
features: string[];
|
|
13
|
+
adapter: WalletAdapter | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface SolanaWalletWithAdapter {
|
|
16
|
+
info: WalletStandardInfo;
|
|
17
|
+
wallet: Wallet;
|
|
18
|
+
adapter?: WalletAdapter;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Gets all available Solana wallets using Wallet Standard
|
|
22
|
+
*/
|
|
23
|
+
export declare function getSolanaWallets(): WalletStandardInfo[];
|
|
24
|
+
//# sourceMappingURL=wallet-standard-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-standard-discovery.d.ts","sourceRoot":"","sources":["../src/wallet-standard-discovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAIhE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,OAAO,EAAE,aAAa,GAAG,SAAS,CAAA;CACnC;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,kBAAkB,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,kBAAkB,EAAE,CAqDvD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Standard Discovery for Solana Wallets
|
|
3
|
+
*
|
|
4
|
+
* Simple implementation to get Solana wallets using the Wallet Standard API
|
|
5
|
+
*/
|
|
6
|
+
import { getWallets } from '@wallet-standard/app';
|
|
7
|
+
import { isWalletAdapterCompatibleStandardWallet } from '@solana/wallet-adapter-base';
|
|
8
|
+
import { StandardWalletAdapter } from '@solana/wallet-standard-wallet-adapter-base';
|
|
9
|
+
import { CoinbaseWalletAdapter } from '@solana/wallet-adapter-wallets';
|
|
10
|
+
/**
|
|
11
|
+
* Gets all available Solana wallets using Wallet Standard
|
|
12
|
+
*/
|
|
13
|
+
export function getSolanaWallets() {
|
|
14
|
+
const { get } = getWallets();
|
|
15
|
+
const wallets = get();
|
|
16
|
+
const solanaWallets = [];
|
|
17
|
+
const walletNames = new Set();
|
|
18
|
+
// First, get wallets from Wallet Standard
|
|
19
|
+
for (const wallet of wallets) {
|
|
20
|
+
// Check if this is a Solana wallet
|
|
21
|
+
if (isSolanaWallet(wallet)) {
|
|
22
|
+
let adapter;
|
|
23
|
+
if (isWalletAdapterCompatibleStandardWallet(wallet)) {
|
|
24
|
+
adapter = new StandardWalletAdapter({ wallet });
|
|
25
|
+
}
|
|
26
|
+
solanaWallets.push({
|
|
27
|
+
uuid: generateWalletId(wallet),
|
|
28
|
+
name: wallet.name,
|
|
29
|
+
chains: (wallet.chains || []),
|
|
30
|
+
features: Object.keys(wallet.features),
|
|
31
|
+
adapter: adapter
|
|
32
|
+
});
|
|
33
|
+
walletNames.add(wallet.name);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Initialize traditional wallet adapters - Only import CBW for now, as it's not using Wallet Standard
|
|
37
|
+
const walletAdapters = [new CoinbaseWalletAdapter()];
|
|
38
|
+
// Add traditional wallet adapters (but skip duplicates)
|
|
39
|
+
for (const adapter of walletAdapters) {
|
|
40
|
+
if (walletNames.has(adapter.name)) {
|
|
41
|
+
// Skipping duplicate wallet already detected via Wallet Standard
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const readyState = adapter.readyState;
|
|
45
|
+
const isDetected = readyState === 'Installed' || readyState === 'Loadable';
|
|
46
|
+
// Only add if installed
|
|
47
|
+
if (isDetected) {
|
|
48
|
+
solanaWallets.push({
|
|
49
|
+
uuid: `${adapter.name}-traditional`.toLowerCase().replace(/\s+/g, '-'),
|
|
50
|
+
name: adapter.name,
|
|
51
|
+
chains: ['solana:mainnet'],
|
|
52
|
+
features: [],
|
|
53
|
+
adapter: adapter
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return solanaWallets;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if a wallet supports Solana
|
|
61
|
+
*/
|
|
62
|
+
function isSolanaWallet(wallet) {
|
|
63
|
+
const chains = wallet.chains || [];
|
|
64
|
+
const hasSolanaChain = chains.some(chain => chain.startsWith('solana:'));
|
|
65
|
+
return hasSolanaChain;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Generate a unique ID for a wallet
|
|
69
|
+
*/
|
|
70
|
+
function generateWalletId(wallet) {
|
|
71
|
+
const chain = wallet.chains?.[0] || 'unknown';
|
|
72
|
+
return `${wallet.name}-${chain}`.toLowerCase().replace(/\s+/g, '-');
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=wallet-standard-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-standard-discovery.js","sourceRoot":"","sources":["../src/wallet-standard-discovery.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@meshconnect/uwc-injected-connector",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Injected connector for Universal Wallet Connector",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"src"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@solana/wallet-adapter-base": "^0.9.23",
|
|
20
|
+
"@solana/wallet-adapter-wallets": "^0.19.37",
|
|
21
|
+
"@solana/wallet-standard-wallet-adapter-base": "^1.1.2",
|
|
22
|
+
"@solana/web3.js": "^1.98.4",
|
|
23
|
+
"@wallet-standard/app": "^1.1.0",
|
|
24
|
+
"@wallet-standard/base": "^1.1.0",
|
|
25
|
+
"bs58": "^6.0.0",
|
|
26
|
+
"ethers": "^6.15.0",
|
|
27
|
+
"@meshconnect/uwc-types": "0.2.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"typescript": "^5.9.2"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc",
|
|
37
|
+
"dev": "tsc --watch",
|
|
38
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
39
|
+
"lint:fix": "eslint src --ext .ts,.tsx --fix",
|
|
40
|
+
"type-check": "tsc --noEmit"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EIP-6963: Multi Injected Provider Discovery
|
|
3
|
+
* https://eips.ethereum.org/EIPS/eip-6963
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface EthereumProvider {
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
request: (args: { method: string; params?: unknown[] }) => Promise<any>
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
on?: (event: string, handler: (...args: any[]) => void) => void
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
removeListener?: (event: string, handler: (...args: any[]) => void) => void
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface EIP6963ProviderInfo {
|
|
16
|
+
uuid: string
|
|
17
|
+
name: string
|
|
18
|
+
icon: string
|
|
19
|
+
rdns: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface EIP6963ProviderDetail {
|
|
23
|
+
info: EIP6963ProviderInfo
|
|
24
|
+
provider: EthereumProvider
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface EIP6963AnnounceProviderEvent extends CustomEvent {
|
|
28
|
+
type: 'eip6963:announceProvider'
|
|
29
|
+
detail: EIP6963ProviderDetail
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface EIP6963RequestProviderEvent extends Event {
|
|
33
|
+
type: 'eip6963:requestProvider'
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface DetectedWallet {
|
|
37
|
+
uuid: string
|
|
38
|
+
name: string
|
|
39
|
+
icon: string
|
|
40
|
+
rdns: string
|
|
41
|
+
provider: EthereumProvider
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Discovers wallets using EIP-6963 protocol
|
|
46
|
+
* @returns Promise that resolves to an array of detected wallets
|
|
47
|
+
*/
|
|
48
|
+
export async function discoverWallets(): Promise<DetectedWallet[]> {
|
|
49
|
+
// Skip discovery in non-browser environments
|
|
50
|
+
if (typeof window === 'undefined') {
|
|
51
|
+
return []
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return new Promise(resolve => {
|
|
55
|
+
const detectedWallets: DetectedWallet[] = []
|
|
56
|
+
const timeout = 1000 // Wait up to 1 second for wallets to announce
|
|
57
|
+
|
|
58
|
+
// Set up listener for wallet announcements
|
|
59
|
+
const handleAnnouncement = (event: Event) => {
|
|
60
|
+
const announcementEvent = event as EIP6963AnnounceProviderEvent
|
|
61
|
+
const { info, provider } = announcementEvent.detail
|
|
62
|
+
|
|
63
|
+
// Check if wallet is already detected (by uuid)
|
|
64
|
+
const existingIndex = detectedWallets.findIndex(w => w.uuid === info.uuid)
|
|
65
|
+
|
|
66
|
+
if (existingIndex === -1) {
|
|
67
|
+
detectedWallets.push({
|
|
68
|
+
uuid: info.uuid,
|
|
69
|
+
name: info.name,
|
|
70
|
+
icon: info.icon,
|
|
71
|
+
rdns: info.rdns,
|
|
72
|
+
provider
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Listen for wallet announcements
|
|
78
|
+
window.addEventListener('eip6963:announceProvider', handleAnnouncement)
|
|
79
|
+
|
|
80
|
+
// Request wallets to announce themselves
|
|
81
|
+
window.dispatchEvent(new Event('eip6963:requestProvider'))
|
|
82
|
+
|
|
83
|
+
// Clean up and resolve after timeout
|
|
84
|
+
setTimeout(() => {
|
|
85
|
+
window.removeEventListener('eip6963:announceProvider', handleAnnouncement)
|
|
86
|
+
resolve(detectedWallets)
|
|
87
|
+
}, timeout)
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Gets available wallets by discovering them via EIP-6963
|
|
93
|
+
* This function can be called multiple times to refresh the list
|
|
94
|
+
*/
|
|
95
|
+
export async function getAvailableWallets(): Promise<DetectedWallet[]> {
|
|
96
|
+
try {
|
|
97
|
+
const wallets = await discoverWallets()
|
|
98
|
+
return wallets
|
|
99
|
+
} catch {
|
|
100
|
+
// Return empty array if discovery fails
|
|
101
|
+
return []
|
|
102
|
+
}
|
|
103
|
+
}
|
package/src/index.ts
ADDED