Bech32Address.fromString constructor

Bech32Address.fromString(
  1. String encoded,
  2. Network network
)

Implementation

factory Bech32Address.fromString(String encoded, Network network) {

  final bech32 = Bech32.decode(encoded);

  if (bech32.words.isEmpty) throw InvalidAddress();
  if (bech32.hrp != network.bech32Hrp) throw InvalidAddressNetwork();

  final version = bech32.words[0];

  // Must use bech32m starting with version 1
  if (
    (version == 0 && bech32.type != Bech32Type.bech32)
    || (version != 0 && bech32.type != Bech32Type.bech32m)
  ) {
    throw InvalidAddress();
  }

  final data = convertBits(bech32.words.sublist(1), 5, 8, false);
  if (data == null) throw InvalidAddress();

  final bytes = Uint8List.fromList(data);

  late Bech32Address addr;

  if (version == 0) {
    // Version 0 signals P2WPKH or P2WSH
    if (bytes.length == 20) {
      addr = P2WPKHAddress.fromHash(bytes, hrp: bech32.hrp);
    } else if (bytes.length == 32) {
      addr = P2WSHAddress.fromHash(bytes, hrp: bech32.hrp);
    } else {
      throw InvalidAddress();
    }
  } else if (version == 1) {
    // Version 1 is Taproot
    if (bytes.length == 32) {
      addr = P2TRAddress.fromTweakedKeyX(bytes, hrp: bech32.hrp);
    } else {
      throw InvalidAddress();
    }
  } else if (version <= 16) {
    // Treat other versions as unknown.
    if (bytes.length < 2 || bytes.length > maxWitnessProgramLength) {
      throw InvalidAddress();
    }
    addr = UnknownWitnessAddress(bytes, hrp: bech32.hrp, version: version);
  } else {
    throw InvalidAddress();
  }

  addr._encodedCache = encoded;
  return addr;

}