{"version":3,"sources":["../../../src/infura.ts","../../../src/networks.ts","../../../src/connect.ts","../../../src/utils.ts"],"sourcesContent":["import { getInfuraRpcUrls as getInfuraRpcUrlsMultichain } from '@metamask/connect-multichain';\nimport type { CaipChainId } from '@metamask/utils';\n\nimport { SOLANA_CAIP_IDS } from './networks';\nimport type { SolanaNetwork, SolanaSupportedNetworks } from './types';\n\n/**\n * Generates Infura RPC URLs for Solana networks keyed by Solana network name.\n *\n * The returned map is intended for `createSolanaClient({ api: { supportedNetworks } })`.\n *\n * @param options - The options for generating Solana Infura RPC URLs\n * @param options.infuraApiKey - The Infura API key\n * @param options.networks - Solana networks to include in the returned map\n * @returns A map of Solana network names to Infura RPC URLs\n */\nexport const getInfuraRpcUrls = ({\n  infuraApiKey,\n  networks,\n}: {\n  infuraApiKey: string;\n  networks: SolanaNetwork[];\n}): SolanaSupportedNetworks => {\n  const caipChainIds = networks.map(\n    (network) => SOLANA_CAIP_IDS[network] as CaipChainId,\n  );\n  const caipMap = getInfuraRpcUrlsMultichain({\n    infuraApiKey,\n    caipChainIds,\n  });\n\n  return networks.reduce<SolanaSupportedNetworks>((acc, network) => {\n    const caipId = SOLANA_CAIP_IDS[network] as CaipChainId;\n    const rpcUrl = caipMap[caipId];\n    if (rpcUrl) {\n      acc[network] = rpcUrl;\n    }\n    return acc;\n  }, {});\n};\n","import type { SolanaNetwork, SolanaSupportedNetworks } from './types';\n\n/**\n * CAIP-2 chain IDs for Solana networks.\n * The reference is the first 32 characters of the Base58-encoded genesis hash.\n */\nexport const SOLANA_CAIP_IDS: Record<SolanaNetwork, string> = {\n  mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n  devnet: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n  testnet: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n};\n\n/**\n * Converts a record of network names to RPC URLs into a record of CAIP IDs to RPC URLs.\n *\n * @param networks - A record of network names to RPC URLs\n * @returns A record of CAIP IDs to RPC URLs\n */\nexport function convertNetworksToCAIP(\n  networks: SolanaSupportedNetworks,\n): Record<string, string> {\n  return Object.entries(networks).reduce<Record<string, string>>(\n    (acc, [network, rpcUrl]) => {\n      const caipId = SOLANA_CAIP_IDS[network as SolanaNetwork];\n      if (caipId && rpcUrl) {\n        acc[caipId] = rpcUrl;\n      }\n      return acc;\n    },\n    {},\n  );\n}\n","/* eslint-disable @typescript-eslint/naming-convention -- __PACKAGE_VERSION__ and __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__ are esbuild define conventions */\nimport {\n  createMultichainClient,\n  type Scope,\n} from '@metamask/connect-multichain';\nimport {\n  getWalletStandard,\n  registerSolanaWalletStandard,\n} from '@metamask/solana-wallet-standard';\nimport { satisfies } from 'semver';\n\nimport { convertNetworksToCAIP, SOLANA_CAIP_IDS } from './networks';\nimport type {\n  SolanaClient,\n  SolanaConnectOptions,\n  SolanaSupportedNetworks,\n} from './types';\nimport { isMetamaskExtensionRegistered, logger } from './utils';\n\n// Values substituted by tsup at build time\ndeclare const __PACKAGE_VERSION__: string | undefined;\ndeclare const __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__: string | undefined;\n\n/**\n * Creates a new Solana client for connecting to MetaMask via wallet-standard.\n *\n * This function initializes the MultichainSDK and provides methods to get or register\n * a wallet-standard compatible wallet. The wallet handles session creation internally\n * when users connect through the Solana wallet adapter UI.\n *\n * @param options - Configuration options for the Solana client\n * @param options.dapp - Dapp identification and branding settings\n * @param options.api - Optional API configuration with supported networks\n * @param options.api.supportedNetworks - Record mapping network names (mainnet, devnet, testnet) to RPC URLs\n * @param [options.analytics] - Analytics configuration\n * @param [options.analytics.enabled] - Whether to enable dapp-side analytics (defaults to true)\n * @param [options.analytics.integrationType] - Integration type for analytics (defaults to 'direct')\n * @param options.debug - Enable debug logging\n * @param options.skipAutoRegister - Skip auto-registering the wallet during creation (defaults to false)\n * @returns A promise that resolves to the Solana client instance\n *\n * @example\n * ```typescript\n * import { createSolanaClient } from '@metamask/connect-solana';\n *\n * // Wallet is auto-registered and ready to use\n * const client = await createSolanaClient({\n *   dapp: {\n *     name: 'My Solana DApp',\n *     url: 'https://mydapp.com',\n *   },\n *   api: {\n *     supportedNetworks: {\n *       mainnet: 'https://api.mainnet-beta.solana.com',\n *       devnet: 'https://api.devnet.solana.com',\n *     },\n *   },\n * });\n *\n * // Get the wallet instance directly\n * const wallet = client.getWallet();\n * ```\n */\nexport async function createSolanaClient(\n  options: SolanaConnectOptions,\n): Promise<SolanaClient> {\n  const defaultNetworks: SolanaSupportedNetworks = {\n    mainnet: 'https://api.mainnet-beta.solana.com',\n  };\n\n  const skipAutoRegister = options.skipAutoRegister ?? false;\n\n  const supportedNetworks = convertNetworksToCAIP(\n    options.api?.supportedNetworks ?? defaultNetworks,\n  );\n\n  const core = await createMultichainClient({\n    dapp: options.dapp,\n    api: {\n      supportedNetworks,\n    },\n    analytics: {\n      ...(options.analytics ?? {}),\n      // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n      integrationType: options.analytics?.integrationType || 'direct',\n    },\n    versions: {\n      // typeof guard needed: Metro (React Native) bundles TS source directly,\n      // bypassing the tsup build that substitutes __PACKAGE_VERSION__.\n      'connect-solana':\n        typeof __PACKAGE_VERSION__ === 'undefined'\n          ? 'unknown'\n          : __PACKAGE_VERSION__,\n    },\n  });\n\n  const multichainClientPeerRange =\n    typeof __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__ === 'undefined'\n      ? 'unknown'\n      : __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__;\n\n  if (\n    multichainClientPeerRange !== 'unknown' &&\n    multichainClientPeerRange !== '' &&\n    !satisfies(core.version, multichainClientPeerRange)\n  ) {\n    console.warn(\n      `@metamask/connect-solana expected @metamask/connect-multichain version ${multichainClientPeerRange}, but got ${core.version}. This may lead to unexpected behavior.`,\n    );\n  }\n\n  const client = core.provider;\n\n  const walletName = 'MetaMask';\n\n  let hasRegisteredMmc = false;\n  let handledInitRegistration!: () => void;\n  const initRegistrationHandledPromise = new Promise<void>((resolve) => {\n    handledInitRegistration = resolve;\n  });\n\n  const registerWallet = async (): Promise<void> => {\n    if (hasRegisteredMmc) {\n      logger('MetaMask Connect is already registered. Skipping...');\n      return;\n    }\n\n    if (isMetamaskExtensionRegistered()) {\n      logger('MetaMask extension is already registered. Skipping...');\n      return;\n    }\n\n    await registerSolanaWalletStandard({ client, walletName });\n    hasRegisteredMmc = true; // eslint-disable-line require-atomic-updates\n  };\n\n  if (skipAutoRegister) {\n    handledInitRegistration();\n  } else {\n    // eslint-disable-next-line @typescript-eslint/no-misused-promises\n    setTimeout(async () => {\n      try {\n        await registerWallet();\n      } finally {\n        handledInitRegistration();\n      }\n    }, 1000);\n  }\n\n  const provider = getWalletStandard({ client, walletName });\n  const session = await core.provider.getSession();\n  const hasSolanaScope = Object.keys(session?.sessionScopes ?? {}).some(\n    (scope) => scope.startsWith('solana:'),\n  );\n  if (hasSolanaScope) {\n    // This will resolve without needing to prompt the user as we know solana scopes are already granted\n    await provider.features['standard:connect'].connect();\n  }\n\n  return {\n    core,\n    getWallet: () => provider,\n    registerWallet: async (): Promise<void> => {\n      await initRegistrationHandledPromise;\n      await registerWallet();\n    },\n    disconnect: async () =>\n      await core.disconnect(Object.values(SOLANA_CAIP_IDS) as Scope[]),\n  };\n}\n","import {\n  createLogger,\n  enableDebug as debug,\n} from '@metamask/connect-multichain';\nimport { getWallets } from '@wallet-standard/app';\n\nconst namespace = 'metamask-connect:solana';\n\n// @ts-expect-error logger needs to be typed properly\nexport const logger = createLogger(namespace, '93');\n\nexport const enableDebug = (): void => {\n  // @ts-expect-error logger needs to be typed properly\n  debug(namespace);\n};\n\n/**\n * Check if MetaMask extension is registered on Solana wallet-standard registry\n *\n * @returns True if extension is registered, false otherwise\n */\nexport const isMetamaskExtensionRegistered = (): boolean => {\n  const wallets = getWallets();\n\n  return wallets\n    .get()\n    .some((wallet) => wallet.name.toLowerCase().includes('metamask'));\n};\n"],"mappings":"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","names":[]}