@meshconnect/uwc-injected-connector 0.2.6 → 0.2.8

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 (40) hide show
  1. package/dist/injected-connector.js +2 -2
  2. package/dist/injected-connector.js.map +1 -1
  3. package/dist/injected-connector.old.d.ts +44 -0
  4. package/dist/injected-connector.old.d.ts.map +1 -0
  5. package/dist/injected-connector.old.js +491 -0
  6. package/dist/injected-connector.old.js.map +1 -0
  7. package/dist/providers/evm-provider.d.ts +18 -0
  8. package/dist/providers/evm-provider.d.ts.map +1 -0
  9. package/dist/providers/evm-provider.js +86 -0
  10. package/dist/providers/evm-provider.js.map +1 -0
  11. package/dist/providers/solana-provider.d.ts +22 -0
  12. package/dist/providers/solana-provider.d.ts.map +1 -0
  13. package/dist/providers/solana-provider.js +137 -0
  14. package/dist/providers/solana-provider.js.map +1 -0
  15. package/dist/services/signature-service.d.ts +2 -2
  16. package/dist/services/signature-service.d.ts.map +1 -1
  17. package/dist/services/signature-service.js +3 -10
  18. package/dist/services/signature-service.js.map +1 -1
  19. package/dist/services/solana/solana-transaction-service.d.ts +14 -2
  20. package/dist/services/solana/solana-transaction-service.d.ts.map +1 -1
  21. package/dist/services/solana/solana-transaction-service.js +87 -47
  22. package/dist/services/solana/solana-transaction-service.js.map +1 -1
  23. package/dist/services/solana/solana-wallet-service.d.ts +6 -7
  24. package/dist/services/solana/solana-wallet-service.d.ts.map +1 -1
  25. package/dist/services/solana/solana-wallet-service.js +13 -15
  26. package/dist/services/solana/solana-wallet-service.js.map +1 -1
  27. package/dist/services/transaction-service.d.ts +2 -2
  28. package/dist/services/transaction-service.d.ts.map +1 -1
  29. package/dist/services/transaction-service.js.map +1 -1
  30. package/dist/wallet-standard-discovery.d.ts +11 -9
  31. package/dist/wallet-standard-discovery.d.ts.map +1 -1
  32. package/dist/wallet-standard-discovery.js +47 -23
  33. package/dist/wallet-standard-discovery.js.map +1 -1
  34. package/package.json +2 -2
  35. package/src/injected-connector.ts +2 -2
  36. package/src/services/signature-service.ts +5 -17
  37. package/src/services/solana/solana-transaction-service.ts +121 -60
  38. package/src/services/solana/solana-wallet-service.ts +21 -23
  39. package/src/services/transaction-service.ts +3 -3
  40. package/src/wallet-standard-discovery.ts +77 -32
@@ -1,7 +1,7 @@
1
1
  import type { NetworkId, AvailableAddress } from '@meshconnect/uwc-types'
2
- import type { WalletAdapter } from '@solana/wallet-adapter-base'
3
2
  import {
4
3
  getSolanaWallets,
4
+ type SolanaAdapter,
5
5
  type WalletStandardInfo
6
6
  } from '../../wallet-standard-discovery'
7
7
  import { StorageService } from '../storage-service'
@@ -11,7 +11,7 @@ import { StorageService } from '../storage-service'
11
11
  */
