encodeUnifiedObject static method

String encodeUnifiedObject({
  1. List<int>? addressBytes,
  2. List<ZUnifiedReceiver>? receivers,
  3. required String hrp,
  4. required UnifiedReceiverMode mode,
})

Implementation

static String encodeUnifiedObject({
  List<int>? addressBytes,
  List<ZUnifiedReceiver>? receivers,
  required String hrp,
  required UnifiedReceiverMode mode,
}) {
  final hrpBytes = StringUtils.encode(hrp);
  const int paddingLen = unifiedAddressPaddingLength;
  if (hrpBytes.length > paddingLen) {
    throw ZCashKeyEncodingError.invalidUnifiedArguments(
      mode,
      reason: "Invalid HRP.",
    );
  }
  if (addressBytes == null && receivers == null) {
    throw ZCashKeyEncodingError.invalidUnifiedArguments(
      mode,
      reason: "Missing unified address receivers.",
    );
  }
  try {
    final layout = _unifiedCodecLayout();
    if (receivers == null) {
      final json = layout.deserialize(addressBytes!).value;
      receivers =
          json.map((e) => ZUnifiedReceiver.deserializeJson(e, mode)).toList();
    }
    receivers = validateUnifiedObjects(receivers: receivers, mode: mode);
    addressBytes = layout.serialize(
      receivers.map((e) => e.toSerializeVariantJson()).toList(),
    );
    final pad = List<int>.filled(paddingLen, 0)..setAll(0, hrpBytes);
    final jubmed = F4Jumble.apply([...addressBytes, ...pad]);
    return Bech32Encoder.encode(
      hrp,
      jubmed,
      encoding: Bech32Encodings.bech32m,
    );
  } catch (_) {
    throw ZCashKeyEncodingError.invalidUnifiedBytes(
      mode,
      reason: "Invalid unified address bytes.",
    );
  }
}