@solana/connector 0.1.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +403 -50
- package/dist/chunk-4KD6HQQG.js +69 -0
- package/dist/chunk-4KD6HQQG.js.map +1 -0
- package/dist/chunk-BJAVJQLK.js +230 -0
- package/dist/chunk-BJAVJQLK.js.map +1 -0
- package/dist/{chunk-5HRJKCIL.js → chunk-BZ2VBJCZ.js} +1061 -424
- package/dist/chunk-BZ2VBJCZ.js.map +1 -0
- package/dist/{chunk-WDXEP4AJ.js → chunk-EM4KNOKG.js} +658 -190
- package/dist/chunk-EM4KNOKG.js.map +1 -0
- package/dist/chunk-HN5AJF7F.js +507 -0
- package/dist/chunk-HN5AJF7F.js.map +1 -0
- package/dist/chunk-HO6QNKFM.mjs +61 -0
- package/dist/chunk-HO6QNKFM.mjs.map +1 -0
- package/dist/chunk-HPQ5T32K.mjs +178 -0
- package/dist/chunk-HPQ5T32K.mjs.map +1 -0
- package/dist/{chunk-MAXA3HEP.mjs → chunk-IDTUFDNB.mjs} +962 -344
- package/dist/chunk-IDTUFDNB.mjs.map +1 -0
- package/dist/{chunk-P5LXUDP6.mjs → chunk-RTXUS5KG.mjs} +579 -119
- package/dist/chunk-RTXUS5KG.mjs.map +1 -0
- package/dist/{chunk-DSUCH44G.js → chunk-SITQ4JWM.js} +23 -67
- package/dist/chunk-SITQ4JWM.js.map +1 -0
- package/dist/chunk-UCISIAOG.mjs +501 -0
- package/dist/chunk-UCISIAOG.mjs.map +1 -0
- package/dist/{chunk-J7DHGLW6.mjs → chunk-ZZTY3O4N.mjs} +21 -61
- package/dist/chunk-ZZTY3O4N.mjs.map +1 -0
- package/dist/compat.d.mts +1 -1
- package/dist/compat.d.ts +1 -1
- package/dist/compat.js +10 -9
- package/dist/compat.js.map +1 -1
- package/dist/compat.mjs +2 -1
- package/dist/compat.mjs.map +1 -1
- package/dist/headless.d.mts +239 -104
- package/dist/headless.d.ts +239 -104
- package/dist/headless.js +255 -169
- package/dist/headless.mjs +5 -3
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +316 -206
- package/dist/index.mjs +6 -4
- package/dist/react.d.mts +299 -9
- package/dist/react.d.ts +299 -9
- package/dist/react.js +90 -38
- package/dist/react.mjs +2 -2
- package/dist/{standard-shim-CT49DM5l.d.mts → standard-shim-CGB88PPO.d.mts} +673 -52
- package/dist/{standard-shim-D9guL5fz.d.ts → standard-shim-tmnQelaJ.d.ts} +673 -52
- package/dist/{transaction-signer-T-KVQFi8.d.mts → transaction-signer-7NaYmP5w.d.mts} +1 -0
- package/dist/{transaction-signer-T-KVQFi8.d.ts → transaction-signer-7NaYmP5w.d.ts} +1 -0
- package/dist/walletconnect-447EY3OJ.js +28 -0
- package/dist/walletconnect-447EY3OJ.js.map +1 -0
- package/dist/walletconnect-U455PO4I.mjs +3 -0
- package/dist/walletconnect-U455PO4I.mjs.map +1 -0
- package/package.json +6 -2
- package/dist/chunk-5HRJKCIL.js.map +0 -1
- package/dist/chunk-DSUCH44G.js.map +0 -1
- package/dist/chunk-I6TJLYNA.js +0 -535
- package/dist/chunk-I6TJLYNA.js.map +0 -1
- package/dist/chunk-J7DHGLW6.mjs.map +0 -1
- package/dist/chunk-JOBLG62A.mjs +0 -476
- package/dist/chunk-JOBLG62A.mjs.map +0 -1
- package/dist/chunk-MAXA3HEP.mjs.map +0 -1
- package/dist/chunk-P5LXUDP6.mjs.map +0 -1
- package/dist/chunk-WDXEP4AJ.js.map +0 -1
|
@@ -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/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","../src/lib/core/try-catch.ts","../src/utils/transaction-format.ts"],"names":["createSolanaRpc","createSolanaRpcSubscriptions","setTransactionMessageLifetimeUsingBlockhash","assertIsTransactionMessageWithBlockhashLifetime","address","getBase58Encoder","getBase58Decoder","message","LOG_LEVELS"],"mappings":"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","file":"chunk-DSUCH44G.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 * @solana/connector - Unified Error System\n */\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","/**\n * @solana/connector - Try-Catch Utility\n *\n * Provides a consistent pattern for async error handling,\n * returning a Result type instead of throwing errors.\n */\n\n/**\n * Represents a failed operation\n */\nexport interface Failure<E> {\n data: null;\n error: E;\n}\n\n/**\n * Represents a successful operation\n */\nexport interface Success<T> {\n data: T;\n error: null;\n}\n\n/**\n * Result type that is either a Success or Failure\n */\nexport type Result<T, E = Error> = Success<T> | Failure<E>;\n\n/**\n * Wraps an async operation and returns a Result instead of throwing.\n * This enables consistent error handling without nested try/catch blocks.\n *\n * @param promise - The promise to wrap\n * @returns A Result containing either the data or an error\n *\n * @example Basic usage\n * ```typescript\n * const { data, error } = await tryCatch(fetchData());\n * if (error) {\n * console.error('Failed:', error.message);\n * return;\n * }\n * console.log('Success:', data);\n * ```\n *\n * @example With typed errors\n * ```typescript\n * const { data, error } = await tryCatch<User, ApiError>(api.getUser(id));\n * if (error) {\n * // error is typed as ApiError\n * handleApiError(error);\n * return;\n * }\n * // data is typed as User\n * displayUser(data);\n * ```\n *\n * @example Chaining operations\n * ```typescript\n * const { data: user, error: userError } = await tryCatch(getUser(id));\n * if (userError) return handleError(userError);\n *\n * const { data: posts, error: postsError } = await tryCatch(getPosts(user.id));\n * if (postsError) return handleError(postsError);\n *\n * return { user, posts };\n * ```\n */\nexport async function tryCatch<T, E = Error>(promise: Promise<T>): Promise<Result<T, E>> {\n try {\n const data = await promise;\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as E };\n }\n}\n\n/**\n * Synchronous version of tryCatch for non-async operations\n *\n * @param fn - The function to execute\n * @returns A Result containing either the return value or an error\n *\n * @example\n * ```typescript\n * const { data, error } = tryCatchSync(() => JSON.parse(jsonString));\n * if (error) {\n * console.error('Invalid JSON:', error.message);\n * return defaultValue;\n * }\n * return data;\n * ```\n */\nexport function tryCatchSync<T, E = Error>(fn: () => T): Result<T, E> {\n try {\n const data = fn();\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as E };\n }\n}\n\n/**\n * Type guard to check if a Result is a Success\n */\nexport function isSuccess<T, E>(result: Result<T, E>): result is Success<T> {\n return result.error === null;\n}\n\n/**\n * Type guard to check if a Result is a Failure\n */\nexport function isFailure<T, E>(result: Result<T, E>): result is Failure<E> {\n return result.error !== null;\n}\n","/**\n * Transaction Format Utilities\n *\n * Utilities for detecting and converting between different transaction formats:\n * - web3.js Transaction/VersionedTransaction objects\n * - Serialized Uint8Array (Wallet Standard format)\n * - Other TypedArray formats\n *\n * Note: Uses dynamic imports for @solana/web3.js to avoid bundling it\n * since it's only needed for the compat layer.\n */\n\nimport type { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport type { SolanaTransaction } from '../types/transactions';\n\n/**\n * Check if a value is a web3.js Transaction or VersionedTransaction object\n *\n * @param tx - Value to check\n * @returns True if it's a web3.js transaction object\n */\nexport function isWeb3jsTransaction(tx: unknown): tx is Transaction | VersionedTransaction {\n // Duck-typing: if it has a serialize method, it's likely a web3.js transaction\n return tx !== null && typeof tx === 'object' && 'serialize' in tx && typeof tx.serialize === 'function';\n}\n\n/**\n * Serialize a transaction to Uint8Array format (required for Wallet Standard)\n *\n * @param tx - Transaction to serialize (web3.js object, Uint8Array, or TypedArray)\n * @returns Serialized transaction bytes\n * @throws Error if transaction format is unsupported\n */\nexport function serializeTransaction(tx: SolanaTransaction): Uint8Array {\n // web3.js Transaction/VersionedTransaction object\n if (isWeb3jsTransaction(tx)) {\n return tx.serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n }\n\n // Already serialized as Uint8Array\n if (tx instanceof Uint8Array) {\n return tx;\n }\n\n // Other TypedArray format\n if (ArrayBuffer.isView(tx)) {\n return new Uint8Array(tx.buffer, tx.byteOffset, tx.byteLength);\n }\n\n throw new Error('Unsupported transaction format - must be Transaction, VersionedTransaction, or Uint8Array');\n}\n\n/**\n * Check if transaction bytes represent a legacy transaction\n * Legacy transactions have high bit = 0, versioned have high bit = 1\n *\n * @param bytes - Serialized transaction bytes\n * @returns True if legacy transaction\n */\nfunction isLegacyTransaction(bytes: Uint8Array): boolean {\n if (bytes.length === 0) return false;\n // High bit of first byte: 0 = legacy, 1 = versioned\n return (bytes[0] & 0x80) === 0;\n}\n\n/**\n * Deserialize bytes to a web3.js Transaction or VersionedTransaction object\n * Uses dynamic import to avoid bundling @solana/web3.js\n * Automatically detects legacy vs versioned format\n *\n * @param bytes - Serialized transaction bytes\n * @returns Transaction or VersionedTransaction object\n */\nexport async function deserializeToWeb3jsTransaction(bytes: Uint8Array): Promise<Transaction | VersionedTransaction> {\n if (isLegacyTransaction(bytes)) {\n // Legacy transaction - use Transaction.deserialize to preserve legacy-only fields\n const { Transaction } = await import('@solana/web3.js');\n return Transaction.from(bytes);\n } else {\n // Versioned transaction\n const { VersionedTransaction } = await import('@solana/web3.js');\n return VersionedTransaction.deserialize(bytes);\n }\n}\n\n/**\n * Smart converter that preserves the original format\n * Converts to Wallet Standard format (Uint8Array) and tracks original type\n *\n * @param tx - Transaction in any supported format\n * @returns Object with serialized bytes and format flag\n */\nexport function prepareTransactionForWallet(tx: SolanaTransaction): { serialized: Uint8Array; wasWeb3js: boolean } {\n const wasWeb3js = isWeb3jsTransaction(tx);\n const serialized = serializeTransaction(tx);\n return { serialized, wasWeb3js };\n}\n\n/**\n * Convert signed transaction bytes back to original format if needed\n *\n * @param signedBytes - Signed transaction as Uint8Array\n * @param wasWeb3js - Whether the original was a web3.js object\n * @returns Transaction in appropriate format (async if conversion needed)\n * Returns Transaction for legacy, VersionedTransaction for versioned, or Uint8Array if not web3js\n */\nexport async function convertSignedTransaction(\n signedBytes: Uint8Array,\n wasWeb3js: boolean,\n): Promise<Transaction | VersionedTransaction | Uint8Array> {\n if (wasWeb3js) {\n return await deserializeToWeb3jsTransaction(signedBytes);\n }\n return signedBytes;\n}\n"]}
|