decodeCashAddress function

DecodedAddress decodeCashAddress(
  1. String address
)

Decodes the given address into its constituting prefix, type and hash.

address Address to decode. E.g.: 'ecash:qpm2qsznhks23z7629mms6s4cwef74vcwva87rkuu2'. Throws ValidationError

Implementation

DecodedAddress decodeCashAddress(String address) {
  validate(_hasSingleCase(address), 'Invalid address: $address.');
  final List<String> pieces = address.toLowerCase().split(':');
  // if there is no prefix, it might still be valid
  late String prefix;
  late Uint8List payload;
  if (pieces.length == 1) {
    // Check and see if it has a valid checksum for accepted prefixes
    bool hasValidChecksum = false;
    for (int i = 0; i < validPrefixes.length; i += 1) {
      final String testedPrefix = validPrefixes[i];
      final Uint8List prefixlessPayload = base32.decode(pieces[0]);
      hasValidChecksum = _validChecksum(testedPrefix, prefixlessPayload);
      if (hasValidChecksum) {
        // Here's your prefix
        prefix = testedPrefix;
        payload = prefixlessPayload;
        // Stop testing other prefixes
        break;
      }
    }
    validate(
      hasValidChecksum,
      'Prefixless address $address does not have valid checksum for any valid prefix (${validPrefixes.join(', ')})',
    );
  } else {
    validate(pieces.length == 2, 'Invalid address: $address.');
    prefix = pieces[0];
    payload = base32.decode(pieces[1]);
    validate(_validChecksum(prefix, payload), 'Invalid checksum: $address.');
  }

  final Uint8List payloadData = _fromUint5Array(
    payload.sublist(0, payload.length - 8),
  );
  final int versionByte = payloadData[0];
  final Uint8List hash = payloadData.sublist(1);
  validate(
    _getHashSize(versionByte) == hash.length * 8,
    'Invalid hash size: $address.',
  );
  final AddressType type = _getType(versionByte);
  return DecodedAddress(
    prefix: prefix,
    type: type,
    hash: _uint8arrayToHexString(hash),
  );
}