@meshconnect/uwc-injected-connector 0.2.13 → 0.3.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 +15 -1
- package/dist/eip6963-discovery.d.ts.map +1 -1
- package/dist/eip6963-discovery.js +35 -3
- package/dist/eip6963-discovery.js.map +1 -1
- package/dist/injected-connector.d.ts +3 -3
- package/dist/injected-connector.d.ts.map +1 -1
- package/dist/injected-connector.js +6 -6
- package/dist/injected-connector.js.map +1 -1
- package/dist/services/ethereum/ethereum-wallet-service.d.ts +2 -2
- package/dist/services/ethereum/ethereum-wallet-service.d.ts.map +1 -1
- package/dist/services/ethereum/ethereum-wallet-service.js +2 -2
- package/dist/services/ethereum/ethereum-wallet-service.js.map +1 -1
- package/package.json +3 -2
- package/src/eip6963-discovery.test.ts +312 -0
- package/src/eip6963-discovery.ts +69 -3
- package/src/injected-connector.ts +14 -7
- package/src/services/ethereum/ethereum-wallet-service.ts +4 -3
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* EIP-6963: Multi Injected Provider Discovery
|
|
3
3
|
* https://eips.ethereum.org/EIPS/eip-6963
|
|
4
4
|
*/
|
|
5
|
+
import type { WalletMetadata } from '@meshconnect/uwc-types';
|
|
5
6
|
export interface EthereumProvider {
|
|
6
7
|
request: (args: {
|
|
7
8
|
method: string;
|
|
@@ -10,6 +11,19 @@ export interface EthereumProvider {
|
|
|
10
11
|
on?: (event: string, handler: (...args: any[]) => void) => void;
|
|
11
12
|
removeListener?: (event: string, handler: (...args: any[]) => void) => void;
|
|
12
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* EIP-1193 compatible provider interface extending the base EthereumProvider
|
|
16
|
+
* This interface includes the standard EIP-1193 methods and properties
|
|
17
|
+
*/
|
|
18
|
+
export interface EIP1193Provider extends EthereumProvider {
|
|
19
|
+
request: (args: {
|
|
20
|
+
method: string;
|
|
21
|
+
params?: unknown[];
|
|
22
|
+
}) => Promise<any>;
|
|
23
|
+
on: (event: string, handler: (...args: any[]) => void) => void;
|
|
24
|
+
removeListener: (event: string, handler: (...args: any[]) => void) => void;
|
|
25
|
+
[key: string]: any;
|
|
26
|
+
}
|
|
13
27
|
export interface EIP6963ProviderInfo {
|
|
14
28
|
uuid: string;
|
|
15
29
|
name: string;
|
|
@@ -43,5 +57,5 @@ export declare function discoverWallets(): Promise<DetectedWallet[]>;
|
|
|
43
57
|
* Gets available wallets by discovering them via EIP-6963
|
|
44
58
|
* This function can be called multiple times to refresh the list
|
|
45
59
|
*/
|
|
46
|
-
export declare function getAvailableWallets(): Promise<DetectedWallet[]>;
|
|
60
|
+
export declare function getAvailableWallets(expectedWallets?: WalletMetadata[]): Promise<DetectedWallet[]>;
|
|
47
61
|
//# sourceMappingURL=eip6963-discovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eip6963-discovery.d.ts","sourceRoot":"","sources":["../src/eip6963-discovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAE/B,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IAEvE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;IAE/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;CAC5E;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAA;IACzB,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAED,MAAM,WAAW,4BAA6B,SAAQ,WAAW;IAC/D,IAAI,EAAE,0BAA0B,CAAA;IAChC,MAAM,EAAE,qBAAqB,CAAA;CAC9B;AAED,MAAM,WAAW,2BAA4B,SAAQ,KAAK;IACxD,IAAI,EAAE,yBAAyB,CAAA;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAuCD;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"eip6963-discovery.d.ts","sourceRoot":"","sources":["../src/eip6963-discovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAG5D,MAAM,WAAW,gBAAgB;IAE/B,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IAEvE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;IAE/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;CAC5E;AAED;;;GAGG;AACH,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IAGvD,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IAEvE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;IAE9D,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;IAI1E,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAA;IACzB,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAED,MAAM,WAAW,4BAA6B,SAAQ,WAAW;IAC/D,IAAI,EAAE,0BAA0B,CAAA;IAChC,MAAM,EAAE,qBAAqB,CAAA;CAC9B;AAED,MAAM,WAAW,2BAA4B,SAAQ,KAAK;IACxD,IAAI,EAAE,yBAAyB,CAAA;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAuCD;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAqDjE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,eAAe,GAAE,cAAc,EAAO,GACrC,OAAO,CAAC,cAAc,EAAE,CAAC,CAkD3B"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* EIP-6963: Multi Injected Provider Discovery
|
|
3
3
|
* https://eips.ethereum.org/EIPS/eip-6963
|
|
4
4
|
*/
|
|
5
|
+
import { v4 as uuid } from 'uuid';
|
|
5
6
|
/**
|
|
6
7
|
* Polls for bridge wallets when UWCBridgeInitialized is true
|
|
7
8
|
* @returns Promise that resolves to an array of detected wallets from the bridge
|
|
@@ -87,10 +88,41 @@ export async function discoverWallets() {
|
|
|
87
88
|
* Gets available wallets by discovering them via EIP-6963
|
|
88
89
|
* This function can be called multiple times to refresh the list
|
|
89
90
|
*/
|
|
90
|
-
export async function getAvailableWallets() {
|
|
91
|
+
export async function getAvailableWallets(expectedWallets = []) {
|
|
91
92
|
try {
|
|
92
|
-
const
|
|
93
|
-
|
|
93
|
+
const detectedWallets = await discoverWallets();
|
|
94
|
+
// Check expected wallets with legacy EIP-1193 provider support
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
96
|
+
// @ts-ignore - window.ethereum is set by the browser
|
|
97
|
+
if (window.ethereum && expectedWallets.length > 0) {
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
99
|
+
// @ts-ignore - window.ethereum is set by the browser
|
|
100
|
+
const legacyProvider = window.ethereum;
|
|
101
|
+
// Match expected wallets with legacy provider using isWallet detection
|
|
102
|
+
const matchedWallet = expectedWallets.find(wallet => {
|
|
103
|
+
const injectedId = wallet.extensionInjectedProvider?.namespaceMetaData.eip155
|
|
104
|
+
?.injectedId ?? '';
|
|
105
|
+
// Check if the legacy provider has the corresponding isWallet property
|
|
106
|
+
// This supports detection of wallets like MetaMask (isMetaMask), Coinbase Wallet (isCoinbaseWallet), etc.
|
|
107
|
+
return injectedId && legacyProvider[injectedId] === true;
|
|
108
|
+
});
|
|
109
|
+
if (matchedWallet) {
|
|
110
|
+
// Check if this wallet is already detected via EIP-6963 to avoid duplicates
|
|
111
|
+
const isAlreadyDetected = detectedWallets.some(detectedWallet => detectedWallet.name.toLowerCase() ===
|
|
112
|
+
matchedWallet.extensionInjectedProvider?.namespaceMetaData.eip155?.eip155Name?.toLowerCase());
|
|
113
|
+
if (!isAlreadyDetected) {
|
|
114
|
+
detectedWallets.push({
|
|
115
|
+
uuid: matchedWallet.metadata['uuid'] || uuid(),
|
|
116
|
+
name: matchedWallet.extensionInjectedProvider?.namespaceMetaData.eip155
|
|
117
|
+
?.eip155Name || matchedWallet.name,
|
|
118
|
+
icon: matchedWallet.metadata['icon'] || '',
|
|
119
|
+
rdns: matchedWallet.metadata['rdns'] || '',
|
|
120
|
+
provider: legacyProvider
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return detectedWallets;
|
|
94
126
|
}
|
|
95
127
|
catch {
|
|
96
128
|
// Return empty array if discovery fails
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eip6963-discovery.js","sourceRoot":"","sources":["../src/eip6963-discovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"eip6963-discovery.js","sourceRoot":"","sources":["../src/eip6963-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Network, ExtensionInjectedProvider, IntegratedBrowserInjectedProvider, Connector, ConnectorResult, SwitchNetworkResult, Namespace, DetectedEIP6963WalletInfo, DetectedSolanaWalletInfo, TransactionRequest, TransactionResult, NetworkRpcMap, EVMCapabilities, SignatureType } from '@meshconnect/uwc-types';
|
|
1
|
+
import type { Network, ExtensionInjectedProvider, IntegratedBrowserInjectedProvider, Connector, ConnectorResult, SwitchNetworkResult, Namespace, DetectedEIP6963WalletInfo, DetectedSolanaWalletInfo, TransactionRequest, TransactionResult, NetworkRpcMap, EVMCapabilities, SignatureType, WalletMetadata } from '@meshconnect/uwc-types';
|
|
2
2
|
export declare class InjectedConnector implements Connector {
|
|
3
3
|
private readonly storageService;
|
|
4
4
|
private ethereumService;
|
|
@@ -7,7 +7,7 @@ export declare class InjectedConnector implements Connector {
|
|
|
7
7
|
private signatureService;
|
|
8
8
|
private transactionService;
|
|
9
9
|
private networkRpcMap;
|
|
10
|
-
constructor(networkRpcMap?: NetworkRpcMap);
|
|
10
|
+
constructor(networkRpcMap?: NetworkRpcMap, expectedWallets?: WalletMetadata[]);
|
|
11
11
|
/**
|
|
12
12
|
* Initialize wallet discovery for both Ethereum and Solana
|
|
13
13
|
*/
|
|
@@ -15,7 +15,7 @@ export declare class InjectedConnector implements Connector {
|
|
|
15
15
|
/**
|
|
16
16
|
* Get available wallets for a specific namespace
|
|
17
17
|
*/
|
|
18
|
-
getAvailableWallets(namespace: Namespace): Promise<DetectedEIP6963WalletInfo[] | DetectedSolanaWalletInfo[]>;
|
|
18
|
+
getAvailableWallets(namespace: Namespace, expectedWallets?: WalletMetadata[]): Promise<DetectedEIP6963WalletInfo[] | DetectedSolanaWalletInfo[]>;
|
|
19
19
|
/**
|
|
20
20
|
* Connect to a wallet
|
|
21
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injected-connector.d.ts","sourceRoot":"","sources":["../src/injected-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,yBAAyB,EACzB,iCAAiC,EACjC,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,
|
|
1
|
+
{"version":3,"file":"injected-connector.d.ts","sourceRoot":"","sources":["../src/injected-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,yBAAyB,EACzB,iCAAiC,EACjC,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACf,MAAM,wBAAwB,CAAA;AAS/B,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,aAAa,CAAe;gBAGlC,aAAa,GAAE,aAAkB,EACjC,eAAe,GAAE,cAAc,EAAO;IAoBxC;;OAEG;YACW,yBAAyB;IAOvC;;OAEG;IACG,mBAAmB,CACvB,SAAS,EAAE,SAAS,EACpB,eAAe,GAAE,cAAc,EAAO,GACrC,OAAO,CAAC,yBAAyB,EAAE,GAAG,wBAAwB,EAAE,CAAC;IAoCpE;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,yBAAyB,GAAG,iCAAiC,GACtE,OAAO,CAAC,eAAe,CAAC;IAmC3B;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,yBAAyB,GAAG,iCAAiC,GACtE,OAAO,CAAC,mBAAmB,CAAC;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,yBAAyB,GAAG,iCAAiC,GACtE,OAAO,CAAC,aAAa,CAAC;IA6DzB;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,yBAAyB,GAAG,iCAAiC,GACtE,OAAO,CAAC,iBAAiB,CAAC;IA2C7B;;OAEG;IACG,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAG5C"}
|
|
@@ -12,7 +12,7 @@ export class InjectedConnector {
|
|
|
12
12
|
signatureService;
|
|
13
13
|
transactionService;
|
|
14
14
|
networkRpcMap;
|
|
15
|
-
constructor(networkRpcMap = {}) {
|
|
15
|
+
constructor(networkRpcMap = {}, expectedWallets = []) {
|
|
16
16
|
// Store the network RPC map
|
|
17
17
|
this.networkRpcMap = networkRpcMap;
|
|
18
18
|
// Initialize services
|
|
@@ -23,25 +23,25 @@ export class InjectedConnector {
|
|
|
23
23
|
this.signatureService = new SignatureService();
|
|
24
24
|
this.transactionService = new TransactionService(this.networkRpcMap);
|
|
25
25
|
// Initialize wallet discovery
|
|
26
|
-
this.initializeWalletDiscovery();
|
|
26
|
+
this.initializeWalletDiscovery(expectedWallets);
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* Initialize wallet discovery for both Ethereum and Solana
|
|
30
30
|
*/
|
|
31
|
-
async initializeWalletDiscovery() {
|
|
32
|
-
await this.ethereumService.initializeDiscovery();
|
|
31
|
+
async initializeWalletDiscovery(expectedWallets = []) {
|
|
32
|
+
await this.ethereumService.initializeDiscovery(expectedWallets);
|
|
33
33
|
await this.solanaService.initializeDiscovery();
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
36
|
* Get available wallets for a specific namespace
|
|
37
37
|
*/
|
|
38
|
-
async getAvailableWallets(namespace) {
|
|
38
|
+
async getAvailableWallets(namespace, expectedWallets = []) {
|
|
39
39
|
switch (namespace) {
|
|
40
40
|
case 'eip155': {
|
|
41
41
|
const detectedWallets = this.ethereumService.getDetectedWallets();
|
|
42
42
|
// Re-fetch if no wallets detected
|
|
43
43
|
if (detectedWallets.length === 0) {
|
|
44
|
-
await this.ethereumService.initializeDiscovery();
|
|
44
|
+
await this.ethereumService.initializeDiscovery(expectedWallets);
|
|
45
45
|
}
|
|
46
46
|
// Convert to DetectedWalletInfo format
|
|
47
47
|
return this.ethereumService.getDetectedWallets().map(wallet => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injected-connector.js","sourceRoot":"","sources":["../src/injected-connector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"injected-connector.js","sourceRoot":"","sources":["../src/injected-connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AvailableAddress, EVMCapabilities, Network } from '@meshconnect/uwc-types';
|
|
1
|
+
import type { AvailableAddress, EVMCapabilities, Network, WalletMetadata } from '@meshconnect/uwc-types';
|
|
2
2
|
import type { EthereumProvider, DetectedWallet as EIP6963DetectedWallet } from '../../eip6963-discovery';
|
|
3
3
|
/**
|
|
4
4
|
* Service for managing Ethereum wallet connections
|
|
@@ -10,7 +10,7 @@ export declare class EthereumWalletService {
|
|
|
10
10
|
/**
|
|
11
11
|
* Initialize wallet discovery
|
|
12
12
|
*/
|
|
13
|
-
initializeDiscovery(): Promise<void>;
|
|
13
|
+
initializeDiscovery(expectedWallets?: WalletMetadata[]): Promise<void>;
|
|
14
14
|
/**
|
|
15
15
|
* Get detected wallets
|
|
16
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethereum-wallet-service.d.ts","sourceRoot":"","sources":["../../../src/services/ethereum/ethereum-wallet-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,eAAe,EAEf,OAAO,
|
|
1
|
+
{"version":3,"file":"ethereum-wallet-service.d.ts","sourceRoot":"","sources":["../../../src/services/ethereum/ethereum-wallet-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,eAAe,EAEf,OAAO,EACP,cAAc,EACf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,IAAI,qBAAqB,EACxC,MAAM,yBAAyB,CAAA;AAGhC;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,iBAAiB,CAAgC;IACzD,OAAO,CAAC,OAAO,CAAsB;IAErC;;OAEG;IACG,mBAAmB,CAAC,eAAe,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E;;OAEG;IACH,kBAAkB,IAAI,qBAAqB,EAAE;IAI7C;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAIjE;;OAEG;IACG,uBAAuB,CAC3B,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAY3B;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB1D;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BrD;;OAEG;IACH,uBAAuB,CACrB,mBAAmB,EAAE,MAAM,EAAE,EAC7B,OAAO,EAAE,MAAM,GACd,gBAAgB,EAAE;IAarB;;OAEG;IACH,kBAAkB,CAChB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,IAAI;IAKP;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,oBAAoB,IAAI,gBAAgB,GAAG,IAAI;IAI/C;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACG,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAsD5C"}
|
|
@@ -9,8 +9,8 @@ export class EthereumWalletService {
|
|
|
9
9
|
/**
|
|
10
10
|
* Initialize wallet discovery
|
|
11
11
|
*/
|
|
12
|
-
async initializeDiscovery() {
|
|
13
|
-
this.detectedWallets = await getEIP6963Wallets();
|
|
12
|
+
async initializeDiscovery(expectedWallets) {
|
|
13
|
+
this.detectedWallets = await getEIP6963Wallets(expectedWallets);
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Get detected wallets
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethereum-wallet-service.js","sourceRoot":"","sources":["../../../src/services/ethereum/ethereum-wallet-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ethereum-wallet-service.js","sourceRoot":"","sources":["../../../src/services/ethereum/ethereum-wallet-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meshconnect/uwc-injected-connector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Injected connector for Universal Wallet Connector",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"bs58": "^6.0.0",
|
|
27
27
|
"buffer": "^6.0.3",
|
|
28
28
|
"ethers": "^6.15.0",
|
|
29
|
-
"
|
|
29
|
+
"uuid": "^11.1.0",
|
|
30
|
+
"@meshconnect/uwc-types": "0.3.0"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|
|
32
33
|
"typescript": "^5.9.2"
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
|
|
2
|
+
import type { WalletMetadata } from '@meshconnect/uwc-types'
|
|
3
|
+
import { discoverWallets } from './eip6963-discovery'
|
|
4
|
+
|
|
5
|
+
// Mock window object
|
|
6
|
+
const mockWindow = {
|
|
7
|
+
addEventListener: vi.fn(),
|
|
8
|
+
removeEventListener: vi.fn(),
|
|
9
|
+
dispatchEvent: vi.fn(),
|
|
10
|
+
ethereum: undefined as any,
|
|
11
|
+
UWCBridgeChildInitialized: false,
|
|
12
|
+
eip6963Wallets: undefined as any
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Mock global window
|
|
16
|
+
Object.defineProperty(globalThis, 'window', {
|
|
17
|
+
value: mockWindow,
|
|
18
|
+
writable: true
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
describe('EIP-6963 Discovery', () => {
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
vi.clearAllMocks()
|
|
24
|
+
// Reset window properties
|
|
25
|
+
mockWindow.ethereum = undefined
|
|
26
|
+
mockWindow.UWCBridgeChildInitialized = false
|
|
27
|
+
mockWindow.eip6963Wallets = undefined
|
|
28
|
+
// Clear module cache to ensure fresh imports
|
|
29
|
+
vi.resetModules()
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
vi.restoreAllMocks()
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
describe('discoverWallets', () => {
|
|
37
|
+
it('should return empty array in non-browser environment', async () => {
|
|
38
|
+
// Mock non-browser environment
|
|
39
|
+
Object.defineProperty(globalThis, 'window', {
|
|
40
|
+
value: undefined,
|
|
41
|
+
writable: true
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
const result = await discoverWallets()
|
|
45
|
+
expect(result).toEqual([])
|
|
46
|
+
|
|
47
|
+
// Restore window for other tests
|
|
48
|
+
Object.defineProperty(globalThis, 'window', {
|
|
49
|
+
value: mockWindow,
|
|
50
|
+
writable: true
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it('should poll for bridge wallets when UWCBridgeChildInitialized is true', async () => {
|
|
55
|
+
mockWindow.UWCBridgeChildInitialized = true
|
|
56
|
+
const mockBridgeWallets = [
|
|
57
|
+
{
|
|
58
|
+
uuid: 'bridge-wallet-1',
|
|
59
|
+
name: 'Bridge Wallet',
|
|
60
|
+
icon: 'bridge-icon',
|
|
61
|
+
rdns: 'com.bridge.wallet',
|
|
62
|
+
provider: { request: vi.fn() }
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
mockWindow.eip6963Wallets = mockBridgeWallets
|
|
66
|
+
|
|
67
|
+
const result = await discoverWallets()
|
|
68
|
+
|
|
69
|
+
expect(result).toEqual(mockBridgeWallets)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it('should return empty array when bridge polling times out', async () => {
|
|
73
|
+
mockWindow.UWCBridgeChildInitialized = true
|
|
74
|
+
mockWindow.eip6963Wallets = undefined
|
|
75
|
+
|
|
76
|
+
const result = await discoverWallets()
|
|
77
|
+
|
|
78
|
+
expect(result).toEqual([])
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
it('should handle invalid bridge wallets array', async () => {
|
|
82
|
+
mockWindow.UWCBridgeChildInitialized = true
|
|
83
|
+
mockWindow.eip6963Wallets = 'invalid' as any
|
|
84
|
+
|
|
85
|
+
const result = await discoverWallets()
|
|
86
|
+
|
|
87
|
+
expect(result).toEqual([])
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
describe('getAvailableWallets', () => {
|
|
92
|
+
const mockExpectedWallets: WalletMetadata[] = [
|
|
93
|
+
{
|
|
94
|
+
id: 'metamask',
|
|
95
|
+
name: 'MetaMask',
|
|
96
|
+
metadata: {
|
|
97
|
+
uuid: 'metamask-uuid',
|
|
98
|
+
icon: 'metamask-icon',
|
|
99
|
+
rdns: 'io.metamask'
|
|
100
|
+
},
|
|
101
|
+
extensionInjectedProvider: {
|
|
102
|
+
supportedNetworkIds: ['eip155:1'] as const,
|
|
103
|
+
namespaceMetaData: {
|
|
104
|
+
eip155: {
|
|
105
|
+
eip155Name: 'MetaMask',
|
|
106
|
+
injectedId: 'isMetaMask',
|
|
107
|
+
supportsAddingNetworks: true,
|
|
108
|
+
requiresUserApprovalOnNetworkSwitch: false
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
requiresUserApprovalOnNamespaceSwitch: false
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
it('should add legacy provider wallet when detected', async () => {
|
|
117
|
+
const mockDetectedWallets: any[] = []
|
|
118
|
+
const mockLegacyProvider = {
|
|
119
|
+
request: vi.fn(),
|
|
120
|
+
on: vi.fn(),
|
|
121
|
+
removeListener: vi.fn(),
|
|
122
|
+
isMetaMask: true
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
mockWindow.ethereum = mockLegacyProvider
|
|
126
|
+
|
|
127
|
+
// Mock discoverWallets
|
|
128
|
+
vi.doMock('./eip6963-discovery', async () => {
|
|
129
|
+
const actual = await vi.importActual('./eip6963-discovery')
|
|
130
|
+
return {
|
|
131
|
+
...actual,
|
|
132
|
+
discoverWallets: vi.fn().mockResolvedValue(mockDetectedWallets)
|
|
133
|
+
}
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
const { getAvailableWallets } = await import('./eip6963-discovery')
|
|
137
|
+
const result = await getAvailableWallets(mockExpectedWallets)
|
|
138
|
+
|
|
139
|
+
expect(result).toHaveLength(1)
|
|
140
|
+
expect(result[0].name).toBe('MetaMask')
|
|
141
|
+
expect(result[0].provider).toBe(mockLegacyProvider)
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it('should not add legacy provider wallet if no matching expected wallet', async () => {
|
|
145
|
+
const mockDetectedWallets: any[] = []
|
|
146
|
+
const mockLegacyProvider = {
|
|
147
|
+
request: vi.fn(),
|
|
148
|
+
on: vi.fn(),
|
|
149
|
+
removeListener: vi.fn(),
|
|
150
|
+
isMetaMask: true
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
mockWindow.ethereum = mockLegacyProvider
|
|
154
|
+
|
|
155
|
+
// Mock discoverWallets
|
|
156
|
+
vi.doMock('./eip6963-discovery', async () => {
|
|
157
|
+
const actual = await vi.importActual('./eip6963-discovery')
|
|
158
|
+
return {
|
|
159
|
+
...actual,
|
|
160
|
+
discoverWallets: vi.fn().mockResolvedValue(mockDetectedWallets)
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
const { getAvailableWallets } = await import('./eip6963-discovery')
|
|
165
|
+
const result = await getAvailableWallets([]) // Empty expected wallets
|
|
166
|
+
|
|
167
|
+
expect(result).toHaveLength(0)
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
it('should not add legacy provider wallet if injectedId does not match', async () => {
|
|
171
|
+
const mockDetectedWallets: any[] = []
|
|
172
|
+
const mockLegacyProvider = {
|
|
173
|
+
request: vi.fn(),
|
|
174
|
+
on: vi.fn(),
|
|
175
|
+
removeListener: vi.fn(),
|
|
176
|
+
isCoinbaseWallet: true // Different wallet
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
mockWindow.ethereum = mockLegacyProvider
|
|
180
|
+
|
|
181
|
+
// Mock discoverWallets
|
|
182
|
+
vi.doMock('./eip6963-discovery', async () => {
|
|
183
|
+
const actual = await vi.importActual('./eip6963-discovery')
|
|
184
|
+
return {
|
|
185
|
+
...actual,
|
|
186
|
+
discoverWallets: vi.fn().mockResolvedValue(mockDetectedWallets)
|
|
187
|
+
}
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
const { getAvailableWallets } = await import('./eip6963-discovery')
|
|
191
|
+
const result = await getAvailableWallets(mockExpectedWallets)
|
|
192
|
+
|
|
193
|
+
expect(result).toHaveLength(0)
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
it('should handle missing metadata gracefully', async () => {
|
|
197
|
+
const mockDetectedWallets: any[] = []
|
|
198
|
+
const mockLegacyProvider = {
|
|
199
|
+
request: vi.fn(),
|
|
200
|
+
on: vi.fn(),
|
|
201
|
+
removeListener: vi.fn(),
|
|
202
|
+
isMetaMask: true
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
mockWindow.ethereum = mockLegacyProvider
|
|
206
|
+
|
|
207
|
+
const walletWithoutMetadata: WalletMetadata = {
|
|
208
|
+
id: 'metamask',
|
|
209
|
+
name: 'MetaMask',
|
|
210
|
+
metadata: {}, // Empty metadata
|
|
211
|
+
extensionInjectedProvider: {
|
|
212
|
+
supportedNetworkIds: ['eip155:1'] as const,
|
|
213
|
+
namespaceMetaData: {
|
|
214
|
+
eip155: {
|
|
215
|
+
eip155Name: 'MetaMask',
|
|
216
|
+
injectedId: 'isMetaMask',
|
|
217
|
+
supportsAddingNetworks: true,
|
|
218
|
+
requiresUserApprovalOnNetworkSwitch: false
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
requiresUserApprovalOnNamespaceSwitch: false
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Mock discoverWallets
|
|
226
|
+
vi.doMock('./eip6963-discovery', async () => {
|
|
227
|
+
const actual = await vi.importActual('./eip6963-discovery')
|
|
228
|
+
return {
|
|
229
|
+
...actual,
|
|
230
|
+
discoverWallets: vi.fn().mockResolvedValue(mockDetectedWallets)
|
|
231
|
+
}
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
const { getAvailableWallets } = await import('./eip6963-discovery')
|
|
235
|
+
const result = await getAvailableWallets([walletWithoutMetadata])
|
|
236
|
+
|
|
237
|
+
expect(result).toHaveLength(1)
|
|
238
|
+
expect(result[0].uuid).toBeTruthy()
|
|
239
|
+
expect(result[0].name).toBe('MetaMask')
|
|
240
|
+
expect(result[0].icon).toBe('')
|
|
241
|
+
expect(result[0].rdns).toBe('')
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
it('should handle missing namespace metadata gracefully', async () => {
|
|
245
|
+
const mockDetectedWallets: any[] = []
|
|
246
|
+
const mockLegacyProvider = {
|
|
247
|
+
request: vi.fn(),
|
|
248
|
+
on: vi.fn(),
|
|
249
|
+
removeListener: vi.fn(),
|
|
250
|
+
isMetaMask: true
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
mockWindow.ethereum = mockLegacyProvider
|
|
254
|
+
|
|
255
|
+
const walletWithoutNamespaceMetadata: WalletMetadata = {
|
|
256
|
+
id: 'metamask',
|
|
257
|
+
name: 'MetaMask',
|
|
258
|
+
metadata: {
|
|
259
|
+
uuid: 'metamask-uuid',
|
|
260
|
+
icon: 'metamask-icon',
|
|
261
|
+
rdns: 'io.metamask'
|
|
262
|
+
},
|
|
263
|
+
extensionInjectedProvider: {
|
|
264
|
+
supportedNetworkIds: ['eip155:1'] as const,
|
|
265
|
+
namespaceMetaData: {
|
|
266
|
+
eip155: {
|
|
267
|
+
eip155Name: 'MetaMask',
|
|
268
|
+
injectedId: '', // Empty injectedId
|
|
269
|
+
supportsAddingNetworks: true,
|
|
270
|
+
requiresUserApprovalOnNetworkSwitch: false
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
requiresUserApprovalOnNamespaceSwitch: false
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Mock discoverWallets
|
|
278
|
+
vi.doMock('./eip6963-discovery', async () => {
|
|
279
|
+
const actual = await vi.importActual('./eip6963-discovery')
|
|
280
|
+
return {
|
|
281
|
+
...actual,
|
|
282
|
+
discoverWallets: vi.fn().mockResolvedValue(mockDetectedWallets)
|
|
283
|
+
}
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
const { getAvailableWallets } = await import('./eip6963-discovery')
|
|
287
|
+
const result = await getAvailableWallets([walletWithoutNamespaceMetadata])
|
|
288
|
+
|
|
289
|
+
expect(result).toHaveLength(0)
|
|
290
|
+
})
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
describe('Bridge wallet polling', () => {
|
|
294
|
+
it('should resolve immediately when bridge wallets are available', async () => {
|
|
295
|
+
mockWindow.UWCBridgeChildInitialized = true
|
|
296
|
+
const mockBridgeWallets = [
|
|
297
|
+
{
|
|
298
|
+
uuid: 'bridge-wallet-1',
|
|
299
|
+
name: 'Bridge Wallet 1',
|
|
300
|
+
icon: 'bridge-icon-1',
|
|
301
|
+
rdns: 'com.bridge.wallet1',
|
|
302
|
+
provider: { request: vi.fn() }
|
|
303
|
+
}
|
|
304
|
+
]
|
|
305
|
+
mockWindow.eip6963Wallets = mockBridgeWallets
|
|
306
|
+
|
|
307
|
+
const result = await discoverWallets()
|
|
308
|
+
|
|
309
|
+
expect(result).toEqual(mockBridgeWallets)
|
|
310
|
+
})
|
|
311
|
+
})
|
|
312
|
+
})
|
package/src/eip6963-discovery.ts
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
* https://eips.ethereum.org/EIPS/eip-6963
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import type { WalletMetadata } from '@meshconnect/uwc-types'
|
|
7
|
+
import { v4 as uuid } from 'uuid'
|
|
8
|
+
|
|
6
9
|
export interface EthereumProvider {
|
|
7
10
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
11
|
request: (args: { method: string; params?: unknown[] }) => Promise<any>
|
|
@@ -12,6 +15,24 @@ export interface EthereumProvider {
|
|
|
12
15
|
removeListener?: (event: string, handler: (...args: any[]) => void) => void
|
|
13
16
|
}
|
|
14
17
|
|
|
18
|
+
/**
|
|
19
|
+
* EIP-1193 compatible provider interface extending the base EthereumProvider
|
|
20
|
+
* This interface includes the standard EIP-1193 methods and properties
|
|
21
|
+
*/
|
|
22
|
+
export interface EIP1193Provider extends EthereumProvider {
|
|
23
|
+
// EIP-1193 standard methods
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
request: (args: { method: string; params?: unknown[] }) => Promise<any>
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
on: (event: string, handler: (...args: any[]) => void) => void
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
removeListener: (event: string, handler: (...args: any[]) => void) => void
|
|
30
|
+
|
|
31
|
+
// Add common wallet detection properties as needed (e.g. isMetaMask, isCoinbaseWallet, etc.)
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
+
[key: string]: any
|
|
34
|
+
}
|
|
35
|
+
|
|
15
36
|
export interface EIP6963ProviderInfo {
|
|
16
37
|
uuid: string
|
|
17
38
|
name: string
|
|
@@ -131,6 +152,7 @@ export async function discoverWallets(): Promise<DetectedWallet[]> {
|
|
|
131
152
|
// Clean up and resolve after timeout
|
|
132
153
|
setTimeout(() => {
|
|
133
154
|
window.removeEventListener('eip6963:announceProvider', handleAnnouncement)
|
|
155
|
+
|
|
134
156
|
resolve(detectedWallets)
|
|
135
157
|
}, timeout)
|
|
136
158
|
})
|
|
@@ -140,10 +162,54 @@ export async function discoverWallets(): Promise<DetectedWallet[]> {
|
|
|
140
162
|
* Gets available wallets by discovering them via EIP-6963
|
|
141
163
|
* This function can be called multiple times to refresh the list
|
|
142
164
|
*/
|
|
143
|
-
export async function getAvailableWallets(
|
|
165
|
+
export async function getAvailableWallets(
|
|
166
|
+
expectedWallets: WalletMetadata[] = []
|
|
167
|
+
): Promise<DetectedWallet[]> {
|
|
144
168
|
try {
|
|
145
|
-
const
|
|
146
|
-
|
|
169
|
+
const detectedWallets = await discoverWallets()
|
|
170
|
+
|
|
171
|
+
// Check expected wallets with legacy EIP-1193 provider support
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
173
|
+
// @ts-ignore - window.ethereum is set by the browser
|
|
174
|
+
if (window.ethereum && expectedWallets.length > 0) {
|
|
175
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
176
|
+
// @ts-ignore - window.ethereum is set by the browser
|
|
177
|
+
const legacyProvider = window.ethereum as EIP1193Provider
|
|
178
|
+
|
|
179
|
+
// Match expected wallets with legacy provider using isWallet detection
|
|
180
|
+
const matchedWallet = expectedWallets.find(wallet => {
|
|
181
|
+
const injectedId =
|
|
182
|
+
wallet.extensionInjectedProvider?.namespaceMetaData.eip155
|
|
183
|
+
?.injectedId ?? ''
|
|
184
|
+
|
|
185
|
+
// Check if the legacy provider has the corresponding isWallet property
|
|
186
|
+
// This supports detection of wallets like MetaMask (isMetaMask), Coinbase Wallet (isCoinbaseWallet), etc.
|
|
187
|
+
return injectedId && legacyProvider[injectedId] === true
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
if (matchedWallet) {
|
|
191
|
+
// Check if this wallet is already detected via EIP-6963 to avoid duplicates
|
|
192
|
+
const isAlreadyDetected = detectedWallets.some(
|
|
193
|
+
detectedWallet =>
|
|
194
|
+
detectedWallet.name.toLowerCase() ===
|
|
195
|
+
matchedWallet.extensionInjectedProvider?.namespaceMetaData.eip155?.eip155Name?.toLowerCase()
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
if (!isAlreadyDetected) {
|
|
199
|
+
detectedWallets.push({
|
|
200
|
+
uuid: matchedWallet.metadata['uuid'] || uuid(),
|
|
201
|
+
name:
|
|
202
|
+
matchedWallet.extensionInjectedProvider?.namespaceMetaData.eip155
|
|
203
|
+
?.eip155Name || matchedWallet.name,
|
|
204
|
+
icon: matchedWallet.metadata['icon'] || '',
|
|
205
|
+
rdns: matchedWallet.metadata['rdns'] || '',
|
|
206
|
+
provider: legacyProvider
|
|
207
|
+
})
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return detectedWallets
|
|
147
213
|
} catch {
|
|
148
214
|
// Return empty array if discovery fails
|
|
149
215
|
return []
|
|
@@ -12,7 +12,8 @@ import type {
|
|
|
12
12
|
TransactionResult,
|
|
13
13
|
NetworkRpcMap,
|
|
14
14
|
EVMCapabilities,
|
|
15
|
-
SignatureType
|
|
15
|
+
SignatureType,
|
|
16
|
+
WalletMetadata
|
|
16
17
|
} from '@meshconnect/uwc-types'
|
|
17
18
|
|
|
18
19
|
import { EthereumWalletService } from './services/ethereum/ethereum-wallet-service'
|
|
@@ -31,7 +32,10 @@ export class InjectedConnector implements Connector {
|
|
|
31
32
|
private transactionService: TransactionService
|
|
32
33
|
private networkRpcMap: NetworkRpcMap
|
|
33
34
|
|
|
34
|
-
constructor(
|
|
35
|
+
constructor(
|
|
36
|
+
networkRpcMap: NetworkRpcMap = {},
|
|
37
|
+
expectedWallets: WalletMetadata[] = []
|
|
38
|
+
) {
|
|
35
39
|
// Store the network RPC map
|
|
36
40
|
this.networkRpcMap = networkRpcMap
|
|
37
41
|
|
|
@@ -47,14 +51,16 @@ export class InjectedConnector implements Connector {
|
|
|
47
51
|
this.transactionService = new TransactionService(this.networkRpcMap)
|
|
48
52
|
|
|
49
53
|
// Initialize wallet discovery
|
|
50
|
-
this.initializeWalletDiscovery()
|
|
54
|
+
this.initializeWalletDiscovery(expectedWallets)
|
|
51
55
|
}
|
|
52
56
|
|
|
53
57
|
/**
|
|
54
58
|
* Initialize wallet discovery for both Ethereum and Solana
|
|
55
59
|
*/
|
|
56
|
-
private async initializeWalletDiscovery(
|
|
57
|
-
|
|
60
|
+
private async initializeWalletDiscovery(
|
|
61
|
+
expectedWallets: WalletMetadata[] = []
|
|
62
|
+
): Promise<void> {
|
|
63
|
+
await this.ethereumService.initializeDiscovery(expectedWallets)
|
|
58
64
|
await this.solanaService.initializeDiscovery()
|
|
59
65
|
}
|
|
60
66
|
|
|
@@ -62,7 +68,8 @@ export class InjectedConnector implements Connector {
|
|
|
62
68
|
* Get available wallets for a specific namespace
|
|
63
69
|
*/
|
|
64
70
|
async getAvailableWallets(
|
|
65
|
-
namespace: Namespace
|
|
71
|
+
namespace: Namespace,
|
|
72
|
+
expectedWallets: WalletMetadata[] = []
|
|
66
73
|
): Promise<DetectedEIP6963WalletInfo[] | DetectedSolanaWalletInfo[]> {
|
|
67
74
|
switch (namespace) {
|
|
68
75
|
case 'eip155': {
|
|
@@ -70,7 +77,7 @@ export class InjectedConnector implements Connector {
|
|
|
70
77
|
|
|
71
78
|
// Re-fetch if no wallets detected
|
|
72
79
|
if (detectedWallets.length === 0) {
|
|
73
|
-
await this.ethereumService.initializeDiscovery()
|
|
80
|
+
await this.ethereumService.initializeDiscovery(expectedWallets)
|
|
74
81
|
}
|
|
75
82
|
|
|
76
83
|
// Convert to DetectedWalletInfo format
|
|
@@ -3,7 +3,8 @@ import type {
|
|
|
3
3
|
AvailableAddress,
|
|
4
4
|
EVMCapabilities,
|
|
5
5
|
EVMCapabilityStatus,
|
|
6
|
-
Network
|
|
6
|
+
Network,
|
|
7
|
+
WalletMetadata
|
|
7
8
|
} from '@meshconnect/uwc-types'
|
|
8
9
|
import type {
|
|
9
10
|
EthereumProvider,
|
|
@@ -22,8 +23,8 @@ export class EthereumWalletService {
|
|
|
22
23
|
/**
|
|
23
24
|
* Initialize wallet discovery
|
|
24
25
|
*/
|
|
25
|
-
async initializeDiscovery(): Promise<void> {
|
|
26
|
-
this.detectedWallets = await getEIP6963Wallets()
|
|
26
|
+
async initializeDiscovery(expectedWallets?: WalletMetadata[]): Promise<void> {
|
|
27
|
+
this.detectedWallets = await getEIP6963Wallets(expectedWallets)
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
/**
|