@solana/connector 0.2.1 → 0.2.2
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/{chunk-HPQ5T32K.mjs → chunk-3623Z2QL.mjs} +4 -4
- package/dist/{chunk-HPQ5T32K.mjs.map → chunk-3623Z2QL.mjs.map} +1 -1
- package/dist/{chunk-UCISIAOG.mjs → chunk-A7WQ3K75.mjs} +3 -3
- package/dist/{chunk-UCISIAOG.mjs.map → chunk-A7WQ3K75.mjs.map} +1 -1
- package/dist/{chunk-SITQ4JWM.js → chunk-BF67LVVM.js} +17 -21
- package/dist/chunk-BF67LVVM.js.map +1 -0
- package/dist/{chunk-MDR4Y37Z.mjs → chunk-DFHJYZKZ.mjs} +5 -4
- package/dist/chunk-DFHJYZKZ.mjs.map +1 -0
- package/dist/chunk-E3DAIOYS.mjs +22 -0
- package/dist/chunk-E3DAIOYS.mjs.map +1 -0
- package/dist/chunk-FG7HTQTV.mjs +7 -0
- package/dist/chunk-FG7HTQTV.mjs.map +1 -0
- package/dist/{chunk-BJAVJQLK.js → chunk-I2XX5FUG.js} +6 -6
- package/dist/{chunk-BJAVJQLK.js.map → chunk-I2XX5FUG.js.map} +1 -1
- package/dist/chunk-L5FWMNWO.js +9 -0
- package/dist/chunk-L5FWMNWO.js.map +1 -0
- package/dist/{chunk-HN5AJF7F.js → chunk-NLPEO5GT.js} +5 -5
- package/dist/{chunk-HN5AJF7F.js.map → chunk-NLPEO5GT.js.map} +1 -1
- package/dist/chunk-QST7XLMB.js +26 -0
- package/dist/chunk-QST7XLMB.js.map +1 -0
- package/dist/{chunk-ZZTY3O4N.mjs → chunk-SJCQ3KZE.mjs} +4 -7
- package/dist/chunk-SJCQ3KZE.mjs.map +1 -0
- package/dist/{chunk-IDTUFDNB.mjs → chunk-SQ2JEA2M.mjs} +58 -11
- package/dist/chunk-SQ2JEA2M.mjs.map +1 -0
- package/dist/{chunk-BZ2VBJCZ.js → chunk-TRSJSU33.js} +141 -94
- package/dist/chunk-TRSJSU33.js.map +1 -0
- package/dist/{chunk-4Z2F6ERB.js → chunk-VVLY6QPI.js} +49 -48
- package/dist/chunk-VVLY6QPI.js.map +1 -0
- package/dist/compat.js +2 -2
- package/dist/compat.mjs +1 -1
- package/dist/fireblocks-FLKRTJU3.js +67 -0
- package/dist/fireblocks-FLKRTJU3.js.map +1 -0
- package/dist/fireblocks-KCJV3GEK.mjs +65 -0
- package/dist/fireblocks-KCJV3GEK.mjs.map +1 -0
- package/dist/headless.d.mts +6 -11
- package/dist/headless.d.ts +6 -11
- package/dist/headless.js +147 -147
- package/dist/headless.mjs +4 -4
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +188 -188
- package/dist/index.mjs +5 -5
- package/dist/privy-6LYDE24Z.mjs +64 -0
- package/dist/privy-6LYDE24Z.mjs.map +1 -0
- package/dist/privy-ID4YFTKR.js +66 -0
- package/dist/privy-ID4YFTKR.js.map +1 -0
- package/dist/protocol-G-z1lRqo.d.mts +166 -0
- package/dist/protocol-G-z1lRqo.d.ts +166 -0
- package/dist/react.d.mts +3 -3
- package/dist/react.d.ts +3 -3
- package/dist/react.js +49 -49
- package/dist/react.mjs +2 -2
- package/dist/remote.d.mts +46 -0
- package/dist/remote.d.ts +46 -0
- package/dist/remote.js +212 -0
- package/dist/remote.js.map +1 -0
- package/dist/remote.mjs +198 -0
- package/dist/remote.mjs.map +1 -0
- package/dist/server.d.mts +141 -0
- package/dist/server.d.ts +141 -0
- package/dist/server.js +189 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +187 -0
- package/dist/server.mjs.map +1 -0
- package/dist/{standard-shim-tmnQelaJ.d.ts → standard-shim-Cg6fmjK_.d.ts} +10 -0
- package/dist/{standard-shim-CGB88PPO.d.mts → standard-shim-Cz4UNS7t.d.mts} +10 -0
- package/dist/{walletconnect-447EY3OJ.js → walletconnect-F2M3PAAN.js} +8 -8
- package/dist/{walletconnect-447EY3OJ.js.map → walletconnect-F2M3PAAN.js.map} +1 -1
- package/dist/walletconnect-Z6LPGALR.mjs +3 -0
- package/dist/{walletconnect-U455PO4I.mjs.map → walletconnect-Z6LPGALR.mjs.map} +1 -1
- package/package.json +27 -2
- package/dist/chunk-4Z2F6ERB.js.map +0 -1
- package/dist/chunk-BZ2VBJCZ.js.map +0 -1
- package/dist/chunk-IDTUFDNB.mjs.map +0 -1
- package/dist/chunk-MDR4Y37Z.mjs.map +0 -1
- package/dist/chunk-SITQ4JWM.js.map +0 -1
- package/dist/chunk-ZZTY3O4N.mjs.map +0 -1
- package/dist/walletconnect-U455PO4I.mjs +0 -3
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/kit/constants.ts","../src/lib/kit/rpc.ts","../src/lib/kit/explorer.ts","../src/lib/kit/client.ts","../src/lib/kit/debug.ts","../src/lib/kit/prepare-transaction.ts","../src/lib/errors/wallet-errors.ts","../src/lib/errors/index.ts","../src/lib/kit/signer-utils.ts","../src/lib/kit/signer-factories.ts","../src/lib/kit/signer-integration.ts","../src/lib/utils/secure-logger.ts"],"names":["createSolanaRpc","createSolanaRpcSubscriptions","setTransactionMessageLifetimeUsingBlockhash","assertIsTransactionMessageWithBlockhashLifetime","address","getBase58Encoder","getBase58Decoder","message","LOG_LEVELS"],"mappings":"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","file":"chunk-SITQ4JWM.js","sourcesContent":["/**\n * @solana/connector - Kit Constants\n *\n * Core Solana constants used throughout the connector.\n * These match the values from @solana/kit ecosystem.\n */\n\n/** 1 billion lamports per SOL */\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\n/**\n * Genesis hash for Solana network clusters\n */\nexport const GENESIS_HASH = {\n mainnet: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d',\n devnet: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG',\n testnet: '4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY',\n} as const;\n\n/**\n * Convert lamports to SOL\n * @param lamports - Amount in lamports\n * @returns Amount in SOL\n */\nexport function lamportsToSol(lamports: number | bigint): number {\n return Number(lamports) / LAMPORTS_PER_SOL;\n}\n\n/**\n * Convert SOL to lamports\n * @param sol - Amount in SOL\n * @returns Amount in lamports\n */\nexport function solToLamports(sol: number): bigint {\n return BigInt(Math.floor(sol * LAMPORTS_PER_SOL));\n}\n","/**\n * @solana/connector - Kit RPC Utilities\n *\n * RPC URL helpers for Solana clusters.\n */\n\nimport type { DevnetUrl, MainnetUrl, TestnetUrl } from '@solana/kit';\n\n/** Solana cluster moniker */\nexport type SolanaClusterMoniker = 'devnet' | 'localnet' | 'mainnet' | 'testnet';\n\n/** Localnet URL type */\nexport type LocalnetUrl = string & { '~cluster': 'localnet' };\n\n/** Generic URL type */\nexport type GenericUrl = string & {};\n\n/** Union of all cluster URL types */\nexport type ModifiedClusterUrl = DevnetUrl | GenericUrl | LocalnetUrl | MainnetUrl | TestnetUrl;\n\n/** URL or moniker that can be used to create a Solana client */\nexport type SolanaClientUrlOrMoniker = ModifiedClusterUrl | SolanaClusterMoniker | URL;\n\n/**\n * Helper to create a localnet URL type\n */\nexport function localnet(putativeString: string): LocalnetUrl {\n return putativeString as LocalnetUrl;\n}\n\n/**\n * Get a public Solana RPC endpoint for a cluster based on its moniker\n *\n * Note: These RPC URLs are rate limited and not suitable for production applications.\n * For production, use a dedicated RPC provider like Triton, Helius, QuickNode, or Alchemy.\n *\n * @param cluster - Cluster moniker\n * @returns Public RPC URL for the cluster\n */\nexport function getPublicSolanaRpcUrl(\n cluster: SolanaClusterMoniker | 'mainnet-beta' | 'localhost',\n): ModifiedClusterUrl {\n switch (cluster) {\n case 'devnet':\n return 'https://api.devnet.solana.com' as DevnetUrl;\n case 'testnet':\n return 'https://api.testnet.solana.com' as TestnetUrl;\n case 'mainnet-beta':\n case 'mainnet':\n return 'https://api.mainnet-beta.solana.com' as MainnetUrl;\n case 'localnet':\n case 'localhost':\n return 'http://127.0.0.1:8899' as LocalnetUrl;\n default:\n throw new Error('Invalid cluster moniker');\n }\n}\n\n/**\n * Get the WebSocket URL for a given RPC URL\n *\n * @param rpcUrl - HTTP/HTTPS RPC URL\n * @returns WebSocket URL\n */\nexport function getWebSocketUrl(rpcUrl: string): string {\n const url = new URL(rpcUrl);\n url.protocol = url.protocol.replace('http', 'ws');\n\n // Default WebSocket port for localnet\n if (url.hostname === 'localhost' || url.hostname.startsWith('127')) {\n url.port = '8900';\n }\n\n return url.toString();\n}\n","/**\n * @solana/connector - Kit Explorer Utilities\n *\n * Generate Solana Explorer links for addresses, transactions, and blocks.\n */\n\n/** Cluster type for explorer links */\nexport type ExplorerCluster = 'mainnet' | 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet' | 'localhost';\n\n/** Arguments for generating an explorer link */\nexport type GetExplorerLinkArgs =\n | { address: string; cluster?: ExplorerCluster }\n | { transaction: string; cluster?: ExplorerCluster }\n | { block: string | number; cluster?: ExplorerCluster }\n | { cluster?: ExplorerCluster };\n\n/**\n * Craft a Solana Explorer link on any cluster\n *\n * @param props - Configuration for the explorer link\n * @returns Solana Explorer URL\n *\n * @example\n * ```ts\n * // Transaction link on mainnet\n * getExplorerLink({ transaction: 'abc123...', cluster: 'mainnet' });\n *\n * // Address link on devnet\n * getExplorerLink({ address: 'abc123...', cluster: 'devnet' });\n *\n * // Block link on testnet\n * getExplorerLink({ block: 12345, cluster: 'testnet' });\n * ```\n */\nexport function getExplorerLink(props: GetExplorerLinkArgs = {}): string {\n const url = new URL('https://explorer.solana.com');\n\n // Default to mainnet / mainnet-beta\n let cluster = props.cluster;\n if (!cluster || cluster === 'mainnet') {\n cluster = 'mainnet-beta';\n }\n\n if ('address' in props && props.address) {\n url.pathname = `/address/${props.address}`;\n } else if ('transaction' in props && props.transaction) {\n url.pathname = `/tx/${props.transaction}`;\n } else if ('block' in props && props.block !== undefined) {\n url.pathname = `/block/${props.block}`;\n }\n\n if (cluster !== 'mainnet-beta') {\n if (cluster === 'localnet' || cluster === 'localhost') {\n // localnet technically isn't a cluster, so requires special handling\n url.searchParams.set('cluster', 'custom');\n url.searchParams.set('customUrl', 'http://localhost:8899');\n } else {\n url.searchParams.set('cluster', cluster);\n }\n }\n\n return url.toString();\n}\n","/**\n * @solana/connector - Kit Client Factory\n *\n * Creates a Solana RPC and WebSocket subscriptions client.\n * Replaces gill's createSolanaClient with a kit-based implementation.\n */\n\nimport type {\n DevnetUrl,\n MainnetUrl,\n TestnetUrl,\n Rpc,\n RpcSubscriptions,\n SolanaRpcApi,\n SolanaRpcSubscriptionsApi,\n} from '@solana/kit';\nimport { createSolanaRpc, createSolanaRpcSubscriptions } from '@solana/kit';\n\nimport type { LocalnetUrl, ModifiedClusterUrl, SolanaClientUrlOrMoniker } from './rpc';\nimport { getPublicSolanaRpcUrl } from './rpc';\n\n/**\n * Configuration for creating a Solana RPC client\n */\nexport interface CreateSolanaClientRpcConfig {\n /** Custom port for the RPC endpoint */\n port?: number;\n}\n\n/**\n * Configuration for creating a Solana RPC subscriptions client\n */\nexport interface CreateSolanaClientRpcSubscriptionsConfig {\n /** Custom port for the WebSocket endpoint */\n port?: number;\n}\n\n/**\n * Arguments for creating a Solana client\n */\nexport interface CreateSolanaClientArgs<TClusterUrl extends SolanaClientUrlOrMoniker = string> {\n /** Full RPC URL (for a private RPC endpoint) or the Solana moniker (for a public RPC endpoint) */\n urlOrMoniker: SolanaClientUrlOrMoniker | TClusterUrl;\n /** Configuration used to create the `rpc` client */\n rpcConfig?: CreateSolanaClientRpcConfig;\n /** Configuration used to create the `rpcSubscriptions` client */\n rpcSubscriptionsConfig?: CreateSolanaClientRpcSubscriptionsConfig;\n}\n\n/**\n * A Solana client with RPC and WebSocket subscription capabilities\n */\nexport interface SolanaClient<TClusterUrl extends ModifiedClusterUrl | string = string> {\n /** Used to make RPC calls to your RPC provider */\n rpc: Rpc<SolanaRpcApi>;\n /** Used to make RPC websocket calls to your RPC provider */\n rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n /** Full RPC URL that was used to create this client */\n urlOrMoniker: SolanaClientUrlOrMoniker | TClusterUrl;\n}\n\n/**\n * Create a Solana `rpc` and `rpcSubscriptions` client\n *\n * @param props - Configuration for the client\n * @returns Solana client with RPC and WebSocket subscription capabilities\n *\n * @example\n * ```ts\n * // Using a cluster moniker\n * const client = createSolanaClient({ urlOrMoniker: 'devnet' });\n *\n * // Using a custom RPC URL\n * const client = createSolanaClient({ urlOrMoniker: 'https://my-rpc.example.com' });\n *\n * // Making RPC calls\n * const balance = await client.rpc.getBalance(address).send();\n * ```\n */\nexport function createSolanaClient(\n props: Omit<CreateSolanaClientArgs<MainnetUrl | 'mainnet'>, 'urlOrMoniker'> & {\n urlOrMoniker: 'mainnet';\n },\n): SolanaClient<MainnetUrl>;\nexport function createSolanaClient(\n props: Omit<CreateSolanaClientArgs<DevnetUrl | 'devnet'>, 'urlOrMoniker'> & {\n urlOrMoniker: 'devnet';\n },\n): SolanaClient<DevnetUrl>;\nexport function createSolanaClient(\n props: Omit<CreateSolanaClientArgs<TestnetUrl | 'testnet'>, 'urlOrMoniker'> & {\n urlOrMoniker: 'testnet';\n },\n): SolanaClient<TestnetUrl>;\nexport function createSolanaClient(\n props: Omit<CreateSolanaClientArgs<LocalnetUrl | 'localnet'>, 'urlOrMoniker'> & {\n urlOrMoniker: 'localnet';\n },\n): SolanaClient<LocalnetUrl>;\nexport function createSolanaClient<TClusterUrl extends ModifiedClusterUrl>(\n props: CreateSolanaClientArgs<TClusterUrl>,\n): SolanaClient<TClusterUrl>;\nexport function createSolanaClient<TCluster extends ModifiedClusterUrl>({\n urlOrMoniker,\n rpcConfig,\n rpcSubscriptionsConfig,\n}: CreateSolanaClientArgs<TCluster>): SolanaClient<TCluster> {\n if (!urlOrMoniker) throw new Error('Cluster url or moniker is required');\n\n let parsedUrl: URL;\n\n // Try to parse as URL first\n if (urlOrMoniker instanceof URL) {\n parsedUrl = urlOrMoniker;\n } else {\n try {\n parsedUrl = new URL(urlOrMoniker.toString());\n } catch {\n // Not a valid URL, try as moniker\n try {\n parsedUrl = new URL(\n getPublicSolanaRpcUrl(urlOrMoniker.toString() as 'mainnet' | 'devnet' | 'testnet' | 'localnet'),\n );\n } catch {\n throw new Error('Invalid URL or cluster moniker');\n }\n }\n }\n\n if (!parsedUrl.protocol.match(/^https?:/i)) {\n throw new Error('Unsupported protocol. Only HTTP and HTTPS are supported');\n }\n\n // Apply custom port if specified\n if (rpcConfig?.port) {\n parsedUrl.port = rpcConfig.port.toString();\n }\n\n const rpcUrl = parsedUrl.toString();\n const rpc = createSolanaRpc(rpcUrl) as Rpc<SolanaRpcApi>;\n\n // Convert HTTP to WS for subscriptions\n parsedUrl.protocol = parsedUrl.protocol.replace('http', 'ws');\n\n // Apply WebSocket port if specified, or use default 8900 for localhost\n if (rpcSubscriptionsConfig?.port) {\n parsedUrl.port = rpcSubscriptionsConfig.port.toString();\n } else if (parsedUrl.hostname === 'localhost' || parsedUrl.hostname.startsWith('127')) {\n parsedUrl.port = '8900';\n }\n\n const rpcSubscriptions = createSolanaRpcSubscriptions(\n parsedUrl.toString(),\n ) as RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n\n return {\n rpc,\n rpcSubscriptions,\n urlOrMoniker: rpcUrl as TCluster,\n };\n}\n","/**\n * @solana/connector - Kit Debug Utilities\n *\n * Simplified debug logging utilities for the connector.\n * Replaces gill's debug system with a connector-specific implementation.\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\ndeclare global {\n /**\n * Whether or not to enable debug mode. When enabled, default log level of `info`\n */\n // eslint-disable-next-line no-var\n var __CONNECTOR_DEBUG__: boolean | undefined;\n /**\n * Set the a desired level of logs to be output in the application\n *\n * - Default: `info`\n * - Options: `debug` | `info` | `warn` | `error`\n */\n // eslint-disable-next-line no-var\n var __CONNECTOR_DEBUG_LEVEL__: LogLevel | undefined;\n}\n\n/**\n * Get the minimum log level from environment or global settings\n */\nfunction getMinLogLevel(): LogLevel {\n if (typeof process !== 'undefined' && process.env?.CONNECTOR_DEBUG_LEVEL) {\n return process.env.CONNECTOR_DEBUG_LEVEL as LogLevel;\n }\n if (\n typeof globalThis !== 'undefined' &&\n (globalThis as typeof globalThis & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__\n ) {\n return (globalThis as typeof globalThis & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__!;\n }\n if (\n typeof window !== 'undefined' &&\n (window as Window & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__\n ) {\n return (window as Window & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__!;\n }\n return 'info';\n}\n\n/**\n * Check if the connector debug logger is enabled or not\n *\n * Enable debugging by setting any of the following to `true`:\n * - `process.env.CONNECTOR_DEBUG`\n * - `globalThis.__CONNECTOR_DEBUG__`\n * - `window.__CONNECTOR_DEBUG__`\n */\nexport function isDebugEnabled(): boolean {\n if (typeof process !== 'undefined') {\n if (process.env?.CONNECTOR_DEBUG_LEVEL) return true;\n if (process.env?.CONNECTOR_DEBUG === 'true' || process.env?.CONNECTOR_DEBUG === '1') return true;\n }\n if (typeof globalThis !== 'undefined') {\n if ((globalThis as typeof globalThis & { __CONNECTOR_DEBUG__?: boolean }).__CONNECTOR_DEBUG__ === true) {\n return true;\n }\n if ((globalThis as typeof globalThis & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__) {\n return true;\n }\n }\n if (typeof window !== 'undefined') {\n if ((window as Window & { __CONNECTOR_DEBUG__?: boolean }).__CONNECTOR_DEBUG__ === true) {\n return true;\n }\n if ((window as Window & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Log debug messages based on the desired application's logging level.\n *\n * @param message - the message contents to be logged\n * @param level - default: `info` (see: {@link LOG_LEVELS})\n * @param prefix - default: `[Connector]`\n *\n * To enable connector's debug logger, set any of the following to `true`:\n * - `process.env.CONNECTOR_DEBUG`\n * - `globalThis.__CONNECTOR_DEBUG__`\n * - `window.__CONNECTOR_DEBUG__`\n *\n * To set a desired level of logs to be output in the application, set the value of one of the following:\n * - `process.env.CONNECTOR_DEBUG_LEVEL`\n * - `globalThis.__CONNECTOR_DEBUG_LEVEL__`\n * - `window.__CONNECTOR_DEBUG_LEVEL__`\n */\nexport function debug(message: unknown, level: LogLevel = 'info', prefix: string = '[Connector]'): void {\n if (!isDebugEnabled()) return;\n\n if (LOG_LEVELS[level] < LOG_LEVELS[getMinLogLevel()]) return;\n\n const formattedMessage = typeof message === 'string' ? message : JSON.stringify(message, null, 2);\n\n switch (level) {\n case 'debug':\n console.log(prefix, formattedMessage);\n break;\n case 'info':\n console.info(prefix, formattedMessage);\n break;\n case 'warn':\n console.warn(prefix, formattedMessage);\n break;\n case 'error':\n console.error(prefix, formattedMessage);\n break;\n }\n}\n","/**\n * @solana/connector - Kit Transaction Preparation\n *\n * Prepares transactions for sending by setting blockhash.\n * A simplified version that focuses on blockhash management.\n */\n\nimport type {\n GetLatestBlockhashApi,\n Rpc,\n TransactionMessage,\n TransactionMessageWithBlockhashLifetime,\n TransactionMessageWithFeePayer,\n} from '@solana/kit';\nimport {\n assertIsTransactionMessageWithBlockhashLifetime,\n setTransactionMessageLifetimeUsingBlockhash,\n} from '@solana/kit';\n\nimport { debug, isDebugEnabled } from './debug';\n\n/**\n * Transaction message types that can be prepared.\n * Requires both a fee payer and a transaction message.\n */\ntype PrepareCompilableTransactionMessage = TransactionMessage & TransactionMessageWithFeePayer;\n\n/**\n * Configuration for preparing a transaction\n */\nexport interface PrepareTransactionConfig<TMessage extends PrepareCompilableTransactionMessage> {\n /**\n * Transaction to prepare for sending to the blockchain\n */\n transaction: TMessage;\n /**\n * RPC client capable of getting the latest blockhash\n */\n rpc: Rpc<GetLatestBlockhashApi>;\n /**\n * Multiplier applied to the simulated compute unit value obtained from simulation\n * @default 1.1\n * @deprecated Compute unit estimation is not currently supported\n */\n computeUnitLimitMultiplier?: number;\n /**\n * Whether or not you wish to force reset the compute unit limit value (if one is already set)\n * @deprecated Compute unit estimation is not currently supported\n */\n computeUnitLimitReset?: boolean;\n /**\n * Whether or not you wish to force reset the latest blockhash (if one is already set)\n * @default true\n */\n blockhashReset?: boolean;\n}\n\n/**\n * Prepare a Transaction to be signed and sent to the network. Including:\n * - fetching the latest blockhash (if not already set)\n * - (optional) resetting latest blockhash to the most recent\n *\n * Note: Automatic compute unit estimation is not currently supported in this version.\n * You should set compute unit limits manually if needed.\n *\n * @param config - Configuration for transaction preparation\n * @returns Prepared transaction with blockhash lifetime set\n *\n * @example\n * ```ts\n * const prepared = await prepareTransaction({\n * transaction: myTransaction,\n * rpc: client.rpc,\n * });\n * ```\n */\nexport async function prepareTransaction<TMessage extends PrepareCompilableTransactionMessage>(\n config: PrepareTransactionConfig<TMessage>,\n): Promise<TMessage & TransactionMessageWithBlockhashLifetime> {\n // Set config defaults\n const blockhashReset = config.blockhashReset !== false;\n\n let transaction = config.transaction as TMessage & Partial<TransactionMessageWithBlockhashLifetime>;\n\n // Update the latest blockhash\n const hasLifetimeConstraint = 'lifetimeConstraint' in transaction;\n\n if (blockhashReset || !hasLifetimeConstraint) {\n const { value: latestBlockhash } = await config.rpc.getLatestBlockhash().send();\n\n if (!hasLifetimeConstraint) {\n if (isDebugEnabled()) {\n debug('Transaction missing latest blockhash, fetching one.', 'debug');\n }\n transaction = setTransactionMessageLifetimeUsingBlockhash(\n latestBlockhash,\n transaction as TMessage,\n ) as TMessage & TransactionMessageWithBlockhashLifetime;\n } else if (blockhashReset) {\n if (isDebugEnabled()) {\n debug('Auto resetting the latest blockhash.', 'debug');\n }\n transaction = {\n ...transaction,\n lifetimeConstraint: latestBlockhash,\n } as TMessage & TransactionMessageWithBlockhashLifetime;\n }\n }\n\n assertIsTransactionMessageWithBlockhashLifetime(transaction);\n\n return transaction as TMessage & TransactionMessageWithBlockhashLifetime;\n}\n","/**\n * Wallet Error Types - Framework-agnostic error definitions\n *\n * These types are shared between headless and React implementations.\n * They do NOT import React or any TSX modules.\n */\n\n/**\n * Error types specific to wallet connections.\n * Used by error boundaries and headless error handling.\n */\nexport const WalletErrorType = {\n CONNECTION_FAILED: 'CONNECTION_FAILED',\n TRANSACTION_FAILED: 'TRANSACTION_FAILED',\n NETWORK_ERROR: 'NETWORK_ERROR',\n WALLET_NOT_FOUND: 'WALLET_NOT_FOUND',\n USER_REJECTED: 'USER_REJECTED',\n INSUFFICIENT_FUNDS: 'INSUFFICIENT_FUNDS',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n} as const;\n\nexport type WalletErrorType = (typeof WalletErrorType)[keyof typeof WalletErrorType];\n\n/**\n * Extended error interface for wallet-specific errors.\n * Extends the standard Error with wallet context.\n */\nexport interface WalletError extends Error {\n type: WalletErrorType;\n recoverable: boolean;\n context?: Record<string, unknown>;\n retryAction?: () => Promise<void>;\n}\n\n/**\n * Type guard to check if an error is a WalletError\n */\nexport function isWalletError(error: unknown): error is WalletError {\n return (\n error instanceof Error &&\n 'type' in error &&\n typeof (error as WalletError).type === 'string' &&\n Object.values(WalletErrorType).includes((error as WalletError).type as WalletErrorType)\n );\n}\n\n/**\n * Create a WalletError from a standard Error\n */\nexport function createWalletError(\n error: Error,\n type: WalletErrorType,\n recoverable: boolean,\n context?: Record<string, unknown>,\n): WalletError {\n const walletError = error as WalletError;\n walletError.type = type;\n walletError.recoverable = recoverable;\n walletError.context = context;\n return walletError;\n}\n","/**\n * @solana/connector - Unified Error System\n */\n\n// Re-export wallet-specific error types (React-free)\nexport * from './wallet-errors';\n\nexport abstract class ConnectorError extends Error {\n abstract readonly code: string;\n abstract readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n readonly originalError?: Error;\n readonly timestamp: string;\n\n constructor(message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message);\n this.name = this.constructor.name;\n this.context = context;\n this.originalError = originalError;\n this.timestamp = new Date().toISOString();\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n recoverable: this.recoverable,\n context: this.context,\n timestamp: this.timestamp,\n originalError: this.originalError?.message,\n };\n }\n}\n\nexport class ConnectionError extends ConnectorError {\n readonly code: ConnectionErrorCode;\n readonly recoverable = true;\n\n constructor(code: ConnectionErrorCode, message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message, context, originalError);\n this.code = code;\n }\n}\n\nexport type ConnectionErrorCode =\n | 'WALLET_NOT_CONNECTED'\n | 'WALLET_NOT_FOUND'\n | 'CONNECTION_FAILED'\n | 'CONNECTION_REJECTED'\n | 'DISCONNECTION_FAILED'\n | 'ACCOUNT_NOT_AVAILABLE'\n | 'RECONNECTION_FAILED';\n\nexport class ValidationError extends ConnectorError {\n readonly code: ValidationErrorCode;\n readonly recoverable = false;\n\n constructor(code: ValidationErrorCode, message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message, context, originalError);\n this.code = code;\n }\n}\n\nexport type ValidationErrorCode =\n | 'INVALID_TRANSACTION'\n | 'INVALID_MESSAGE'\n | 'INVALID_ADDRESS'\n | 'INVALID_SIGNATURE'\n | 'INVALID_FORMAT'\n | 'UNSUPPORTED_FORMAT'\n | 'VALIDATION_FAILED';\n\nexport class ConfigurationError extends ConnectorError {\n readonly code: ConfigurationErrorCode;\n readonly recoverable = false;\n\n constructor(\n code: ConfigurationErrorCode,\n message: string,\n context?: Record<string, unknown>,\n originalError?: Error,\n ) {\n super(message, context, originalError);\n this.code = code;\n }\n}\n\nexport type ConfigurationErrorCode =\n | 'MISSING_PROVIDER'\n | 'INVALID_CLUSTER'\n | 'CLUSTER_NOT_FOUND'\n | 'INVALID_CONFIG'\n | 'INITIALIZATION_FAILED';\n\nexport class NetworkError extends ConnectorError {\n readonly code: NetworkErrorCode;\n readonly recoverable = true;\n\n constructor(code: NetworkErrorCode, message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message, context, originalError);\n this.code = code;\n }\n}\n\nexport type NetworkErrorCode =\n | 'RPC_ERROR'\n | 'NETWORK_TIMEOUT'\n | 'NETWORK_UNAVAILABLE'\n | 'TRANSACTION_SIMULATION_FAILED';\n\nexport class TransactionError extends ConnectorError {\n readonly code: TransactionErrorCode;\n readonly recoverable: boolean;\n\n constructor(code: TransactionErrorCode, message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message, context, originalError);\n this.code = code;\n this.recoverable = ['USER_REJECTED', 'SEND_FAILED', 'SIMULATION_FAILED'].includes(code);\n }\n}\n\nexport type TransactionErrorCode =\n | 'SIGNING_FAILED'\n | 'SEND_FAILED'\n | 'FEATURE_NOT_SUPPORTED'\n | 'USER_REJECTED'\n | 'SIMULATION_FAILED'\n | 'INVALID_TRANSACTION'\n | 'TRANSACTION_EXPIRED';\n\nexport function isConnectorError(error: unknown): error is ConnectorError {\n return error instanceof ConnectorError;\n}\n\nexport function isConnectionError(error: unknown): error is ConnectionError {\n return error instanceof ConnectionError;\n}\n\nexport function isValidationError(error: unknown): error is ValidationError {\n return error instanceof ValidationError;\n}\n\nexport function isConfigurationError(error: unknown): error is ConfigurationError {\n return error instanceof ConfigurationError;\n}\n\nexport function isNetworkError(error: unknown): error is NetworkError {\n return error instanceof NetworkError;\n}\n\nexport function isTransactionError(error: unknown): error is TransactionError {\n return error instanceof TransactionError;\n}\n\nexport const Errors = {\n walletNotConnected: (context?: Record<string, unknown>) =>\n new ConnectionError('WALLET_NOT_CONNECTED', 'No wallet connected', context),\n\n walletNotFound: (walletName?: string) =>\n new ConnectionError('WALLET_NOT_FOUND', `Wallet not found${walletName ? `: ${walletName}` : ''}`, {\n walletName,\n }),\n\n connectionFailed: (originalError?: Error) =>\n new ConnectionError('CONNECTION_FAILED', 'Failed to connect to wallet', undefined, originalError),\n\n accountNotAvailable: (address?: string) =>\n new ConnectionError('ACCOUNT_NOT_AVAILABLE', 'Requested account not available', { address }),\n\n invalidTransaction: (reason: string, context?: Record<string, unknown>) =>\n new ValidationError('INVALID_TRANSACTION', `Invalid transaction: ${reason}`, context),\n\n invalidFormat: (expectedFormat: string, actualFormat?: string) =>\n new ValidationError('INVALID_FORMAT', `Invalid format: expected ${expectedFormat}`, {\n expectedFormat,\n actualFormat,\n }),\n\n unsupportedFormat: (format: string) =>\n new ValidationError('UNSUPPORTED_FORMAT', `Unsupported format: ${format}`, { format }),\n\n missingProvider: (hookName: string) =>\n new ConfigurationError(\n 'MISSING_PROVIDER',\n `${hookName} must be used within ConnectorProvider. Wrap your app with <ConnectorProvider> or <UnifiedProvider>.`,\n { hookName },\n ),\n\n clusterNotFound: (clusterId: string, availableClusters: string[]) =>\n new ConfigurationError(\n 'CLUSTER_NOT_FOUND',\n `Cluster ${clusterId} not found. Available clusters: ${availableClusters.join(', ')}`,\n { clusterId, availableClusters },\n ),\n\n rpcError: (message: string, originalError?: Error) =>\n new NetworkError('RPC_ERROR', message, undefined, originalError),\n\n networkTimeout: () => new NetworkError('NETWORK_TIMEOUT', 'Network request timed out'),\n\n signingFailed: (originalError?: Error) =>\n new TransactionError('SIGNING_FAILED', 'Failed to sign transaction', undefined, originalError),\n\n featureNotSupported: (feature: string) =>\n new TransactionError('FEATURE_NOT_SUPPORTED', `Wallet does not support ${feature}`, { feature }),\n\n userRejected: (operation: string) =>\n new TransactionError('USER_REJECTED', `User rejected ${operation}`, { operation }),\n} as const;\n\nexport function toConnectorError(error: unknown, defaultMessage = 'An unexpected error occurred'): ConnectorError {\n if (isConnectorError(error)) {\n return error;\n }\n\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n\n if (message.includes('user rejected') || message.includes('user denied')) {\n return Errors.userRejected('transaction');\n }\n\n if (message.includes('wallet not found') || message.includes('not installed')) {\n return Errors.walletNotFound();\n }\n\n if (message.includes('not connected')) {\n return Errors.walletNotConnected();\n }\n\n if (message.includes('network') || message.includes('fetch')) {\n return Errors.rpcError(error.message, error);\n }\n\n if (message.includes('invalid')) {\n return new ValidationError('VALIDATION_FAILED', error.message, undefined, error);\n }\n\n return new TransactionError('SIGNING_FAILED', error.message, undefined, error);\n }\n\n return new TransactionError('SIGNING_FAILED', defaultMessage, { originalError: String(error) });\n}\n\nexport function getUserFriendlyMessage(error: unknown): string {\n if (!isConnectorError(error)) {\n return 'An unexpected error occurred. Please try again.';\n }\n\n const messages: Record<string, string> = {\n WALLET_NOT_CONNECTED: 'Please connect your wallet to continue.',\n WALLET_NOT_FOUND: 'Wallet not found. Please install a supported wallet.',\n CONNECTION_FAILED: 'Failed to connect to wallet. Please try again.',\n USER_REJECTED: 'Transaction was cancelled.',\n FEATURE_NOT_SUPPORTED: 'This wallet does not support this feature.',\n SIGNING_FAILED: 'Failed to sign transaction. Please try again.',\n SEND_FAILED: 'Failed to send transaction. Please try again.',\n INVALID_CLUSTER: 'Invalid network configuration.',\n CLUSTER_NOT_FOUND: 'Network not found.',\n MISSING_PROVIDER: 'Application not properly configured.',\n RPC_ERROR: 'Network error. Please check your connection.',\n NETWORK_TIMEOUT: 'Request timed out. Please try again.',\n };\n\n return messages[error.code] || error.message || 'An error occurred.';\n}\n","import type { Address } from '@solana/addresses';\nimport { getBase58Decoder, getBase58Encoder } from '@solana/codecs';\nimport type { SignatureBytes } from '@solana/keys';\nimport type { SignatureDictionary } from '@solana/signers';\n\nfunction toSignatureBytes(bytes: Uint8Array): SignatureBytes {\n return bytes as SignatureBytes;\n}\n\nexport function detectMessageModification(original: Uint8Array, modified: Uint8Array): boolean {\n if (original.length !== modified.length) {\n return true;\n }\n\n for (let i = 0; i < original.length; i++) {\n if (original[i] !== modified[i]) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function updateSignatureDictionary(\n original: Uint8Array,\n signed: Uint8Array,\n originalSignatures: SignatureDictionary,\n address: Address<string>,\n signature: Uint8Array,\n): SignatureDictionary {\n const wasModified = detectMessageModification(original, signed);\n\n const signatureBytes = signature as unknown as SignatureBytes;\n\n const newSignatures = {} as Record<string, SignatureBytes>;\n newSignatures[address as string] = signatureBytes;\n\n if (wasModified) {\n return newSignatures as SignatureDictionary;\n }\n\n const merged = {\n ...originalSignatures,\n ...newSignatures,\n };\n\n return merged as SignatureDictionary;\n}\n\nexport function freezeSigner<T extends object>(signer: T): Readonly<T> {\n return Object.freeze(signer);\n}\n\nexport function base58ToSignatureBytes(signature: string): SignatureBytes {\n try {\n const bytes = getBase58Encoder().encode(signature);\n if (bytes.length !== 64) {\n throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);\n }\n return bytes as SignatureBytes;\n } catch (error) {\n throw new Error(`Failed to decode base58 signature: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nexport function signatureBytesToBase58(bytes: SignatureBytes): string {\n try {\n if (bytes.length !== 64) {\n throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);\n }\n return getBase58Decoder().decode(bytes);\n } catch (error) {\n throw new Error(\n `Failed to encode signature to base58: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n","/**\n * @solana/connector - Kit Signer Factories\n *\n * Framework-agnostic factory functions to create Kit-compatible signers from wallet functions.\n * These factories enable pure Kit integration without React or framework dependencies.\n */\n\nimport type { Address } from '@solana/addresses';\nimport type {\n MessageModifyingSigner,\n TransactionSendingSigner,\n SignableMessage,\n MessageModifyingSignerConfig,\n TransactionSendingSignerConfig,\n} from '@solana/signers';\nimport type { SignatureBytes } from '@solana/keys';\nimport type { Transaction } from '@solana/transactions';\nimport { ValidationError, TransactionError, Errors } from '../errors';\nimport { updateSignatureDictionary, freezeSigner, base58ToSignatureBytes } from './signer-utils';\n\n/**\n * Create a MessageModifyingSigner from a wallet's sign message function\n *\n * This is a pure, framework-agnostic factory function that can be used anywhere.\n * Enables message signing (SIWS, auth) without React.\n *\n * @param walletAddress - The address of the wallet\n * @param signMessageFn - Function to sign a message (from wallet adapter)\n * @returns A frozen MessageModifyingSigner object\n *\n * @example\n * ```typescript\n * import { address } from '@solana/addresses';\n * import { createMessageSignerFromWallet } from '@solana/connector/headless';\n *\n * const signer = createMessageSignerFromWallet(\n * address('...'),\n * async (msg) => await wallet.signMessage(msg)\n * );\n *\n * // Use with Kit message signing\n * import { createSignableMessage } from '@solana/signers';\n * const signed = await signer.modifyAndSignMessages([createSignableMessage(messageBytes)]);\n * ```\n */\nexport function createMessageSignerFromWallet(\n walletAddress: Address<string>,\n signMessageFn: (message: Uint8Array) => Promise<Uint8Array>,\n): MessageModifyingSigner<string> {\n const signer: MessageModifyingSigner<string> = {\n address: walletAddress,\n\n async modifyAndSignMessages(\n messages: readonly SignableMessage[],\n config?: MessageModifyingSignerConfig,\n ): Promise<readonly SignableMessage[]> {\n // Most wallets only support signing one message at a time\n if (messages.length !== 1) {\n throw new ValidationError('INVALID_FORMAT', 'Wallets only support signing one message at a time', {\n receivedCount: messages.length,\n expectedCount: 1,\n });\n }\n\n const [message] = messages;\n const { content, signatures: originalSignatures } = message;\n\n // Handle abort signal if provided\n if (config?.abortSignal?.aborted) {\n throw Errors.userRejected('message signing');\n }\n\n try {\n // Sign the message\n const signature = await signMessageFn(content);\n\n // Update signatures (handle potential message modification)\n // Note: Message content doesn't change in signMessage operations\n const signatures = updateSignatureDictionary(\n content,\n content, // Message content doesn't change in signMessage\n originalSignatures,\n walletAddress,\n signature,\n );\n\n // Return signed message\n return [\n {\n content,\n signatures,\n },\n ];\n } catch (error) {\n // Convert wallet errors to ConnectorKit errors\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n if (message.includes('user rejected') || message.includes('user denied')) {\n throw Errors.userRejected('message signing');\n }\n throw new TransactionError('SIGNING_FAILED', 'Failed to sign message', undefined, error);\n }\n throw new TransactionError('SIGNING_FAILED', 'Failed to sign message', {\n originalError: String(error),\n });\n }\n },\n };\n\n return freezeSigner(signer);\n}\n\n/**\n * Create a TransactionSendingSigner from a wallet's send transaction function\n *\n * This is a pure, framework-agnostic factory function that can be used anywhere.\n * Enables sign + send in one operation (wallets like Phantom support this).\n *\n * @param walletAddress - The address of the wallet\n * @param chain - The Solana chain identifier (e.g., 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1')\n * @param sendTransactionFn - Function to send a transaction (from wallet adapter)\n * @returns A frozen TransactionSendingSigner object\n *\n * @example\n * ```typescript\n * import { address } from '@solana/addresses';\n * import { createTransactionSendingSignerFromWallet } from '@solana/connector/headless';\n *\n * const signer = createTransactionSendingSignerFromWallet(\n * address('...'),\n * 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n * async (tx) => await wallet.sendTransaction(tx, connection)\n * );\n *\n * // Use with Kit transaction sending\n * const signatures = await signer.signAndSendTransactions([transaction]);\n * ```\n */\nexport function createTransactionSendingSignerFromWallet(\n walletAddress: Address<string>,\n chain: `solana:${string}`,\n sendTransactionFn: (transaction: Transaction) => Promise<string>,\n): TransactionSendingSigner<string> {\n const signer: TransactionSendingSigner<string> = {\n address: walletAddress,\n\n async signAndSendTransactions(\n transactions: readonly Transaction[],\n config?: TransactionSendingSignerConfig,\n ): Promise<readonly SignatureBytes[]> {\n // Most wallets only support signing one transaction at a time\n if (transactions.length !== 1) {\n throw new ValidationError('INVALID_FORMAT', 'Wallets only support sending one transaction at a time', {\n receivedCount: transactions.length,\n expectedCount: 1,\n });\n }\n\n const [transaction] = transactions;\n\n // Handle abort signal if provided\n if (config?.abortSignal?.aborted) {\n throw Errors.userRejected('transaction sending');\n }\n\n try {\n // Send the transaction and get signature string (base58)\n const signatureString = await sendTransactionFn(transaction);\n\n // Convert base58 signature string to SignatureBytes\n const signatureBytes = base58ToSignatureBytes(signatureString);\n\n return [signatureBytes];\n } catch (error) {\n // Convert wallet errors to ConnectorKit errors\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n if (message.includes('user rejected') || message.includes('user denied')) {\n throw Errors.userRejected('transaction sending');\n }\n if (message.includes('network') || message.includes('rpc')) {\n throw new TransactionError('SEND_FAILED', 'Failed to send transaction', undefined, error);\n }\n throw new TransactionError('SEND_FAILED', 'Failed to send transaction', undefined, error);\n }\n throw new TransactionError('SEND_FAILED', 'Failed to send transaction', {\n originalError: String(error),\n });\n }\n },\n };\n\n return freezeSigner(signer);\n}\n","/**\n * @solana/connector - Kit Integration Helper\n *\n * High-level helper to create Kit signers from Wallet Standard wallets.\n * Framework-agnostic and works in any JavaScript environment.\n */\n\nimport type { Wallet, WalletAccount } from '@wallet-standard/base';\nimport type { Address } from '@solana/addresses';\nimport type { MessageModifyingSigner, TransactionSendingSigner } from '@solana/signers';\nimport { address } from '@solana/addresses';\nimport type { Connection } from '@solana/web3.js';\nimport type { Transaction } from '@solana/transactions';\nimport { createMessageSignerFromWallet, createTransactionSendingSignerFromWallet } from './signer-factories';\nimport { Errors } from '../errors';\n\n/**\n * Result of creating Kit signers from a Wallet Standard wallet\n */\nexport interface KitSignersFromWallet {\n /** Kit Address type (null if wallet not connected) */\n address: Address<string> | null;\n\n /** Plain address string (null if wallet not connected) */\n addressString: string | null;\n\n /** Message signer (null if wallet doesn't support signing or not connected) */\n messageSigner: MessageModifyingSigner<string> | null;\n\n /** Transaction sending signer (null if wallet doesn't support or not connected) */\n transactionSigner: TransactionSendingSigner<string> | null;\n}\n\n/**\n * Create Kit-compatible signers from a Wallet Standard wallet\n *\n * This function bridges Wallet Standard wallets with modern Kit architecture.\n * It's framework-agnostic and can be used in any JavaScript environment.\n *\n * The network is automatically detected from the connection's RPC endpoint.\n * For custom RPC URLs, you can override detection with the optional `network` parameter.\n *\n * @param wallet - The Wallet Standard wallet instance\n * @param account - The wallet account to use (first account if not provided)\n * @param connection - Optional connection for network detection and transaction sending\n * @param network - Optional network override ('mainnet' | 'devnet' | 'testnet')\n * @returns Kit signers object with address and signer instances\n *\n * @example\n * ```typescript\n * import { Connection } from '@solana/web3.js';\n * import { createKitSignersFromWallet } from '@solana/connector/headless';\n *\n * const connection = new Connection('https://api.devnet.solana.com');\n * const { address, messageSigner, transactionSigner } = createKitSignersFromWallet(\n * wallet,\n * account,\n * connection\n * );\n * ```\n */\nexport function createKitSignersFromWallet(\n wallet: Wallet | null,\n account?: WalletAccount | null,\n connection?: Connection | null,\n network?: 'mainnet' | 'devnet' | 'testnet',\n): KitSignersFromWallet {\n // If no wallet or account, return null values\n if (!wallet || !account) {\n return {\n address: null,\n addressString: null,\n messageSigner: null,\n transactionSigner: null,\n };\n }\n\n // Convert account address to Kit Address type\n let walletAddress: Address<string> | null = null;\n let walletAddressString: string | null = null;\n\n try {\n walletAddress = address(account.address) as Address<string>;\n walletAddressString = account.address;\n } catch (error) {\n // Invalid address format\n return {\n address: null,\n addressString: null,\n messageSigner: null,\n transactionSigner: null,\n };\n }\n\n // Detect network from connection or use provided override\n // Note: Will be enhanced in Phase 2 with chain utilities\n let chain: `solana:${string}` = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1'; // Default to devnet\n\n if (network) {\n // Map network to Wallet Standard chain ID\n const chainMap: Record<string, `solana:${string}`> = {\n mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n };\n chain = chainMap[network] || chain;\n } else if (connection) {\n // Detect from connection RPC URL\n const rpcUrl = connection.rpcEndpoint || '';\n if (rpcUrl.includes('mainnet') || rpcUrl.includes('api.mainnet-beta')) {\n chain = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';\n } else if (rpcUrl.includes('testnet')) {\n chain = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z';\n } else {\n // Default to devnet\n chain = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';\n }\n }\n\n // Check wallet features for capabilities\n const features = wallet.features as Record<string, Record<string, (...args: unknown[]) => unknown>>;\n const hasSignMessage = Boolean(features['solana:signMessage']);\n const hasSignAndSendTransaction = Boolean(features['solana:signAndSendTransaction']);\n const hasSendTransaction = Boolean(features['solana:sendTransaction']);\n\n // Create message signer if wallet supports message signing\n const messageSigner: MessageModifyingSigner<string> | null = hasSignMessage\n ? createMessageSignerFromWallet(walletAddress, async (message: Uint8Array) => {\n if (!hasSignMessage) {\n throw Errors.featureNotSupported('message signing');\n }\n\n try {\n const signFeature = features['solana:signMessage'];\n\n // Ensure message is a Uint8Array\n const messageBytes = message instanceof Uint8Array ? message : new Uint8Array(message);\n\n // Wallet Standard returns an array of signed messages\n const results = (await signFeature.signMessage({\n account,\n message: messageBytes,\n ...(chain ? { chain } : {}),\n })) as Array<{ signature: Uint8Array; signedMessage?: Uint8Array }>;\n\n if (!Array.isArray(results) || results.length === 0) {\n throw new Error('Wallet returned empty results array');\n }\n\n const firstResult = results[0];\n if (!firstResult?.signature) {\n throw new Error('Wallet returned no signature in first result');\n }\n\n return firstResult.signature;\n } catch (error) {\n console.error('signMessage error:', error);\n throw error instanceof Error ? error : new Error(String(error));\n }\n })\n : null;\n\n // Create transaction sending signer if wallet supports sending transactions\n // Prefer signAndSendTransaction over sendTransaction as it's more efficient\n const transactionSigner: TransactionSendingSigner<string> | null =\n hasSignAndSendTransaction || hasSendTransaction\n ? createTransactionSendingSignerFromWallet(walletAddress, chain, async (transaction: Transaction) => {\n // Prefer signAndSendTransaction (sign + send in one call)\n if (hasSignAndSendTransaction) {\n try {\n const signAndSendFeature = features['solana:signAndSendTransaction'];\n const result = (await signAndSendFeature.signAndSendTransaction({\n account,\n transactions: [transaction],\n ...(chain ? { chain } : {}),\n ...(connection ? { connection } : {}),\n })) as { signatures: string[] };\n\n // Return first signature (wallet limitation: single transaction)\n return result.signatures[0] || '';\n } catch (error) {\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n\n // Fallback to sendTransaction (if wallet supports it but not signAndSendTransaction)\n // Note: sendTransaction in Wallet Standard typically just signs, but some wallets\n // may implement it to also send if connection is available\n if (hasSendTransaction) {\n try {\n const sendFeature = features['solana:sendTransaction'];\n const result = (await sendFeature.sendTransaction({\n account,\n transactions: [transaction],\n ...(chain ? { chain } : {}),\n })) as { signatures: string[] };\n\n // Return first signature\n // Note: Actual sending should be handled by the caller or wallet implementation\n return result.signatures[0] || '';\n } catch (error) {\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n\n throw Errors.featureNotSupported('transaction sending');\n })\n : null;\n\n return {\n address: walletAddress,\n addressString: walletAddressString,\n messageSigner,\n transactionSigner,\n };\n}\n","/**\n * @solana/connector - Secure Logger\n *\n * Production-safe logger that redacts sensitive information\n * Prevents accidental exposure of addresses, keys, and other PII in logs\n *\n * Integrates with the connector's debug system:\n * - Respects `__CONNECTOR_DEBUG__` flag (enable/disable logging globally)\n * - Respects `__CONNECTOR_DEBUG_LEVEL__` (set minimum log level)\n * - Provides sensitive data redaction\n * - Provides unified logging API across the connector\n *\n * Enable connector debug:\n * ```ts\n * window.__CONNECTOR_DEBUG__ = true\n * window.__CONNECTOR_DEBUG_LEVEL__ = 'debug' // or 'info', 'warn', 'error'\n * ```\n */\n\nimport { isDebugEnabled, debug as connectorDebug } from '../kit';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface SecureLoggerConfig {\n /** Enable logging (defaults to false - use __CONNECTOR_DEBUG__ flag to enable) */\n enabled?: boolean;\n /** Minimum log level to output */\n level?: LogLevel;\n /** Redact sensitive information in logs (defaults to true in production) */\n redactSensitive?: boolean;\n /** Custom prefix for all log messages */\n prefix?: string;\n /** Use connector's debug system for logging (respects __CONNECTOR_DEBUG__ flags) */\n useConnectorDebug?: boolean;\n}\n\n/**\n * Keys that contain sensitive information that should be redacted\n */\nconst SENSITIVE_KEYS = [\n 'address',\n 'publickey',\n 'signature',\n 'account',\n 'rpcurl',\n 'url',\n 'apikey',\n 'api_key',\n 'token',\n 'secret',\n 'password',\n 'private',\n 'seed',\n 'mnemonic',\n];\n\n/**\n * Log levels in order of severity\n */\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/**\n * SecureLogger - Production-safe logging with automatic redaction\n *\n * Features:\n * - Integrates with connector's debug system (respects __CONNECTOR_DEBUG__ flags)\n * - Automatic redaction of sensitive data (addresses, keys, URLs)\n * - Configurable log levels (respects __CONNECTOR_DEBUG_LEVEL__)\n * - Environment-aware defaults\n * - Deep object traversal for nested sensitive data\n *\n * @example\n * ```ts\n * // Enable connector debug\n * window.__CONNECTOR_DEBUG__ = true\n * window.__CONNECTOR_DEBUG_LEVEL__ = 'info' // Optional: filter by level\n *\n * const logger = new SecureLogger({ prefix: 'Connector' });\n *\n * logger.debug('User connected', {\n * address: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU', // Auto-redacted in prod\n * wallet: 'Phantom'\n * });\n * // Development: \"User connected { address: '7xKX...gAsU', wallet: 'Phantom' }\"\n * // Production: \"User connected { address: '***', wallet: 'Phantom' }\"\n * ```\n */\nexport class SecureLogger {\n private config: Required<SecureLoggerConfig>;\n\n constructor(config: SecureLoggerConfig = {}) {\n const isDevelopment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';\n\n this.config = {\n // Default to disabled - logging is opt-in via __CONNECTOR_DEBUG__ or explicit config\n enabled: config.enabled ?? false,\n level: config.level ?? 'debug',\n redactSensitive: config.redactSensitive ?? !isDevelopment,\n prefix: config.prefix ?? 'Connector',\n useConnectorDebug: config.useConnectorDebug ?? true, // Default to using connector's debug system\n };\n }\n\n /**\n * Log debug information (lowest priority)\n */\n debug(message: string, data?: unknown): void {\n this.log('debug', message, data);\n }\n\n /**\n * Log general information\n */\n info(message: string, data?: unknown): void {\n this.log('info', message, data);\n }\n\n /**\n * Log warnings\n */\n warn(message: string, data?: unknown): void {\n this.log('warn', message, data);\n }\n\n /**\n * Log errors (highest priority)\n */\n error(message: string, data?: unknown): void {\n this.log('error', message, data);\n }\n\n /**\n * Internal log method that handles level filtering and redaction\n * Integrates with connector's debug system when enabled\n */\n private log(level: LogLevel, message: string, data?: unknown): void {\n // Check if logging is enabled (either via config or connector's debug system)\n const debugEnabled = this.config.useConnectorDebug ? isDebugEnabled() : false;\n if (!this.config.enabled && !debugEnabled) return;\n\n // Get effective log level (prefer connector's debug level if set)\n let effectiveLevel = this.config.level;\n if (this.config.useConnectorDebug && typeof globalThis !== 'undefined') {\n const connectorLevel = (globalThis as { __CONNECTOR_DEBUG_LEVEL__?: string }).__CONNECTOR_DEBUG_LEVEL__;\n if (connectorLevel && ['debug', 'info', 'warn', 'error'].includes(connectorLevel)) {\n effectiveLevel = connectorLevel as LogLevel;\n }\n }\n\n // Check if this log level should be output\n if (LOG_LEVELS[level] < LOG_LEVELS[effectiveLevel]) {\n return;\n }\n\n // Process data (redact if enabled)\n const processedData = this.config.redactSensitive ? this.redact(data) : data;\n\n // Format message with data\n const fullMessage =\n processedData !== undefined\n ? `${message} ${typeof processedData === 'object' ? JSON.stringify(processedData, null, 2) : processedData}`\n : message;\n\n // Use connector's debug system if enabled, otherwise fall back to console.*\n if (this.config.useConnectorDebug && debugEnabled) {\n connectorDebug(fullMessage, level, this.config.prefix);\n } else {\n const prefix = `[${this.config.prefix}]`;\n switch (level) {\n case 'debug':\n console.debug(prefix, message, processedData !== undefined ? processedData : '');\n break;\n case 'info':\n console.info(prefix, message, processedData !== undefined ? processedData : '');\n break;\n case 'warn':\n console.warn(prefix, message, processedData !== undefined ? processedData : '');\n break;\n case 'error':\n console.error(prefix, message, processedData !== undefined ? processedData : '');\n break;\n }\n }\n }\n\n /**\n * Recursively redact sensitive information from data\n */\n private redact(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n // Handle primitives\n if (typeof data !== 'object') {\n return data;\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map(item => this.redact(item));\n }\n\n // Handle objects\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n const keyLower = key.toLowerCase();\n\n // Check if this key contains sensitive information\n const isSensitive = SENSITIVE_KEYS.some(sensitiveKey => keyLower.includes(sensitiveKey));\n\n if (isSensitive) {\n redacted[key] = this.maskValue(value);\n } else if (typeof value === 'object' && value !== null) {\n redacted[key] = this.redact(value);\n } else {\n redacted[key] = value;\n }\n }\n\n return redacted;\n }\n\n /**\n * Mask a sensitive value for logging\n * Shows first 4 and last 4 characters for strings longer than 8 chars\n */\n private maskValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '***';\n }\n\n const str = String(value);\n\n // For very short strings, just mask completely\n if (str.length <= 8) {\n return '***';\n }\n\n // For longer strings, show first and last 4 characters\n return `${str.slice(0, 4)}...${str.slice(-4)}`;\n }\n\n /**\n * Update logger configuration at runtime\n */\n updateConfig(config: Partial<SecureLoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Required<SecureLoggerConfig> {\n return { ...this.config };\n }\n}\n\n/**\n * Default logger instance for the connector\n * Automatically configured based on NODE_ENV\n */\nexport const logger = new SecureLogger({\n prefix: 'Connector',\n});\n\n/**\n * Create a logger with a custom prefix\n *\n * @example\n * ```ts\n * const walletLogger = createLogger('WalletDetector');\n * walletLogger.debug('Scanning for wallets...');\n * // Output: [WalletDetector] Scanning for wallets...\n * ```\n */\nexport function createLogger(prefix: string, config?: Omit<SecureLoggerConfig, 'prefix'>): SecureLogger {\n return new SecureLogger({ ...config, prefix });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/kit/constants.ts","../src/lib/kit/rpc.ts","../src/lib/kit/explorer.ts","../src/lib/kit/client.ts","../src/lib/kit/debug.ts","../src/lib/kit/prepare-transaction.ts","../src/lib/errors/wallet-errors.ts","../src/lib/errors/index.ts","../src/lib/kit/signer-utils.ts","../src/lib/kit/signer-factories.ts","../src/lib/kit/signer-integration.ts","../src/lib/utils/secure-logger.ts"],"names":["address","message","LOG_LEVELS"],"mappings":"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","file":"chunk-ZZTY3O4N.mjs","sourcesContent":["/**\n * @solana/connector - Kit Constants\n *\n * Core Solana constants used throughout the connector.\n * These match the values from @solana/kit ecosystem.\n */\n\n/** 1 billion lamports per SOL */\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\n/**\n * Genesis hash for Solana network clusters\n */\nexport const GENESIS_HASH = {\n mainnet: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d',\n devnet: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG',\n testnet: '4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY',\n} as const;\n\n/**\n * Convert lamports to SOL\n * @param lamports - Amount in lamports\n * @returns Amount in SOL\n */\nexport function lamportsToSol(lamports: number | bigint): number {\n return Number(lamports) / LAMPORTS_PER_SOL;\n}\n\n/**\n * Convert SOL to lamports\n * @param sol - Amount in SOL\n * @returns Amount in lamports\n */\nexport function solToLamports(sol: number): bigint {\n return BigInt(Math.floor(sol * LAMPORTS_PER_SOL));\n}\n","/**\n * @solana/connector - Kit RPC Utilities\n *\n * RPC URL helpers for Solana clusters.\n */\n\nimport type { DevnetUrl, MainnetUrl, TestnetUrl } from '@solana/kit';\n\n/** Solana cluster moniker */\nexport type SolanaClusterMoniker = 'devnet' | 'localnet' | 'mainnet' | 'testnet';\n\n/** Localnet URL type */\nexport type LocalnetUrl = string & { '~cluster': 'localnet' };\n\n/** Generic URL type */\nexport type GenericUrl = string & {};\n\n/** Union of all cluster URL types */\nexport type ModifiedClusterUrl = DevnetUrl | GenericUrl | LocalnetUrl | MainnetUrl | TestnetUrl;\n\n/** URL or moniker that can be used to create a Solana client */\nexport type SolanaClientUrlOrMoniker = ModifiedClusterUrl | SolanaClusterMoniker | URL;\n\n/**\n * Helper to create a localnet URL type\n */\nexport function localnet(putativeString: string): LocalnetUrl {\n return putativeString as LocalnetUrl;\n}\n\n/**\n * Get a public Solana RPC endpoint for a cluster based on its moniker\n *\n * Note: These RPC URLs are rate limited and not suitable for production applications.\n * For production, use a dedicated RPC provider like Triton, Helius, QuickNode, or Alchemy.\n *\n * @param cluster - Cluster moniker\n * @returns Public RPC URL for the cluster\n */\nexport function getPublicSolanaRpcUrl(\n cluster: SolanaClusterMoniker | 'mainnet-beta' | 'localhost',\n): ModifiedClusterUrl {\n switch (cluster) {\n case 'devnet':\n return 'https://api.devnet.solana.com' as DevnetUrl;\n case 'testnet':\n return 'https://api.testnet.solana.com' as TestnetUrl;\n case 'mainnet-beta':\n case 'mainnet':\n return 'https://api.mainnet-beta.solana.com' as MainnetUrl;\n case 'localnet':\n case 'localhost':\n return 'http://127.0.0.1:8899' as LocalnetUrl;\n default:\n throw new Error('Invalid cluster moniker');\n }\n}\n\n/**\n * Get the WebSocket URL for a given RPC URL\n *\n * @param rpcUrl - HTTP/HTTPS RPC URL\n * @returns WebSocket URL\n */\nexport function getWebSocketUrl(rpcUrl: string): string {\n const url = new URL(rpcUrl);\n url.protocol = url.protocol.replace('http', 'ws');\n\n // Default WebSocket port for localnet\n if (url.hostname === 'localhost' || url.hostname.startsWith('127')) {\n url.port = '8900';\n }\n\n return url.toString();\n}\n","/**\n * @solana/connector - Kit Explorer Utilities\n *\n * Generate Solana Explorer links for addresses, transactions, and blocks.\n */\n\n/** Cluster type for explorer links */\nexport type ExplorerCluster = 'mainnet' | 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet' | 'localhost';\n\n/** Arguments for generating an explorer link */\nexport type GetExplorerLinkArgs =\n | { address: string; cluster?: ExplorerCluster }\n | { transaction: string; cluster?: ExplorerCluster }\n | { block: string | number; cluster?: ExplorerCluster }\n | { cluster?: ExplorerCluster };\n\n/**\n * Craft a Solana Explorer link on any cluster\n *\n * @param props - Configuration for the explorer link\n * @returns Solana Explorer URL\n *\n * @example\n * ```ts\n * // Transaction link on mainnet\n * getExplorerLink({ transaction: 'abc123...', cluster: 'mainnet' });\n *\n * // Address link on devnet\n * getExplorerLink({ address: 'abc123...', cluster: 'devnet' });\n *\n * // Block link on testnet\n * getExplorerLink({ block: 12345, cluster: 'testnet' });\n * ```\n */\nexport function getExplorerLink(props: GetExplorerLinkArgs = {}): string {\n const url = new URL('https://explorer.solana.com');\n\n // Default to mainnet / mainnet-beta\n let cluster = props.cluster;\n if (!cluster || cluster === 'mainnet') {\n cluster = 'mainnet-beta';\n }\n\n if ('address' in props && props.address) {\n url.pathname = `/address/${props.address}`;\n } else if ('transaction' in props && props.transaction) {\n url.pathname = `/tx/${props.transaction}`;\n } else if ('block' in props && props.block !== undefined) {\n url.pathname = `/block/${props.block}`;\n }\n\n if (cluster !== 'mainnet-beta') {\n if (cluster === 'localnet' || cluster === 'localhost') {\n // localnet technically isn't a cluster, so requires special handling\n url.searchParams.set('cluster', 'custom');\n url.searchParams.set('customUrl', 'http://localhost:8899');\n } else {\n url.searchParams.set('cluster', cluster);\n }\n }\n\n return url.toString();\n}\n","/**\n * @solana/connector - Kit Client Factory\n *\n * Creates a Solana RPC and WebSocket subscriptions client.\n * Replaces gill's createSolanaClient with a kit-based implementation.\n */\n\nimport type {\n DevnetUrl,\n MainnetUrl,\n TestnetUrl,\n Rpc,\n RpcSubscriptions,\n SolanaRpcApi,\n SolanaRpcSubscriptionsApi,\n} from '@solana/kit';\nimport { createSolanaRpc, createSolanaRpcSubscriptions } from '@solana/kit';\n\nimport type { LocalnetUrl, ModifiedClusterUrl, SolanaClientUrlOrMoniker } from './rpc';\nimport { getPublicSolanaRpcUrl } from './rpc';\n\n/**\n * Configuration for creating a Solana RPC client\n */\nexport interface CreateSolanaClientRpcConfig {\n /** Custom port for the RPC endpoint */\n port?: number;\n}\n\n/**\n * Configuration for creating a Solana RPC subscriptions client\n */\nexport interface CreateSolanaClientRpcSubscriptionsConfig {\n /** Custom port for the WebSocket endpoint */\n port?: number;\n}\n\n/**\n * Arguments for creating a Solana client\n */\nexport interface CreateSolanaClientArgs<TClusterUrl extends SolanaClientUrlOrMoniker = string> {\n /** Full RPC URL (for a private RPC endpoint) or the Solana moniker (for a public RPC endpoint) */\n urlOrMoniker: SolanaClientUrlOrMoniker | TClusterUrl;\n /** Configuration used to create the `rpc` client */\n rpcConfig?: CreateSolanaClientRpcConfig;\n /** Configuration used to create the `rpcSubscriptions` client */\n rpcSubscriptionsConfig?: CreateSolanaClientRpcSubscriptionsConfig;\n}\n\n/**\n * A Solana client with RPC and WebSocket subscription capabilities\n */\nexport interface SolanaClient<TClusterUrl extends ModifiedClusterUrl | string = string> {\n /** Used to make RPC calls to your RPC provider */\n rpc: Rpc<SolanaRpcApi>;\n /** Used to make RPC websocket calls to your RPC provider */\n rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n /** Full RPC URL that was used to create this client */\n urlOrMoniker: SolanaClientUrlOrMoniker | TClusterUrl;\n}\n\n/**\n * Create a Solana `rpc` and `rpcSubscriptions` client\n *\n * @param props - Configuration for the client\n * @returns Solana client with RPC and WebSocket subscription capabilities\n *\n * @example\n * ```ts\n * // Using a cluster moniker\n * const client = createSolanaClient({ urlOrMoniker: 'devnet' });\n *\n * // Using a custom RPC URL\n * const client = createSolanaClient({ urlOrMoniker: 'https://my-rpc.example.com' });\n *\n * // Making RPC calls\n * const balance = await client.rpc.getBalance(address).send();\n * ```\n */\nexport function createSolanaClient(\n props: Omit<CreateSolanaClientArgs<MainnetUrl | 'mainnet'>, 'urlOrMoniker'> & {\n urlOrMoniker: 'mainnet';\n },\n): SolanaClient<MainnetUrl>;\nexport function createSolanaClient(\n props: Omit<CreateSolanaClientArgs<DevnetUrl | 'devnet'>, 'urlOrMoniker'> & {\n urlOrMoniker: 'devnet';\n },\n): SolanaClient<DevnetUrl>;\nexport function createSolanaClient(\n props: Omit<CreateSolanaClientArgs<TestnetUrl | 'testnet'>, 'urlOrMoniker'> & {\n urlOrMoniker: 'testnet';\n },\n): SolanaClient<TestnetUrl>;\nexport function createSolanaClient(\n props: Omit<CreateSolanaClientArgs<LocalnetUrl | 'localnet'>, 'urlOrMoniker'> & {\n urlOrMoniker: 'localnet';\n },\n): SolanaClient<LocalnetUrl>;\nexport function createSolanaClient<TClusterUrl extends ModifiedClusterUrl>(\n props: CreateSolanaClientArgs<TClusterUrl>,\n): SolanaClient<TClusterUrl>;\nexport function createSolanaClient<TCluster extends ModifiedClusterUrl>({\n urlOrMoniker,\n rpcConfig,\n rpcSubscriptionsConfig,\n}: CreateSolanaClientArgs<TCluster>): SolanaClient<TCluster> {\n if (!urlOrMoniker) throw new Error('Cluster url or moniker is required');\n\n let parsedUrl: URL;\n\n // Try to parse as URL first\n if (urlOrMoniker instanceof URL) {\n parsedUrl = urlOrMoniker;\n } else {\n try {\n parsedUrl = new URL(urlOrMoniker.toString());\n } catch {\n // Not a valid URL, try as moniker\n try {\n parsedUrl = new URL(\n getPublicSolanaRpcUrl(urlOrMoniker.toString() as 'mainnet' | 'devnet' | 'testnet' | 'localnet'),\n );\n } catch {\n throw new Error('Invalid URL or cluster moniker');\n }\n }\n }\n\n if (!parsedUrl.protocol.match(/^https?:/i)) {\n throw new Error('Unsupported protocol. Only HTTP and HTTPS are supported');\n }\n\n // Apply custom port if specified\n if (rpcConfig?.port) {\n parsedUrl.port = rpcConfig.port.toString();\n }\n\n const rpcUrl = parsedUrl.toString();\n const rpc = createSolanaRpc(rpcUrl) as Rpc<SolanaRpcApi>;\n\n // Convert HTTP to WS for subscriptions\n parsedUrl.protocol = parsedUrl.protocol.replace('http', 'ws');\n\n // Apply WebSocket port if specified, or use default 8900 for localhost\n if (rpcSubscriptionsConfig?.port) {\n parsedUrl.port = rpcSubscriptionsConfig.port.toString();\n } else if (parsedUrl.hostname === 'localhost' || parsedUrl.hostname.startsWith('127')) {\n parsedUrl.port = '8900';\n }\n\n const rpcSubscriptions = createSolanaRpcSubscriptions(\n parsedUrl.toString(),\n ) as RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n\n return {\n rpc,\n rpcSubscriptions,\n urlOrMoniker: rpcUrl as TCluster,\n };\n}\n","/**\n * @solana/connector - Kit Debug Utilities\n *\n * Simplified debug logging utilities for the connector.\n * Replaces gill's debug system with a connector-specific implementation.\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\ndeclare global {\n /**\n * Whether or not to enable debug mode. When enabled, default log level of `info`\n */\n // eslint-disable-next-line no-var\n var __CONNECTOR_DEBUG__: boolean | undefined;\n /**\n * Set the a desired level of logs to be output in the application\n *\n * - Default: `info`\n * - Options: `debug` | `info` | `warn` | `error`\n */\n // eslint-disable-next-line no-var\n var __CONNECTOR_DEBUG_LEVEL__: LogLevel | undefined;\n}\n\n/**\n * Get the minimum log level from environment or global settings\n */\nfunction getMinLogLevel(): LogLevel {\n if (typeof process !== 'undefined' && process.env?.CONNECTOR_DEBUG_LEVEL) {\n return process.env.CONNECTOR_DEBUG_LEVEL as LogLevel;\n }\n if (\n typeof globalThis !== 'undefined' &&\n (globalThis as typeof globalThis & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__\n ) {\n return (globalThis as typeof globalThis & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__!;\n }\n if (\n typeof window !== 'undefined' &&\n (window as Window & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__\n ) {\n return (window as Window & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__!;\n }\n return 'info';\n}\n\n/**\n * Check if the connector debug logger is enabled or not\n *\n * Enable debugging by setting any of the following to `true`:\n * - `process.env.CONNECTOR_DEBUG`\n * - `globalThis.__CONNECTOR_DEBUG__`\n * - `window.__CONNECTOR_DEBUG__`\n */\nexport function isDebugEnabled(): boolean {\n if (typeof process !== 'undefined') {\n if (process.env?.CONNECTOR_DEBUG_LEVEL) return true;\n if (process.env?.CONNECTOR_DEBUG === 'true' || process.env?.CONNECTOR_DEBUG === '1') return true;\n }\n if (typeof globalThis !== 'undefined') {\n if ((globalThis as typeof globalThis & { __CONNECTOR_DEBUG__?: boolean }).__CONNECTOR_DEBUG__ === true) {\n return true;\n }\n if ((globalThis as typeof globalThis & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__) {\n return true;\n }\n }\n if (typeof window !== 'undefined') {\n if ((window as Window & { __CONNECTOR_DEBUG__?: boolean }).__CONNECTOR_DEBUG__ === true) {\n return true;\n }\n if ((window as Window & { __CONNECTOR_DEBUG_LEVEL__?: LogLevel }).__CONNECTOR_DEBUG_LEVEL__) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Log debug messages based on the desired application's logging level.\n *\n * @param message - the message contents to be logged\n * @param level - default: `info` (see: {@link LOG_LEVELS})\n * @param prefix - default: `[Connector]`\n *\n * To enable connector's debug logger, set any of the following to `true`:\n * - `process.env.CONNECTOR_DEBUG`\n * - `globalThis.__CONNECTOR_DEBUG__`\n * - `window.__CONNECTOR_DEBUG__`\n *\n * To set a desired level of logs to be output in the application, set the value of one of the following:\n * - `process.env.CONNECTOR_DEBUG_LEVEL`\n * - `globalThis.__CONNECTOR_DEBUG_LEVEL__`\n * - `window.__CONNECTOR_DEBUG_LEVEL__`\n */\nexport function debug(message: unknown, level: LogLevel = 'info', prefix: string = '[Connector]'): void {\n if (!isDebugEnabled()) return;\n\n if (LOG_LEVELS[level] < LOG_LEVELS[getMinLogLevel()]) return;\n\n const formattedMessage = typeof message === 'string' ? message : JSON.stringify(message, null, 2);\n\n switch (level) {\n case 'debug':\n console.log(prefix, formattedMessage);\n break;\n case 'info':\n console.info(prefix, formattedMessage);\n break;\n case 'warn':\n console.warn(prefix, formattedMessage);\n break;\n case 'error':\n console.error(prefix, formattedMessage);\n break;\n }\n}\n","/**\n * @solana/connector - Kit Transaction Preparation\n *\n * Prepares transactions for sending by setting blockhash.\n * A simplified version that focuses on blockhash management.\n */\n\nimport type {\n GetLatestBlockhashApi,\n Rpc,\n TransactionMessage,\n TransactionMessageWithBlockhashLifetime,\n TransactionMessageWithFeePayer,\n} from '@solana/kit';\nimport {\n assertIsTransactionMessageWithBlockhashLifetime,\n setTransactionMessageLifetimeUsingBlockhash,\n} from '@solana/kit';\n\nimport { debug, isDebugEnabled } from './debug';\n\n/**\n * Transaction message types that can be prepared.\n * Requires both a fee payer and a transaction message.\n */\ntype PrepareCompilableTransactionMessage = TransactionMessage & TransactionMessageWithFeePayer;\n\n/**\n * Configuration for preparing a transaction\n */\nexport interface PrepareTransactionConfig<TMessage extends PrepareCompilableTransactionMessage> {\n /**\n * Transaction to prepare for sending to the blockchain\n */\n transaction: TMessage;\n /**\n * RPC client capable of getting the latest blockhash\n */\n rpc: Rpc<GetLatestBlockhashApi>;\n /**\n * Multiplier applied to the simulated compute unit value obtained from simulation\n * @default 1.1\n * @deprecated Compute unit estimation is not currently supported\n */\n computeUnitLimitMultiplier?: number;\n /**\n * Whether or not you wish to force reset the compute unit limit value (if one is already set)\n * @deprecated Compute unit estimation is not currently supported\n */\n computeUnitLimitReset?: boolean;\n /**\n * Whether or not you wish to force reset the latest blockhash (if one is already set)\n * @default true\n */\n blockhashReset?: boolean;\n}\n\n/**\n * Prepare a Transaction to be signed and sent to the network. Including:\n * - fetching the latest blockhash (if not already set)\n * - (optional) resetting latest blockhash to the most recent\n *\n * Note: Automatic compute unit estimation is not currently supported in this version.\n * You should set compute unit limits manually if needed.\n *\n * @param config - Configuration for transaction preparation\n * @returns Prepared transaction with blockhash lifetime set\n *\n * @example\n * ```ts\n * const prepared = await prepareTransaction({\n * transaction: myTransaction,\n * rpc: client.rpc,\n * });\n * ```\n */\nexport async function prepareTransaction<TMessage extends PrepareCompilableTransactionMessage>(\n config: PrepareTransactionConfig<TMessage>,\n): Promise<TMessage & TransactionMessageWithBlockhashLifetime> {\n // Set config defaults\n const blockhashReset = config.blockhashReset !== false;\n\n let transaction = config.transaction as TMessage & Partial<TransactionMessageWithBlockhashLifetime>;\n\n // Update the latest blockhash\n const hasLifetimeConstraint = 'lifetimeConstraint' in transaction;\n\n if (blockhashReset || !hasLifetimeConstraint) {\n const { value: latestBlockhash } = await config.rpc.getLatestBlockhash().send();\n\n if (!hasLifetimeConstraint) {\n if (isDebugEnabled()) {\n debug('Transaction missing latest blockhash, fetching one.', 'debug');\n }\n transaction = setTransactionMessageLifetimeUsingBlockhash(\n latestBlockhash,\n transaction as TMessage,\n ) as TMessage & TransactionMessageWithBlockhashLifetime;\n } else if (blockhashReset) {\n if (isDebugEnabled()) {\n debug('Auto resetting the latest blockhash.', 'debug');\n }\n transaction = {\n ...transaction,\n lifetimeConstraint: latestBlockhash,\n } as TMessage & TransactionMessageWithBlockhashLifetime;\n }\n }\n\n assertIsTransactionMessageWithBlockhashLifetime(transaction);\n\n return transaction as TMessage & TransactionMessageWithBlockhashLifetime;\n}\n","/**\n * Wallet Error Types - Framework-agnostic error definitions\n *\n * These types are shared between headless and React implementations.\n * They do NOT import React or any TSX modules.\n */\n\n/**\n * Error types specific to wallet connections.\n * Used by error boundaries and headless error handling.\n */\nexport const WalletErrorType = {\n CONNECTION_FAILED: 'CONNECTION_FAILED',\n TRANSACTION_FAILED: 'TRANSACTION_FAILED',\n NETWORK_ERROR: 'NETWORK_ERROR',\n WALLET_NOT_FOUND: 'WALLET_NOT_FOUND',\n USER_REJECTED: 'USER_REJECTED',\n INSUFFICIENT_FUNDS: 'INSUFFICIENT_FUNDS',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n} as const;\n\nexport type WalletErrorType = (typeof WalletErrorType)[keyof typeof WalletErrorType];\n\n/**\n * Extended error interface for wallet-specific errors.\n * Extends the standard Error with wallet context.\n */\nexport interface WalletError extends Error {\n type: WalletErrorType;\n recoverable: boolean;\n context?: Record<string, unknown>;\n retryAction?: () => Promise<void>;\n}\n\n/**\n * Type guard to check if an error is a WalletError\n */\nexport function isWalletError(error: unknown): error is WalletError {\n return (\n error instanceof Error &&\n 'type' in error &&\n typeof (error as WalletError).type === 'string' &&\n Object.values(WalletErrorType).includes((error as WalletError).type as WalletErrorType)\n );\n}\n\n/**\n * Create a WalletError from a standard Error\n */\nexport function createWalletError(\n error: Error,\n type: WalletErrorType,\n recoverable: boolean,\n context?: Record<string, unknown>,\n): WalletError {\n const walletError = error as WalletError;\n walletError.type = type;\n walletError.recoverable = recoverable;\n walletError.context = context;\n return walletError;\n}\n","/**\n * @solana/connector - Unified Error System\n */\n\n// Re-export wallet-specific error types (React-free)\nexport * from './wallet-errors';\n\nexport abstract class ConnectorError extends Error {\n abstract readonly code: string;\n abstract readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n readonly originalError?: Error;\n readonly timestamp: string;\n\n constructor(message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message);\n this.name = this.constructor.name;\n this.context = context;\n this.originalError = originalError;\n this.timestamp = new Date().toISOString();\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n recoverable: this.recoverable,\n context: this.context,\n timestamp: this.timestamp,\n originalError: this.originalError?.message,\n };\n }\n}\n\nexport class ConnectionError extends ConnectorError {\n readonly code: ConnectionErrorCode;\n readonly recoverable = true;\n\n constructor(code: ConnectionErrorCode, message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message, context, originalError);\n this.code = code;\n }\n}\n\nexport type ConnectionErrorCode =\n | 'WALLET_NOT_CONNECTED'\n | 'WALLET_NOT_FOUND'\n | 'CONNECTION_FAILED'\n | 'CONNECTION_REJECTED'\n | 'DISCONNECTION_FAILED'\n | 'ACCOUNT_NOT_AVAILABLE'\n | 'RECONNECTION_FAILED';\n\nexport class ValidationError extends ConnectorError {\n readonly code: ValidationErrorCode;\n readonly recoverable = false;\n\n constructor(code: ValidationErrorCode, message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message, context, originalError);\n this.code = code;\n }\n}\n\nexport type ValidationErrorCode =\n | 'INVALID_TRANSACTION'\n | 'INVALID_MESSAGE'\n | 'INVALID_ADDRESS'\n | 'INVALID_SIGNATURE'\n | 'INVALID_FORMAT'\n | 'UNSUPPORTED_FORMAT'\n | 'VALIDATION_FAILED';\n\nexport class ConfigurationError extends ConnectorError {\n readonly code: ConfigurationErrorCode;\n readonly recoverable = false;\n\n constructor(\n code: ConfigurationErrorCode,\n message: string,\n context?: Record<string, unknown>,\n originalError?: Error,\n ) {\n super(message, context, originalError);\n this.code = code;\n }\n}\n\nexport type ConfigurationErrorCode =\n | 'MISSING_PROVIDER'\n | 'INVALID_CLUSTER'\n | 'CLUSTER_NOT_FOUND'\n | 'INVALID_CONFIG'\n | 'INITIALIZATION_FAILED';\n\nexport class NetworkError extends ConnectorError {\n readonly code: NetworkErrorCode;\n readonly recoverable = true;\n\n constructor(code: NetworkErrorCode, message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message, context, originalError);\n this.code = code;\n }\n}\n\nexport type NetworkErrorCode =\n | 'RPC_ERROR'\n | 'NETWORK_TIMEOUT'\n | 'NETWORK_UNAVAILABLE'\n | 'TRANSACTION_SIMULATION_FAILED';\n\nexport class TransactionError extends ConnectorError {\n readonly code: TransactionErrorCode;\n readonly recoverable: boolean;\n\n constructor(code: TransactionErrorCode, message: string, context?: Record<string, unknown>, originalError?: Error) {\n super(message, context, originalError);\n this.code = code;\n this.recoverable = ['USER_REJECTED', 'SEND_FAILED', 'SIMULATION_FAILED'].includes(code);\n }\n}\n\nexport type TransactionErrorCode =\n | 'SIGNING_FAILED'\n | 'SEND_FAILED'\n | 'FEATURE_NOT_SUPPORTED'\n | 'USER_REJECTED'\n | 'SIMULATION_FAILED'\n | 'INVALID_TRANSACTION'\n | 'TRANSACTION_EXPIRED';\n\nexport function isConnectorError(error: unknown): error is ConnectorError {\n return error instanceof ConnectorError;\n}\n\nexport function isConnectionError(error: unknown): error is ConnectionError {\n return error instanceof ConnectionError;\n}\n\nexport function isValidationError(error: unknown): error is ValidationError {\n return error instanceof ValidationError;\n}\n\nexport function isConfigurationError(error: unknown): error is ConfigurationError {\n return error instanceof ConfigurationError;\n}\n\nexport function isNetworkError(error: unknown): error is NetworkError {\n return error instanceof NetworkError;\n}\n\nexport function isTransactionError(error: unknown): error is TransactionError {\n return error instanceof TransactionError;\n}\n\nexport const Errors = {\n walletNotConnected: (context?: Record<string, unknown>) =>\n new ConnectionError('WALLET_NOT_CONNECTED', 'No wallet connected', context),\n\n walletNotFound: (walletName?: string) =>\n new ConnectionError('WALLET_NOT_FOUND', `Wallet not found${walletName ? `: ${walletName}` : ''}`, {\n walletName,\n }),\n\n connectionFailed: (originalError?: Error) =>\n new ConnectionError('CONNECTION_FAILED', 'Failed to connect to wallet', undefined, originalError),\n\n accountNotAvailable: (address?: string) =>\n new ConnectionError('ACCOUNT_NOT_AVAILABLE', 'Requested account not available', { address }),\n\n invalidTransaction: (reason: string, context?: Record<string, unknown>) =>\n new ValidationError('INVALID_TRANSACTION', `Invalid transaction: ${reason}`, context),\n\n invalidFormat: (expectedFormat: string, actualFormat?: string) =>\n new ValidationError('INVALID_FORMAT', `Invalid format: expected ${expectedFormat}`, {\n expectedFormat,\n actualFormat,\n }),\n\n unsupportedFormat: (format: string) =>\n new ValidationError('UNSUPPORTED_FORMAT', `Unsupported format: ${format}`, { format }),\n\n missingProvider: (hookName: string) =>\n new ConfigurationError(\n 'MISSING_PROVIDER',\n `${hookName} must be used within ConnectorProvider. Wrap your app with <ConnectorProvider> or <UnifiedProvider>.`,\n { hookName },\n ),\n\n clusterNotFound: (clusterId: string, availableClusters: string[]) =>\n new ConfigurationError(\n 'CLUSTER_NOT_FOUND',\n `Cluster ${clusterId} not found. Available clusters: ${availableClusters.join(', ')}`,\n { clusterId, availableClusters },\n ),\n\n rpcError: (message: string, originalError?: Error) =>\n new NetworkError('RPC_ERROR', message, undefined, originalError),\n\n networkTimeout: () => new NetworkError('NETWORK_TIMEOUT', 'Network request timed out'),\n\n signingFailed: (originalError?: Error) =>\n new TransactionError('SIGNING_FAILED', 'Failed to sign transaction', undefined, originalError),\n\n featureNotSupported: (feature: string) =>\n new TransactionError('FEATURE_NOT_SUPPORTED', `Wallet does not support ${feature}`, { feature }),\n\n userRejected: (operation: string) =>\n new TransactionError('USER_REJECTED', `User rejected ${operation}`, { operation }),\n} as const;\n\nexport function toConnectorError(error: unknown, defaultMessage = 'An unexpected error occurred'): ConnectorError {\n if (isConnectorError(error)) {\n return error;\n }\n\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n\n if (message.includes('user rejected') || message.includes('user denied')) {\n return Errors.userRejected('transaction');\n }\n\n if (message.includes('wallet not found') || message.includes('not installed')) {\n return Errors.walletNotFound();\n }\n\n if (message.includes('not connected')) {\n return Errors.walletNotConnected();\n }\n\n if (message.includes('network') || message.includes('fetch')) {\n return Errors.rpcError(error.message, error);\n }\n\n if (message.includes('invalid')) {\n return new ValidationError('VALIDATION_FAILED', error.message, undefined, error);\n }\n\n return new TransactionError('SIGNING_FAILED', error.message, undefined, error);\n }\n\n return new TransactionError('SIGNING_FAILED', defaultMessage, { originalError: String(error) });\n}\n\nexport function getUserFriendlyMessage(error: unknown): string {\n if (!isConnectorError(error)) {\n return 'An unexpected error occurred. Please try again.';\n }\n\n const messages: Record<string, string> = {\n WALLET_NOT_CONNECTED: 'Please connect your wallet to continue.',\n WALLET_NOT_FOUND: 'Wallet not found. Please install a supported wallet.',\n CONNECTION_FAILED: 'Failed to connect to wallet. Please try again.',\n USER_REJECTED: 'Transaction was cancelled.',\n FEATURE_NOT_SUPPORTED: 'This wallet does not support this feature.',\n SIGNING_FAILED: 'Failed to sign transaction. Please try again.',\n SEND_FAILED: 'Failed to send transaction. Please try again.',\n INVALID_CLUSTER: 'Invalid network configuration.',\n CLUSTER_NOT_FOUND: 'Network not found.',\n MISSING_PROVIDER: 'Application not properly configured.',\n RPC_ERROR: 'Network error. Please check your connection.',\n NETWORK_TIMEOUT: 'Request timed out. Please try again.',\n };\n\n return messages[error.code] || error.message || 'An error occurred.';\n}\n","import type { Address } from '@solana/addresses';\nimport { getBase58Decoder, getBase58Encoder } from '@solana/codecs';\nimport type { SignatureBytes } from '@solana/keys';\nimport type { SignatureDictionary } from '@solana/signers';\n\nfunction toSignatureBytes(bytes: Uint8Array): SignatureBytes {\n return bytes as SignatureBytes;\n}\n\nexport function detectMessageModification(original: Uint8Array, modified: Uint8Array): boolean {\n if (original.length !== modified.length) {\n return true;\n }\n\n for (let i = 0; i < original.length; i++) {\n if (original[i] !== modified[i]) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function updateSignatureDictionary(\n original: Uint8Array,\n signed: Uint8Array,\n originalSignatures: SignatureDictionary,\n address: Address<string>,\n signature: Uint8Array,\n): SignatureDictionary {\n const wasModified = detectMessageModification(original, signed);\n\n const signatureBytes = signature as unknown as SignatureBytes;\n\n const newSignatures = {} as Record<string, SignatureBytes>;\n newSignatures[address as string] = signatureBytes;\n\n if (wasModified) {\n return newSignatures as SignatureDictionary;\n }\n\n const merged = {\n ...originalSignatures,\n ...newSignatures,\n };\n\n return merged as SignatureDictionary;\n}\n\nexport function freezeSigner<T extends object>(signer: T): Readonly<T> {\n return Object.freeze(signer);\n}\n\nexport function base58ToSignatureBytes(signature: string): SignatureBytes {\n try {\n const bytes = getBase58Encoder().encode(signature);\n if (bytes.length !== 64) {\n throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);\n }\n return bytes as SignatureBytes;\n } catch (error) {\n throw new Error(`Failed to decode base58 signature: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nexport function signatureBytesToBase58(bytes: SignatureBytes): string {\n try {\n if (bytes.length !== 64) {\n throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);\n }\n return getBase58Decoder().decode(bytes);\n } catch (error) {\n throw new Error(\n `Failed to encode signature to base58: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n","/**\n * @solana/connector - Kit Signer Factories\n *\n * Framework-agnostic factory functions to create Kit-compatible signers from wallet functions.\n * These factories enable pure Kit integration without React or framework dependencies.\n */\n\nimport type { Address } from '@solana/addresses';\nimport type {\n MessageModifyingSigner,\n TransactionSendingSigner,\n SignableMessage,\n MessageModifyingSignerConfig,\n TransactionSendingSignerConfig,\n} from '@solana/signers';\nimport type { SignatureBytes } from '@solana/keys';\nimport type { Transaction } from '@solana/transactions';\nimport { ValidationError, TransactionError, Errors } from '../errors';\nimport { updateSignatureDictionary, freezeSigner, base58ToSignatureBytes } from './signer-utils';\n\n/**\n * Create a MessageModifyingSigner from a wallet's sign message function\n *\n * This is a pure, framework-agnostic factory function that can be used anywhere.\n * Enables message signing (SIWS, auth) without React.\n *\n * @param walletAddress - The address of the wallet\n * @param signMessageFn - Function to sign a message (from wallet adapter)\n * @returns A frozen MessageModifyingSigner object\n *\n * @example\n * ```typescript\n * import { address } from '@solana/addresses';\n * import { createMessageSignerFromWallet } from '@solana/connector/headless';\n *\n * const signer = createMessageSignerFromWallet(\n * address('...'),\n * async (msg) => await wallet.signMessage(msg)\n * );\n *\n * // Use with Kit message signing\n * import { createSignableMessage } from '@solana/signers';\n * const signed = await signer.modifyAndSignMessages([createSignableMessage(messageBytes)]);\n * ```\n */\nexport function createMessageSignerFromWallet(\n walletAddress: Address<string>,\n signMessageFn: (message: Uint8Array) => Promise<Uint8Array>,\n): MessageModifyingSigner<string> {\n const signer: MessageModifyingSigner<string> = {\n address: walletAddress,\n\n async modifyAndSignMessages(\n messages: readonly SignableMessage[],\n config?: MessageModifyingSignerConfig,\n ): Promise<readonly SignableMessage[]> {\n // Most wallets only support signing one message at a time\n if (messages.length !== 1) {\n throw new ValidationError('INVALID_FORMAT', 'Wallets only support signing one message at a time', {\n receivedCount: messages.length,\n expectedCount: 1,\n });\n }\n\n const [message] = messages;\n const { content, signatures: originalSignatures } = message;\n\n // Handle abort signal if provided\n if (config?.abortSignal?.aborted) {\n throw Errors.userRejected('message signing');\n }\n\n try {\n // Sign the message\n const signature = await signMessageFn(content);\n\n // Update signatures (handle potential message modification)\n // Note: Message content doesn't change in signMessage operations\n const signatures = updateSignatureDictionary(\n content,\n content, // Message content doesn't change in signMessage\n originalSignatures,\n walletAddress,\n signature,\n );\n\n // Return signed message\n return [\n {\n content,\n signatures,\n },\n ];\n } catch (error) {\n // Convert wallet errors to ConnectorKit errors\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n if (message.includes('user rejected') || message.includes('user denied')) {\n throw Errors.userRejected('message signing');\n }\n throw new TransactionError('SIGNING_FAILED', 'Failed to sign message', undefined, error);\n }\n throw new TransactionError('SIGNING_FAILED', 'Failed to sign message', {\n originalError: String(error),\n });\n }\n },\n };\n\n return freezeSigner(signer);\n}\n\n/**\n * Create a TransactionSendingSigner from a wallet's send transaction function\n *\n * This is a pure, framework-agnostic factory function that can be used anywhere.\n * Enables sign + send in one operation (wallets like Phantom support this).\n *\n * @param walletAddress - The address of the wallet\n * @param chain - The Solana chain identifier (e.g., 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1')\n * @param sendTransactionFn - Function to send a transaction (from wallet adapter)\n * @returns A frozen TransactionSendingSigner object\n *\n * @example\n * ```typescript\n * import { address } from '@solana/addresses';\n * import { createTransactionSendingSignerFromWallet } from '@solana/connector/headless';\n *\n * const signer = createTransactionSendingSignerFromWallet(\n * address('...'),\n * 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n * async (tx) => await wallet.sendTransaction(tx, connection)\n * );\n *\n * // Use with Kit transaction sending\n * const signatures = await signer.signAndSendTransactions([transaction]);\n * ```\n */\nexport function createTransactionSendingSignerFromWallet(\n walletAddress: Address<string>,\n chain: `solana:${string}`,\n sendTransactionFn: (transaction: Transaction) => Promise<string>,\n): TransactionSendingSigner<string> {\n const signer: TransactionSendingSigner<string> = {\n address: walletAddress,\n\n async signAndSendTransactions(\n transactions: readonly Transaction[],\n config?: TransactionSendingSignerConfig,\n ): Promise<readonly SignatureBytes[]> {\n // Most wallets only support signing one transaction at a time\n if (transactions.length !== 1) {\n throw new ValidationError('INVALID_FORMAT', 'Wallets only support sending one transaction at a time', {\n receivedCount: transactions.length,\n expectedCount: 1,\n });\n }\n\n const [transaction] = transactions;\n\n // Handle abort signal if provided\n if (config?.abortSignal?.aborted) {\n throw Errors.userRejected('transaction sending');\n }\n\n try {\n // Send the transaction and get signature string (base58)\n const signatureString = await sendTransactionFn(transaction);\n\n // Convert base58 signature string to SignatureBytes\n const signatureBytes = base58ToSignatureBytes(signatureString);\n\n return [signatureBytes];\n } catch (error) {\n // Convert wallet errors to ConnectorKit errors\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n if (message.includes('user rejected') || message.includes('user denied')) {\n throw Errors.userRejected('transaction sending');\n }\n if (message.includes('network') || message.includes('rpc')) {\n throw new TransactionError('SEND_FAILED', 'Failed to send transaction', undefined, error);\n }\n throw new TransactionError('SEND_FAILED', 'Failed to send transaction', undefined, error);\n }\n throw new TransactionError('SEND_FAILED', 'Failed to send transaction', {\n originalError: String(error),\n });\n }\n },\n };\n\n return freezeSigner(signer);\n}\n","/**\n * @solana/connector - Kit Integration Helper\n *\n * High-level helper to create Kit signers from Wallet Standard wallets.\n * Framework-agnostic and works in any JavaScript environment.\n */\n\nimport type { Wallet, WalletAccount } from '@wallet-standard/base';\nimport type { Address } from '@solana/addresses';\nimport type { MessageModifyingSigner, TransactionSendingSigner } from '@solana/signers';\nimport { address } from '@solana/addresses';\nimport type { Connection } from '@solana/web3.js';\nimport type { Transaction } from '@solana/transactions';\nimport { createMessageSignerFromWallet, createTransactionSendingSignerFromWallet } from './signer-factories';\nimport { Errors } from '../errors';\n\n/**\n * Result of creating Kit signers from a Wallet Standard wallet\n */\nexport interface KitSignersFromWallet {\n /** Kit Address type (null if wallet not connected) */\n address: Address<string> | null;\n\n /** Plain address string (null if wallet not connected) */\n addressString: string | null;\n\n /** Message signer (null if wallet doesn't support signing or not connected) */\n messageSigner: MessageModifyingSigner<string> | null;\n\n /** Transaction sending signer (null if wallet doesn't support or not connected) */\n transactionSigner: TransactionSendingSigner<string> | null;\n}\n\n/**\n * Create Kit-compatible signers from a Wallet Standard wallet\n *\n * This function bridges Wallet Standard wallets with modern Kit architecture.\n * It's framework-agnostic and can be used in any JavaScript environment.\n *\n * The network is automatically detected from the connection's RPC endpoint.\n * For custom RPC URLs, you can override detection with the optional `network` parameter.\n *\n * @param wallet - The Wallet Standard wallet instance\n * @param account - The wallet account to use (first account if not provided)\n * @param connection - Optional connection for network detection and transaction sending\n * @param network - Optional network override ('mainnet' | 'devnet' | 'testnet')\n * @returns Kit signers object with address and signer instances\n *\n * @example\n * ```typescript\n * import { Connection } from '@solana/web3.js';\n * import { createKitSignersFromWallet } from '@solana/connector/headless';\n *\n * const connection = new Connection('https://api.devnet.solana.com');\n * const { address, messageSigner, transactionSigner } = createKitSignersFromWallet(\n * wallet,\n * account,\n * connection\n * );\n * ```\n */\nexport function createKitSignersFromWallet(\n wallet: Wallet | null,\n account?: WalletAccount | null,\n connection?: Connection | null,\n network?: 'mainnet' | 'devnet' | 'testnet',\n): KitSignersFromWallet {\n // If no wallet or account, return null values\n if (!wallet || !account) {\n return {\n address: null,\n addressString: null,\n messageSigner: null,\n transactionSigner: null,\n };\n }\n\n // Convert account address to Kit Address type\n let walletAddress: Address<string> | null = null;\n let walletAddressString: string | null = null;\n\n try {\n walletAddress = address(account.address) as Address<string>;\n walletAddressString = account.address;\n } catch (error) {\n // Invalid address format\n return {\n address: null,\n addressString: null,\n messageSigner: null,\n transactionSigner: null,\n };\n }\n\n // Detect network from connection or use provided override\n // Note: Will be enhanced in Phase 2 with chain utilities\n let chain: `solana:${string}` = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1'; // Default to devnet\n\n if (network) {\n // Map network to Wallet Standard chain ID\n const chainMap: Record<string, `solana:${string}`> = {\n mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n };\n chain = chainMap[network] || chain;\n } else if (connection) {\n // Detect from connection RPC URL\n const rpcUrl = connection.rpcEndpoint || '';\n if (rpcUrl.includes('mainnet') || rpcUrl.includes('api.mainnet-beta')) {\n chain = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';\n } else if (rpcUrl.includes('testnet')) {\n chain = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z';\n } else {\n // Default to devnet\n chain = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';\n }\n }\n\n // Check wallet features for capabilities\n const features = wallet.features as Record<string, Record<string, (...args: unknown[]) => unknown>>;\n const hasSignMessage = Boolean(features['solana:signMessage']);\n const hasSignAndSendTransaction = Boolean(features['solana:signAndSendTransaction']);\n const hasSendTransaction = Boolean(features['solana:sendTransaction']);\n\n // Create message signer if wallet supports message signing\n const messageSigner: MessageModifyingSigner<string> | null = hasSignMessage\n ? createMessageSignerFromWallet(walletAddress, async (message: Uint8Array) => {\n if (!hasSignMessage) {\n throw Errors.featureNotSupported('message signing');\n }\n\n try {\n const signFeature = features['solana:signMessage'];\n\n // Ensure message is a Uint8Array\n const messageBytes = message instanceof Uint8Array ? message : new Uint8Array(message);\n\n // Wallet Standard returns an array of signed messages\n const results = (await signFeature.signMessage({\n account,\n message: messageBytes,\n ...(chain ? { chain } : {}),\n })) as Array<{ signature: Uint8Array; signedMessage?: Uint8Array }>;\n\n if (!Array.isArray(results) || results.length === 0) {\n throw new Error('Wallet returned empty results array');\n }\n\n const firstResult = results[0];\n if (!firstResult?.signature) {\n throw new Error('Wallet returned no signature in first result');\n }\n\n return firstResult.signature;\n } catch (error) {\n console.error('signMessage error:', error);\n throw error instanceof Error ? error : new Error(String(error));\n }\n })\n : null;\n\n // Create transaction sending signer if wallet supports sending transactions\n // Prefer signAndSendTransaction over sendTransaction as it's more efficient\n const transactionSigner: TransactionSendingSigner<string> | null =\n hasSignAndSendTransaction || hasSendTransaction\n ? createTransactionSendingSignerFromWallet(walletAddress, chain, async (transaction: Transaction) => {\n // Prefer signAndSendTransaction (sign + send in one call)\n if (hasSignAndSendTransaction) {\n try {\n const signAndSendFeature = features['solana:signAndSendTransaction'];\n const result = (await signAndSendFeature.signAndSendTransaction({\n account,\n transactions: [transaction],\n ...(chain ? { chain } : {}),\n ...(connection ? { connection } : {}),\n })) as { signatures: string[] };\n\n // Return first signature (wallet limitation: single transaction)\n return result.signatures[0] || '';\n } catch (error) {\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n\n // Fallback to sendTransaction (if wallet supports it but not signAndSendTransaction)\n // Note: sendTransaction in Wallet Standard typically just signs, but some wallets\n // may implement it to also send if connection is available\n if (hasSendTransaction) {\n try {\n const sendFeature = features['solana:sendTransaction'];\n const result = (await sendFeature.sendTransaction({\n account,\n transactions: [transaction],\n ...(chain ? { chain } : {}),\n })) as { signatures: string[] };\n\n // Return first signature\n // Note: Actual sending should be handled by the caller or wallet implementation\n return result.signatures[0] || '';\n } catch (error) {\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n\n throw Errors.featureNotSupported('transaction sending');\n })\n : null;\n\n return {\n address: walletAddress,\n addressString: walletAddressString,\n messageSigner,\n transactionSigner,\n };\n}\n","/**\n * @solana/connector - Secure Logger\n *\n * Production-safe logger that redacts sensitive information\n * Prevents accidental exposure of addresses, keys, and other PII in logs\n *\n * Integrates with the connector's debug system:\n * - Respects `__CONNECTOR_DEBUG__` flag (enable/disable logging globally)\n * - Respects `__CONNECTOR_DEBUG_LEVEL__` (set minimum log level)\n * - Provides sensitive data redaction\n * - Provides unified logging API across the connector\n *\n * Enable connector debug:\n * ```ts\n * window.__CONNECTOR_DEBUG__ = true\n * window.__CONNECTOR_DEBUG_LEVEL__ = 'debug' // or 'info', 'warn', 'error'\n * ```\n */\n\nimport { isDebugEnabled, debug as connectorDebug } from '../kit';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface SecureLoggerConfig {\n /** Enable logging (defaults to false - use __CONNECTOR_DEBUG__ flag to enable) */\n enabled?: boolean;\n /** Minimum log level to output */\n level?: LogLevel;\n /** Redact sensitive information in logs (defaults to true in production) */\n redactSensitive?: boolean;\n /** Custom prefix for all log messages */\n prefix?: string;\n /** Use connector's debug system for logging (respects __CONNECTOR_DEBUG__ flags) */\n useConnectorDebug?: boolean;\n}\n\n/**\n * Keys that contain sensitive information that should be redacted\n */\nconst SENSITIVE_KEYS = [\n 'address',\n 'publickey',\n 'signature',\n 'account',\n 'rpcurl',\n 'url',\n 'apikey',\n 'api_key',\n 'token',\n 'secret',\n 'password',\n 'private',\n 'seed',\n 'mnemonic',\n];\n\n/**\n * Log levels in order of severity\n */\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/**\n * SecureLogger - Production-safe logging with automatic redaction\n *\n * Features:\n * - Integrates with connector's debug system (respects __CONNECTOR_DEBUG__ flags)\n * - Automatic redaction of sensitive data (addresses, keys, URLs)\n * - Configurable log levels (respects __CONNECTOR_DEBUG_LEVEL__)\n * - Environment-aware defaults\n * - Deep object traversal for nested sensitive data\n *\n * @example\n * ```ts\n * // Enable connector debug\n * window.__CONNECTOR_DEBUG__ = true\n * window.__CONNECTOR_DEBUG_LEVEL__ = 'info' // Optional: filter by level\n *\n * const logger = new SecureLogger({ prefix: 'Connector' });\n *\n * logger.debug('User connected', {\n * address: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU', // Auto-redacted in prod\n * wallet: 'Phantom'\n * });\n * // Development: \"User connected { address: '7xKX...gAsU', wallet: 'Phantom' }\"\n * // Production: \"User connected { address: '***', wallet: 'Phantom' }\"\n * ```\n */\nexport class SecureLogger {\n private config: Required<SecureLoggerConfig>;\n\n constructor(config: SecureLoggerConfig = {}) {\n const isDevelopment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';\n\n this.config = {\n // Default to disabled - logging is opt-in via __CONNECTOR_DEBUG__ or explicit config\n enabled: config.enabled ?? false,\n level: config.level ?? 'debug',\n redactSensitive: config.redactSensitive ?? !isDevelopment,\n prefix: config.prefix ?? 'Connector',\n useConnectorDebug: config.useConnectorDebug ?? true, // Default to using connector's debug system\n };\n }\n\n /**\n * Log debug information (lowest priority)\n */\n debug(message: string, data?: unknown): void {\n this.log('debug', message, data);\n }\n\n /**\n * Log general information\n */\n info(message: string, data?: unknown): void {\n this.log('info', message, data);\n }\n\n /**\n * Log warnings\n */\n warn(message: string, data?: unknown): void {\n this.log('warn', message, data);\n }\n\n /**\n * Log errors (highest priority)\n */\n error(message: string, data?: unknown): void {\n this.log('error', message, data);\n }\n\n /**\n * Internal log method that handles level filtering and redaction\n * Integrates with connector's debug system when enabled\n */\n private log(level: LogLevel, message: string, data?: unknown): void {\n // Check if logging is enabled (either via config or connector's debug system)\n const debugEnabled = this.config.useConnectorDebug ? isDebugEnabled() : false;\n if (!this.config.enabled && !debugEnabled) return;\n\n // Get effective log level (prefer connector's debug level if set)\n let effectiveLevel = this.config.level;\n if (this.config.useConnectorDebug && typeof globalThis !== 'undefined') {\n const connectorLevel = (globalThis as { __CONNECTOR_DEBUG_LEVEL__?: string }).__CONNECTOR_DEBUG_LEVEL__;\n if (connectorLevel && ['debug', 'info', 'warn', 'error'].includes(connectorLevel)) {\n effectiveLevel = connectorLevel as LogLevel;\n }\n }\n\n // Check if this log level should be output\n if (LOG_LEVELS[level] < LOG_LEVELS[effectiveLevel]) {\n return;\n }\n\n // Process data (redact if enabled)\n const processedData = this.config.redactSensitive ? this.redact(data) : data;\n\n // Format message with data\n const fullMessage =\n processedData !== undefined\n ? `${message} ${typeof processedData === 'object' ? JSON.stringify(processedData, null, 2) : processedData}`\n : message;\n\n // Use connector's debug system if enabled, otherwise fall back to console.*\n if (this.config.useConnectorDebug && debugEnabled) {\n connectorDebug(fullMessage, level, this.config.prefix);\n } else {\n const prefix = `[${this.config.prefix}]`;\n switch (level) {\n case 'debug':\n console.debug(prefix, message, processedData !== undefined ? processedData : '');\n break;\n case 'info':\n console.info(prefix, message, processedData !== undefined ? processedData : '');\n break;\n case 'warn':\n console.warn(prefix, message, processedData !== undefined ? processedData : '');\n break;\n case 'error':\n console.error(prefix, message, processedData !== undefined ? processedData : '');\n break;\n }\n }\n }\n\n /**\n * Recursively redact sensitive information from data\n */\n private redact(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n // Handle primitives\n if (typeof data !== 'object') {\n return data;\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map(item => this.redact(item));\n }\n\n // Handle objects\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n const keyLower = key.toLowerCase();\n\n // Check if this key contains sensitive information\n const isSensitive = SENSITIVE_KEYS.some(sensitiveKey => keyLower.includes(sensitiveKey));\n\n if (isSensitive) {\n redacted[key] = this.maskValue(value);\n } else if (typeof value === 'object' && value !== null) {\n redacted[key] = this.redact(value);\n } else {\n redacted[key] = value;\n }\n }\n\n return redacted;\n }\n\n /**\n * Mask a sensitive value for logging\n * Shows first 4 and last 4 characters for strings longer than 8 chars\n */\n private maskValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '***';\n }\n\n const str = String(value);\n\n // For very short strings, just mask completely\n if (str.length <= 8) {\n return '***';\n }\n\n // For longer strings, show first and last 4 characters\n return `${str.slice(0, 4)}...${str.slice(-4)}`;\n }\n\n /**\n * Update logger configuration at runtime\n */\n updateConfig(config: Partial<SecureLoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Required<SecureLoggerConfig> {\n return { ...this.config };\n }\n}\n\n/**\n * Default logger instance for the connector\n * Automatically configured based on NODE_ENV\n */\nexport const logger = new SecureLogger({\n prefix: 'Connector',\n});\n\n/**\n * Create a logger with a custom prefix\n *\n * @example\n * ```ts\n * const walletLogger = createLogger('WalletDetector');\n * walletLogger.debug('Scanning for wallets...');\n * // Output: [WalletDetector] Scanning for wallets...\n * ```\n */\nexport function createLogger(prefix: string, config?: Omit<SecureLoggerConfig, 'prefix'>): SecureLogger {\n return new SecureLogger({ ...config, prefix });\n}\n"]}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export { createMockWalletConnectTransport, createWalletConnectTransport, createWalletConnectWallet, isWalletConnectAvailable, registerWalletConnectWallet } from './chunk-UCISIAOG.mjs';
|
|
2
|
-
//# sourceMappingURL=walletconnect-U455PO4I.mjs.map
|
|
3
|
-
//# sourceMappingURL=walletconnect-U455PO4I.mjs.map
|