blackjackAlgorithm function

SelectionModel blackjackAlgorithm(
  1. List<InputModel> utxos,
  2. List<OutputModel> outputs,
  3. int feeRate
)

Implementation

SelectionModel blackjackAlgorithm(
    List<InputModel> utxos, List<OutputModel> outputs, int feeRate) {
  int bytesAccum = utils.transactionBytes(<InputModel>[], outputs);

  int inAccum = 0;
  List<InputModel> inputs = [];
  final int? outAccum = utils.sumOrNull(outputs);
  final threshold = utils.dustThreshold(/*OutputModel(), */ feeRate);

  for (var i = 0; i < utxos.length; ++i) {
    var input = utxos[i];
    var inputBytes = utils.inputBytes(input);
    var fee = feeRate * (bytesAccum + inputBytes);

    // would it waste value?
    if (input.value != null && outAccum != null) {
      if ((inAccum + input.value!) > (outAccum + fee + threshold)) {
        continue;
      }
    }

    bytesAccum += inputBytes;
    inAccum += input.value!;
    inputs.add(input);

    // go again?
    if (outAccum != null && inAccum < outAccum + fee) {
      continue;
    }

    return utils.finalize(inputs, outputs, feeRate);
  }

  return SelectionModel(feeRate * bytesAccum);
}