validateUnifiedObjects static method
List<ZUnifiedReceiver>
validateUnifiedObjects({
- required List<
ZUnifiedReceiver> receivers, - required UnifiedReceiverMode mode,
Implementation
static List<ZUnifiedReceiver> validateUnifiedObjects({
required List<ZUnifiedReceiver> receivers,
required UnifiedReceiverMode mode,
}) {
if (receivers.isEmpty) {
throw ZCashKeyEncodingError.invalidUnifiedArguments(
mode,
reason: "Empty receivers.",
);
}
final types = receivers.map((e) => e.type).toList();
List<Typecode> allowedTypeCode = [
Typecode.sapling,
Typecode.orchard,
Typecode.p2pkh,
if (mode != UnifiedReceiverMode.sk) Typecode.unknown,
if (mode == UnifiedReceiverMode.address) Typecode.p2sh,
];
if (types.any(
(e) =>
!allowedTypeCode.contains(e) || receivers.any((e) => e.mode != mode),
)) {
throw ZCashKeyEncodingError.invalidUnifiedArguments(
mode,
reason: "Receivers contains invalid type code.",
);
}
if (mode == UnifiedReceiverMode.sk &&
receivers.length != allowedTypeCode.length) {
throw ZCashKeyEncodingError.invalidUnifiedArguments(
mode,
reason: "Missing some USK type code.",
);
}
if (receivers.toSet().length != receivers.length) {
throw ZCashKeyEncodingError.invalidUnifiedArguments(
mode,
reason: "Duplicate receivers.",
);
}
if (mode == UnifiedReceiverMode.address) {
if (types.contains(Typecode.p2pkh) && types.contains(Typecode.p2sh)) {
throw ZCashKeyEncodingError.invalidUnifiedArguments(
mode,
reason: "Unified address contains both P2PKH and P2SH receivers.",
);
}
}
return receivers.clone()..sort((a, b) => a.compareTo(b));
}