@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.
- package/dist/injected-connector.js +2 -2
- package/dist/injected-connector.js.map +1 -1
- 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/signature-service.d.ts +2 -2
- package/dist/services/signature-service.d.ts.map +1 -1
- package/dist/services/signature-service.js +3 -10
- package/dist/services/signature-service.js.map +1 -1
- package/dist/services/solana/solana-transaction-service.d.ts +14 -2
- package/dist/services/solana/solana-transaction-service.d.ts.map +1 -1
- package/dist/services/solana/solana-transaction-service.js +87 -47
- package/dist/services/solana/solana-transaction-service.js.map +1 -1
- package/dist/services/solana/solana-wallet-service.d.ts +6 -7
- package/dist/services/solana/solana-wallet-service.d.ts.map +1 -1
- package/dist/services/solana/solana-wallet-service.js +13 -15
- package/dist/services/solana/solana-wallet-service.js.map +1 -1
- package/dist/services/transaction-service.d.ts +2 -2
- package/dist/services/transaction-service.d.ts.map +1 -1
- package/dist/services/transaction-service.js.map +1 -1
- package/dist/wallet-standard-discovery.d.ts +11 -9
- package/dist/wallet-standard-discovery.d.ts.map +1 -1
- package/dist/wallet-standard-discovery.js +47 -23
- package/dist/wallet-standard-discovery.js.map +1 -1
- package/package.json +2 -2
- package/src/injected-connector.ts +2 -2
- package/src/services/signature-service.ts +5 -17
- package/src/services/solana/solana-transaction-service.ts +121 -60
- package/src/services/solana/solana-wallet-service.ts +21 -23
- package/src/services/transaction-service.ts +3 -3
- 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:
|
|
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:
|
|
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 (
|
|
53
|
-
return
|
|
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
|
-
|
|
60
|
-
|
|
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
|
-
|
|
68
|
-
const
|
|
69
|
-
if (
|
|
70
|
-
return
|
|
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:
|
|
83
|
+
async connect(adapter: SolanaAdapter, walletUuid: string): Promise<string> {
|
|
87
84
|
// Connect to the Solana wallet
|
|
88
85
|
await adapter.connect()
|
|
89
86
|
|
|
90
|
-
|
|
91
|
-
|
|
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:
|
|
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():
|
|
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 |
|
|
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
|
|
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 {
|
|
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:
|
|
40
|
+
adapter: SolanaAdapter | undefined
|
|
20
41
|
}
|
|
21
42
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|