initialize method
Future<void>
initialize({
- required NetworkConfig defaultNetwork,
- String? privateKey,
- Web3Signer? signer,
- required EIP6963ProviderInfo providerInfo,
- List<
NetworkConfig> additionalNetworks = const [], - WalletDialogTheme? theme,
- WalletDialogTheme? darkTheme,
- 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);
}
}