accumulativeAlgorithm function

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

Implementation

SelectionModel accumulativeAlgorithm(
    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);

  for (var i = 0; i < utxos.length; ++i) {
    var utxo = utxos[i];
    var utxoBytes = utils.inputBytes(utxo);
    var utxoFee = feeRate * utxoBytes;

    // skip detrimental input
    if (utxo.value != null && utxoFee > utxo.value!) {
      if (i == utxos.length - 1) {
        return SelectionModel(feeRate * (bytesAccum + utxoBytes));
      }
      continue;
    }

    bytesAccum += utxoBytes;
    inAccum += utxo.value!;
    inputs.add(utxo);

    int fee = feeRate * bytesAccum;

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

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

  return SelectionModel(feeRate * bytesAccum);
}