Skip to main content

Available Networks

Access networks enabled in your Dynamic dashboard:
import 'package:dynamic_sdk/dynamic_sdk.dart';

final sdk = DynamicSDK.instance;

// EVM networks (Ethereum, Polygon, Base, etc.)
for (final network in sdk.networks.evm) {
  print('${network.name} - Chain ID: ${network.chainId.value}');
}

// Solana networks
for (final network in sdk.networks.solana) {
  print(network.name);
}

Get Current Network

Future<String> getCurrentNetwork(BaseWallet wallet) async {
  final network = await sdk.wallets.getNetwork(wallet: wallet);
  return network.value.value.toString();
}

Resolve Network Name

Future<String> getNetworkName(BaseWallet wallet) async {
  try {
    final network = await sdk.wallets.getNetwork(wallet: wallet);
    final rawId = network.value.value.toString();

    if (wallet.chain.toUpperCase() == 'EVM') {
      final evmNetwork = sdk.networks.evm.firstWhere(
        (n) => n.chainId.value.toString() == rawId,
        orElse: () => throw Exception('Network not found'),
      );
      return evmNetwork.name;
    }

    if (wallet.chain.toUpperCase() == 'SOL') {
      final solanaNetwork = sdk.networks.solana.firstWhere(
        (n) => n.networkId.value.toString() == rawId,
        orElse: () => throw Exception('Network not found'),
      );
      return solanaNetwork.name;
    }

    return rawId;
  } catch (e) {
    return 'Unknown';
  }
}

Switch Network

Future<void> switchNetwork(BaseWallet wallet, GenericNetwork network) async {
  try {
    await sdk.wallets.switchNetwork(wallet: wallet, network: network);
    print('Switched to ${network.name}');
  } catch (e) {
    print('Failed to switch network: $e');
  }
}

Example Usage

// Get first available Polygon network and switch to it
final polygonNetwork = sdk.networks.evm.firstWhere(
  (network) => network.name.contains('Polygon'),
  orElse: () => throw Exception('Polygon network not found'),
);

await switchNetwork(myWallet, polygonNetwork);

Error Handling

Future<void> switchNetworkWithErrorHandling(
  BaseWallet wallet,
  GenericNetwork network,
) async {
  try {
    await sdk.wallets.switchNetwork(wallet: wallet, network: network);
    print('Network switched successfully');
  } catch (e) {
    final errorDesc = e.toString().toLowerCase();

    if (errorDesc.contains('rejected')) {
      print('User rejected network switch');
    } else if (errorDesc.contains('unsupported')) {
      print('Network not supported');
    } else {
      print('Switch failed: $e');
    }
  }
}

Flutter Widget Example

import 'package:flutter/material.dart';
import 'package:dynamic_sdk/dynamic_sdk.dart';

class NetworkSwitcher extends StatefulWidget {
  final BaseWallet wallet;

  const NetworkSwitcher({Key? key, required this.wallet}) : super(key: key);

  @override
  State<NetworkSwitcher> createState() => _NetworkSwitcherState();
}

class _NetworkSwitcherState extends State<NetworkSwitcher> {
  final sdk = DynamicSDK.instance;
  String? currentNetwork;
  bool isLoading = false;

  @override
  void initState() {
    super.initState();
    _loadCurrentNetwork();
  }

  Future<void> _loadCurrentNetwork() async {
    setState(() => isLoading = true);
    try {
      final networkName = await getNetworkName(widget.wallet);
      setState(() => currentNetwork = networkName);
    } catch (e) {
      print('Failed to load network: $e');
    } finally {
      setState(() => isLoading = false);
    }
  }

  Future<String> getNetworkName(BaseWallet wallet) async {
    try {
      final network = await sdk.wallets.getNetwork(wallet: wallet);
      final rawId = network.value.value.toString();

      if (wallet.chain.toUpperCase() == 'EVM') {
        final evmNetwork = sdk.networks.evm.firstWhere(
          (n) => n.chainId.value.toString() == rawId,
          orElse: () => throw Exception('Network not found'),
        );
        return evmNetwork.name;
      }

      return rawId;
    } catch (e) {
      return 'Unknown';
    }
  }

  @override
  Widget build(BuildContext context) {
    if (isLoading) {
      return const Center(child: CircularProgressIndicator());
    }

    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text('Current Network: ${currentNetwork ?? "Unknown"}'),
        const SizedBox(height: 16),
        DropdownButton<GenericNetwork>(
          hint: const Text('Select Network'),
          items: sdk.networks.evm.map((network) {
            return DropdownMenuItem(
              value: network,
              child: Text(network.name),
            );
          }).toList(),
          onChanged: (network) async {
            if (network != null) {
              await switchNetwork(widget.wallet, network);
              await _loadCurrentNetwork();
            }
          },
        ),
      ],
    );
  }
}

StreamBuilder Example

import 'package:flutter/material.dart';
import 'package:dynamic_sdk/dynamic_sdk.dart';

class NetworkMonitor extends StatelessWidget {
  final BaseWallet wallet;

  const NetworkMonitor({Key? key, required this.wallet}) : super(key: key);

  Stream<String> networkStream() async* {
    while (true) {
      try {
        final sdk = DynamicSDK.instance;
        final network = await sdk.wallets.getNetwork(wallet: wallet);
        yield network.value.value.toString();
      } catch (e) {
        yield 'Error: $e';
      }
      await Future.delayed(const Duration(seconds: 5));
    }
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<String>(
      stream: networkStream(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Text('Network: ${snapshot.data}');
        }
        return const CircularProgressIndicator();
      },
    );
  }
}

Next Steps