initialize method

Future<void> initialize({
  1. required NetworkConfig defaultNetwork,
  2. String? privateKey,
  3. Web3Signer? signer,
  4. required EIP6963ProviderInfo providerInfo,
  5. List<NetworkConfig> additionalNetworks = const [],
  6. WalletDialogTheme? theme,
  7. WalletDialogTheme? darkTheme,
  8. WalletDialogBuilders? dialogBuilders,
})

Initializes provider.

Provide either signer (preferred) or privateKey (legacy, 64 hex, 0x optional). If both are null / empty, provider enters read-only mode and only RPC reads succeed.

Implementation

Future<void> initialize({
  required NetworkConfig defaultNetwork,
  String? privateKey,
  Web3Signer? signer,
  required EIP6963ProviderInfo providerInfo,
  List<NetworkConfig> additionalNetworks = const [],
  WalletDialogTheme? theme,
  WalletDialogTheme? darkTheme,
  WalletDialogBuilders? dialogBuilders,
}) async {
  // Configure dialog service theme (light + dark) + custom builders
  _dialogService.configureTheme(theme ?? WalletDialogTheme(), darkTheme: darkTheme);
  _dialogService.setBuilders(dialogBuilders);

  // Configure provider info
  _eip6963ProviderInfo = providerInfo;

  // Initialize Web3 client first – needed for all modes (read)
  _httpClient?.close();
  _httpClient = Client();
  _web3client = Web3Client(
    defaultNetwork.rpcUrls.first,
    _httpClient!,
  );

  // Determine signer mode (signer takes precedence)
  if (signer != null) {
    if (!ValidationUtils.isValidAddress(signer.address)) {
      throw WalletException(
        'Invalid signer address: ${signer.address}',
        code: -32602,
      );
    }
    _signer = signer;
    // Keep legacy fields null
    _credentials = null;
    _txHandler = null;
    _state = WalletState(
      chainId: defaultNetwork.chainId,
      address: signer.address,
      isConnected: true,
    );
  } else if (privateKey != null && privateKey.trim().isNotEmpty) {
    final trimmedKey = privateKey.trim();
    final normalized =
        trimmedKey.startsWith('0x') ? trimmedKey : '0x$trimmedKey';
    if (!RegExp(r'^0x[0-9a-fA-F]{64}$').hasMatch(normalized)) {
      throw WalletException(
          'Invalid private key format: expected 32 bytes hex',
          code: -32602);
    }
    try {
      _credentials = EthPrivateKey.fromHex(normalized);
    } catch (e) {
      throw WalletException('Invalid private key: $e', code: -32602);
    }
    // Create private-key signer that delegates to handlers via getters
    // _state must exist before closure captures it
    final addr = _credentials!.address.hexEip55;
    _state = WalletState(
      chainId: defaultNetwork.chainId,
      address: addr,
      isConnected: true,
    );
    _signer = PrivateKeySigner(
      credentials: _credentials as EthPrivateKey,
      getClient: () => _web3client!,
      getChainId: () =>
          int.parse(_state.chainId.substring(2), radix: 16),
    );
    // Legacy handler kept for eth_call / estimateGas
    _txHandler = TransactionHandler(
      _web3client!,
      _credentials!,
      int.parse(defaultNetwork.chainId.substring(2), radix: 16),
    );
  } else {
    // Read-only mode – no signer
    _signer = null;
    _credentials = null;
    _txHandler = null;
    _state = WalletState(
      chainId: defaultNetwork.chainId,
      address: null,
      isConnected: false,
    );
  }

  // Add networks
  _addNetwork(defaultNetwork);
  for (var network in additionalNetworks) {
    _addNetwork(network);
  }
}