{"version":3,"sources":["../src/types/chain.ts","../src/types/connector.ts","../src/chains/evm/index.ts","../src/chains/svm/index.ts","../src/chains/evm/popular.ts","../src/chains/svm/popular.ts","../src/chains/index.ts","../src/connectors/base.ts","../src/connectors/metamask.ts","../src/connectors/phantom.ts","../src/connectors/index.ts","../src/store/web3Store.ts","../src/hooks/useWeb3.ts","../src/components/Web3Provider.tsx"],"names":["ChainType","NetworkType","ConnectorStatus","ConnectorEvent","getViemChainById","chainId","mainnet","goerli","sepolia","polygon","polygonMumbai","optimism","optimismGoerli","arbitrum","arbitrumGoerli","base","baseGoerli","chain","EVMChainAdapter","viemChain","client","createPublicClient","http","customViemChain","defineChain","address","createWalletClient","custom","SVMChainAdapter","Connection","connection","publicKey","PublicKey","balance","blockHeight","ethereumMainnet","polygonMainnet","arbitrumMainnet","optimismMainnet","bscMainnet","popularEVMChains","solanaMainnet","solanaDevnet","solanaTestnet","popularSVMChains","chainAdapters","getChainAdapter","chainType","adapter","getChainAdapterForChain","chainConfig","getAllChains","getChainById","BaseConnector","id","name","type","icon","supportedChains","EventEmitter","event","listener","status","error","account","previousAccount","previousChainId","pendingRequest","requestTimeout","MetaMaskConnector","accounts","currentChainId","parsedChainId","pendingError","connectorError","hexChainId","PhantomConnector","solana","solanaChainId","defaultConnectors","getAvailableConnectors","connector","getConnectorById","isDisconnecting","isBrowser","createSafeStorage","value","useWeb3Store","create","persist","set","get","connectorId","connectedChainId","newAccount","newChainId","newChain","state","defaultState","useWeb3","config","store","setState","useState","autoConnectAttempted","useRef","useEffect","storedData","parsedData","connectors","storedConnectorId","c","Web3Context","createContext","defaultConfig","InternalProvider","children","web3","jsx","Web3Provider","mergedConfig","isMounted","setIsMounted","useWeb3Context","context","useContext","ConnectWalletButton","onConnect","onError","className","connect","isLoading","setIsLoading","metaMaskConnector"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Enum for different blockchain types\n */\nexport enum ChainType {\n  EVM = \"evm\", // Ethereum Virtual Machine based chains\n  SVM = \"svm\", // Solana Virtual Machine\n}\n\n/**\n * Enum for network types\n */\nexport enum NetworkType {\n  MAINNET = \"mainnet\",\n  TESTNET = \"testnet\",\n  DEVNET = \"devnet\",\n}\n\n/**\n * Interface for chain configuration\n */\nexport interface ChainConfig {\n  id: string | number; // Chain ID (number for EVM, string for others)\n  name: string; // Display name\n  type: ChainType; // Chain type (EVM, SVM, etc.)\n  networkType: NetworkType; // Network type (mainnet, testnet, etc.)\n  rpcUrls: string[]; // RPC endpoints\n  nativeCurrency: {\n    name: string;\n    symbol: string;\n    decimals: number;\n  };\n  blockExplorerUrls?: string[]; // Block explorer URLs\n  iconUrl?: string; // Chain icon URL\n  testnet?: boolean; // Is testnet\n}\n\n/**\n * Type for chain ID\n */\nexport type ChainId = string | number;\n\n/**\n * Interface for chain adapter\n * This is used to implement chain-specific functionality\n */\nexport interface ChainAdapter {\n  getProvider: (chain: ChainConfig) => any;\n  getBalance: (chain: ChainConfig, address: string) => Promise<bigint>;\n  getBlockNumber: (chain: ChainConfig) => Promise<bigint>;\n}\n","import { ChainConfig, ChainId, ChainType } from \"./chain\";\n\n/**\n * Interface for wallet info\n */\nexport interface WalletInfo {\n  id: string;\n  name: string;\n  icon: string;\n  description?: string;\n  downloadUrls?: {\n    browserExtension?: string;\n    mobileApp?: string;\n    website?: string;\n  };\n  supportedChains: ChainType[];\n}\n\n/**\n * Interface for connector status\n */\nexport enum ConnectorStatus {\n  DISCONNECTED = \"disconnected\",\n  CONNECTING = \"connecting\",\n  CONNECTED = \"connected\",\n  ERROR = \"error\",\n}\n\n/**\n * Interface for connector error\n */\nexport interface ConnectorError {\n  code: string;\n  message: string;\n  details?: any;\n}\n\n/**\n * Interface for connector\n */\nexport interface Connector {\n  id: string;\n  name: string;\n  type: string;\n  icon: string;\n  supportedChains: ChainType[];\n\n  // Connection methods\n  connect: (chainId?: ChainId) => Promise<string>;\n  disconnect: () => Promise<void>;\n  switchChain: (chainId: ChainId) => Promise<void>;\n\n  // Status\n  isConnected: () => boolean;\n  getStatus: () => ConnectorStatus;\n  getError: () => ConnectorError | null;\n\n  // Account info\n  getAccount: () => string | null;\n  getChainId: () => ChainId | null;\n\n  // Events\n  on: (event: ConnectorEvent, listener: (...args: any[]) => void) => void;\n  off: (event: ConnectorEvent, listener: (...args: any[]) => void) => void;\n  removeAllListeners: (event?: ConnectorEvent) => void;\n}\n\n/**\n * Enum for connector events\n */\nexport enum ConnectorEvent {\n  CONNECT = \"connect\",\n  DISCONNECT = \"disconnect\",\n  CHAIN_CHANGED = \"chainChanged\",\n  ACCOUNT_CHANGED = \"accountChanged\",\n  ERROR = \"error\",\n}\n","import { ChainAdapter, ChainConfig } from \"../../types/chain\";\nimport {\n  createPublicClient,\n  http,\n  PublicClient,\n  defineChain,\n  createWalletClient,\n  custom,\n  Chain as ViemChain,\n} from \"viem\";\nimport {\n  mainnet,\n  goerli,\n  sepolia,\n  polygon,\n  polygonMumbai,\n  optimism,\n  optimismGoerli,\n  arbitrum,\n  arbitrumGoerli,\n  base,\n  baseGoerli,\n} from \"viem/chains\";\n\n/**\n * Get a Viem chain by ID\n * @param chainId Chain ID\n * @returns Viem chain object or undefined if not found\n */\nfunction getViemChainById(chainId: number): ViemChain | undefined {\n  const allChains = [\n    mainnet,\n    goerli,\n    sepolia,\n    polygon,\n    polygonMumbai,\n    optimism,\n    optimismGoerli,\n    arbitrum,\n    arbitrumGoerli,\n    base,\n    baseGoerli,\n  ];\n\n  return allChains.find((chain) => chain.id === chainId);\n}\n\n/**\n * Implementation of chain-specific functionality for EVM-compatible chains\n */\nexport class EVMChainAdapter implements ChainAdapter {\n  private clientCache = new Map<number | string, PublicClient>();\n\n  /**\n   * Get a provider for the specified chain\n   * @param chain Chain configuration\n   * @returns Provider instance\n   */\n  getProvider(chain: ChainConfig): PublicClient {\n    const chainId = chain.id;\n\n    // Check if we have a cached client\n    if (this.clientCache.has(chainId)) {\n      return this.clientCache.get(chainId)!;\n    }\n\n    // Try to get a predefined Viem chain\n    const viemChain = getViemChainById(chainId as number);\n\n    let client: PublicClient;\n\n    if (viemChain) {\n      // Use the predefined Viem chain\n      client = createPublicClient({\n        chain: viemChain,\n        transport: http(),\n      });\n    } else {\n      // Create a custom chain definition\n      const customViemChain = defineChain({\n        id: Number(chainId),\n        name: chain.name,\n        nativeCurrency: {\n          name: chain.nativeCurrency.name,\n          symbol: chain.nativeCurrency.symbol,\n          decimals: chain.nativeCurrency.decimals,\n        },\n        rpcUrls: {\n          default: {\n            http: chain.rpcUrls,\n          },\n        },\n        blockExplorers: chain.blockExplorerUrls\n          ? {\n              default: {\n                name: chain.name,\n                url: chain.blockExplorerUrls[0],\n              },\n            }\n          : undefined,\n      });\n\n      client = createPublicClient({\n        chain: customViemChain,\n        transport: http(),\n      });\n    }\n\n    // Cache the client\n    this.clientCache.set(chainId, client);\n    return client;\n  }\n\n  /**\n   * Get the balance of an address on the specified chain\n   * @param chain Chain configuration\n   * @param address Address to check\n   * @returns Balance in wei\n   */\n  async getBalance(chain: ChainConfig, address: string): Promise<bigint> {\n    const client = this.getProvider(chain);\n    return await client.getBalance({ address: address as `0x${string}` });\n  }\n\n  /**\n   * Get the current block number on the specified chain\n   * @param chain Chain configuration\n   * @returns Current block number\n   */\n  async getBlockNumber(chain: ChainConfig): Promise<bigint> {\n    const client = this.getProvider(chain);\n    return await client.getBlockNumber();\n  }\n\n  /**\n   * Get a wallet client for signing transactions\n   * @param chain Chain configuration\n   * @returns Wallet client or null if not connected\n   */\n  getWalletClient(chain: ChainConfig) {\n    if (typeof window !== \"undefined\" && window.ethereum) {\n      // Create a Viem wallet client using the MetaMask provider\n      const viemChain = getViemChainById(chain.id as number);\n\n      if (viemChain) {\n        return createWalletClient({\n          chain: viemChain,\n          transport: custom(window.ethereum),\n        });\n      }\n    }\n\n    return null;\n  }\n}\n","import { ChainAdapter, ChainConfig } from \"../../types/chain\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\n\n/**\n * Solana Virtual Machine Chain Adapter\n * Implements chain-specific functionality for Solana\n */\nexport class SVMChainAdapter implements ChainAdapter {\n  private connection: Connection | null = null;\n\n  /**\n   * Get a provider for the specified chain\n   * @param chain Chain configuration\n   * @returns Connection instance\n   */\n  async getProvider(chain: ChainConfig): Promise<Connection> {\n    if (!this.connection) {\n      this.connection = new Connection(chain.rpcUrls[0]);\n    }\n    return this.connection;\n  }\n\n  /**\n   * Get the balance of an address on the specified chain\n   * @param chain Chain configuration\n   * @param address Wallet address\n   * @returns Balance as a bigint\n   */\n  async getBalance(chain: ChainConfig, address: string): Promise<bigint> {\n    const connection = await this.getProvider(chain);\n    const publicKey = new PublicKey(address);\n    const balance = await connection.getBalance(publicKey);\n    return BigInt(balance);\n  }\n\n  /**\n   * Get the current block number (slot) on the specified chain\n   * @param chain Chain configuration\n   * @returns Current slot number as a bigint\n   */\n  async getBlockNumber(chain: ChainConfig): Promise<bigint> {\n    const connection = await this.getProvider(chain);\n    const blockHeight = await connection.getBlockHeight();\n    return BigInt(blockHeight);\n  }\n}\n","import { ChainConfig, NetworkType, ChainType } from \"../../types/chain\";\n\nexport const ethereumMainnet: ChainConfig = {\n  id: 1,\n  name: \"Ethereum\",\n  type: ChainType.EVM,\n  networkType: NetworkType.MAINNET,\n  rpcUrls: [\n    \"https://eth-mainnet.g.alchemy.com/v2/your-api-key\",\n    \"https://mainnet.infura.io/v3/your-api-key\",\n  ],\n  nativeCurrency: {\n    name: \"Ether\",\n    symbol: \"ETH\",\n    decimals: 18,\n  },\n  blockExplorerUrls: [\"https://etherscan.io\"],\n  iconUrl: \"https://cryptologos.cc/logos/ethereum-eth-logo.png\",\n};\n\nexport const polygonMainnet: ChainConfig = {\n  id: 137,\n  name: \"Polygon\",\n  type: ChainType.EVM,\n  networkType: NetworkType.MAINNET,\n  rpcUrls: [\n    \"https://polygon-rpc.com\",\n    \"https://polygon-mainnet.g.alchemy.com/v2/your-api-key\",\n  ],\n  nativeCurrency: {\n    name: \"MATIC\",\n    symbol: \"MATIC\",\n    decimals: 18,\n  },\n  blockExplorerUrls: [\"https://polygonscan.com\"],\n  iconUrl: \"https://cryptologos.cc/logos/polygon-matic-logo.png\",\n};\n\nexport const arbitrumMainnet: ChainConfig = {\n  id: 42161,\n  name: \"Arbitrum\",\n  type: ChainType.EVM,\n  networkType: NetworkType.MAINNET,\n  rpcUrls: [\n    \"https://arb1.arbitrum.io/rpc\",\n    \"https://arb-mainnet.g.alchemy.com/v2/your-api-key\",\n  ],\n  nativeCurrency: {\n    name: \"Ether\",\n    symbol: \"ETH\",\n    decimals: 18,\n  },\n  blockExplorerUrls: [\"https://arbiscan.io\"],\n  iconUrl: \"https://cryptologos.cc/logos/arbitrum-arb-logo.png\",\n};\n\nexport const optimismMainnet: ChainConfig = {\n  id: 10,\n  name: \"Optimism\",\n  type: ChainType.EVM,\n  networkType: NetworkType.MAINNET,\n  rpcUrls: [\n    \"https://mainnet.optimism.io\",\n    \"https://opt-mainnet.g.alchemy.com/v2/your-api-key\",\n  ],\n  nativeCurrency: {\n    name: \"Ether\",\n    symbol: \"ETH\",\n    decimals: 18,\n  },\n  blockExplorerUrls: [\"https://optimistic.etherscan.io\"],\n  iconUrl: \"https://cryptologos.cc/logos/optimism-op-logo.png\",\n};\n\nexport const bscMainnet: ChainConfig = {\n  id: 56,\n  name: \"BNB Smart Chain\",\n  type: ChainType.EVM,\n  networkType: NetworkType.MAINNET,\n  rpcUrls: [\n    \"https://bsc-dataseed.binance.org\",\n    \"https://bsc-dataseed1.defibit.io\",\n  ],\n  nativeCurrency: {\n    name: \"BNB\",\n    symbol: \"BNB\",\n    decimals: 18,\n  },\n  blockExplorerUrls: [\"https://bscscan.com\"],\n  iconUrl: \"https://cryptologos.cc/logos/bnb-bnb-logo.png\",\n};\n\nexport const popularEVMChains = [\n  ethereumMainnet,\n  polygonMainnet,\n  arbitrumMainnet,\n  optimismMainnet,\n  bscMainnet,\n];\n","import { ChainConfig, NetworkType, ChainType } from \"../../types/chain\";\n\nexport const solanaMainnet: ChainConfig = {\n  id: \"mainnet-beta\",\n  name: \"Solana\",\n  type: ChainType.SVM,\n  networkType: NetworkType.MAINNET,\n  rpcUrls: [\n    \"https://api.mainnet-beta.solana.com\",\n    \"https://solana-api.projectserum.com\",\n  ],\n  nativeCurrency: {\n    name: \"Solana\",\n    symbol: \"SOL\",\n    decimals: 9,\n  },\n  blockExplorerUrls: [\"https://explorer.solana.com\"],\n  iconUrl: \"https://cryptologos.cc/logos/solana-sol-logo.png\",\n};\n\nexport const solanaDevnet: ChainConfig = {\n  id: \"devnet\",\n  name: \"Solana Devnet\",\n  type: ChainType.SVM,\n  networkType: NetworkType.DEVNET,\n  rpcUrls: [\"https://api.devnet.solana.com\"],\n  nativeCurrency: {\n    name: \"Solana\",\n    symbol: \"SOL\",\n    decimals: 9,\n  },\n  blockExplorerUrls: [\"https://explorer.solana.com/?cluster=devnet\"],\n  iconUrl: \"https://cryptologos.cc/logos/solana-sol-logo.png\",\n};\n\nexport const solanaTestnet: ChainConfig = {\n  id: \"testnet\",\n  name: \"Solana Testnet\",\n  type: ChainType.SVM,\n  networkType: NetworkType.TESTNET,\n  rpcUrls: [\"https://api.testnet.solana.com\"],\n  nativeCurrency: {\n    name: \"Solana\",\n    symbol: \"SOL\",\n    decimals: 9,\n  },\n  blockExplorerUrls: [\"https://explorer.solana.com/?cluster=testnet\"],\n  iconUrl: \"https://cryptologos.cc/logos/solana-sol-logo.png\",\n};\n\nexport const popularSVMChains = [solanaMainnet, solanaDevnet, solanaTestnet];\n","import { ChainAdapter, ChainConfig, ChainType } from \"../types/chain\";\nimport { EVMChainAdapter } from \"./evm\";\nimport { SVMChainAdapter } from \"./svm\";\n\n// Import popular chains\nimport { popularEVMChains } from \"./evm/popular\";\nimport { popularSVMChains } from \"./svm/popular\";\n\n// Export chain adapters\nexport { EVMChainAdapter, SVMChainAdapter };\n\n// Export popular chains\nexport { popularEVMChains, popularSVMChains };\n\n// Chain adapter registry\nconst chainAdapters: Record<ChainType, ChainAdapter> = {\n  [ChainType.EVM]: new EVMChainAdapter(),\n  [ChainType.SVM]: new SVMChainAdapter(),\n};\n\n/**\n * Get a chain adapter for the specified chain type\n * @param chainType Chain type\n * @returns Chain adapter\n */\nexport function getChainAdapter(chainType: ChainType): ChainAdapter {\n  const adapter = chainAdapters[chainType];\n  if (!adapter) {\n    throw new Error(`Chain adapter not found for chain type: ${chainType}`);\n  }\n  return adapter;\n}\n\n/**\n * Get a chain adapter for the specified chain configuration\n * @param chainConfig Chain configuration\n * @returns Chain adapter\n */\nexport function getChainAdapterForChain(\n  chainConfig: ChainConfig\n): ChainAdapter {\n  return getChainAdapter(chainConfig.type);\n}\n\n/**\n * Get all supported chains\n * @returns Array of chain configurations\n */\nexport function getAllChains(): ChainConfig[] {\n  return [...popularEVMChains, ...popularSVMChains];\n}\n\n/**\n * Get a chain configuration by ID\n * @param chainId Chain ID\n * @returns Chain configuration or null if not found\n */\nexport function getChainById(chainId: string | number): ChainConfig | null {\n  return getAllChains().find((chain) => chain.id === chainId) || null;\n}\n","import EventEmitter from \"eventemitter3\";\nimport {\n  Connector,\n  ConnectorError,\n  ConnectorEvent,\n  ConnectorStatus,\n} from \"../types/connector\";\nimport { ChainId, ChainType } from \"../types/chain\";\n\n/**\n * Base connector class that implements common functionality\n * All specific wallet connectors should extend this class\n */\nexport abstract class BaseConnector implements Connector {\n  id: string;\n  name: string;\n  type: string;\n  icon: string;\n  supportedChains: ChainType[];\n\n  protected _status: ConnectorStatus = ConnectorStatus.DISCONNECTED;\n  protected _error: ConnectorError | null = null;\n  protected _account: string | null = null;\n  protected _chainId: ChainId | null = null;\n  protected _eventEmitter: EventEmitter;\n\n  constructor(\n    id: string,\n    name: string,\n    type: string,\n    icon: string,\n    supportedChains: ChainType[]\n  ) {\n    this._eventEmitter = new EventEmitter();\n    this.id = id;\n    this.name = name;\n    this.type = type;\n    this.icon = icon;\n    this.supportedChains = supportedChains;\n  }\n\n  /**\n   * Connect to the wallet\n   * @param chainId Optional chain ID to connect to\n   */\n  abstract connect(chainId?: ChainId): Promise<string>;\n\n  /**\n   * Disconnect from the wallet\n   */\n  abstract disconnect(): Promise<void>;\n\n  /**\n   * Switch to a different chain\n   * @param chainId Chain ID to switch to\n   */\n  abstract switchChain(chainId: ChainId): Promise<void>;\n\n  /**\n   * Check if the wallet is connected\n   */\n  isConnected(): boolean {\n    return this._status === ConnectorStatus.CONNECTED;\n  }\n\n  /**\n   * Get the current connection status\n   */\n  getStatus(): ConnectorStatus {\n    return this._status;\n  }\n\n  /**\n   * Get the current error (if any)\n   */\n  getError(): ConnectorError | null {\n    return this._error;\n  }\n\n  /**\n   * Get the connected account address\n   */\n  getAccount(): string | null {\n    return this._account;\n  }\n\n  /**\n   * Get the current chain ID\n   */\n  getChainId(): ChainId | null {\n    return this._chainId;\n  }\n\n  /**\n   * Register an event listener\n   * @param event Event to listen for\n   * @param listener Listener function\n   */\n  on(event: ConnectorEvent, listener: (...args: any[]) => void): void {\n    this._eventEmitter.on(event, listener);\n  }\n\n  /**\n   * Remove an event listener\n   * @param event Event to stop listening for\n   * @param listener Listener function to remove\n   */\n  off(event: ConnectorEvent, listener: (...args: any[]) => void): void {\n    this._eventEmitter.off(event, listener);\n  }\n\n  /**\n   * Remove all event listeners for a specific event\n   * @param event Event to stop listening for\n   */\n  removeAllListeners(event?: ConnectorEvent): void {\n    if (event) {\n      this._eventEmitter.removeAllListeners(event);\n    } else {\n      // Remove all listeners for all events\n      this._eventEmitter.removeAllListeners();\n    }\n  }\n\n  /**\n   * Update the connection status\n   * @param status New status\n   */\n  protected updateStatus(status: ConnectorStatus): void {\n    this._status = status;\n  }\n\n  /**\n   * Update the current error\n   * @param error New error\n   */\n  protected updateError(error: ConnectorError | null): void {\n    this._error = error;\n    if (error) {\n      this._eventEmitter.emit(ConnectorEvent.ERROR, error);\n    }\n  }\n\n  /**\n   * Update the connected account\n   * @param account New account address\n   */\n  protected updateAccount(account: string | null): void {\n    const previousAccount = this._account;\n    this._account = account;\n\n    if (account && account !== previousAccount) {\n      this._eventEmitter.emit(ConnectorEvent.ACCOUNT_CHANGED, account);\n    }\n  }\n\n  /**\n   * Update the current chain ID\n   * @param chainId New chain ID\n   */\n  protected updateChainId(chainId: ChainId | null): void {\n    const previousChainId = this._chainId;\n    this._chainId = chainId;\n\n    if (chainId && chainId !== previousChainId) {\n      this._eventEmitter.emit(ConnectorEvent.CHAIN_CHANGED, chainId);\n    }\n  }\n}\n","import { BaseConnector } from \"./base\";\nimport { ChainId, ChainType, ChainConfig } from \"../types/chain\";\nimport {\n  ConnectorError,\n  ConnectorEvent,\n  ConnectorStatus,\n} from \"../types/connector\";\nimport { getChainById } from \"../chains\";\n\ndeclare global {\n  interface Window {\n    ethereum?: any;\n  }\n}\n\n// Track pending requests to prevent duplicates\nlet pendingRequest = false;\nlet requestTimeout: NodeJS.Timeout | null = null;\n\n/**\n * MetaMask connector\n * Implements wallet connection for MetaMask and other EVM-compatible wallets\n */\nexport class MetaMaskConnector extends BaseConnector {\n  // Store bound event handlers to prevent memory leaks\n  private boundAccountsChanged: (accounts: string[]) => void;\n  private boundChainChanged: (chainId: string) => void;\n  private boundDisconnect: () => void;\n\n  constructor() {\n    super(\n      \"metamask\",\n      \"MetaMask\",\n      \"injected\",\n      \"https://metamask.io/images/metamask-fox.svg\",\n      [ChainType.EVM] // MetaMask only supports EVM chains\n    );\n\n    // Bind event handlers once to prevent memory leaks\n    this.boundAccountsChanged = this.handleAccountsChanged.bind(this);\n    this.boundChainChanged = this.handleChainChanged.bind(this);\n    this.boundDisconnect = this.handleDisconnect.bind(this);\n  }\n\n  /**\n   * Check if MetaMask is available\n   */\n  isAvailable(): boolean {\n    return typeof window !== \"undefined\" && !!window.ethereum;\n  }\n\n  /**\n   * Connect to MetaMask\n   * @param chainId Optional chain ID to connect to\n   */\n  async connect(chainId?: ChainId): Promise<string> {\n    if (!this.isAvailable()) {\n      const error: ConnectorError = {\n        code: \"wallet_unavailable\",\n        message: \"MetaMask is not installed\",\n      };\n      this.updateError(error);\n      this.updateStatus(ConnectorStatus.ERROR);\n      throw error;\n    }\n\n    // Check if the user has explicitly disconnected before\n    const hasDisconnected =\n      localStorage.getItem(\"metamask_disconnected\") === \"true\";\n    if (hasDisconnected) {\n      // User has explicitly disconnected, don't auto-connect\n      const error: ConnectorError = {\n        code: \"user_disconnected\",\n        message: \"User has explicitly disconnected. Please connect manually.\",\n      };\n      this.updateError(error);\n      this.updateStatus(ConnectorStatus.ERROR);\n      throw error;\n    }\n\n    // Check if there's already a pending request\n    if (pendingRequest) {\n      const error: ConnectorError = {\n        code: \"request_pending\",\n        message:\n          \"A wallet connection request is already pending. Please check your wallet extension.\",\n      };\n      this.updateError(error);\n      this.updateStatus(ConnectorStatus.ERROR);\n      throw error;\n    }\n\n    try {\n      this.updateStatus(ConnectorStatus.CONNECTING);\n      pendingRequest = true;\n\n      // Set a timeout to reset the pending flag after 30 seconds\n      // This prevents the app from getting stuck if the user never responds to the wallet\n      if (requestTimeout) {\n        clearTimeout(requestTimeout);\n      }\n      requestTimeout = setTimeout(() => {\n        pendingRequest = false;\n      }, 30000); // 30 seconds timeout\n\n      // Request accounts\n      const accounts = await window.ethereum.request({\n        method: \"eth_requestAccounts\",\n      });\n\n      // Clear the timeout and reset the pending flag\n      if (requestTimeout) {\n        clearTimeout(requestTimeout);\n        requestTimeout = null;\n      }\n      pendingRequest = false;\n\n      const account = accounts[0];\n\n      // Get current chain ID\n      const currentChainId = await window.ethereum.request({\n        method: \"eth_chainId\",\n      });\n      const parsedChainId = parseInt(currentChainId, 16);\n\n      // If a specific chain ID is requested, switch to it\n      if (chainId && parsedChainId !== chainId) {\n        await this.switchChain(chainId);\n      }\n\n      // Set up event listeners\n      this.setupEventListeners();\n\n      // Update state\n      this.updateAccount(account);\n      this.updateChainId(parsedChainId);\n      this.updateStatus(ConnectorStatus.CONNECTED);\n      this.updateError(null);\n\n      // Clear the disconnected flag since the user has successfully connected\n      localStorage.removeItem(\"metamask_disconnected\");\n\n      // Emit connect event\n      this._eventEmitter.emit(ConnectorEvent.CONNECT, account);\n\n      return account;\n    } catch (error: any) {\n      // Clear the timeout and reset the pending flag\n      if (requestTimeout) {\n        clearTimeout(requestTimeout);\n        requestTimeout = null;\n      }\n      pendingRequest = false;\n\n      // Handle specific MetaMask errors\n      if (error.code === -32002) {\n        const pendingError: ConnectorError = {\n          code: \"request_already_pending\",\n          message:\n            \"A wallet connection request is already pending. Please check your MetaMask extension and approve or reject the request.\",\n          details: error,\n        };\n        this.updateError(pendingError);\n        this.updateStatus(ConnectorStatus.ERROR);\n        throw pendingError;\n      }\n\n      const connectorError: ConnectorError = {\n        code: error.code || \"connection_error\",\n        message: error.message || \"Failed to connect to MetaMask\",\n        details: error,\n      };\n      this.updateError(connectorError);\n      this.updateStatus(ConnectorStatus.ERROR);\n      throw connectorError;\n    }\n  }\n\n  /**\n   * Disconnect from MetaMask\n   */\n  async disconnect(): Promise<void> {\n    // Only proceed if we're connected\n    if (this._status === ConnectorStatus.DISCONNECTED) {\n      return;\n    }\n\n    // Set a flag in localStorage to indicate that the user has explicitly disconnected\n    localStorage.setItem(\"metamask_disconnected\", \"true\");\n\n    // First remove our internal event listeners\n    this.removeAllListeners();\n\n    // Then remove MetaMask event listeners\n    this.removeEventListeners();\n\n    // Update state\n    this.updateAccount(null);\n    this.updateChainId(null);\n    this.updateStatus(ConnectorStatus.DISCONNECTED);\n    this.updateError(null);\n\n    // Emit disconnect event\n    this._eventEmitter.emit(ConnectorEvent.DISCONNECT);\n  }\n\n  /**\n   * Switch to a different chain\n   * @param chainId Chain ID to switch to\n   */\n  async switchChain(chainId: ChainId): Promise<void> {\n    if (!this.isAvailable() || !this.isConnected()) {\n      const error: ConnectorError = {\n        code: \"not_connected\",\n        message: \"Not connected to MetaMask\",\n      };\n      this.updateError(error);\n      throw error;\n    }\n\n    // Check if there's already a pending request\n    if (pendingRequest) {\n      const error: ConnectorError = {\n        code: \"request_pending\",\n        message:\n          \"A wallet request is already pending. Please check your wallet extension.\",\n      };\n      this.updateError(error);\n      throw error;\n    }\n\n    try {\n      pendingRequest = true;\n\n      // Set a timeout to reset the pending flag after 30 seconds\n      if (requestTimeout) {\n        clearTimeout(requestTimeout);\n      }\n      requestTimeout = setTimeout(() => {\n        pendingRequest = false;\n      }, 30000); // 30 seconds timeout\n\n      // Convert chainId to hex if it's a number\n      const hexChainId =\n        typeof chainId === \"number\" ? `0x${chainId.toString(16)}` : chainId;\n\n      // Try to switch to the chain\n      await window.ethereum.request({\n        method: \"wallet_switchEthereumChain\",\n        params: [{ chainId: hexChainId }],\n      });\n\n      // Clear the timeout and reset the pending flag\n      if (requestTimeout) {\n        clearTimeout(requestTimeout);\n        requestTimeout = null;\n      }\n      pendingRequest = false;\n\n      // Update chain ID\n      this.updateChainId(chainId);\n    } catch (error: any) {\n      // Clear the timeout and reset the pending flag\n      if (requestTimeout) {\n        clearTimeout(requestTimeout);\n        requestTimeout = null;\n      }\n      pendingRequest = false;\n\n      // Handle specific MetaMask errors\n      if (error.code === -32002) {\n        const pendingError: ConnectorError = {\n          code: \"request_already_pending\",\n          message:\n            \"A wallet request is already pending. Please check your MetaMask extension and approve or reject the request.\",\n          details: error,\n        };\n        this.updateError(pendingError);\n        throw pendingError;\n      }\n\n      // If the chain hasn't been added to MetaMask, add it\n      if (error.code === 4902) {\n        const chain = getChainById(chainId);\n        if (chain) {\n          await this.addChain(chain);\n        } else {\n          throw {\n            code: \"chain_not_found\",\n            message: `Chain with ID ${chainId} not found`,\n          };\n        }\n      } else {\n        const connectorError: ConnectorError = {\n          code: error.code || \"chain_switch_error\",\n          message: error.message || \"Failed to switch chain\",\n          details: error,\n        };\n        this.updateError(connectorError);\n        throw connectorError;\n      }\n    }\n  }\n\n  /**\n   * Add a chain to MetaMask\n   * @param chain Chain configuration\n   */\n  private async addChain(chain: ChainConfig): Promise<void> {\n    // Check if there's already a pending request\n    if (pendingRequest) {\n      const error: ConnectorError = {\n        code: \"request_pending\",\n        message:\n          \"A wallet request is already pending. Please check your wallet extension.\",\n      };\n      this.updateError(error);\n      throw error;\n    }\n\n    try {\n      pendingRequest = true;\n\n      // Set a timeout to reset the pending flag after 30 seconds\n      if (requestTimeout) {\n        clearTimeout(requestTimeout);\n      }\n      requestTimeout = setTimeout(() => {\n        pendingRequest = false;\n      }, 30000); // 30 seconds timeout\n\n      await window.ethereum.request({\n        method: \"wallet_addEthereumChain\",\n        params: [\n          {\n            chainId:\n              typeof chain.id === \"number\"\n                ? `0x${chain.id.toString(16)}`\n                : chain.id,\n            chainName: chain.name,\n            nativeCurrency: chain.nativeCurrency,\n            rpcUrls: chain.rpcUrls,\n            blockExplorerUrls: chain.blockExplorerUrls,\n          },\n        ],\n      });\n\n      // Clear the timeout and reset the pending flag\n      if (requestTimeout) {\n        clearTimeout(requestTimeout);\n        requestTimeout = null;\n      }\n      pendingRequest = false;\n    } catch (error: any) {\n      // Clear the timeout and reset the pending flag\n      if (requestTimeout) {\n        clearTimeout(requestTimeout);\n        requestTimeout = null;\n      }\n      pendingRequest = false;\n\n      // Handle specific MetaMask errors\n      if (error.code === -32002) {\n        const pendingError: ConnectorError = {\n          code: \"request_already_pending\",\n          message:\n            \"A wallet request is already pending. Please check your MetaMask extension and approve or reject the request.\",\n          details: error,\n        };\n        this.updateError(pendingError);\n        throw pendingError;\n      }\n\n      const connectorError: ConnectorError = {\n        code: error.code || \"add_chain_error\",\n        message: error.message || \"Failed to add chain\",\n        details: error,\n      };\n      this.updateError(connectorError);\n      throw connectorError;\n    }\n  }\n\n  /**\n   * Set up event listeners for MetaMask events\n   */\n  private setupEventListeners(): void {\n    if (window.ethereum) {\n      window.ethereum.on(\"accountsChanged\", this.boundAccountsChanged);\n      window.ethereum.on(\"chainChanged\", this.boundChainChanged);\n      window.ethereum.on(\"disconnect\", this.boundDisconnect);\n    }\n  }\n\n  /**\n   * Remove event listeners\n   */\n  private removeEventListeners(): void {\n    if (window.ethereum) {\n      window.ethereum.removeListener(\n        \"accountsChanged\",\n        this.boundAccountsChanged\n      );\n      window.ethereum.removeListener(\"chainChanged\", this.boundChainChanged);\n      window.ethereum.removeListener(\"disconnect\", this.boundDisconnect);\n    }\n  }\n\n  /**\n   * Handle accounts changed event\n   * @param accounts New accounts\n   */\n  private handleAccountsChanged(accounts: string[]): void {\n    if (accounts.length === 0) {\n      // User disconnected\n      this.disconnect();\n    } else {\n      // Account changed\n      this.updateAccount(accounts[0]);\n    }\n  }\n\n  /**\n   * Handle chain changed event\n   * @param chainId New chain ID\n   */\n  private handleChainChanged(chainId: string): void {\n    const parsedChainId = parseInt(chainId, 16);\n    this.updateChainId(parsedChainId);\n  }\n\n  /**\n   * Handle disconnect event\n   */\n  private handleDisconnect(): void {\n    // Only update the state without emitting events to prevent recursion\n    this.updateStatus(ConnectorStatus.DISCONNECTED);\n    this.updateAccount(null);\n    this.updateChainId(null);\n    this.updateError(null);\n\n    // Remove event listeners\n    this.removeEventListeners();\n  }\n}\n","import { BaseConnector } from \"./base\";\nimport { ChainId, ChainType } from \"../types/chain\";\nimport {\n  ConnectorError,\n  ConnectorEvent,\n  ConnectorStatus,\n} from \"../types/connector\";\nimport { getChainById } from \"../chains\";\n\ndeclare global {\n  interface Window {\n    phantom?: {\n      solana?: {\n        isPhantom?: boolean;\n        connect: () => Promise<{ publicKey: { toString: () => string } }>;\n        disconnect: () => Promise<void>;\n        on: (event: string, handler: (...args: any[]) => void) => void;\n        off: (event: string, handler: (...args: any[]) => void) => void;\n        request: (request: { method: string; params?: any }) => Promise<any>;\n      };\n    };\n  }\n}\n\n/**\n * Phantom connector\n * Implements wallet connection for Phantom (Solana)\n */\nexport class PhantomConnector extends BaseConnector {\n  constructor() {\n    super(\n      \"phantom\",\n      \"Phantom\",\n      \"injected\",\n      \"https://phantom.app/img/logo.png\",\n      [ChainType.SVM] // Phantom supports Solana\n    );\n  }\n\n  /**\n   * Check if Phantom is available\n   */\n  isAvailable(): boolean {\n    return typeof window !== \"undefined\" && !!window.phantom?.solana?.isPhantom;\n  }\n\n  /**\n   * Connect to Phantom\n   * @param chainId Optional chain ID to connect to\n   */\n  async connect(chainId?: ChainId): Promise<string> {\n    if (!this.isAvailable()) {\n      const error: ConnectorError = {\n        code: \"wallet_unavailable\",\n        message: \"Phantom is not installed\",\n      };\n      this.updateError(error);\n      this.updateStatus(ConnectorStatus.ERROR);\n      throw error;\n    }\n\n    try {\n      this.updateStatus(ConnectorStatus.CONNECTING);\n\n      // Connect to Phantom\n      const solana = window.phantom?.solana;\n      if (!solana) {\n        throw new Error(\"Phantom solana provider not found\");\n      }\n\n      const response = await solana.connect();\n      const account = response.publicKey.toString();\n\n      // Set up event listeners\n      this.setupEventListeners();\n\n      // Update state\n      this.updateAccount(account);\n\n      // For Solana, we use the network name as the chain ID\n      // Default to mainnet if not specified\n      const solanaChainId = chainId || \"mainnet-beta\";\n      this.updateChainId(solanaChainId);\n\n      this.updateStatus(ConnectorStatus.CONNECTED);\n      this.updateError(null);\n\n      // Emit connect event\n      this._eventEmitter.emit(ConnectorEvent.CONNECT, account);\n\n      return account;\n    } catch (error: any) {\n      const connectorError: ConnectorError = {\n        code: error.code || \"connection_error\",\n        message: error.message || \"Failed to connect to Phantom\",\n        details: error,\n      };\n      this.updateError(connectorError);\n      this.updateStatus(ConnectorStatus.ERROR);\n      throw connectorError;\n    }\n  }\n\n  /**\n   * Disconnect from Phantom\n   */\n  async disconnect(): Promise<void> {\n    if (this.isAvailable()) {\n      try {\n        const solana = window.phantom?.solana;\n        if (solana) {\n          await solana.disconnect();\n        }\n      } catch (error) {\n        console.error(\"Error disconnecting from Phantom:\", error);\n      }\n    }\n\n    this.removeEventListeners();\n    this.updateAccount(null);\n    this.updateChainId(null);\n    this.updateStatus(ConnectorStatus.DISCONNECTED);\n    this.updateError(null);\n    this._eventEmitter.emit(ConnectorEvent.DISCONNECT);\n  }\n\n  /**\n   * Switch to a different Solana network\n   * @param chainId Chain ID to switch to (e.g., 'mainnet-beta', 'testnet', 'devnet')\n   */\n  async switchChain(chainId: ChainId): Promise<void> {\n    if (!this.isAvailable() || !this.isConnected()) {\n      const error: ConnectorError = {\n        code: \"not_connected\",\n        message: \"Not connected to Phantom\",\n      };\n      this.updateError(error);\n      throw error;\n    }\n\n    try {\n      // Phantom doesn't have a direct method to switch networks\n      // Users need to switch networks manually in the wallet\n      // We can only update our internal state\n      this.updateChainId(chainId);\n\n      // Notify the user that they need to switch networks manually\n      console.warn(\n        \"Please switch to the desired network manually in your Phantom wallet.\"\n      );\n    } catch (error: any) {\n      const connectorError: ConnectorError = {\n        code: error.code || \"chain_switch_error\",\n        message: error.message || \"Failed to switch chain\",\n        details: error,\n      };\n      this.updateError(connectorError);\n      throw connectorError;\n    }\n  }\n\n  /**\n   * Set up event listeners for Phantom events\n   */\n  private setupEventListeners(): void {\n    const solana = window.phantom?.solana;\n    if (solana) {\n      solana.on(\"accountChanged\", this.handleAccountChanged.bind(this));\n      solana.on(\"disconnect\", this.handleDisconnect.bind(this));\n    }\n  }\n\n  /**\n   * Remove event listeners\n   */\n  private removeEventListeners(): void {\n    const solana = window.phantom?.solana;\n    if (solana) {\n      solana.off(\"accountChanged\", this.handleAccountChanged.bind(this));\n      solana.off(\"disconnect\", this.handleDisconnect.bind(this));\n    }\n  }\n\n  /**\n   * Handle account changed event\n   * @param publicKey New public key\n   */\n  private handleAccountChanged(\n    publicKey: { toString: () => string } | null\n  ): void {\n    if (!publicKey) {\n      // User disconnected\n      this.disconnect();\n    } else {\n      // Account changed\n      this.updateAccount(publicKey.toString());\n    }\n  }\n\n  /**\n   * Handle disconnect event\n   */\n  private handleDisconnect(): void {\n    this.disconnect();\n  }\n}\n","import { Connector } from \"../types/connector\";\nimport { BaseConnector } from \"./base\";\nimport { MetaMaskConnector } from \"./metamask\";\nimport { PhantomConnector } from \"./phantom\";\n\n// Export all connectors\nexport { BaseConnector, MetaMaskConnector, PhantomConnector };\n\n// Default connectors\nconst defaultConnectors: Connector[] = [\n  new MetaMaskConnector(), // Use MetaMask for EVM chains\n  new PhantomConnector(),\n];\n\n/**\n * Get all available connectors\n * @returns Array of available connectors\n */\nexport function getAvailableConnectors(): Connector[] {\n  if (typeof window === \"undefined\") {\n    return [];\n  }\n\n  return defaultConnectors.filter((connector) => {\n    // Check if the connector has an isAvailable method\n    if (\n      \"isAvailable\" in connector &&\n      typeof (connector as any).isAvailable === \"function\"\n    ) {\n      return (connector as any).isAvailable();\n    }\n    return true;\n  });\n}\n\n/**\n * Get a connector by ID\n * @param id Connector ID\n * @returns Connector or undefined if not found\n */\nexport function getConnectorById(id: string): Connector | undefined {\n  return defaultConnectors.find((connector) => connector.id === id);\n}\n","\"use client\";\n\nimport { create } from \"zustand\";\nimport { persist, PersistStorage, StateStorage } from \"zustand/middleware\";\nimport { getChainById } from \"../chains\";\nimport { getConnectorById } from \"../connectors\";\nimport { ChainConfig, ChainId } from \"../types/chain\";\nimport { Connector, ConnectorEvent, ConnectorStatus } from \"../types/connector\";\n\n// Flag to prevent recursive disconnect calls\nlet isDisconnecting = false;\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== \"undefined\";\n\n// Define the persisted state type\ntype PersistedState = {\n  account: string | null;\n  chainId: ChainId | null;\n  connector: string | null;\n};\n\n// Web3 store state interface\ninterface Web3State {\n  // Connection state\n  status: ConnectorStatus;\n  account: string | null;\n  chainId: ChainId | null;\n  connector: Connector | null;\n  error: Error | null;\n\n  // Chain info\n  chain: ChainConfig | null;\n\n  // Actions\n  connect: (connectorId: string, chainId?: ChainId) => Promise<void>;\n  disconnect: () => Promise<void>;\n  switchChain: (chainId: ChainId) => Promise<void>;\n\n  // Internal actions\n  setStatus: (status: ConnectorStatus) => void;\n  setAccount: (account: string | null) => void;\n  setChainId: (chainId: ChainId | null) => void;\n  setConnector: (connector: Connector | null) => void;\n  setError: (error: Error | null) => void;\n}\n\n// Create a safe storage object that checks for browser environment\nconst createSafeStorage = (): StateStorage => {\n  if (!isBrowser) {\n    return {\n      getItem: (name) => {\n        return null;\n      },\n      setItem: (name, value) => {},\n      removeItem: (name) => {},\n    };\n  }\n\n  return {\n    getItem: (name) => {\n      const str = localStorage.getItem(name);\n      return str ?? null;\n    },\n    setItem: (name, value) => {\n      localStorage.setItem(name, value);\n    },\n    removeItem: (name) => {\n      localStorage.removeItem(name);\n    },\n  };\n};\n\n// Create the store with persistence\nexport const useWeb3Store = create<Web3State>()(\n  persist(\n    (set, get) => ({\n      // Initial state\n      status: ConnectorStatus.DISCONNECTED,\n      account: null,\n      chainId: null,\n      connector: null,\n      error: null,\n      chain: null,\n\n      // Actions\n      connect: async (connectorId: string, chainId?: ChainId) => {\n        try {\n          // First disconnect any existing connection to clean up event listeners\n          const currentConnector = get().connector;\n          if (currentConnector) {\n            await get().disconnect();\n          }\n\n          set({\n            status: ConnectorStatus.CONNECTING,\n            error: null,\n          });\n\n          const connector = getConnectorById(connectorId);\n          if (!connector) {\n            throw new Error(`Connector with ID ${connectorId} not found`);\n          }\n\n          // Connect to the wallet\n          const account = await connector.connect(chainId);\n\n          // Get the chain ID from the connector\n          const connectedChainId = connector.getChainId();\n\n          // Get the chain config\n          const chainConfig = connectedChainId\n            ? getChainById(connectedChainId)\n            : null;\n\n          // Set up event listeners\n          connector.on(ConnectorEvent.ACCOUNT_CHANGED, (newAccount: string) => {\n            set({ account: newAccount });\n          });\n\n          connector.on(ConnectorEvent.CHAIN_CHANGED, (newChainId: ChainId) => {\n            const newChain = getChainById(newChainId);\n            set({\n              chainId: newChainId,\n              chain: newChain || null,\n            });\n          });\n\n          connector.on(ConnectorEvent.DISCONNECT, () => {\n            // Prevent recursive calls\n            if (!isDisconnecting) {\n              get().disconnect();\n            }\n          });\n\n          connector.on(ConnectorEvent.ERROR, (error: Error) => {\n            set({\n              error,\n              status: error ? ConnectorStatus.ERROR : get().status,\n            });\n          });\n\n          // Update state\n          set({\n            connector,\n            account,\n            chainId: connectedChainId,\n            chain: chainConfig,\n            status: ConnectorStatus.CONNECTED,\n          });\n        } catch (error) {\n          set({\n            status: ConnectorStatus.ERROR,\n            error: error as Error,\n          });\n          throw error;\n        }\n      },\n\n      disconnect: async () => {\n        // Prevent recursive calls\n        if (isDisconnecting) return;\n\n        isDisconnecting = true;\n\n        try {\n          const { connector } = get();\n          if (connector) {\n            try {\n              // Remove all event listeners before disconnecting\n              connector.removeAllListeners();\n\n              await connector.disconnect();\n            } catch (error) {\n              console.error(\"Error disconnecting:\", error);\n            }\n          }\n\n          // Clear the persisted data from localStorage\n          localStorage.removeItem(\"web3-storage\");\n\n          set({\n            status: ConnectorStatus.DISCONNECTED,\n            account: null,\n            chainId: null,\n            connector: null,\n            chain: null,\n            error: null,\n          });\n        } finally {\n          isDisconnecting = false;\n        }\n      },\n\n      switchChain: async (chainId: ChainId) => {\n        const { connector } = get();\n        if (!connector) {\n          throw new Error(\"Not connected to any wallet\");\n        }\n\n        try {\n          await connector.switchChain(chainId);\n          const chainConfig = getChainById(chainId);\n\n          set({\n            chainId,\n            chain: chainConfig || null,\n          });\n        } catch (error) {\n          set({ error: error as Error });\n          throw error;\n        }\n      },\n\n      // Internal actions\n      setStatus: (status: ConnectorStatus) => set({ status }),\n      setAccount: (account: string | null) => set({ account }),\n      setChainId: (chainId: ChainId | null) =>\n        set({\n          chainId,\n          chain: chainId ? getChainById(chainId) || null : null,\n        }),\n      setConnector: (connector: Connector | null) => set({ connector }),\n      setError: (error: Error | null) => set({ error }),\n    }),\n    {\n      name: \"web3-storage\",\n      storage: createSafeStorage() as unknown as PersistStorage<\n        Partial<Web3State>\n      >,\n      partialize: (state) =>\n        ({\n          account: state.account,\n          chainId: state.chainId,\n          connector: state.connector ? state.connector.id : null,\n        } as Partial<Web3State>),\n    }\n  )\n);\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useWeb3Store } from \"../store/web3Store\";\nimport { ChainConfig, ChainId } from \"../types/chain\";\nimport { Connector, ConnectorStatus } from \"../types/connector\";\nimport { getAvailableConnectors } from \"../connectors\";\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== \"undefined\";\n\n// Define the return type of the hook\nexport interface Web3HookReturn {\n  status: ConnectorStatus;\n  account: string | null;\n  chainId: ChainId | null;\n  chain: ChainConfig | null;\n  error: Error | null;\n  isConnected: boolean;\n  isConnecting: boolean;\n  isDisconnected: boolean;\n  isError: boolean;\n  connect: (connectorId: string, chainId?: ChainId) => Promise<void>;\n  disconnect: () => Promise<void>;\n  switchChain: (chainId: ChainId) => Promise<void>;\n  getAvailableConnectors: () => Connector[];\n}\n\n// Create a default state for server-side rendering\nconst defaultState: Web3HookReturn = {\n  status: ConnectorStatus.DISCONNECTED,\n  account: null,\n  chainId: null,\n  chain: null,\n  error: null,\n  isConnected: false,\n  isConnecting: false,\n  isDisconnected: true,\n  isError: false,\n  connect: async () => {\n    console.warn(\"Web3 not initialized\");\n  },\n  disconnect: async () => {\n    console.warn(\"Web3 not initialized\");\n  },\n  switchChain: async () => {\n    console.warn(\"Web3 not initialized\");\n  },\n  getAvailableConnectors: () => [],\n};\n\n/**\n * Hook for interacting with the web3 store\n * @param config Configuration options\n * @returns Web3 state and actions\n */\nexport function useWeb3(config?: {\n  autoConnect?: boolean;\n  defaultChain?: ChainId;\n}): Web3HookReturn {\n  const store = useWeb3Store();\n  const [state, setState] = useState<Web3HookReturn>(defaultState);\n  const autoConnectAttempted = useRef(false);\n\n  useEffect(() => {\n    if (!isBrowser) return;\n\n    setState({\n      status: store.status,\n      account: store.account,\n      chainId: store.chainId,\n      chain: store.chain,\n      error: store.error,\n      isConnected: store.status === ConnectorStatus.CONNECTED,\n      isConnecting: store.status === ConnectorStatus.CONNECTING,\n      isDisconnected: store.status === ConnectorStatus.DISCONNECTED,\n      isError: store.status === ConnectorStatus.ERROR,\n      connect: store.connect,\n      disconnect: store.disconnect,\n      switchChain: store.switchChain,\n      getAvailableConnectors,\n    });\n  }, [\n    store.status,\n    store.account,\n    store.chainId,\n    store.chain,\n    store.error,\n    store.connect,\n    store.disconnect,\n    store.switchChain,\n  ]);\n\n  useEffect(() => {\n    if (!isBrowser || !config?.autoConnect || autoConnectAttempted.current)\n      return;\n\n    const autoConnect = async () => {\n      try {\n        autoConnectAttempted.current = true;\n\n        const storedData = localStorage.getItem(\"web3-storage\");\n        if (!storedData) return;\n\n        const parsedData = JSON.parse(storedData);\n        if (!parsedData?.state?.connector) return;\n\n        const connectors = getAvailableConnectors();\n        const storedConnectorId = parsedData.state.connector;\n        const connector = connectors.find((c) => c.id === storedConnectorId);\n\n        if (connector) {\n          await store.connect(connector.id, config.defaultChain);\n        }\n      } catch (error) {\n        console.error(\"Auto-connect failed:\", error);\n      }\n    };\n\n    autoConnect();\n  }, [config?.autoConnect, config?.defaultChain, store.connect]);\n\n  return state;\n}\n","\"use client\";\n\nimport React, {\n  createContext,\n  ReactNode,\n  useContext,\n  useEffect,\n  useState,\n} from \"react\";\nimport { getAvailableConnectors } from \"../connectors\";\nimport { useWeb3, Web3HookReturn } from \"../hooks/useWeb3\";\nimport { ConnectorStatus } from \"../types/connector\";\nimport { Web3Config } from \"../types/index\";\n\n// Create context\nconst Web3Context = createContext<Web3HookReturn | null>(null);\n\n/**\n * Default configuration for Web3Provider\n */\nconst defaultConfig: Web3Config = {\n  autoConnect: false,\n};\n\n/**\n * Web3Provider props\n */\ninterface Web3ProviderProps {\n  children: React.ReactNode;\n  config?: Web3Config;\n}\n\n/**\n * Internal provider component that uses the web3 hook\n */\nfunction InternalProvider({ children, config }: Web3ProviderProps) {\n  const web3 = useWeb3(config);\n  return <Web3Context.Provider value={web3}>{children}</Web3Context.Provider>;\n}\n\n/**\n * Web3Provider component\n * Provides web3 context to child components\n */\nexport function Web3Provider({ children, config }: Web3ProviderProps) {\n  const mergedConfig = { ...defaultConfig, ...config };\n  const [isMounted, setIsMounted] = useState(false);\n\n  useEffect(() => {\n    setIsMounted(true);\n  }, []);\n\n  if (!isMounted) {\n    return null;\n  }\n\n  return <InternalProvider config={mergedConfig}>{children}</InternalProvider>;\n}\n\n/**\n * Hook to access web3 context\n * @returns Web3 context\n */\nexport function useWeb3Context(): Web3HookReturn {\n  const context = useContext(Web3Context);\n  if (!context) {\n    throw new Error(\"useWeb3Context must be used within a Web3Provider\");\n  }\n  return context;\n}\n\n/**\n * ConnectWalletButton component\n * Button to connect wallet\n */\nexport function ConnectWalletButton({\n  onConnect,\n  onError,\n  chainId,\n  className,\n  children,\n}: {\n  onConnect?: (account: string) => void;\n  onError?: (error: Error) => void;\n  chainId?: string | number;\n  className?: string;\n  children?: React.ReactNode;\n}) {\n  const { connect, account, status } = useWeb3Context();\n  const [isLoading, setIsLoading] = useState(false);\n\n  useEffect(() => {\n    if (status !== ConnectorStatus.CONNECTING) {\n      setIsLoading(false);\n    }\n  }, [status]);\n\n  useEffect(() => {\n    if (account && onConnect) {\n      onConnect(account);\n    }\n  }, [account, onConnect]);\n\n  const handleConnect = async () => {\n    try {\n      setIsLoading(true);\n      const connectors = getAvailableConnectors();\n      if (connectors.length > 0) {\n        // Prefer MetaMask connector for EVM chains\n        const metaMaskConnector = connectors.find((c) => c.id === \"metamask\");\n        if (metaMaskConnector) {\n          await connect(metaMaskConnector.id, chainId);\n        } else if (connectors.length > 0) {\n          await connect(connectors[0].id, chainId);\n        }\n      } else {\n        throw new Error(\"No wallet connectors available\");\n      }\n    } catch (error) {\n      setIsLoading(false);\n      if (onError && error instanceof Error) {\n        onError(error);\n      }\n      console.error(\"Failed to connect wallet:\", error);\n    }\n  };\n\n  return (\n    <button\n      onClick={handleConnect}\n      disabled={isLoading || status === ConnectorStatus.CONNECTED}\n      className={className}\n      style={{\n        padding: \"0.5rem 1rem\",\n        backgroundColor: \"#4CAF50\",\n        color: \"white\",\n        border: \"none\",\n        borderRadius: \"4px\",\n        cursor: \"pointer\",\n        ...(!className && {}),\n      }}\n    >\n      {isLoading\n        ? \"Connecting...\"\n        : status === ConnectorStatus.CONNECTED\n        ? \"Connected\"\n        : children || \"Connect Wallet\"}\n    </button>\n  );\n}\n"]}