commit b8ab36546dad3b0774222b1f2e0bf61628c0d490
parent f8ee20322551575c3f969d4b00dfb3c441ac1b3f
Author: SomberNight <somber.night@protonmail.com>
Date: Sat, 14 Jul 2018 18:45:02 +0200
mempool fees: increase estimate by max precision of histogram
related: #4551
Diffstat:
2 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/electrum/simple_config.py b/electrum/simple_config.py
@@ -5,6 +5,7 @@ import os
import stat
from decimal import Decimal
from typing import Union
+from numbers import Real
from copy import deepcopy
@@ -310,7 +311,11 @@ class SimpleConfig(PrintError):
fee = int(fee)
return fee
- def fee_to_depth(self, target_fee):
+ def fee_to_depth(self, target_fee: Real) -> int:
+ """For a given sat/vbyte fee, returns an estimate of how deep
+ it would be in the current mempool in vbytes.
+ Pessimistic == overestimates the depth.
+ """
depth = 0
for fee, s in self.mempool_fees:
depth += s
@@ -320,10 +325,16 @@ class SimpleConfig(PrintError):
return 0
return depth
- @impose_hard_limits_on_fee
def depth_to_fee(self, slider_pos) -> int:
"""Returns fee in sat/kbyte."""
target = self.depth_target(slider_pos)
+ return self.depth_target_to_fee(target)
+
+ @impose_hard_limits_on_fee
+ def depth_target_to_fee(self, target: int) -> int:
+ """Returns fee in sat/kbyte.
+ target: desired mempool depth in sat/vbyte
+ """
depth = 0
for fee, s in self.mempool_fees:
depth += s
@@ -331,6 +342,10 @@ class SimpleConfig(PrintError):
break
else:
return 0
+ # add one sat/byte as currently that is
+ # the max precision of the histogram
+ fee += 1
+ # convert to sat/kbyte
return fee * 1000
def depth_target(self, slider_pos):
diff --git a/electrum/tests/test_simple_config.py b/electrum/tests/test_simple_config.py
@@ -110,6 +110,42 @@ class Test_SimpleConfig(SequentialTestCase):
result.pop('config_version', None)
self.assertEqual({"something": "a"}, result)
+ def test_depth_target_to_fee(self):
+ config = SimpleConfig({})
+ config.mempool_fees = [[49, 100110], [10, 121301], [6, 153731], [5, 125872], [1, 36488810]]
+ self.assertEqual( 2 * 1000, config.depth_target_to_fee(1000000))
+ self.assertEqual( 6 * 1000, config.depth_target_to_fee( 500000))
+ self.assertEqual( 7 * 1000, config.depth_target_to_fee( 250000))
+ self.assertEqual(11 * 1000, config.depth_target_to_fee( 200000))
+ self.assertEqual(50 * 1000, config.depth_target_to_fee( 100000))
+ config.mempool_fees = []
+ self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 5))
+ self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 6))
+ self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 7))
+ config.mempool_fees = [[1, 36488810]]
+ self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 5))
+ self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 6))
+ self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 7))
+ self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 8))
+ config.mempool_fees = [[5, 125872], [1, 36488810]]
+ self.assertEqual( 6 * 1000, config.depth_target_to_fee(10 ** 5))
+ self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 6))
+ self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 7))
+ self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 8))
+
+ def test_fee_to_depth(self):
+ config = SimpleConfig({})
+ config.mempool_fees = [[49, 100000], [10, 120000], [6, 150000], [5, 125000], [1, 36000000]]
+ self.assertEqual(100000, config.fee_to_depth(500))
+ self.assertEqual(100000, config.fee_to_depth(50))
+ self.assertEqual(100000, config.fee_to_depth(49))
+ self.assertEqual(220000, config.fee_to_depth(48))
+ self.assertEqual(220000, config.fee_to_depth(10))
+ self.assertEqual(370000, config.fee_to_depth(9))
+ self.assertEqual(370000, config.fee_to_depth(6.5))
+ self.assertEqual(370000, config.fee_to_depth(6))
+ self.assertEqual(495000, config.fee_to_depth(5.5))
+
class TestUserConfig(SequentialTestCase):