diff --git a/jmclient/jmclient/blockchaininterface.py b/jmclient/jmclient/blockchaininterface.py index 5ac5f98..02a16fe 100644 --- a/jmclient/jmclient/blockchaininterface.py +++ b/jmclient/jmclient/blockchaininterface.py @@ -306,7 +306,8 @@ class ElectrumWalletInterface(BlockchainInterface): #pragma: no cover def estimate_fee_per_kb(self, N): if super(ElectrumWalletInterface, self).fee_per_kb_has_been_manually_set(N): - return int(random.uniform(N * float(0.8), N * float(1.2))) + # use a floor of 1000 to not run into node relay problems + return int(max(1000, random.uniform(N * float(0.8), N * float(1.2)))) fee = self.wallet.network.synchronous_get(('blockchain.estimatefee', [N] )) log.debug("Got fee: " + str(fee)) @@ -872,7 +873,17 @@ class BitcoinCoreInterface(BlockchainInterface): def estimate_fee_per_kb(self, N): if super(BitcoinCoreInterface, self).fee_per_kb_has_been_manually_set(N): - return int(random.uniform(N * float(0.8), N * float(1.2))) + # use the local bitcoin core relay fee as floor to avoid relay problems + btc_relayfee = -1 + rpc_result = self.rpc('getnetworkinfo', None) + btc_relayfee = rpc_result.get('relayfee', btc_relayfee) + if btc_relayfee > 0: + relayfee_in_sat = int(Decimal(1e8) * Decimal(btc_relayfee)) + log.debug("Using this min relay fee as tx fee floor: " + str(relayfee_in_sat)) + return int(max(relayfee_in_sat, random.uniform(N * float(0.8), N * float(1.2)))) + else: # cannot get valid relayfee: fall back to 1000 sat/kbyte + log.debug("Using this min relay fee as tx fee floor (fallback): 1000") + return int(max(1000, random.uniform(N * float(0.8), N * float(1.2)))) # Special bitcoin core case: sometimes the highest priority # cannot be estimated in that case the 2nd highest priority