12
12
  export class SolanaWalletService {
13
13
  private detectedWallets: WalletStandardInfo[] = []
14
- private connectedAdapter: WalletAdapter | null = null
14
+ private connectedAdapter: SolanaAdapter | null = null
15
15
  private account: string | null = null
16
16
  private storageService: StorageService
17
17
 
@@ -22,8 +22,8 @@ export class SolanaWalletService {
22
22
  /**
23
23
  * Initialize wallet discovery
24
24
  */
25
- initializeDiscovery(): void {
26
- this.detectedWallets = getSolanaWallets()
25
+ async initializeDiscovery(): Promise<void> {
26
+ this.detectedWallets = await getSolanaWallets()
27
27
  }
28
28
 
29
29
  /**
@@ -44,30 +44,27 @@ export class SolanaWalletService {
44
44
  * Check if a Solana wallet is already connected
45
45
  */
46
46
  async checkExistingConnection(
47
- adapter: WalletAdapter,
47
+ adapter: SolanaAdapter,
48
48
  walletUuid: string
49
49
  ): Promise<string | null> {
50
50
  try {
51
+ const base58PublicKey = await adapter.publicKey?.toBase58()
51
52
  // Check if adapter has a publicKey (means it's connected)
52
- if (adapter.publicKey) {
53
- return adapter.publicKey.toBase58()
53
+ if (base58PublicKey) {
54
+ return base58PublicKey
54
55
  }
55
56
 
56
57
  // If this wallet was previously connected, try to reconnect
57
58
  // This should work without prompting for wallets that support it
58
59
  if (this.storageService.wasSolanaWalletPreviouslyConnected(walletUuid)) {
59
- if (
60
- 'connecting' in adapter &&
61
- !adapter.connecting &&
62
- 'connect' in adapter
63
- ) {
60
+ const walletIsConnecting = await adapter.connecting
61
+ if (!walletIsConnecting) {
64
62
  try {
65
- // Type assertion needed because TypeScript can't narrow the type properly
66
63
  await adapter.connect()
67
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
- const publicKey = (adapter as any).publicKey
69
- if (publicKey && 'toBase58' in publicKey) {
70
- return publicKey.toBase58()
64
+
65
+ const base58PublicKey = await adapter.publicKey?.toBase58()
66
+ if (base58PublicKey) {
67
+ return base58PublicKey
71
68
  }
72
69
  } catch {
73
70
  // Silent fail - wallet requires user interaction or doesn't support silent reconnect
@@ -83,15 +80,16 @@ export class SolanaWalletService {
83
80
  /**
84
81
  * Connect to wallet
85
82
  */
86
- async connect(adapter: WalletAdapter, walletUuid: string): Promise<string> {
83
+ async connect(adapter: SolanaAdapter, walletUuid: string): Promise<string> {
87
84
  // Connect to the Solana wallet
88
85
  await adapter.connect()
89
86
 
90
- if (!adapter.publicKey) {
91
- throw new Error('No public key returned from wallet')
87
+ const address = await adapter.publicKey?.toBase58()
88
+
89
+ if (!address) {
90
+ throw new Error('No address returned from wallet')
92
91
  }
93
92
 
94
- const address = adapter.publicKey.toBase58()
95
93
  this.connectedAdapter = adapter
96
94
  this.account = address
97
95
 
@@ -124,7 +122,7 @@ export class SolanaWalletService {
124
122
  * Set connection state
125
123
  */
126
124
  setConnectionState(
127
- adapter: WalletAdapter | null,
125
+ adapter: SolanaAdapter | null,
128
126
  account: string | null,
129
127
  walletUuid?: string
130
128
  ): void {
@@ -147,7 +145,7 @@ export class SolanaWalletService {
147
145
  /**
148
146
  * Get connected adapter
149
147
  */
150
- getConnectedAdapter(): WalletAdapter | null {
148
+ getConnectedAdapter(): SolanaAdapter | null {
151
149
  return this.connectedAdapter
152
150
  }
153
151
 
@@ -1,5 +1,4 @@
1
1
  import type { EthereumProvider } from '../eip6963-discovery'
2
- import type { WalletAdapter } from '@solana/wallet-adapter-base'
3
2
  import type {
4
3
  TransactionRequest,
5
4
  TransactionResult,
@@ -10,6 +9,7 @@ import type {
10
9
  import { EthereumTransactionService } from './ethereum/ethereum-transaction-service'
11
10
  import { SolanaTransactionService } from './solana/solana-transaction-service'
12
11
  import { parseError } from '../utils/error-utils'
12
+ import type { SolanaAdapter } from '../wallet-standard-discovery'
13
13
 
14
14
  /**
15
15
  * Service for handling transaction operations across different wallet types
@@ -29,7 +29,7 @@ export class TransactionService {
29
29
  async sendTransaction(
30
30
  request: TransactionRequest,
31
31
  namespace: 'eip155' | 'solana',
32
- provider: EthereumProvider | WalletAdapter
32
+ provider: EthereumProvider | SolanaAdapter
33
33
  ): Promise<TransactionResult> {
34
34
  if (namespace === 'eip155') {
35
35
  return await this.ethereumService.sendTransaction(
@@ -39,7 +39,7 @@ export class TransactionService {
39
39
  } else if (namespace === 'solana') {
40
40
  return await this.solanaService.sendTransaction(
41
41
  request as SolanaTransactionRequest,
42
- provider as WalletAdapter
42
+ provider as SolanaAdapter
43
43
  )
44
44
  } else {
45
45
  throw parseError(new Error(`Unsupported namespace: ${namespace}`))
@@ -7,28 +7,97 @@
7
7
  import type { Wallet } from '@wallet-standard/base'
8
8
  import { getWallets } from '@wallet-standard/app'
9
9
  import { isWalletAdapterCompatibleStandardWallet } from '@solana/wallet-adapter-base'
10
- import type { WalletAdapter } from '@solana/wallet-adapter-base'
11
10
  import { StandardWalletAdapter } from '@solana/wallet-standard-wallet-adapter-base'
12
- import { CoinbaseWalletAdapter } from '@solana/wallet-adapter-wallets'
11
+ import type { Transaction } from '@solana/web3.js'
12
+
13
+ export interface ExtendedStandardWalletAdapter extends StandardWalletAdapter {
14
+ customFunctions: (
15
+ | 'sendSerializedTransaction'
16
+ | 'signSerializedTransaction'
17
+ | 'signAllSerializedTransactions'
18
+ )[]
19
+ sendSerializedTransaction: (
20
+ transaction: unknown,
21
+ rpcUrl: string
22
+ ) => Promise<string>
23
+ signSerializedTransaction: (
24
+ transaction: unknown
25
+ ) => Promise<Error | Transaction>
26
+ signAllSerializedTransactions: (
27
+ transactions: unknown[]
28
+ ) => Promise<Error | Transaction[]>
29
+ }
30
+
31
+ export type SolanaAdapter =
32
+ | ExtendedStandardWalletAdapter
33
+ | StandardWalletAdapter
13
34
 
14
35
  export interface WalletStandardInfo {
15
36
  uuid: string
16
37
  name: string
17
38
  chains: string[]
18
39
  features: string[]
19
- adapter: WalletAdapter | undefined
40
+ adapter: SolanaAdapter | undefined
20
41
  }
21
42
 
22
- export interface SolanaWalletWithAdapter {
23
- info: WalletStandardInfo
24
- wallet: Wallet
25
- adapter?: WalletAdapter
43
+ /**
44
+ * Polls for bridge wallets when UWCBridgeInitialized is true
45
+ * @returns Promise that resolves to an array of detected wallets from the bridge
46
+ */
47
+ async function pollForBridgeWallets(): Promise<WalletStandardInfo[]> {
48
+ const pollInterval = 100 // Poll every 100ms
49
+ const maxPollTime = 3000 // Poll for maximum 3 seconds
50
+ const startTime = Date.now()
51
+
52
+ return new Promise(resolve => {
53
+ const poll = () => {
54
+ // Check if we've exceeded the max poll time
55
+ if (Date.now() - startTime > maxPollTime) {
56
+ resolve([])
57
+ return
58
+ }
59
+
60
+ // Check if window.walletStandardWallets is available
61
+ if (
62
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
63
+ // @ts-ignore - window.eip6963Wallets is set by the bridge
64
+ window.walletStandardWallets &&
65
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
66
+ // @ts-ignore - window.eip6963Wallets is set by the bridge
67
+ Array.isArray(window.walletStandardWallets)
68
+ ) {
69
+ const bridgeWallets =
70
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
71
+ // @ts-ignore
72
+ window.walletStandardWallets as WalletStandardInfo[]
73
+ resolve(bridgeWallets)
74
+ return
75
+ }
76
+
77
+ // Continue polling
78
+ setTimeout(poll, pollInterval)
79
+ }
80
+
81
+ // Start polling
82
+ poll()
83
+ })
26
84
  }
27
85
 
28
86
  /**
29
87
  * Gets all available Solana wallets using Wallet Standard
30
88
  */
31
- export function getSolanaWallets(): WalletStandardInfo[] {
89
+ export async function getSolanaWallets(): Promise<WalletStandardInfo[]> {
90
+ // UWCBridgeChildInitialized is only initialized if app runs in an iframe. We can skip checking for bridge proxy providers when it's not necessary.
91
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
92
+ // @ts-ignore - window.UWCBridgeInitialized is set by the bridge
93
+ if (window.UWCBridgeChildInitialized === true) {
94
+ const wallets = await pollForBridgeWallets()
95
+
96
+ if (wallets.length > 0) {
97
+ return wallets
98
+ }
99
+ }
100
+
32
101
  const { get } = getWallets()
33
102
  const wallets = get()
34
103
 
@@ -56,30 +125,6 @@ export function getSolanaWallets(): WalletStandardInfo[] {
56
125
  }
57
126
  }
58
127
 
59
- // Initialize traditional wallet adapters - Only import CBW for now, as it's not using Wallet Standard
60
- const walletAdapters = [new CoinbaseWalletAdapter()]
61
-
62
- // Add traditional wallet adapters (but skip duplicates)
63
- for (const adapter of walletAdapters) {
64
- if (walletNames.has(adapter.name)) {
65
- // Skipping duplicate wallet already detected via Wallet Standard
66
- continue
67
- }
68
-
69
- const readyState = adapter.readyState
70
- const isDetected = readyState === 'Installed' || readyState === 'Loadable'
71
-
72
- // Only add if installed
73
- if (isDetected) {
74
- solanaWallets.push({
75
- uuid: `${adapter.name}-traditional`.toLowerCase().replace(/\s+/g, '-'),
76
- name: adapter.name,
77
- chains: ['solana:mainnet'],
78
- features: [],
79
- adapter: adapter
80
- })
81
- }
82
- }
83
128
  return solanaWallets
84
129
  }
85
130