@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.
Files changed (83) hide show
  1. package/dist/eip6963-discovery.d.ts +47 -0
  2. package/dist/eip6963-discovery.d.ts.map +1 -0
  3. package/dist/eip6963-discovery.js +58 -0
  4. package/dist/eip6963-discovery.js.map +1 -0
  5. package/dist/index.d.ts +4 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +4 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/injected-connector.d.ts +40 -0
  10. package/dist/injected-connector.d.ts.map +1 -0
  11. package/dist/injected-connector.js +183 -0
  12. package/dist/injected-connector.js.map +1 -0
  13. package/dist/injected-connector.old.d.ts +44 -0
  14. package/dist/injected-connector.old.d.ts.map +1 -0
  15. package/dist/injected-connector.old.js +491 -0
  16. package/dist/injected-connector.old.js.map +1 -0
  17. package/dist/providers/evm-provider.d.ts +18 -0
  18. package/dist/providers/evm-provider.d.ts.map +1 -0
  19. package/dist/providers/evm-provider.js +86 -0
  20. package/dist/providers/evm-provider.js.map +1 -0
  21. package/dist/providers/solana-provider.d.ts +22 -0
  22. package/dist/providers/solana-provider.d.ts.map +1 -0
  23. package/dist/providers/solana-provider.js +137 -0
  24. package/dist/providers/solana-provider.js.map +1 -0
  25. package/dist/services/connection-manager.d.ts +56 -0
  26. package/dist/services/connection-manager.d.ts.map +1 -0
  27. package/dist/services/connection-manager.js +303 -0
  28. package/dist/services/connection-manager.js.map +1 -0
  29. package/dist/services/ethereum-transaction-service.d.ts +28 -0
  30. package/dist/services/ethereum-transaction-service.d.ts.map +1 -0
  31. package/dist/services/ethereum-transaction-service.js +143 -0
  32. package/dist/services/ethereum-transaction-service.js.map +1 -0
  33. package/dist/services/ethereum-wallet-service.d.ts +55 -0
  34. package/dist/services/ethereum-wallet-service.d.ts.map +1 -0
  35. package/dist/services/ethereum-wallet-service.js +133 -0
  36. package/dist/services/ethereum-wallet-service.js.map +1 -0
  37. package/dist/services/index.d.ts +8 -0
  38. package/dist/services/index.d.ts.map +1 -0
  39. package/dist/services/index.js +8 -0
  40. package/dist/services/index.js.map +1 -0
  41. package/dist/services/signature-service.d.ts +16 -0
  42. package/dist/services/signature-service.d.ts.map +1 -0
  43. package/dist/services/signature-service.js +63 -0
  44. package/dist/services/signature-service.js.map +1 -0
  45. package/dist/services/solana-transaction-service.d.ts +14 -0
  46. package/dist/services/solana-transaction-service.d.ts.map +1 -0
  47. package/dist/services/solana-transaction-service.js +48 -0
  48. package/dist/services/solana-transaction-service.js.map +1 -0
  49. package/dist/services/solana-wallet-service.d.ts +55 -0
  50. package/dist/services/solana-wallet-service.d.ts.map +1 -0
  51. package/dist/services/solana-wallet-service.js +129 -0
  52. package/dist/services/solana-wallet-service.js.map +1 -0
  53. package/dist/services/storage-service.d.ts +19 -0
  54. package/dist/services/storage-service.d.ts.map +1 -0
  55. package/dist/services/storage-service.js +41 -0
  56. package/dist/services/storage-service.js.map +1 -0
  57. package/dist/services/transaction-service.d.ts +28 -0
  58. package/dist/services/transaction-service.d.ts.map +1 -0
  59. package/dist/services/transaction-service.js +67 -0
  60. package/dist/services/transaction-service.js.map +1 -0
  61. package/dist/utils/error-utils.d.ts +6 -0
  62. package/dist/utils/error-utils.d.ts.map +1 -0
  63. package/dist/utils/error-utils.js +55 -0
  64. package/dist/utils/error-utils.js.map +1 -0
  65. package/dist/wallet-standard-discovery.d.ts +24 -0
  66. package/dist/wallet-standard-discovery.d.ts.map +1 -0
  67. package/dist/wallet-standard-discovery.js +74 -0
  68. package/dist/wallet-standard-discovery.js.map +1 -0
  69. package/package.json +42 -0
  70. package/src/eip6963-discovery.ts +103 -0
  71. package/src/index.ts +7 -0
  72. package/src/injected-connector.ts +265 -0
  73. package/src/services/connection-manager.ts +437 -0
  74. package/src/services/ethereum-transaction-service.ts +196 -0
  75. package/src/services/ethereum-wallet-service.ts +161 -0
  76. package/src/services/index.ts +7 -0
  77. package/src/services/signature-service.ts +84 -0
  78. package/src/services/solana-transaction-service.ts +68 -0
  79. package/src/services/solana-wallet-service.ts +161 -0
  80. package/src/services/storage-service.ts +44 -0
  81. package/src/services/transaction-service.ts +106 -0
  82. package/src/utils/error-utils.ts +62 -0
  83. 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,6 @@
1
+ /**
2
+ * Parse an error and throw a WalletConnectorError
3
+ * Detects if the error is a user rejection or an unknown error
4
+ */
5
+ export declare function parseError(error: unknown): never;
6
+ //# sourceMappingURL=error-utils.d.ts.map
@@ -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
@@ -0,0 +1,7 @@
1
+ export * from './injected-connector'
2
+ export { getAvailableWallets, type DetectedWallet } from './eip6963-discovery'
3
+ export {
4
+ getSolanaWallets,
5
+ type WalletStandardInfo,
6
+ type SolanaWalletWithAdapter
7
+ } from './wallet-standard-discovery'