decodeCashAddress function
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),
);
}