electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit fd5d1dab4f4aed84b6cfacc3a2ee845f7bb9a91b
parent cb69aa80f7f9751ee5ed4699f93e4b00f8c59b10
Author: SomberNight <somber.night@protonmail.com>
Date:   Thu, 20 Jun 2019 22:46:22 +0200

coinchooser: clear up what "fee_estimator" expects

Diffstat:
Melectrum/coinchooser.py | 26+++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/electrum/coinchooser.py b/electrum/coinchooser.py @@ -111,14 +111,14 @@ class CoinChooserBase(Logger): def keys(self, coins): raise NotImplementedError - def bucketize_coins(self, coins, *, fee_estimator): + def bucketize_coins(self, coins, *, fee_estimator_vb): keys = self.keys(coins) buckets = defaultdict(list) for key, coin in zip(keys, coins): buckets[key].append(coin) # fee_estimator returns fee to be paid, for given vbytes. # guess whether it is just returning a constant as follows. - constant_fee = fee_estimator(2000) == fee_estimator(200) + constant_fee = fee_estimator_vb(2000) == fee_estimator_vb(200) def make_Bucket(desc, coins): witness = any(Transaction.is_segwit_input(coin, guess_for_address=True) for coin in coins) @@ -136,7 +136,7 @@ class CoinChooserBase(Logger): else: # when converting from weight to vBytes, instead of rounding up, # keep fractional part, to avoid overestimating fee - fee = fee_estimator(Decimal(weight) / 4) + fee = fee_estimator_vb(Decimal(weight) / 4) effective_value = value - fee return Bucket(desc=desc, weight=weight, @@ -151,7 +151,7 @@ class CoinChooserBase(Logger): def penalty_func(self, base_tx, *, tx_from_buckets) -> Callable[[List[Bucket]], ScoredCandidate]: raise NotImplementedError - def _change_amounts(self, tx, count, fee_estimator): + def _change_amounts(self, tx, count, fee_estimator_numchange): # Break change up if bigger than max_change output_amounts = [o.value for o in tx.outputs()] # Don't split change of less than 0.02 BTC @@ -160,7 +160,7 @@ class CoinChooserBase(Logger): # Use N change outputs for n in range(1, count + 1): # How much is left if we add this many change outputs? - change_amount = max(0, tx.get_fee() - fee_estimator(n)) + change_amount = max(0, tx.get_fee() - fee_estimator_numchange(n)) if change_amount // n <= max_change: break @@ -205,8 +205,8 @@ class CoinChooserBase(Logger): return amounts - def _change_outputs(self, tx, change_addrs, fee_estimator, dust_threshold): - amounts = self._change_amounts(tx, len(change_addrs), fee_estimator) + def _change_outputs(self, tx, change_addrs, fee_estimator_numchange, dust_threshold): + amounts = self._change_amounts(tx, len(change_addrs), fee_estimator_numchange) assert min(amounts) >= 0 assert len(change_addrs) >= len(amounts) # If change is above dust threshold after accounting for the @@ -233,8 +233,8 @@ class CoinChooserBase(Logger): # This takes a count of change outputs and returns a tx fee output_weight = 4 * Transaction.estimated_output_size(change_addrs[0]) - fee = lambda count: fee_estimator_w(tx_weight + count * output_weight) - change = self._change_outputs(tx, change_addrs, fee, dust_threshold) + fee_estimator_numchange = lambda count: fee_estimator_w(tx_weight + count * output_weight) + change = self._change_outputs(tx, change_addrs, fee_estimator_numchange, dust_threshold) tx.add_outputs(change) return tx, change @@ -259,14 +259,14 @@ class CoinChooserBase(Logger): return total_weight - def make_tx(self, coins, inputs, outputs, change_addrs, fee_estimator, + def make_tx(self, coins, inputs, outputs, change_addrs, fee_estimator_vb, dust_threshold): """Select unspent coins to spend to pay outputs. If the change is greater than dust_threshold (after adding the change output to the transaction) it is kept, otherwise none is sent and it is added to the transaction fee. - Note: fee_estimator expects virtual bytes + Note: fee_estimator_vb expects virtual bytes """ # Deterministic randomness from coins @@ -286,7 +286,7 @@ class CoinChooserBase(Logger): spent_amount = base_tx.output_value() def fee_estimator_w(weight): - return fee_estimator(Transaction.virtual_size_from_weight(weight)) + return fee_estimator_vb(Transaction.virtual_size_from_weight(weight)) def sufficient_funds(buckets, *, bucket_value_sum): '''Given a list of buckets, return True if it has enough @@ -309,7 +309,7 @@ class CoinChooserBase(Logger): base_weight=base_weight) # Collect the coins into buckets - all_buckets = self.bucketize_coins(coins, fee_estimator=fee_estimator) + all_buckets = self.bucketize_coins(coins, fee_estimator_vb=fee_estimator_vb) # Filter some buckets out. Only keep those that have positive effective value. # Note that this filtering is intentionally done on the bucket level # instead of per-coin, as each bucket should be either fully spent or not at all.