validateCashAddress static method
Implementation
static bool validateCashAddress(String address, String prefix) {
try {
if (address.toLowerCase() != address &&
address.toUpperCase() != address) {
return false;
}
final normalizedAddress = address.toLowerCase();
final normalizedPrefix = prefix.toLowerCase();
final parts = normalizedAddress.split(':');
if (parts.length != 2 ||
parts[0] != normalizedPrefix ||
parts[1].isEmpty) {
return false;
}
final payload = base32Decode(parts[1]);
if (payload.length <= 8 || payload.any((value) => value < 0)) {
return false;
}
final checksumData = prefixToUint5Array(normalizedPrefix) + [0] + payload;
if (polymod(checksumData) != BigInt.zero) {
return false;
}
final payloadData = payload.sublist(0, payload.length - 8);
final decoded = convertBits(payloadData, 5, 8, strictMode: true);
if (decoded.isEmpty ||
convertBits(decoded, 8, 5).join(',') != payloadData.join(',')) {
return false;
}
final version = decoded.first;
if ((version & 0x80) != 0 ||
(version & 0x78) != 0 && (version & 0x78) != 8) {
return false;
}
const hashSizes = [20, 24, 28, 32, 40, 48, 56, 64];
return decoded.length - 1 == hashSizes[version & 0x07];
} catch (_) {
return false;
}
}