Bech32Address.fromString constructor
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;
}