createTransactionMultDestSync function

PendingTransactionDescription createTransactionMultDestSync({
  1. required List<MoneroOutput> outputs,
  2. required String paymentId,
  3. required int priorityRaw,
  4. int accountIndex = 0,
})

Implementation

PendingTransactionDescription createTransactionMultDestSync(
    {required List<MoneroOutput> outputs,
    required String paymentId,
    required int priorityRaw,
    int accountIndex = 0}) {
  final int size = outputs.length;
  final List<Pointer<Char>> addressesPointers = outputs
      .map((output) => output.address.toNativeUtf8().cast<Char>())
      .toList();
  final Pointer<Pointer<Char>> addressesPointerPointer = calloc(size);
  final List<Pointer<Char>> amountsPointers = outputs
      .map((output) => output.amount.toNativeUtf8().cast<Char>())
      .toList();
  final Pointer<Pointer<Char>> amountsPointerPointer = calloc(size);

  for (int i = 0; i < size; i++) {
    addressesPointerPointer[i] = addressesPointers[i];
    amountsPointerPointer[i] = amountsPointers[i];
  }

  final paymentIdPointer = paymentId.toNativeUtf8().cast<Char>();
  final pendingTransactionPointer = calloc<ExternPendingTransactionRaw>();
  final errorBoxPointer = monero_flutter.buildErrorBoxPointer();

  monero_flutter.bindings.transaction_create_mult_dest(
      addressesPointerPointer,
      paymentIdPointer,
      amountsPointerPointer,
      size,
      priorityRaw,
      accountIndex,
      pendingTransactionPointer,
      errorBoxPointer);

  final errorInfo = monero_flutter.extractErrorInfo(errorBoxPointer);

  for (var element in addressesPointers) {
    calloc.free(element);
  }
  for (var element in amountsPointers) {
    calloc.free(element);
  }

  calloc.free(addressesPointerPointer);
  calloc.free(amountsPointerPointer);

  calloc.free(paymentIdPointer);

  if (0 != errorInfo.code) {
    calloc.free(pendingTransactionPointer);

    throw CreationTransactionException(message: errorInfo.getErrorMessage());
  }

  final pendingTransactionDescription = PendingTransactionDescription(
      amount: pendingTransactionPointer.ref.amount,
      fee: pendingTransactionPointer.ref.fee,
      hash: pendingTransactionPointer.ref.hash.cast<Utf8>().toDartString(),
      hex: pendingTransactionPointer.ref.hex.cast<Utf8>().toDartString(),
      txKey: pendingTransactionPointer.ref.tx_key.cast<Utf8>().toDartString(),
      multisigSignData: pendingTransactionPointer.ref.multisig_sign_data
          .cast<Utf8>()
          .toDartString(),
      pointerAddress: pendingTransactionPointer.address);

  return pendingTransactionDescription;
}