validateCashAddress static method

bool validateCashAddress(
  1. String address,
  2. String prefix
)

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;
  }
}