validateUnifiedObjects static method

List<ZUnifiedReceiver> validateUnifiedObjects({
  1. required List<ZUnifiedReceiver> receivers,
  2. 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));
}