diff --git a/cw_monero/lib/api/structs/pending_transaction.dart b/cw_monero/lib/api/structs/pending_transaction.dart index dc5fbddd0..22f974f4b 100644 --- a/cw_monero/lib/api/structs/pending_transaction.dart +++ b/cw_monero/lib/api/structs/pending_transaction.dart @@ -5,13 +5,11 @@ class PendingTransactionDescription { required this.fee, required this.hash, required this.hex, - required this.txKey, required this.pointerAddress}); final int amount; final int fee; final String hash; final String hex; - final String txKey; final int pointerAddress; } \ No newline at end of file diff --git a/cw_monero/lib/api/transaction_history.dart b/cw_monero/lib/api/transaction_history.dart index 2fe0888f6..fd6004140 100644 --- a/cw_monero/lib/api/transaction_history.dart +++ b/cw_monero/lib/api/transaction_history.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:ffi'; import 'dart:isolate'; @@ -194,14 +195,12 @@ Future createTransactionSync( final rFee = pendingTx.fee(); final rHash = pendingTx.txid(''); final rHex = pendingTx.hex(''); - final rTxKey = rHash; return PendingTransactionDescription( amount: rAmt, fee: rFee, hash: rHash, hex: rHex, - txKey: rTxKey, pointerAddress: pendingTx.ffiAddress(), ); } @@ -246,7 +245,6 @@ Future createTransactionMultDest( fee: tx.fee(), hash: tx.txid(''), hex: tx.hex(''), - txKey: tx.txid(''), pointerAddress: tx.ffiAddress(), ); } @@ -263,6 +261,7 @@ Future commitTransaction({required Wallet2PendingTransaction tx, requir filename: '', overwrite: false, ); + return null; }); String? error = (() { @@ -285,11 +284,12 @@ Future commitTransaction({required Wallet2PendingTransaction tx, requir if (error != null && error != "no tx keys found for this txid") { throw CreationTransactionException(message: error); } - if (useUR) { - return Future.value(txCommit as String?); - } else { - return Future.value(null); - } + unawaited(() async { + storeSync(force: true); + await Future.delayed(Duration(seconds: 5)); + storeSync(force: true); + }()); + return Future.value(txCommit); } class Transaction { diff --git a/cw_monero/lib/pending_monero_transaction.dart b/cw_monero/lib/pending_monero_transaction.dart index f29d1ccd2..9909a3021 100644 --- a/cw_monero/lib/pending_monero_transaction.dart +++ b/cw_monero/lib/pending_monero_transaction.dart @@ -31,8 +31,6 @@ class PendingMoneroTransaction with PendingTransaction { @override String get hex => pendingTransactionDescription.hex; - String get txKey => pendingTransactionDescription.txKey; - @override String get amountFormatted => AmountConverter.amountIntToString( CryptoCurrency.xmr, pendingTransactionDescription.amount); diff --git a/lib/entities/transaction_description.dart b/lib/entities/transaction_description.dart index 2ac573652..05f64820e 100644 --- a/lib/entities/transaction_description.dart +++ b/lib/entities/transaction_description.dart @@ -5,7 +5,7 @@ part 'transaction_description.g.dart'; @HiveType(typeId: TransactionDescription.typeId) class TransactionDescription extends HiveObject { - TransactionDescription({required this.id, this.recipientAddress, this.transactionNote}); + TransactionDescription({required this.id, this.recipientAddress, this.transactionNote, this.transactionKey}); static const typeId = TRANSACTION_TYPE_ID; static const boxName = 'TransactionDescriptions'; @@ -20,12 +20,16 @@ class TransactionDescription extends HiveObject { @HiveField(2) String? transactionNote; + @HiveField(3) + String? transactionKey; + String get note => transactionNote ?? ''; Map toJson() => { 'id': id, 'recipientAddress': recipientAddress, 'transactionNote': transactionNote, + 'transactionKey': transactionKey, }; factory TransactionDescription.fromJson(Map json) { @@ -33,6 +37,7 @@ class TransactionDescription extends HiveObject { id: json['id'] as String, recipientAddress: json['recipientAddress'] as String?, transactionNote: json['transactionNote'] as String?, + transactionKey: json['transactionKey'] as String?, ); } } diff --git a/lib/monero/cw_monero.dart b/lib/monero/cw_monero.dart index 6ae48b863..257ff895e 100644 --- a/lib/monero/cw_monero.dart +++ b/lib/monero/cw_monero.dart @@ -365,7 +365,7 @@ class CWMonero extends Monero { @override Map pendingTransactionInfo(Object transaction) { final ptx = transaction as PendingMoneroTransaction; - return {'id': ptx.id, 'hex': ptx.hex, 'key': ptx.txKey}; + return {'id': ptx.id, 'hex': ptx.hex}; } @override diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 0a4b7e841..edca5636c 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -590,16 +590,25 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor } if (pendingTransaction!.id.isNotEmpty) { + TransactionInfo? tx; + if (walletType == WalletType.monero) { + await Future.delayed(Duration(milliseconds: 450)); + await wallet.fetchTransactions(); + final txhistory = monero!.getTransactionHistory(wallet); + tx = txhistory.transactions.values.last; + } final descriptionKey = '${pendingTransaction!.id}_${wallet.walletAddresses.primaryAddress}'; _settingsStore.shouldSaveRecipientAddress ? await transactionDescriptionBox.add(TransactionDescription( id: descriptionKey, recipientAddress: address, transactionNote: note, + transactionKey: tx?.additionalInfo["key"] as String?, )) : await transactionDescriptionBox.add(TransactionDescription( id: descriptionKey, transactionNote: note, + transactionKey: tx?.additionalInfo["key"] as String?, )); } final sharedPreferences = await SharedPreferences.getInstance(); diff --git a/lib/view_model/transaction_details_view_model.dart b/lib/view_model/transaction_details_view_model.dart index 067ca73f9..691c94f56 100644 --- a/lib/view_model/transaction_details_view_model.dart +++ b/lib/view_model/transaction_details_view_model.dart @@ -233,7 +233,13 @@ abstract class TransactionDetailsViewModelBase with Store { } void _addMoneroListItems(TransactionInfo tx, DateFormat dateFormat) { - final key = tx.additionalInfo['key'] as String?; + final descriptionKey = '${transactionInfo.txHash}_${wallet.walletAddresses.primaryAddress}'; + final description = transactionDescriptionBox.values.firstWhere( + (val) => val.id == descriptionKey || val.id == transactionInfo.txHash, + orElse: () => TransactionDescription(id: descriptionKey)); + + + final key = tx.additionalInfo['key'] as String? ?? description.transactionKey; final accountIndex = tx.additionalInfo['accountIndex'] as int; final addressIndex = tx.additionalInfo['addressIndex'] as int; final feeFormatted = tx.feeFormatted();