From 0d1bf5895d5b69f8d2768420afb7ebf09ad9f18d Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 13 Jan 2025 17:13:25 -0600 Subject: [PATCH] fix: incorrect number of confirms for monero (and wownero) outputs and transactions --- lib/models/isar/models/blockchain_data/utxo.dart | 16 ++++++++++++++-- .../blockchain_data/v2/transaction_v2.dart | 4 +++- .../wallet/intermediate/lib_monero_wallet.dart | 4 ++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/models/isar/models/blockchain_data/utxo.dart b/lib/models/isar/models/blockchain_data/utxo.dart index 87558c541..77de5ae3a 100644 --- a/lib/models/isar/models/blockchain_data/utxo.dart +++ b/lib/models/isar/models/blockchain_data/utxo.dart @@ -77,7 +77,9 @@ class UTXO { int getConfirmations(int currentChainHeight) { if (blockTime == null || blockHash == null) return 0; if (blockHeight == null || blockHeight! <= 0) return 0; - return max(0, currentChainHeight - (blockHeight! - 1)); + return _isMonero() + ? max(0, currentChainHeight - (blockHeight!)) + : max(0, currentChainHeight - (blockHeight! - 1)); } bool isConfirmed( @@ -90,6 +92,11 @@ class UTXO { (isCoinbase ? minimumCoinbaseConfirms : minimumConfirms); } + // fuzzy + bool _isMonero() { + return keyImage != null; + } + @ignore String? get keyImage { if (otherData == null) { @@ -98,7 +105,7 @@ class UTXO { try { final map = jsonDecode(otherData!) as Map; - return map["keyImage"] as String; + return map[UTXOOtherDataKeys.keyImage] as String; } catch (_) { return null; } @@ -169,3 +176,8 @@ class UTXO { @ignore int get hashCode => Object.hashAll([walletId, txid, vout]); } + +abstract final class UTXOOtherDataKeys { + static const keyImage = "keyImage"; + static const spent = "spent"; +} diff --git a/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart b/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart index 3d8903391..b7a92c26e 100644 --- a/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart +++ b/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart @@ -109,7 +109,9 @@ class TransactionV2 { int getConfirmations(int currentChainHeight) { if (height == null || height! <= 0) return 0; - return max(0, currentChainHeight - (height! - 1)); + return _isMonero() + ? max(0, currentChainHeight - (height!)) + : max(0, currentChainHeight - (height! - 1)); } bool isConfirmed( diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 3c3c34a6d..423e8c70b 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -1017,8 +1017,8 @@ abstract class LibMoneroWallet .findFirst(); final otherDataMap = { - "keyImage": rawUTXO.keyImage, - "spent": rawUTXO.spent, + UTXOOtherDataKeys.keyImage: rawUTXO.keyImage, + UTXOOtherDataKeys.spent: rawUTXO.spent, }; final utxo = UTXO(