Periodically poll fee estimates from server.
This commit is contained in:
parent
77eb62b4cb
commit
f80d8b02ca
|
@ -314,12 +314,16 @@ class Network(util.DaemonThread):
|
||||||
self.queue_request('server.banner', [])
|
self.queue_request('server.banner', [])
|
||||||
self.queue_request('server.donation_address', [])
|
self.queue_request('server.donation_address', [])
|
||||||
self.queue_request('server.peers.subscribe', [])
|
self.queue_request('server.peers.subscribe', [])
|
||||||
for i in bitcoin.FEE_TARGETS:
|
self.request_fee_estimates()
|
||||||
self.queue_request('blockchain.estimatefee', [i])
|
|
||||||
self.queue_request('blockchain.relayfee', [])
|
self.queue_request('blockchain.relayfee', [])
|
||||||
for h in self.subscribed_addresses:
|
for h in self.subscribed_addresses:
|
||||||
self.queue_request('blockchain.scripthash.subscribe', [h])
|
self.queue_request('blockchain.scripthash.subscribe', [h])
|
||||||
|
|
||||||
|
def request_fee_estimates(self):
|
||||||
|
self.config.requested_fee_estimates()
|
||||||
|
for i in bitcoin.FEE_TARGETS:
|
||||||
|
self.queue_request('blockchain.estimatefee', [i])
|
||||||
|
|
||||||
def get_status_value(self, key):
|
def get_status_value(self, key):
|
||||||
if key == 'status':
|
if key == 'status':
|
||||||
value = self.connection_status
|
value = self.connection_status
|
||||||
|
@ -542,7 +546,7 @@ class Network(util.DaemonThread):
|
||||||
if error is None and result > 0:
|
if error is None and result > 0:
|
||||||
i = params[0]
|
i = params[0]
|
||||||
fee = int(result*COIN)
|
fee = int(result*COIN)
|
||||||
self.config.fee_estimates[i] = fee
|
self.config.update_fee_estimates(i, fee)
|
||||||
self.print_error("fee_estimates[%d]" % i, fee)
|
self.print_error("fee_estimates[%d]" % i, fee)
|
||||||
self.notify('fee')
|
self.notify('fee')
|
||||||
elif method == 'blockchain.relayfee':
|
elif method == 'blockchain.relayfee':
|
||||||
|
@ -746,6 +750,9 @@ class Network(util.DaemonThread):
|
||||||
self.server_retry_time = now
|
self.server_retry_time = now
|
||||||
else:
|
else:
|
||||||
self.switch_to_interface(self.default_server)
|
self.switch_to_interface(self.default_server)
|
||||||
|
else:
|
||||||
|
if self.config.is_fee_estimates_update_required():
|
||||||
|
self.request_fee_estimates()
|
||||||
|
|
||||||
def request_chunk(self, interface, idx):
|
def request_chunk(self, interface, idx):
|
||||||
interface.print_error("requesting chunk %d" % idx)
|
interface.print_error("requesting chunk %d" % idx)
|
||||||
|
|
|
@ -6,6 +6,7 @@ from __future__ import unicode_literals
|
||||||
import ast
|
import ast
|
||||||
import json
|
import json
|
||||||
import threading
|
import threading
|
||||||
|
import time
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
@ -48,6 +49,8 @@ class SimpleConfig(PrintError):
|
||||||
self.lock = threading.RLock()
|
self.lock = threading.RLock()
|
||||||
|
|
||||||
self.fee_estimates = {}
|
self.fee_estimates = {}
|
||||||
|
self.fee_estimates_last_updated = {}
|
||||||
|
self.last_time_fee_estimates_requested = 0 # zero ensures immediate fees
|
||||||
|
|
||||||
# The following two functions are there for dependency injection when
|
# The following two functions are there for dependency injection when
|
||||||
# testing.
|
# testing.
|
||||||
|
@ -243,6 +246,24 @@ class SimpleConfig(PrintError):
|
||||||
fee_rate = self.get('fee_per_kb', self.max_fee_rate()/2)
|
fee_rate = self.get('fee_per_kb', self.max_fee_rate()/2)
|
||||||
return fee_rate
|
return fee_rate
|
||||||
|
|
||||||
|
def update_fee_estimates(self, key, value):
|
||||||
|
self.fee_estimates[key] = value
|
||||||
|
self.fee_estimates_last_updated[key] = time.time()
|
||||||
|
|
||||||
|
def is_fee_estimates_update_required(self):
|
||||||
|
"""Checks time since last requested and updated fee estimates.
|
||||||
|
Returns True if an update should be requested.
|
||||||
|
"""
|
||||||
|
now = time.time()
|
||||||
|
prev_updates = self.fee_estimates_last_updated.values()
|
||||||
|
oldest_fee_time = min(prev_updates) if prev_updates else 0
|
||||||
|
stale_fees = now - oldest_fee_time > 7200
|
||||||
|
old_request = now - self.last_time_fee_estimates_requested > 60
|
||||||
|
return stale_fees and old_request
|
||||||
|
|
||||||
|
def requested_fee_estimates(self):
|
||||||
|
self.last_time_fee_estimates_requested = time.time()
|
||||||
|
|
||||||
def get_video_device(self):
|
def get_video_device(self):
|
||||||
device = self.get("video_device", "default")
|
device = self.get("video_device", "default")
|
||||||
if device == 'default':
|
if device == 'default':
|
||||||
|
|
Loading…
Reference in New Issue