@solana/connector 0.2.2 → 0.2.4
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/README.md +17 -0
- package/dist/{chunk-3623Z2QL.mjs → chunk-CTHICIEC.mjs} +3 -3
- package/dist/{chunk-3623Z2QL.mjs.map → chunk-CTHICIEC.mjs.map} +1 -1
- package/dist/{chunk-SQ2JEA2M.mjs → chunk-KE3IEBN2.mjs} +67 -17
- package/dist/chunk-KE3IEBN2.mjs.map +1 -0
- package/dist/{chunk-TRSJSU33.js → chunk-POESNTBI.js} +67 -17
- package/dist/chunk-POESNTBI.js.map +1 -0
- package/dist/{chunk-VVLY6QPI.js → chunk-R3IOWWA7.js} +18 -18
- package/dist/{chunk-VVLY6QPI.js.map → chunk-R3IOWWA7.js.map} +1 -1
- package/dist/{chunk-DFHJYZKZ.mjs → chunk-SIVITWXE.mjs} +3 -3
- package/dist/{chunk-DFHJYZKZ.mjs.map → chunk-SIVITWXE.mjs.map} +1 -1
- package/dist/{chunk-I2XX5FUG.js → chunk-TMCJU76S.js} +4 -4
- package/dist/{chunk-I2XX5FUG.js.map → chunk-TMCJU76S.js.map} +1 -1
- package/dist/headless.d.mts +7 -2
- package/dist/headless.d.ts +7 -2
- package/dist/headless.js +107 -107
- package/dist/headless.mjs +2 -2
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +148 -148
- package/dist/index.mjs +3 -3
- package/dist/react.d.mts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +49 -49
- package/dist/react.mjs +2 -2
- package/dist/{standard-shim-Cg6fmjK_.d.ts → standard-shim-BB0Lkg_C.d.ts} +34 -1
- package/dist/{standard-shim-Cz4UNS7t.d.mts → standard-shim-n5phZB1d.d.mts} +34 -1
- package/package.json +1 -1
- package/dist/chunk-SQ2JEA2M.mjs.map +0 -1
- package/dist/chunk-TRSJSU33.js.map +0 -1
package/README.md
CHANGED
|
@@ -70,6 +70,12 @@ export function Providers({ children }: { children: React.ReactNode }) {
|
|
|
70
70
|
autoConnect: true,
|
|
71
71
|
enableMobile: true,
|
|
72
72
|
clusters,
|
|
73
|
+
// Optional: Control which detected wallets are shown/available (Wallet Standard auto-discovery)
|
|
74
|
+
wallets: {
|
|
75
|
+
allowList: ['Phantom', 'Solflare', 'Backpack'],
|
|
76
|
+
denyList: ['Keplr', 'MetaMask'],
|
|
77
|
+
featured: ['Phantom', 'Solflare'],
|
|
78
|
+
},
|
|
73
79
|
});
|
|
74
80
|
}, []);
|
|
75
81
|
|
|
@@ -90,6 +96,16 @@ export function Providers({ children }: { children: React.ReactNode }) {
|
|
|
90
96
|
}
|
|
91
97
|
```
|
|
92
98
|
|
|
99
|
+
**Optional: Wallet filtering & ordering**
|
|
100
|
+
|
|
101
|
+
ConnectorKit auto-detects wallets via Wallet Standard. To improve UX for users with many installed wallets, you can filter/prioritize the detected list using `wallets`.
|
|
102
|
+
|
|
103
|
+
- `allowList`: only expose these wallet names
|
|
104
|
+
- `denyList`: hide these wallet names (deny wins)
|
|
105
|
+
- `featured`: show these wallets first
|
|
106
|
+
|
|
107
|
+
This is **full-scope** filtering: hidden wallets are removed from `connectors` and cannot be selected or auto-connected.
|
|
108
|
+
|
|
93
109
|
### 3. Use Hooks (in any component)
|
|
94
110
|
|
|
95
111
|
```typescript
|
|
@@ -1467,6 +1483,7 @@ import { AppProvider, useConnector, useWallet, useConnectWallet } from '@solana/
|
|
|
1467
1483
|
import type {
|
|
1468
1484
|
// Configuration
|
|
1469
1485
|
ConnectorConfig,
|
|
1486
|
+
WalletDisplayConfig,
|
|
1470
1487
|
DefaultConfigOptions,
|
|
1471
1488
|
ExtendedConnectorConfig,
|
|
1472
1489
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getClusterType } from './chunk-
|
|
1
|
+
import { getClusterType } from './chunk-KE3IEBN2.mjs';
|
|
2
2
|
import { getExplorerLink } from './chunk-SJCQ3KZE.mjs';
|
|
3
3
|
export { createSolanaDevnet, createSolanaLocalnet, createSolanaMainnet, createSolanaTestnet } from '@wallet-ui/core';
|
|
4
4
|
export { createSignableMessage } from '@solana/signers';
|
|
@@ -174,5 +174,5 @@ async function copySignature(signature) {
|
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
export { SOLANA_CHAIN_IDS, chainIdToClusterId, chainIdToClusterType, clusterToChainId, copySignature, formatSignature, getAllExplorerUrls, getChainIdFromCluster, getChainIdFromClusterId, getChainIdFromClusterType, getChainIdFromConnection, getClusterIdFromChainId, getClusterTypeFromChainId, getClusterTypeFromConnection, getLatestBlockhash, getSolanaExplorerUrl, getSolanaFmUrl, getSolscanUrl, getXrayUrl, isAccountAddress, isKitConnection, isKnownSolanaChain, isLegacyConnection, isSolanaChain, isWalletName, sendRawTransaction, validateKnownSolanaChain };
|
|
177
|
-
//# sourceMappingURL=chunk-
|
|
178
|
-
//# sourceMappingURL=chunk-
|
|
177
|
+
//# sourceMappingURL=chunk-CTHICIEC.mjs.map
|
|
178
|
+
//# sourceMappingURL=chunk-CTHICIEC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/wallets.ts","../src/lib/connection/types.ts","../src/lib/connection/helpers.ts","../src/utils/chain.ts","../src/lib/utils/explorer-urls.ts"],"names":[],"mappings":"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","file":"chunk-3623Z2QL.mjs","sourcesContent":["/**\n * Wallet-related types\n * Re-exports from @wallet-standard/base and custom wallet types\n */\n\nimport type { Wallet, WalletAccount } from '@wallet-standard/base';\n\n// Re-export standard types\nexport type { Wallet, WalletAccount };\n\n/**\n * Wallet name as a branded string for type safety\n * Represents the unique identifier for a wallet (e.g., \"Phantom\", \"Solflare\")\n */\nexport type WalletName = string & { readonly __brand: 'WalletName' };\n\n/**\n * Account address as a branded string for type safety\n * Represents a Solana address (base58-encoded public key)\n *\n * @deprecated Use `Address` from '@solana/addresses' instead for consistent address typing\n */\nexport type AccountAddress = string & { readonly __brand: 'AccountAddress' };\n\n/**\n * Type guard to check if a string is a valid wallet name\n */\nexport function isWalletName(value: string): value is WalletName {\n return typeof value === 'string' && value.length > 0;\n}\n\n/**\n * Type guard to check if a string is a valid account address\n *\n * @deprecated Use `isAddress` from '@solana/addresses' instead for proper address validation\n */\nexport function isAccountAddress(value: string): value is AccountAddress {\n // Basic validation: Solana addresses are typically 32-44 characters\n return typeof value === 'string' && value.length >= 32 && value.length <= 44;\n}\n\n/**\n * Extended wallet information with capability metadata\n */\nexport interface WalletInfo {\n /** The Wallet Standard wallet object */\n wallet: Wallet;\n /** Whether the wallet extension is installed */\n installed: boolean;\n /** Precomputed capability flag for UI convenience */\n connectable?: boolean;\n}\n","import type { Connection } from '@solana/web3.js';\n\nexport type Commitment = 'processed' | 'confirmed' | 'finalized';\n\nexport interface KitSendTransactionOptions {\n commitment?: Commitment;\n skipPreflight?: boolean;\n maxRetries?: number;\n}\n\nexport type KitRpc = {\n getLatestBlockhash(options?: { commitment?: Commitment }): {\n send(): Promise<{ value: { blockhash: string; lastValidBlockHeight: number } }>;\n };\n sendTransaction(\n bytes: Uint8Array | string,\n options?: KitSendTransactionOptions,\n ): {\n send(): Promise<string>;\n };\n send?: () => unknown;\n};\n\nexport type DualConnection = Connection | KitRpc;\n\nexport function isLegacyConnection(conn: DualConnection): conn is Connection {\n return 'rpcEndpoint' in conn && typeof (conn as Connection).rpcEndpoint === 'string';\n}\n\nexport function isKitConnection(conn: DualConnection): conn is KitRpc {\n if ('rpcEndpoint' in conn) {\n return false;\n }\n\n const asKitRpc = conn as KitRpc;\n return typeof asKitRpc.getLatestBlockhash === 'function' && typeof asKitRpc.sendTransaction === 'function';\n}\n","/**\n * @solana/connector - Connection Helpers\n *\n * Abstraction layer for working with both legacy @solana/web3.js Connection\n * and modern Kit/gill Rpc objects.\n */\n\nimport type { SendOptions } from '@solana/web3.js';\nimport type { DualConnection, Commitment, KitRpc } from './types';\nimport { isLegacyConnection, isKitConnection } from './types';\n\n/**\n * Get latest blockhash from either legacy Connection or Kit Rpc\n *\n * Abstracts the differences between web3.js 1.x and Kit/gill APIs.\n *\n * @param connection - Legacy Connection or Kit Rpc\n * @param commitment - Optional commitment level (default: 'confirmed')\n * @returns Latest blockhash and last valid block height\n *\n * @example\n * ```typescript\n * // Works with both Connection and Rpc\n * const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(connection);\n * ```\n */\nexport async function getLatestBlockhash(\n connection: DualConnection,\n commitment: Commitment = 'confirmed',\n): Promise<{ blockhash: string; lastValidBlockHeight: number }> {\n if (isLegacyConnection(connection)) {\n // Legacy Connection API\n return await connection.getLatestBlockhash(commitment);\n }\n\n if (isKitConnection(connection)) {\n // Kit/gill Rpc API - returns { value: { blockhash, lastValidBlockHeight } }\n const rpc = connection as KitRpc;\n const result = await rpc.getLatestBlockhash({ commitment }).send();\n return result.value;\n }\n\n throw new Error('Unsupported connection type');\n}\n\n/**\n * Send raw transaction bytes to either legacy Connection or Kit Rpc\n *\n * Abstracts the differences between web3.js 1.x and Kit/gill APIs.\n *\n * @param connection - Legacy Connection or Kit Rpc\n * @param bytes - Raw transaction bytes\n * @param options - Optional send options (skipPreflight, maxRetries, etc.)\n * @returns Transaction signature string\n *\n * @example\n * ```typescript\n * // Works with both Connection and Rpc\n * const signature = await sendRawTransaction(connection, transactionBytes, {\n * skipPreflight: false,\n * maxRetries: 3\n * });\n * ```\n */\nexport async function sendRawTransaction(\n connection: DualConnection,\n bytes: Uint8Array,\n options?: SendOptions & { commitment?: Commitment },\n): Promise<string> {\n if (isLegacyConnection(connection)) {\n // Legacy Connection API\n return await connection.sendRawTransaction(bytes, options);\n }\n\n if (isKitConnection(connection)) {\n // Kit/gill Rpc API\n // Note: gill's sendTransaction expects different options format\n const rpc = connection as KitRpc;\n // Convert Uint8Array to base64 string\n const base64String = Buffer.from(bytes).toString('base64');\n const result = await rpc\n .sendTransaction(base64String as Uint8Array | string, {\n ...(options?.commitment ? { commitment: options.commitment } : {}),\n ...(options?.skipPreflight !== undefined ? { skipPreflight: options.skipPreflight } : {}),\n ...(options?.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n })\n .send();\n\n // Kit Rpc returns signature string directly\n return result;\n }\n\n throw new Error('Unsupported connection type');\n}\n","import type { SolanaCluster, SolanaClusterId } from '@wallet-ui/core';\nimport type { Connection } from '@solana/web3.js';\nimport type { ClusterType } from './cluster';\nimport { getClusterType, isMainnetCluster, isDevnetCluster, isTestnetCluster } from './cluster';\n\nexport const SOLANA_CHAIN_IDS = {\n mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n} as const;\n\nconst CHAIN_ID_TO_CLUSTER_TYPE: Record<string, ClusterType> = {\n [SOLANA_CHAIN_IDS.mainnet]: 'mainnet',\n [SOLANA_CHAIN_IDS.devnet]: 'devnet',\n [SOLANA_CHAIN_IDS.testnet]: 'testnet',\n};\n\nconst CLUSTER_ID_TO_CHAIN_ID: Partial<Record<SolanaClusterId, string>> = {\n 'solana:mainnet': SOLANA_CHAIN_IDS.mainnet,\n 'solana:mainnet-beta': SOLANA_CHAIN_IDS.mainnet,\n 'solana:devnet': SOLANA_CHAIN_IDS.devnet,\n 'solana:testnet': SOLANA_CHAIN_IDS.testnet,\n};\n\nexport function getChainIdFromCluster(cluster: SolanaCluster): `solana:${string}` | null {\n const clusterType = getClusterType(cluster);\n\n if (clusterType === 'localnet' || clusterType === 'custom') {\n return null;\n }\n\n return getChainIdFromClusterType(clusterType);\n}\n\nexport function getChainIdFromClusterId(clusterId: SolanaClusterId): `solana:${string}` | null {\n return (CLUSTER_ID_TO_CHAIN_ID[clusterId] as `solana:${string}` | undefined) || null;\n}\n\nexport function getChainIdFromClusterType(type: ClusterType): `solana:${string}` | null {\n switch (type) {\n case 'mainnet':\n return SOLANA_CHAIN_IDS.mainnet;\n case 'devnet':\n return SOLANA_CHAIN_IDS.devnet;\n case 'testnet':\n return SOLANA_CHAIN_IDS.testnet;\n case 'localnet':\n case 'custom':\n return null;\n }\n}\n\nexport function getClusterTypeFromChainId(chainId: string): ClusterType | null {\n return CHAIN_ID_TO_CLUSTER_TYPE[chainId] || null;\n}\n\nexport function getClusterIdFromChainId(chainId: string): SolanaClusterId | null {\n const clusterType = getClusterTypeFromChainId(chainId);\n if (!clusterType) {\n return null;\n }\n\n switch (clusterType) {\n case 'mainnet':\n return 'solana:mainnet';\n case 'devnet':\n return 'solana:devnet';\n case 'testnet':\n return 'solana:testnet';\n default:\n return null;\n }\n}\n\nexport function isSolanaChain(chain: string): chain is `solana:${string}` {\n return chain.startsWith('solana:');\n}\n\nexport function isKnownSolanaChain(chain: string): boolean {\n return (\n chain === SOLANA_CHAIN_IDS.mainnet || chain === SOLANA_CHAIN_IDS.devnet || chain === SOLANA_CHAIN_IDS.testnet\n );\n}\n\nexport function validateKnownSolanaChain(chain: string): asserts chain is `solana:${string}` {\n if (!isSolanaChain(chain)) {\n throw new Error(`Invalid chain format: expected 'solana:...', got '${chain}'`);\n }\n\n if (!isKnownSolanaChain(chain)) {\n throw new Error(`Unknown Solana chain: ${chain}. Known chains: ${Object.values(SOLANA_CHAIN_IDS).join(', ')}`);\n }\n}\n\nexport function getClusterTypeFromConnection(connection: Connection | null): ClusterType | null {\n if (!connection) {\n return null;\n }\n\n const rpcUrl = connection.rpcEndpoint || '';\n\n if (rpcUrl.includes('mainnet') || rpcUrl.includes('api.mainnet-beta')) {\n return 'mainnet';\n }\n\n if (rpcUrl.includes('testnet')) {\n return 'testnet';\n }\n\n if (rpcUrl.includes('devnet')) {\n return 'devnet';\n }\n\n if (rpcUrl.includes('localhost') || rpcUrl.includes('127.0.0.1')) {\n return 'localnet';\n }\n\n return 'custom';\n}\n\nexport function getChainIdFromConnection(\n connection: Connection | null,\n network?: 'mainnet' | 'devnet' | 'testnet',\n): `solana:${string}` | null {\n if (network) {\n return getChainIdFromClusterType(network);\n }\n\n const clusterType = getClusterTypeFromConnection(connection);\n if (!clusterType) {\n return null;\n }\n\n return getChainIdFromClusterType(clusterType);\n}\n\nexport function clusterToChainId(cluster: SolanaCluster): `solana:${string}` | null {\n return getChainIdFromCluster(cluster);\n}\n\nexport function chainIdToClusterType(chainId: string): ClusterType | null {\n return getClusterTypeFromChainId(chainId);\n}\n\nexport function chainIdToClusterId(chainId: string): SolanaClusterId | null {\n return getClusterIdFromChainId(chainId);\n}\n","/**\n * @solana/connector - Explorer URL Utilities\n *\n * Generate URLs for various Solana block explorers to view transactions,\n * accounts, and other on-chain data.\n */\n\nimport { getExplorerLink } from '../kit';\n\nexport type ExplorerType = 'solana-explorer' | 'solscan' | 'xray' | 'solana-fm';\n\nexport interface ExplorerOptions {\n /** Cluster to use for the explorer link */\n cluster?: string;\n /** Custom RPC URL for localnet */\n customUrl?: string;\n}\n\n/**\n * Generate Solana Explorer URL for a transaction signature\n */\nexport function getSolanaExplorerUrl(signature: string, options: ExplorerOptions = {}): string {\n const { cluster = 'mainnet', customUrl } = options;\n const normalizedCluster = cluster === 'mainnet-beta' ? 'mainnet' : cluster;\n\n // Handle localnet with custom URL - gill doesn't support this specific case\n if (normalizedCluster === 'localnet') {\n const url = customUrl || 'http://localhost:8899';\n return `https://explorer.solana.com/tx/${signature}?cluster=custom&customUrl=${encodeURIComponent(url)}`;\n }\n\n // Map to valid gill cluster types (custom clusters default to devnet)\n const validClusters = ['mainnet', 'devnet', 'testnet'] as const;\n const explorerCluster = validClusters.includes(normalizedCluster as 'mainnet' | 'devnet' | 'testnet')\n ? (normalizedCluster as 'mainnet' | 'devnet' | 'testnet')\n : 'devnet';\n\n // Use gill's getExplorerLink for standard clusters\n return getExplorerLink({\n transaction: signature,\n cluster: explorerCluster,\n });\n}\n\n/**\n * Generate Solscan URL for a transaction signature\n */\nexport function getSolscanUrl(signature: string, options: ExplorerOptions = {}): string {\n const { cluster = 'mainnet' } = options;\n const normalizedCluster = cluster === 'mainnet-beta' ? 'mainnet' : cluster;\n\n if (normalizedCluster === 'mainnet') {\n return `https://solscan.io/tx/${signature}`;\n }\n\n if (normalizedCluster === 'localnet') {\n return `https://solscan.io/tx/${signature}?cluster=custom`;\n }\n\n return `https://solscan.io/tx/${signature}?cluster=${normalizedCluster}`;\n}\n\n/**\n * Generate XRAY (Helius) URL for a transaction signature\n * Note: XRAY works best with mainnet transactions\n */\nexport function getXrayUrl(signature: string): string {\n return `https://xray.helius.xyz/tx/${signature}`;\n}\n\n/**\n * Generate SolanaFM URL for a transaction signature\n */\nexport function getSolanaFmUrl(signature: string, options: ExplorerOptions = {}): string {\n const { cluster = 'mainnet' } = options;\n const normalizedCluster = cluster === 'mainnet-beta' ? 'mainnet' : cluster;\n\n if (normalizedCluster === 'mainnet') {\n return `https://solana.fm/tx/${signature}`;\n }\n\n return `https://solana.fm/tx/${signature}?cluster=${normalizedCluster}`;\n}\n\n/**\n * Get all explorer URLs for a transaction\n */\nexport function getAllExplorerUrls(signature: string, options: ExplorerOptions = {}): Record<ExplorerType, string> {\n return {\n 'solana-explorer': getSolanaExplorerUrl(signature, options),\n solscan: getSolscanUrl(signature, options),\n xray: getXrayUrl(signature),\n 'solana-fm': getSolanaFmUrl(signature, options),\n };\n}\n\n/**\n * Format a transaction signature for display (truncated)\n */\nexport function formatSignature(signature: string, chars = 8): string {\n if (signature.length <= chars * 2) return signature;\n return `${signature.slice(0, chars)}...${signature.slice(-chars)}`;\n}\n\n/**\n * Copy signature to clipboard with enhanced error handling\n *\n * @deprecated Use copySignatureToClipboard from utils/clipboard instead\n * This is maintained for backwards compatibility but will be removed in a future version\n */\nexport async function copySignature(signature: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(signature);\n return true;\n } catch {\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/wallets.ts","../src/lib/connection/types.ts","../src/lib/connection/helpers.ts","../src/utils/chain.ts","../src/lib/utils/explorer-urls.ts"],"names":[],"mappings":"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","file":"chunk-CTHICIEC.mjs","sourcesContent":["/**\n * Wallet-related types\n * Re-exports from @wallet-standard/base and custom wallet types\n */\n\nimport type { Wallet, WalletAccount } from '@wallet-standard/base';\n\n// Re-export standard types\nexport type { Wallet, WalletAccount };\n\n/**\n * Wallet name as a branded string for type safety\n * Represents the unique identifier for a wallet (e.g., \"Phantom\", \"Solflare\")\n */\nexport type WalletName = string & { readonly __brand: 'WalletName' };\n\n/**\n * Account address as a branded string for type safety\n * Represents a Solana address (base58-encoded public key)\n *\n * @deprecated Use `Address` from '@solana/addresses' instead for consistent address typing\n */\nexport type AccountAddress = string & { readonly __brand: 'AccountAddress' };\n\n/**\n * Type guard to check if a string is a valid wallet name\n */\nexport function isWalletName(value: string): value is WalletName {\n return typeof value === 'string' && value.length > 0;\n}\n\n/**\n * Type guard to check if a string is a valid account address\n *\n * @deprecated Use `isAddress` from '@solana/addresses' instead for proper address validation\n */\nexport function isAccountAddress(value: string): value is AccountAddress {\n // Basic validation: Solana addresses are typically 32-44 characters\n return typeof value === 'string' && value.length >= 32 && value.length <= 44;\n}\n\n/**\n * Extended wallet information with capability metadata\n */\nexport interface WalletInfo {\n /** The Wallet Standard wallet object */\n wallet: Wallet;\n /** Whether the wallet extension is installed */\n installed: boolean;\n /** Precomputed capability flag for UI convenience */\n connectable?: boolean;\n}\n","import type { Connection } from '@solana/web3.js';\n\nexport type Commitment = 'processed' | 'confirmed' | 'finalized';\n\nexport interface KitSendTransactionOptions {\n commitment?: Commitment;\n skipPreflight?: boolean;\n maxRetries?: number;\n}\n\nexport type KitRpc = {\n getLatestBlockhash(options?: { commitment?: Commitment }): {\n send(): Promise<{ value: { blockhash: string; lastValidBlockHeight: number } }>;\n };\n sendTransaction(\n bytes: Uint8Array | string,\n options?: KitSendTransactionOptions,\n ): {\n send(): Promise<string>;\n };\n send?: () => unknown;\n};\n\nexport type DualConnection = Connection | KitRpc;\n\nexport function isLegacyConnection(conn: DualConnection): conn is Connection {\n return 'rpcEndpoint' in conn && typeof (conn as Connection).rpcEndpoint === 'string';\n}\n\nexport function isKitConnection(conn: DualConnection): conn is KitRpc {\n if ('rpcEndpoint' in conn) {\n return false;\n }\n\n const asKitRpc = conn as KitRpc;\n return typeof asKitRpc.getLatestBlockhash === 'function' && typeof asKitRpc.sendTransaction === 'function';\n}\n","/**\n * @solana/connector - Connection Helpers\n *\n * Abstraction layer for working with both legacy @solana/web3.js Connection\n * and modern Kit/gill Rpc objects.\n */\n\nimport type { SendOptions } from '@solana/web3.js';\nimport type { DualConnection, Commitment, KitRpc } from './types';\nimport { isLegacyConnection, isKitConnection } from './types';\n\n/**\n * Get latest blockhash from either legacy Connection or Kit Rpc\n *\n * Abstracts the differences between web3.js 1.x and Kit/gill APIs.\n *\n * @param connection - Legacy Connection or Kit Rpc\n * @param commitment - Optional commitment level (default: 'confirmed')\n * @returns Latest blockhash and last valid block height\n *\n * @example\n * ```typescript\n * // Works with both Connection and Rpc\n * const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(connection);\n * ```\n */\nexport async function getLatestBlockhash(\n connection: DualConnection,\n commitment: Commitment = 'confirmed',\n): Promise<{ blockhash: string; lastValidBlockHeight: number }> {\n if (isLegacyConnection(connection)) {\n // Legacy Connection API\n return await connection.getLatestBlockhash(commitment);\n }\n\n if (isKitConnection(connection)) {\n // Kit/gill Rpc API - returns { value: { blockhash, lastValidBlockHeight } }\n const rpc = connection as KitRpc;\n const result = await rpc.getLatestBlockhash({ commitment }).send();\n return result.value;\n }\n\n throw new Error('Unsupported connection type');\n}\n\n/**\n * Send raw transaction bytes to either legacy Connection or Kit Rpc\n *\n * Abstracts the differences between web3.js 1.x and Kit/gill APIs.\n *\n * @param connection - Legacy Connection or Kit Rpc\n * @param bytes - Raw transaction bytes\n * @param options - Optional send options (skipPreflight, maxRetries, etc.)\n * @returns Transaction signature string\n *\n * @example\n * ```typescript\n * // Works with both Connection and Rpc\n * const signature = await sendRawTransaction(connection, transactionBytes, {\n * skipPreflight: false,\n * maxRetries: 3\n * });\n * ```\n */\nexport async function sendRawTransaction(\n connection: DualConnection,\n bytes: Uint8Array,\n options?: SendOptions & { commitment?: Commitment },\n): Promise<string> {\n if (isLegacyConnection(connection)) {\n // Legacy Connection API\n return await connection.sendRawTransaction(bytes, options);\n }\n\n if (isKitConnection(connection)) {\n // Kit/gill Rpc API\n // Note: gill's sendTransaction expects different options format\n const rpc = connection as KitRpc;\n // Convert Uint8Array to base64 string\n const base64String = Buffer.from(bytes).toString('base64');\n const result = await rpc\n .sendTransaction(base64String as Uint8Array | string, {\n ...(options?.commitment ? { commitment: options.commitment } : {}),\n ...(options?.skipPreflight !== undefined ? { skipPreflight: options.skipPreflight } : {}),\n ...(options?.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n })\n .send();\n\n // Kit Rpc returns signature string directly\n return result;\n }\n\n throw new Error('Unsupported connection type');\n}\n","import type { SolanaCluster, SolanaClusterId } from '@wallet-ui/core';\nimport type { Connection } from '@solana/web3.js';\nimport type { ClusterType } from './cluster';\nimport { getClusterType, isMainnetCluster, isDevnetCluster, isTestnetCluster } from './cluster';\n\nexport const SOLANA_CHAIN_IDS = {\n mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n} as const;\n\nconst CHAIN_ID_TO_CLUSTER_TYPE: Record<string, ClusterType> = {\n [SOLANA_CHAIN_IDS.mainnet]: 'mainnet',\n [SOLANA_CHAIN_IDS.devnet]: 'devnet',\n [SOLANA_CHAIN_IDS.testnet]: 'testnet',\n};\n\nconst CLUSTER_ID_TO_CHAIN_ID: Partial<Record<SolanaClusterId, string>> = {\n 'solana:mainnet': SOLANA_CHAIN_IDS.mainnet,\n 'solana:mainnet-beta': SOLANA_CHAIN_IDS.mainnet,\n 'solana:devnet': SOLANA_CHAIN_IDS.devnet,\n 'solana:testnet': SOLANA_CHAIN_IDS.testnet,\n};\n\nexport function getChainIdFromCluster(cluster: SolanaCluster): `solana:${string}` | null {\n const clusterType = getClusterType(cluster);\n\n if (clusterType === 'localnet' || clusterType === 'custom') {\n return null;\n }\n\n return getChainIdFromClusterType(clusterType);\n}\n\nexport function getChainIdFromClusterId(clusterId: SolanaClusterId): `solana:${string}` | null {\n return (CLUSTER_ID_TO_CHAIN_ID[clusterId] as `solana:${string}` | undefined) || null;\n}\n\nexport function getChainIdFromClusterType(type: ClusterType): `solana:${string}` | null {\n switch (type) {\n case 'mainnet':\n return SOLANA_CHAIN_IDS.mainnet;\n case 'devnet':\n return SOLANA_CHAIN_IDS.devnet;\n case 'testnet':\n return SOLANA_CHAIN_IDS.testnet;\n case 'localnet':\n case 'custom':\n return null;\n }\n}\n\nexport function getClusterTypeFromChainId(chainId: string): ClusterType | null {\n return CHAIN_ID_TO_CLUSTER_TYPE[chainId] || null;\n}\n\nexport function getClusterIdFromChainId(chainId: string): SolanaClusterId | null {\n const clusterType = getClusterTypeFromChainId(chainId);\n if (!clusterType) {\n return null;\n }\n\n switch (clusterType) {\n case 'mainnet':\n return 'solana:mainnet';\n case 'devnet':\n return 'solana:devnet';\n case 'testnet':\n return 'solana:testnet';\n default:\n return null;\n }\n}\n\nexport function isSolanaChain(chain: string): chain is `solana:${string}` {\n return chain.startsWith('solana:');\n}\n\nexport function isKnownSolanaChain(chain: string): boolean {\n return (\n chain === SOLANA_CHAIN_IDS.mainnet || chain === SOLANA_CHAIN_IDS.devnet || chain === SOLANA_CHAIN_IDS.testnet\n );\n}\n\nexport function validateKnownSolanaChain(chain: string): asserts chain is `solana:${string}` {\n if (!isSolanaChain(chain)) {\n throw new Error(`Invalid chain format: expected 'solana:...', got '${chain}'`);\n }\n\n if (!isKnownSolanaChain(chain)) {\n throw new Error(`Unknown Solana chain: ${chain}. Known chains: ${Object.values(SOLANA_CHAIN_IDS).join(', ')}`);\n }\n}\n\nexport function getClusterTypeFromConnection(connection: Connection | null): ClusterType | null {\n if (!connection) {\n return null;\n }\n\n const rpcUrl = connection.rpcEndpoint || '';\n\n if (rpcUrl.includes('mainnet') || rpcUrl.includes('api.mainnet-beta')) {\n return 'mainnet';\n }\n\n if (rpcUrl.includes('testnet')) {\n return 'testnet';\n }\n\n if (rpcUrl.includes('devnet')) {\n return 'devnet';\n }\n\n if (rpcUrl.includes('localhost') || rpcUrl.includes('127.0.0.1')) {\n return 'localnet';\n }\n\n return 'custom';\n}\n\nexport function getChainIdFromConnection(\n connection: Connection | null,\n network?: 'mainnet' | 'devnet' | 'testnet',\n): `solana:${string}` | null {\n if (network) {\n return getChainIdFromClusterType(network);\n }\n\n const clusterType = getClusterTypeFromConnection(connection);\n if (!clusterType) {\n return null;\n }\n\n return getChainIdFromClusterType(clusterType);\n}\n\nexport function clusterToChainId(cluster: SolanaCluster): `solana:${string}` | null {\n return getChainIdFromCluster(cluster);\n}\n\nexport function chainIdToClusterType(chainId: string): ClusterType | null {\n return getClusterTypeFromChainId(chainId);\n}\n\nexport function chainIdToClusterId(chainId: string): SolanaClusterId | null {\n return getClusterIdFromChainId(chainId);\n}\n","/**\n * @solana/connector - Explorer URL Utilities\n *\n * Generate URLs for various Solana block explorers to view transactions,\n * accounts, and other on-chain data.\n */\n\nimport { getExplorerLink } from '../kit';\n\nexport type ExplorerType = 'solana-explorer' | 'solscan' | 'xray' | 'solana-fm';\n\nexport interface ExplorerOptions {\n /** Cluster to use for the explorer link */\n cluster?: string;\n /** Custom RPC URL for localnet */\n customUrl?: string;\n}\n\n/**\n * Generate Solana Explorer URL for a transaction signature\n */\nexport function getSolanaExplorerUrl(signature: string, options: ExplorerOptions = {}): string {\n const { cluster = 'mainnet', customUrl } = options;\n const normalizedCluster = cluster === 'mainnet-beta' ? 'mainnet' : cluster;\n\n // Handle localnet with custom URL - gill doesn't support this specific case\n if (normalizedCluster === 'localnet') {\n const url = customUrl || 'http://localhost:8899';\n return `https://explorer.solana.com/tx/${signature}?cluster=custom&customUrl=${encodeURIComponent(url)}`;\n }\n\n // Map to valid gill cluster types (custom clusters default to devnet)\n const validClusters = ['mainnet', 'devnet', 'testnet'] as const;\n const explorerCluster = validClusters.includes(normalizedCluster as 'mainnet' | 'devnet' | 'testnet')\n ? (normalizedCluster as 'mainnet' | 'devnet' | 'testnet')\n : 'devnet';\n\n // Use gill's getExplorerLink for standard clusters\n return getExplorerLink({\n transaction: signature,\n cluster: explorerCluster,\n });\n}\n\n/**\n * Generate Solscan URL for a transaction signature\n */\nexport function getSolscanUrl(signature: string, options: ExplorerOptions = {}): string {\n const { cluster = 'mainnet' } = options;\n const normalizedCluster = cluster === 'mainnet-beta' ? 'mainnet' : cluster;\n\n if (normalizedCluster === 'mainnet') {\n return `https://solscan.io/tx/${signature}`;\n }\n\n if (normalizedCluster === 'localnet') {\n return `https://solscan.io/tx/${signature}?cluster=custom`;\n }\n\n return `https://solscan.io/tx/${signature}?cluster=${normalizedCluster}`;\n}\n\n/**\n * Generate XRAY (Helius) URL for a transaction signature\n * Note: XRAY works best with mainnet transactions\n */\nexport function getXrayUrl(signature: string): string {\n return `https://xray.helius.xyz/tx/${signature}`;\n}\n\n/**\n * Generate SolanaFM URL for a transaction signature\n */\nexport function getSolanaFmUrl(signature: string, options: ExplorerOptions = {}): string {\n const { cluster = 'mainnet' } = options;\n const normalizedCluster = cluster === 'mainnet-beta' ? 'mainnet' : cluster;\n\n if (normalizedCluster === 'mainnet') {\n return `https://solana.fm/tx/${signature}`;\n }\n\n return `https://solana.fm/tx/${signature}?cluster=${normalizedCluster}`;\n}\n\n/**\n * Get all explorer URLs for a transaction\n */\nexport function getAllExplorerUrls(signature: string, options: ExplorerOptions = {}): Record<ExplorerType, string> {\n return {\n 'solana-explorer': getSolanaExplorerUrl(signature, options),\n solscan: getSolscanUrl(signature, options),\n xray: getXrayUrl(signature),\n 'solana-fm': getSolanaFmUrl(signature, options),\n };\n}\n\n/**\n * Format a transaction signature for display (truncated)\n */\nexport function formatSignature(signature: string, chars = 8): string {\n if (signature.length <= chars * 2) return signature;\n return `${signature.slice(0, chars)}...${signature.slice(-chars)}`;\n}\n\n/**\n * Copy signature to clipboard with enhanced error handling\n *\n * @deprecated Use copySignatureToClipboard from utils/clipboard instead\n * This is maintained for backwards compatibility but will be removed in a future version\n */\nexport async function copySignature(signature: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(signature);\n return true;\n } catch {\n return false;\n }\n}\n"]}
|
|
@@ -702,6 +702,28 @@ var logger3 = createLogger("WalletDetector");
|
|
|
702
702
|
function isSolanaWallet(wallet) {
|
|
703
703
|
return Array.isArray(wallet.chains) && wallet.chains.some((chain) => typeof chain == "string" && chain.startsWith("solana:"));
|
|
704
704
|
}
|
|
705
|
+
function normalizeWalletName(value) {
|
|
706
|
+
return value.trim().toLowerCase();
|
|
707
|
+
}
|
|
708
|
+
function applyWalletDisplayConfig(wallets, config) {
|
|
709
|
+
if (!config) return [...wallets];
|
|
710
|
+
let allowList = (config.allowList ?? []).map(normalizeWalletName).filter(Boolean), denyList = (config.denyList ?? []).map(normalizeWalletName).filter(Boolean), featured = (config.featured ?? []).map(normalizeWalletName).filter(Boolean), allowSet = new Set(allowList), denySet = new Set(denyList), filtered = wallets.filter((wallet) => {
|
|
711
|
+
let name = normalizeWalletName(wallet.name);
|
|
712
|
+
return !(denySet.has(name) || allowSet.size > 0 && !allowSet.has(name));
|
|
713
|
+
});
|
|
714
|
+
if (featured.length === 0) return filtered;
|
|
715
|
+
let byName = /* @__PURE__ */ new Map();
|
|
716
|
+
for (let wallet of filtered)
|
|
717
|
+
byName.set(normalizeWalletName(wallet.name), wallet);
|
|
718
|
+
let featuredWallets = [], featuredNames = /* @__PURE__ */ new Set();
|
|
719
|
+
for (let name of featured) {
|
|
720
|
+
if (featuredNames.has(name)) continue;
|
|
721
|
+
let wallet = byName.get(name);
|
|
722
|
+
wallet && (featuredNames.add(name), featuredWallets.push(wallet));
|
|
723
|
+
}
|
|
724
|
+
let remaining = filtered.filter((wallet) => !featuredNames.has(normalizeWalletName(wallet.name)));
|
|
725
|
+
return [...featuredWallets, ...remaining];
|
|
726
|
+
}
|
|
705
727
|
function hasFeature(wallet, featureName) {
|
|
706
728
|
return wallet.features != null && wallet.features[featureName] !== void 0;
|
|
707
729
|
}
|
|
@@ -725,6 +747,7 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
725
747
|
super({ stateManager, eventEmitter, debug }, "WalletDetector");
|
|
726
748
|
__publicField(this, "unsubscribers", []);
|
|
727
749
|
__publicField(this, "additionalWallets", []);
|
|
750
|
+
__publicField(this, "walletDisplayConfig");
|
|
728
751
|
/** Map from stable connector ID to Wallet reference (not stored in state) */
|
|
729
752
|
__publicField(this, "connectorRegistry", /* @__PURE__ */ new Map());
|
|
730
753
|
}
|
|
@@ -743,20 +766,27 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
743
766
|
getAdditionalWallets() {
|
|
744
767
|
return this.additionalWallets;
|
|
745
768
|
}
|
|
769
|
+
/**
|
|
770
|
+
* Set wallet display controls for Wallet Standard auto-discovery.
|
|
771
|
+
* This affects which detected wallets are exposed as connectors (and therefore selectable / autoConnect-able).
|
|
772
|
+
*/
|
|
773
|
+
setWalletDisplayConfig(config) {
|
|
774
|
+
this.walletDisplayConfig = config, this.unsubscribers.length > 0 && this.refreshWallets();
|
|
775
|
+
}
|
|
746
776
|
/**
|
|
747
777
|
* Refresh wallet list (re-detect and merge)
|
|
748
778
|
*/
|
|
749
779
|
refreshWallets() {
|
|
750
780
|
if (!(typeof window > "u"))
|
|
751
781
|
try {
|
|
752
|
-
let registryWallets = getWalletsRegistry().get().filter(isSolanaWallet), additionalWallets = this.additionalWallets.filter(isSolanaWallet), unique = this.deduplicateWallets([...registryWallets, ...additionalWallets]);
|
|
753
|
-
this.updateConnectorRegistry(
|
|
754
|
-
wallets:
|
|
755
|
-
connectors:
|
|
782
|
+
let registryWallets = getWalletsRegistry().get().filter(isSolanaWallet), additionalWallets = this.additionalWallets.filter(isSolanaWallet), unique = this.deduplicateWallets([...registryWallets, ...additionalWallets]), filtered = applyWalletDisplayConfig(unique, this.walletDisplayConfig);
|
|
783
|
+
this.updateConnectorRegistry(filtered), this.stateManager.updateState({
|
|
784
|
+
wallets: filtered.map((w) => this.mapToWalletInfo(w)),
|
|
785
|
+
connectors: filtered.map((w) => this.mapToConnectorMetadata(w))
|
|
756
786
|
}), this.log("\u{1F50D} WalletDetector: refreshed wallets", {
|
|
757
787
|
registry: registryWallets.length,
|
|
758
788
|
additional: additionalWallets.length,
|
|
759
|
-
total:
|
|
789
|
+
total: filtered.length
|
|
760
790
|
});
|
|
761
791
|
} catch {
|
|
762
792
|
}
|
|
@@ -775,14 +805,14 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
775
805
|
if (!(typeof window > "u"))
|
|
776
806
|
try {
|
|
777
807
|
let walletsApi = getWalletsRegistry(), update = () => {
|
|
778
|
-
let ws = walletsApi.get(), previousCount = this.getState().wallets.length, registryWallets = ws.filter(isSolanaWallet), additionalWallets = this.additionalWallets.filter(isSolanaWallet), unique = this.deduplicateWallets([...registryWallets, ...additionalWallets]),
|
|
808
|
+
let ws = walletsApi.get(), previousCount = this.getState().wallets.length, registryWallets = ws.filter(isSolanaWallet), additionalWallets = this.additionalWallets.filter(isSolanaWallet), unique = this.deduplicateWallets([...registryWallets, ...additionalWallets]), filtered = applyWalletDisplayConfig(unique, this.walletDisplayConfig), newCount = filtered.length;
|
|
779
809
|
newCount !== previousCount && this.log("\u{1F50D} WalletDetector: found wallets:", {
|
|
780
810
|
registry: registryWallets.length,
|
|
781
811
|
additional: additionalWallets.length,
|
|
782
812
|
total: newCount
|
|
783
|
-
}), this.updateConnectorRegistry(
|
|
784
|
-
wallets:
|
|
785
|
-
connectors:
|
|
813
|
+
}), this.updateConnectorRegistry(filtered), this.stateManager.updateState({
|
|
814
|
+
wallets: filtered.map((w) => this.mapToWalletInfo(w)),
|
|
815
|
+
connectors: filtered.map((w) => this.mapToConnectorMetadata(w))
|
|
786
816
|
}), newCount !== previousCount && newCount > 0 && this.eventEmitter.emit({
|
|
787
817
|
type: "wallets:detected",
|
|
788
818
|
count: newCount,
|
|
@@ -1808,7 +1838,7 @@ var logger5 = createLogger("ConnectorClient"), ConnectorClient = class {
|
|
|
1808
1838
|
initialize() {
|
|
1809
1839
|
if (typeof window > "u" || this.initialized) return;
|
|
1810
1840
|
let { error } = tryCatchSync(() => {
|
|
1811
|
-
this.config.additionalWallets && this.config.additionalWallets.length > 0 && this.walletDetector.setAdditionalWallets(this.config.additionalWallets), this.walletDetector.initialize(), this.config.walletConnect?.enabled && this.initializeWalletConnect().catch((err) => {
|
|
1841
|
+
this.config.additionalWallets && this.config.additionalWallets.length > 0 && this.walletDetector.setAdditionalWallets(this.config.additionalWallets), this.walletDetector.setWalletDisplayConfig(this.config.wallets), this.walletDetector.initialize(), this.config.walletConnect?.enabled && this.initializeWalletConnect().catch((err) => {
|
|
1812
1842
|
this.config.debug && logger5.error("WalletConnect initialization failed", { error: err });
|
|
1813
1843
|
}), this.config.autoConnect && setTimeout(() => {
|
|
1814
1844
|
this.autoConnector.attemptAutoConnect().catch((err) => {
|
|
@@ -2201,7 +2231,8 @@ function getDefaultConfig(options) {
|
|
|
2201
2231
|
programLabels,
|
|
2202
2232
|
coingecko,
|
|
2203
2233
|
walletConnect,
|
|
2204
|
-
additionalWallets
|
|
2234
|
+
additionalWallets,
|
|
2235
|
+
wallets
|
|
2205
2236
|
} = options, defaultClusters = clusters ?? [
|
|
2206
2237
|
createSolanaMainnet(),
|
|
2207
2238
|
createSolanaDevnet(),
|
|
@@ -2248,6 +2279,7 @@ function getDefaultConfig(options) {
|
|
|
2248
2279
|
appUrl,
|
|
2249
2280
|
enableMobile,
|
|
2250
2281
|
network,
|
|
2282
|
+
wallets,
|
|
2251
2283
|
cluster: {
|
|
2252
2284
|
clusters: defaultClusters,
|
|
2253
2285
|
persistSelection: persistClusterSelection,
|
|
@@ -2308,12 +2340,23 @@ function getInitialCluster(network = "mainnet-beta") {
|
|
|
2308
2340
|
return toClusterId(network);
|
|
2309
2341
|
}
|
|
2310
2342
|
function getDefaultMobileConfig(options) {
|
|
2311
|
-
|
|
2343
|
+
function getAppOrigin(appUrl) {
|
|
2344
|
+
if (appUrl)
|
|
2345
|
+
try {
|
|
2346
|
+
return new URL(appUrl).origin;
|
|
2347
|
+
} catch {
|
|
2348
|
+
return appUrl;
|
|
2349
|
+
}
|
|
2350
|
+
return typeof window < "u" ? window.location.origin : "https://localhost:3000";
|
|
2351
|
+
}
|
|
2352
|
+
let origin = getAppOrigin(options.appUrl);
|
|
2312
2353
|
return {
|
|
2313
2354
|
appIdentity: {
|
|
2314
2355
|
name: options.appName,
|
|
2315
|
-
uri:
|
|
2316
|
-
icon
|
|
2356
|
+
uri: origin,
|
|
2357
|
+
// Use a relative icon path so wallets resolve it against `uri`.
|
|
2358
|
+
// This avoids invalid URLs like: `${uri}/${uri}/favicon.ico` on mobile.
|
|
2359
|
+
icon: "/favicon.ico"
|
|
2317
2360
|
},
|
|
2318
2361
|
cluster: options.network || "mainnet-beta"
|
|
2319
2362
|
};
|
|
@@ -2359,7 +2402,11 @@ var solanaNetworkSchema = z.enum(["mainnet", "mainnet-beta", "devnet", "testnet"
|
|
|
2359
2402
|
}).optional(), walletSchema = z.custom(
|
|
2360
2403
|
(val) => typeof val == "object" && val !== null && "name" in val && "version" in val && "features" in val && "chains" in val,
|
|
2361
2404
|
{ message: "Invalid Wallet Standard wallet object" }
|
|
2362
|
-
),
|
|
2405
|
+
), nonEmptyTrimmedStringSchema = z.string().transform((s) => s.trim()).refine((s) => s.length > 0, { message: "Wallet name cannot be empty or whitespace-only" }), walletDisplayConfigSchema = z.object({
|
|
2406
|
+
allowList: z.array(nonEmptyTrimmedStringSchema).optional(),
|
|
2407
|
+
denyList: z.array(nonEmptyTrimmedStringSchema).optional(),
|
|
2408
|
+
featured: z.array(nonEmptyTrimmedStringSchema).optional()
|
|
2409
|
+
}).optional(), defaultConfigOptionsSchema = z.object({
|
|
2363
2410
|
// Required
|
|
2364
2411
|
appName: z.string().min(1, "Application name is required"),
|
|
2365
2412
|
// Optional strings
|
|
@@ -2385,11 +2432,14 @@ var solanaNetworkSchema = z.enum(["mainnet", "mainnet-beta", "devnet", "testnet"
|
|
|
2385
2432
|
walletConnect: walletConnectConfigSchema,
|
|
2386
2433
|
// Additional wallets (remote signers, etc.)
|
|
2387
2434
|
additionalWallets: z.array(walletSchema).optional(),
|
|
2435
|
+
// Wallet display controls
|
|
2436
|
+
wallets: walletDisplayConfigSchema,
|
|
2388
2437
|
// Functions (can't validate implementation, just existence)
|
|
2389
2438
|
onError: z.custom((val) => typeof val == "function").optional()
|
|
2390
2439
|
}); z.strictObject({
|
|
2391
2440
|
autoConnect: z.boolean().optional(),
|
|
2392
2441
|
debug: z.boolean().optional(),
|
|
2442
|
+
wallets: walletDisplayConfigSchema,
|
|
2393
2443
|
storage: storageConfigSchema,
|
|
2394
2444
|
cluster: clusterConfigSchema,
|
|
2395
2445
|
imageProxy: z.string().optional(),
|
|
@@ -3134,5 +3184,5 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
3134
3184
|
var createGillTransactionSigner = createKitTransactionSigner;
|
|
3135
3185
|
|
|
3136
3186
|
export { ClipboardErrorType, ConnectorClient, EnhancedStorage, EnhancedStorageAdapter, INITIAL_WALLET_STATUS, PUBLIC_RPC_ENDPOINTS, TransactionSignerError, WALLET_STATE_VERSION, clearWalletState, copyAddressToClipboard, copySignatureToClipboard, copyToClipboard, createConnectorId, createEnhancedStorageAccount, createEnhancedStorageCluster, createEnhancedStorageWallet, createEnhancedStorageWalletState, createGillTransactionSigner, createKitTransactionSigner, createTransactionSigner, formatAddress, formatBigIntBalance, formatBigIntUsd, formatLamportsToSolSafe, formatNumber, formatSOL, formatTokenAmount, formatTokenBalanceSafe, getAddressUrl, getBlockUrl, getChainIdForWalletStandard, getClusterChainId, getClusterExplorerUrl, getClusterName, getClusterRpcUrl, getClusterType, getDefaultConfig, getDefaultMobileConfig, getDefaultRpcUrl, getNetworkDisplayName, getPolyfillStatus, getTokenUrl, getTransactionUrl, getWalletNameFromConnectorId, getWalletsRegistry, installPolyfills, isClipboardAvailable, isConnected, isConnecting, isCryptoAvailable, isDevnet, isDevnetCluster, isDisconnected, isLocalCluster, isLocalnet, isMainnet, isMainnetCluster, isPolyfillInstalled, isStatusError, isTestnet, isTestnetCluster, isTransactionSignerError, isWalletConnectorId, isWalletStatusError, normalizeNetwork, parseConfigOptions, ready, saveWalletState, toClusterId, toLegacyWalletState, truncate, validateConfigOptions };
|
|
3137
|
-
//# sourceMappingURL=chunk-
|
|
3138
|
-
//# sourceMappingURL=chunk-
|
|
3187
|
+
//# sourceMappingURL=chunk-KE3IEBN2.mjs.map
|
|
3188
|
+
//# sourceMappingURL=chunk-KE3IEBN2.mjs.map
|