From 3b9676f40eaf5360e16241d46ef1da6e11c14f41 Mon Sep 17 00:00:00 2001 From: sneurlax Date: Fri, 7 Jun 2024 15:56:57 -0500 Subject: [PATCH 1/2] add and use defaultFeeRate per ElectrumX coin --- lib/electrumx_rpc/electrumx_client.dart | 30 ++++++++++++------- .../crypto_currency/coins/bitcoin.dart | 4 +++ .../crypto_currency/coins/bitcoin_frost.dart | 3 ++ .../crypto_currency/coins/bitcoincash.dart | 3 ++ .../crypto_currency/coins/dogecoin.dart | 4 +++ lib/wallets/crypto_currency/coins/ecash.dart | 3 ++ lib/wallets/crypto_currency/coins/firo.dart | 3 ++ .../crypto_currency/coins/litecoin.dart | 3 ++ .../crypto_currency/coins/namecoin.dart | 3 ++ .../crypto_currency/coins/particl.dart | 3 ++ .../crypto_currency/coins/peercoin.dart | 3 ++ .../electrumx_currency_interface.dart | 3 ++ 12 files changed, 54 insertions(+), 11 deletions(-) diff --git a/lib/electrumx_rpc/electrumx_client.dart b/lib/electrumx_rpc/electrumx_client.dart index d0a470cd1..953939a80 100644 --- a/lib/electrumx_rpc/electrumx_client.dart +++ b/lib/electrumx_rpc/electrumx_client.dart @@ -10,6 +10,7 @@ import 'dart:async'; import 'dart:io'; +import 'dart:math'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:decimal/decimal.dart'; @@ -28,6 +29,7 @@ import '../services/tor_service.dart'; import '../utilities/logger.dart'; import '../utilities/prefs.dart'; import '../wallets/crypto_currency/crypto_currency.dart'; +import '../wallets/crypto_currency/interfaces/electrumx_currency_interface.dart'; import 'client_manager.dart'; class WifiOnlyException implements Exception {} @@ -1113,17 +1115,23 @@ class ElectrumXClient { ], ); try { - // If the response is -1 or null, return a temporary hardcoded value for - // Dogecoin. This is a temporary fix until the fee estimation is fixed. - if (cryptoCurrency is Dogecoin && - (response == null || - response == -1 || - Decimal.parse(response.toString()) == Decimal.parse("-1"))) { - // Return 0.05 for slow, 0.2 for average, and 1 for fast txs. - // These numbers produce tx fees in line with txs in the wild on - // https://dogechain.info/ - return Decimal.parse((1 / blocks).toString()); - // TODO [prio=med]: Fix fee estimation. + // If the response is -1 or null, fall back to the defaultFeeRate. + if (response == null || + response == -1 || + Decimal.parse(response.toString()) == Decimal.parse("-1")) { + if (CryptoCurrency is! BitcoinFrost) { + // TODO [prio=low]: Take `blocks` into account. + return Decimal.parse( + ((cryptoCurrency as ElectrumXCurrencyInterface).defaultFeeRate / + pow(10, cryptoCurrency.fractionDigits)) + .toString()); + } else { + // Use Bitcoin's default fee rate for Bitcoin Frost. + return Decimal.parse( + ((Bitcoin(CryptoCurrencyNetwork.main).defaultFeeRate / + pow(10, cryptoCurrency.fractionDigits)) + .toString())); + } } return Decimal.parse(response.toString()); } catch (e, s) { diff --git a/lib/wallets/crypto_currency/coins/bitcoin.dart b/lib/wallets/crypto_currency/coins/bitcoin.dart index ae1214e3e..3c08f98df 100644 --- a/lib/wallets/crypto_currency/coins/bitcoin.dart +++ b/lib/wallets/crypto_currency/coins/bitcoin.dart @@ -295,4 +295,8 @@ class Bitcoin extends Bip39HDCurrency @override int get transactionVersion => 1; + + @override + int get defaultFeeRate => 1000; + // https://github.com/bitcoin/bitcoin/blob/feab35189bc00bc4cf15e9dcb5cf6b34ff3a1e91/test/functional/mempool_limit.py#L259 } diff --git a/lib/wallets/crypto_currency/coins/bitcoin_frost.dart b/lib/wallets/crypto_currency/coins/bitcoin_frost.dart index 9fe8fcf69..386b3806b 100644 --- a/lib/wallets/crypto_currency/coins/bitcoin_frost.dart +++ b/lib/wallets/crypto_currency/coins/bitcoin_frost.dart @@ -201,4 +201,7 @@ class BitcoinFrost extends FrostCurrency { ); } } + + @override + int get defaultFeeRate => 1000; } diff --git a/lib/wallets/crypto_currency/coins/bitcoincash.dart b/lib/wallets/crypto_currency/coins/bitcoincash.dart index 99724e24b..aa8a65885 100644 --- a/lib/wallets/crypto_currency/coins/bitcoincash.dart +++ b/lib/wallets/crypto_currency/coins/bitcoincash.dart @@ -367,4 +367,7 @@ class Bitcoincash extends Bip39HDCurrency with ElectrumXCurrencyInterface { @override int get transactionVersion => 2; + + @override + int get defaultFeeRate => 1000; } diff --git a/lib/wallets/crypto_currency/coins/dogecoin.dart b/lib/wallets/crypto_currency/coins/dogecoin.dart index 2af03fab5..924b7e8d5 100644 --- a/lib/wallets/crypto_currency/coins/dogecoin.dart +++ b/lib/wallets/crypto_currency/coins/dogecoin.dart @@ -252,4 +252,8 @@ class Dogecoin extends Bip39HDCurrency with ElectrumXCurrencyInterface { @override int get transactionVersion => 1; + + @override + int get defaultFeeRate => 1000000; + // https://github.com/dogecoin/dogecoin/blob/master/doc/fee-recommendation.md } diff --git a/lib/wallets/crypto_currency/coins/ecash.dart b/lib/wallets/crypto_currency/coins/ecash.dart index 5f420ad55..0ecee375d 100644 --- a/lib/wallets/crypto_currency/coins/ecash.dart +++ b/lib/wallets/crypto_currency/coins/ecash.dart @@ -339,4 +339,7 @@ class Ecash extends Bip39HDCurrency with ElectrumXCurrencyInterface { @override int get transactionVersion => 2; + + @override + int get defaultFeeRate => 200; } diff --git a/lib/wallets/crypto_currency/coins/firo.dart b/lib/wallets/crypto_currency/coins/firo.dart index 530bf39e7..c050272a4 100644 --- a/lib/wallets/crypto_currency/coins/firo.dart +++ b/lib/wallets/crypto_currency/coins/firo.dart @@ -270,4 +270,7 @@ class Firo extends Bip39HDCurrency with ElectrumXCurrencyInterface { @override int get transactionVersion => 1; + + @override + int get defaultFeeRate => 1000; } diff --git a/lib/wallets/crypto_currency/coins/litecoin.dart b/lib/wallets/crypto_currency/coins/litecoin.dart index a859f9f64..343a387ab 100644 --- a/lib/wallets/crypto_currency/coins/litecoin.dart +++ b/lib/wallets/crypto_currency/coins/litecoin.dart @@ -283,4 +283,7 @@ class Litecoin extends Bip39HDCurrency with ElectrumXCurrencyInterface { @override int get transactionVersion => 1; + + @override + int get defaultFeeRate => 1000; } diff --git a/lib/wallets/crypto_currency/coins/namecoin.dart b/lib/wallets/crypto_currency/coins/namecoin.dart index 4bc2521bd..6de96fe2e 100644 --- a/lib/wallets/crypto_currency/coins/namecoin.dart +++ b/lib/wallets/crypto_currency/coins/namecoin.dart @@ -255,4 +255,7 @@ class Namecoin extends Bip39HDCurrency with ElectrumXCurrencyInterface { @override int get transactionVersion => 1; + + @override + int get defaultFeeRate => 1000; } diff --git a/lib/wallets/crypto_currency/coins/particl.dart b/lib/wallets/crypto_currency/coins/particl.dart index f250792cc..685c04739 100644 --- a/lib/wallets/crypto_currency/coins/particl.dart +++ b/lib/wallets/crypto_currency/coins/particl.dart @@ -233,4 +233,7 @@ class Particl extends Bip39HDCurrency with ElectrumXCurrencyInterface { @override int get transactionVersion => 1; + + @override + int get defaultFeeRate => 20000; } diff --git a/lib/wallets/crypto_currency/coins/peercoin.dart b/lib/wallets/crypto_currency/coins/peercoin.dart index dec4ab846..eb84c9c87 100644 --- a/lib/wallets/crypto_currency/coins/peercoin.dart +++ b/lib/wallets/crypto_currency/coins/peercoin.dart @@ -257,4 +257,7 @@ class Peercoin extends Bip39HDCurrency with ElectrumXCurrencyInterface { @override int get transactionVersion => 3; + + @override + int get defaultFeeRate => 5000; } diff --git a/lib/wallets/crypto_currency/interfaces/electrumx_currency_interface.dart b/lib/wallets/crypto_currency/interfaces/electrumx_currency_interface.dart index 30ddf7c70..8b8fa9a25 100644 --- a/lib/wallets/crypto_currency/interfaces/electrumx_currency_interface.dart +++ b/lib/wallets/crypto_currency/interfaces/electrumx_currency_interface.dart @@ -2,4 +2,7 @@ import '../intermediate/bip39_hd_currency.dart'; mixin ElectrumXCurrencyInterface on Bip39HDCurrency { int get transactionVersion; + + /// The default fee rate in satoshis per kilobyte. + int get defaultFeeRate; } From 713d8b0cde302b1d864052ace61850fb406613be Mon Sep 17 00:00:00 2001 From: sneurlax Date: Fri, 7 Jun 2024 17:04:42 -0500 Subject: [PATCH 2/2] use BigInt defaultFeeRate, BitcoinFrost's default, right cryptoCurrency --- lib/electrumx_rpc/electrumx_client.dart | 28 ++++++++++--------- .../crypto_currency/coins/bitcoin.dart | 2 +- .../crypto_currency/coins/bitcoin_frost.dart | 5 ++-- .../crypto_currency/coins/bitcoincash.dart | 2 +- .../crypto_currency/coins/dogecoin.dart | 2 +- lib/wallets/crypto_currency/coins/ecash.dart | 2 +- lib/wallets/crypto_currency/coins/firo.dart | 2 +- .../crypto_currency/coins/litecoin.dart | 2 +- .../crypto_currency/coins/namecoin.dart | 2 +- .../crypto_currency/coins/particl.dart | 2 +- .../crypto_currency/coins/peercoin.dart | 2 +- .../electrumx_currency_interface.dart | 2 +- 12 files changed, 28 insertions(+), 25 deletions(-) diff --git a/lib/electrumx_rpc/electrumx_client.dart b/lib/electrumx_rpc/electrumx_client.dart index 953939a80..bae7a3637 100644 --- a/lib/electrumx_rpc/electrumx_client.dart +++ b/lib/electrumx_rpc/electrumx_client.dart @@ -10,7 +10,6 @@ import 'dart:async'; import 'dart:io'; -import 'dart:math'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:decimal/decimal.dart'; @@ -26,6 +25,7 @@ import '../services/event_bus/events/global/tor_connection_status_changed_event. import '../services/event_bus/events/global/tor_status_changed_event.dart'; import '../services/event_bus/global_event_bus.dart'; import '../services/tor_service.dart'; +import '../utilities/amount/amount.dart'; import '../utilities/logger.dart'; import '../utilities/prefs.dart'; import '../wallets/crypto_currency/crypto_currency.dart'; @@ -1115,22 +1115,24 @@ class ElectrumXClient { ], ); try { - // If the response is -1 or null, fall back to the defaultFeeRate. if (response == null || response == -1 || Decimal.parse(response.toString()) == Decimal.parse("-1")) { - if (CryptoCurrency is! BitcoinFrost) { - // TODO [prio=low]: Take `blocks` into account. - return Decimal.parse( - ((cryptoCurrency as ElectrumXCurrencyInterface).defaultFeeRate / - pow(10, cryptoCurrency.fractionDigits)) - .toString()); + if (cryptoCurrency is BitcoinFrost) { + final rate = Amount( + rawValue: (cryptoCurrency as BitcoinFrost).defaultFeeRate, + fractionDigits: cryptoCurrency.fractionDigits, + ); + return rate.decimal; + } else if (cryptoCurrency is ElectrumXCurrencyInterface) { + final rate = Amount( + rawValue: + (cryptoCurrency as ElectrumXCurrencyInterface).defaultFeeRate, + fractionDigits: cryptoCurrency.fractionDigits, + ); + return rate.decimal; } else { - // Use Bitcoin's default fee rate for Bitcoin Frost. - return Decimal.parse( - ((Bitcoin(CryptoCurrencyNetwork.main).defaultFeeRate / - pow(10, cryptoCurrency.fractionDigits)) - .toString())); + throw Exception("Unexpected cryptoCurrency found!"); } } return Decimal.parse(response.toString()); diff --git a/lib/wallets/crypto_currency/coins/bitcoin.dart b/lib/wallets/crypto_currency/coins/bitcoin.dart index 3c08f98df..dd103c794 100644 --- a/lib/wallets/crypto_currency/coins/bitcoin.dart +++ b/lib/wallets/crypto_currency/coins/bitcoin.dart @@ -297,6 +297,6 @@ class Bitcoin extends Bip39HDCurrency int get transactionVersion => 1; @override - int get defaultFeeRate => 1000; + BigInt get defaultFeeRate => BigInt.from(1000); // https://github.com/bitcoin/bitcoin/blob/feab35189bc00bc4cf15e9dcb5cf6b34ff3a1e91/test/functional/mempool_limit.py#L259 } diff --git a/lib/wallets/crypto_currency/coins/bitcoin_frost.dart b/lib/wallets/crypto_currency/coins/bitcoin_frost.dart index 386b3806b..a5f02ac08 100644 --- a/lib/wallets/crypto_currency/coins/bitcoin_frost.dart +++ b/lib/wallets/crypto_currency/coins/bitcoin_frost.dart @@ -202,6 +202,7 @@ class BitcoinFrost extends FrostCurrency { } } - @override - int get defaultFeeRate => 1000; + // @override + BigInt get defaultFeeRate => BigInt.from(1000); + // https://github.com/bitcoin/bitcoin/blob/feab35189bc00bc4cf15e9dcb5cf6b34ff3a1e91/test/functional/mempool_limit.py#L259 } diff --git a/lib/wallets/crypto_currency/coins/bitcoincash.dart b/lib/wallets/crypto_currency/coins/bitcoincash.dart index aa8a65885..e06578ac6 100644 --- a/lib/wallets/crypto_currency/coins/bitcoincash.dart +++ b/lib/wallets/crypto_currency/coins/bitcoincash.dart @@ -369,5 +369,5 @@ class Bitcoincash extends Bip39HDCurrency with ElectrumXCurrencyInterface { int get transactionVersion => 2; @override - int get defaultFeeRate => 1000; + BigInt get defaultFeeRate => BigInt.from(1000); } diff --git a/lib/wallets/crypto_currency/coins/dogecoin.dart b/lib/wallets/crypto_currency/coins/dogecoin.dart index 924b7e8d5..461d70d95 100644 --- a/lib/wallets/crypto_currency/coins/dogecoin.dart +++ b/lib/wallets/crypto_currency/coins/dogecoin.dart @@ -254,6 +254,6 @@ class Dogecoin extends Bip39HDCurrency with ElectrumXCurrencyInterface { int get transactionVersion => 1; @override - int get defaultFeeRate => 1000000; + BigInt get defaultFeeRate => BigInt.from(1000000); // https://github.com/dogecoin/dogecoin/blob/master/doc/fee-recommendation.md } diff --git a/lib/wallets/crypto_currency/coins/ecash.dart b/lib/wallets/crypto_currency/coins/ecash.dart index 0ecee375d..533ed3747 100644 --- a/lib/wallets/crypto_currency/coins/ecash.dart +++ b/lib/wallets/crypto_currency/coins/ecash.dart @@ -341,5 +341,5 @@ class Ecash extends Bip39HDCurrency with ElectrumXCurrencyInterface { int get transactionVersion => 2; @override - int get defaultFeeRate => 200; + BigInt get defaultFeeRate => BigInt.from(200); } diff --git a/lib/wallets/crypto_currency/coins/firo.dart b/lib/wallets/crypto_currency/coins/firo.dart index c050272a4..47ee606c4 100644 --- a/lib/wallets/crypto_currency/coins/firo.dart +++ b/lib/wallets/crypto_currency/coins/firo.dart @@ -272,5 +272,5 @@ class Firo extends Bip39HDCurrency with ElectrumXCurrencyInterface { int get transactionVersion => 1; @override - int get defaultFeeRate => 1000; + BigInt get defaultFeeRate => BigInt.from(1000); } diff --git a/lib/wallets/crypto_currency/coins/litecoin.dart b/lib/wallets/crypto_currency/coins/litecoin.dart index 343a387ab..7cf53837a 100644 --- a/lib/wallets/crypto_currency/coins/litecoin.dart +++ b/lib/wallets/crypto_currency/coins/litecoin.dart @@ -285,5 +285,5 @@ class Litecoin extends Bip39HDCurrency with ElectrumXCurrencyInterface { int get transactionVersion => 1; @override - int get defaultFeeRate => 1000; + BigInt get defaultFeeRate => BigInt.from(1000); } diff --git a/lib/wallets/crypto_currency/coins/namecoin.dart b/lib/wallets/crypto_currency/coins/namecoin.dart index 6de96fe2e..bae72281f 100644 --- a/lib/wallets/crypto_currency/coins/namecoin.dart +++ b/lib/wallets/crypto_currency/coins/namecoin.dart @@ -257,5 +257,5 @@ class Namecoin extends Bip39HDCurrency with ElectrumXCurrencyInterface { int get transactionVersion => 1; @override - int get defaultFeeRate => 1000; + BigInt get defaultFeeRate => BigInt.from(1000); } diff --git a/lib/wallets/crypto_currency/coins/particl.dart b/lib/wallets/crypto_currency/coins/particl.dart index 685c04739..fd1aa946f 100644 --- a/lib/wallets/crypto_currency/coins/particl.dart +++ b/lib/wallets/crypto_currency/coins/particl.dart @@ -235,5 +235,5 @@ class Particl extends Bip39HDCurrency with ElectrumXCurrencyInterface { int get transactionVersion => 1; @override - int get defaultFeeRate => 20000; + BigInt get defaultFeeRate => BigInt.from(20000); } diff --git a/lib/wallets/crypto_currency/coins/peercoin.dart b/lib/wallets/crypto_currency/coins/peercoin.dart index eb84c9c87..a199460e7 100644 --- a/lib/wallets/crypto_currency/coins/peercoin.dart +++ b/lib/wallets/crypto_currency/coins/peercoin.dart @@ -259,5 +259,5 @@ class Peercoin extends Bip39HDCurrency with ElectrumXCurrencyInterface { int get transactionVersion => 3; @override - int get defaultFeeRate => 5000; + BigInt get defaultFeeRate => BigInt.from(5000); } diff --git a/lib/wallets/crypto_currency/interfaces/electrumx_currency_interface.dart b/lib/wallets/crypto_currency/interfaces/electrumx_currency_interface.dart index 8b8fa9a25..387bf4454 100644 --- a/lib/wallets/crypto_currency/interfaces/electrumx_currency_interface.dart +++ b/lib/wallets/crypto_currency/interfaces/electrumx_currency_interface.dart @@ -4,5 +4,5 @@ mixin ElectrumXCurrencyInterface on Bip39HDCurrency { int get transactionVersion; /// The default fee rate in satoshis per kilobyte. - int get defaultFeeRate; + BigInt get defaultFeeRate; }