Source code for coinselectpy.split
from functools import reduce
from decimal import Decimal
from . import utils
import math
[docs]def split(utxos, outputs, feeRate):
feeRate = Decimal(feeRate)
bytesAccum = utils.transactionBytes(utxos, outputs)
fee = round(feeRate * bytesAccum)
if not outputs:
return {'fee': fee}
inAccum = utils.sumOrNaN(utxos)
outAccum = utils.sumForgiving(outputs)
remaining = inAccum - outAccum - fee
if remaining < 0:
return {'fee': fee}
elif remaining == 0:
return utils.finalize(utxos, outputs, feeRate)
splitOutputsCount = reduce(
lambda a, x: a + (1 if 'value' not in x else 0),
outputs,
0)
splitValue = math.floor(remaining / splitOutputsCount)
# ensure every output is either user defined, or over the threshold
if any([x for x in outputs
if utils.dustThreshold(x, feeRate) >= splitValue]):
return {'fee': fee}
# assign splitValue to outputs not user defined
outputs = [x if 'value' in x else dict(value=splitValue, **x)
for x in outputs]
return utils.finalize(utxos, outputs, feeRate)