From 516a916b9d724b6ac7d98a430e2844dc2b9311f2 Mon Sep 17 00:00:00 2001 From: likho Date: Fri, 31 Mar 2023 20:27:27 +0200 Subject: [PATCH] Fix Epiccash sendAll not enough funds error --- .../coins/epiccash/epiccash_wallet.dart | 101 +++++++++++++----- 1 file changed, 76 insertions(+), 25 deletions(-) diff --git a/lib/services/coins/epiccash/epiccash_wallet.dart b/lib/services/coins/epiccash/epiccash_wallet.dart index 4574d0019..0504595ee 100644 --- a/lib/services/coins/epiccash/epiccash_wallet.dart +++ b/lib/services/coins/epiccash/epiccash_wallet.dart @@ -862,6 +862,9 @@ class EpicCashWallet extends CoinServiceAPI Map? args}) async { try { int realfee = await nativeFee(satoshiAmount); + if (balance.spendable == satoshiAmount) { + satoshiAmount = balance.spendable - realfee; + } Map txData = { "fee": realfee, @@ -906,33 +909,81 @@ class EpicCashWallet extends CoinServiceAPI }); debugPrint(transactionFees); dynamic decodeData; - try { - decodeData = json.decode(transactionFees!); - } catch (e) { - if (ifErrorEstimateFee) { - //Error Not enough funds. Required: 0.56500000, Available: 0.56200000 - if (transactionFees!.contains("Required")) { - var splits = transactionFees!.split(" "); - Decimal required = Decimal.zero; - Decimal available = Decimal.zero; - for (int i = 0; i < splits.length; i++) { - var word = splits[i]; - if (word == "Required:") { - required = Decimal.parse(splits[i + 1].replaceAll(",", "")); - } else if (word == "Available:") { - available = Decimal.parse(splits[i + 1].replaceAll(",", "")); - } + + final available = balance.spendable; + + if (available == satoshiAmount) { + if (transactionFees!.contains("Required")) { + var splits = transactionFees!.split(" "); + Decimal required = Decimal.zero; + Decimal available = Decimal.zero; + for (int i = 0; i < splits.length; i++) { + var word = splits[i]; + if (word == "Required:") { + required = Decimal.parse(splits[i + 1].replaceAll(",", "")); + } else if (word == "Available:") { + available = Decimal.parse(splits[i + 1].replaceAll(",", "")); } - int largestSatoshiFee = - ((required - available) * Decimal.fromInt(100000000)) - .toBigInt() - .toInt(); - Logging.instance.log("largestSatoshiFee $largestSatoshiFee", - level: LogLevel.Info); - return largestSatoshiFee; } + int largestSatoshiFee = + ((required - available) * Decimal.fromInt(100000000)) + .toBigInt() + .toInt(); + var amountSending = satoshiAmount - largestSatoshiFee; + + //Get fees for this new amount + await m.protect(() async { + ReceivePort receivePort = await getIsolate({ + "function": "getTransactionFees", + "wallet": wallet!, + "amount": amountSending, + "minimumConfirmations": MINIMUM_CONFIRMATIONS, + }, name: walletName); + + var message = await receivePort.first; + if (message is String) { + Logging.instance + .log("this is a string $message", level: LogLevel.Error); + stop(receivePort); + throw Exception("getTransactionFees isolate failed"); + } + stop(receivePort); + Logging.instance.log('Closing getTransactionFees!\n $message', + level: LogLevel.Info); + // return message; + transactionFees = message['result'] as String; + }); + } + decodeData = json.decode(transactionFees!); + } else { + try { + decodeData = json.decode(transactionFees!); + } catch (e) { + if (ifErrorEstimateFee) { + //Error Not enough funds. Required: 0.56500000, Available: 0.56200000 + if (transactionFees!.contains("Required")) { + var splits = transactionFees!.split(" "); + Decimal required = Decimal.zero; + Decimal available = Decimal.zero; + for (int i = 0; i < splits.length; i++) { + var word = splits[i]; + if (word == "Required:") { + required = Decimal.parse(splits[i + 1].replaceAll(",", "")); + } else if (word == "Available:") { + available = Decimal.parse(splits[i + 1].replaceAll(",", "")); + } + } + int largestSatoshiFee = + ((required - available) * Decimal.fromInt(100000000)) + .toBigInt() + .toInt(); + Logging.instance.log("largestSatoshiFee $largestSatoshiFee", + level: LogLevel.Info); + return largestSatoshiFee; + } + } + rethrow; } - rethrow; } //TODO: first problem @@ -1799,7 +1850,7 @@ class EpicCashWallet extends CoinServiceAPI // final chunk = { // "timestamp": txTimeArray[0], // "transactions": [txObject], - // }; + // };sendAll // // // result["dateTimeChunks"]. // result["dateTimeChunks"].add(chunk);