From 2f0cb28fb204229a847c5fdcac98a0c34edbd02d Mon Sep 17 00:00:00 2001 From: cyan Date: Wed, 26 Mar 2025 02:56:24 +0100 Subject: [PATCH] properly await multDest transactino so it won't freeze the UI (#2116) --- cw_monero/lib/api/transaction_history.dart | 64 +++++++--------------- cw_monero/lib/monero_wallet.dart | 1 + 2 files changed, 22 insertions(+), 43 deletions(-) diff --git a/cw_monero/lib/api/transaction_history.dart b/cw_monero/lib/api/transaction_history.dart index 854ee01c3..162b9ac1a 100644 --- a/cw_monero/lib/api/transaction_history.dart +++ b/cw_monero/lib/api/transaction_history.dart @@ -161,31 +161,39 @@ Future createTransactionSync( ); } -PendingTransactionDescription createTransactionMultDestSync( +Future createTransactionMultDest( {required List outputs, required String paymentId, required int priorityRaw, int accountIndex = 0, - List preferredInputs = const []}) { + List preferredInputs = const []}) async { final dstAddrs = outputs.map((e) => e.address).toList(); final amounts = outputs.map((e) => monero.Wallet_amountFromString(e.amount)).toList(); - // printV("multDest: dstAddrs: $dstAddrs"); - // printV("multDest: amounts: $amounts"); + final waddr = wptr!.address; + + // force reconnection in case the os killed the connection + Isolate.run(() async { + monero.Wallet_synchronized(Pointer.fromAddress(waddr)); + }); + + final txptr = Pointer.fromAddress(await Isolate.run(() { + return monero.Wallet_createTransactionMultDest( + Pointer.fromAddress(waddr), + dstAddr: dstAddrs, + isSweepAll: false, + amounts: amounts, + mixinCount: 0, + pendingTransactionPriority: priorityRaw, + subaddr_account: accountIndex, + ).address; + })); - final txptr = monero.Wallet_createTransactionMultDest( - wptr!, - dstAddr: dstAddrs, - isSweepAll: false, - amounts: amounts, - mixinCount: 0, - pendingTransactionPriority: priorityRaw, - subaddr_account: accountIndex, - ); if (monero.PendingTransaction_status(txptr) != 0) { throw CreationTransactionException(message: monero.PendingTransaction_errorString(txptr)); } + return PendingTransactionDescription( amount: monero.PendingTransaction_amount(txptr), fee: monero.PendingTransaction_fee(txptr), @@ -255,21 +263,6 @@ Future _createTransactionSync(Map args) async { preferredInputs: preferredInputs); } -PendingTransactionDescription _createTransactionMultDestSync(Map args) { - final outputs = args['outputs'] as List; - final paymentId = args['paymentId'] as String; - final priorityRaw = args['priorityRaw'] as int; - final accountIndex = args['accountIndex'] as int; - final preferredInputs = args['preferredInputs'] as List; - - return createTransactionMultDestSync( - outputs: outputs, - paymentId: paymentId, - priorityRaw: priorityRaw, - accountIndex: accountIndex, - preferredInputs: preferredInputs); -} - Future createTransaction( {required String address, required int priorityRaw, @@ -286,21 +279,6 @@ Future createTransaction( 'preferredInputs': preferredInputs }); -Future createTransactionMultDest( - {required List outputs, - required int priorityRaw, - String paymentId = '', - int accountIndex = 0, - List preferredInputs = const []}) async => - _createTransactionMultDestSync({ - 'outputs': outputs, - 'paymentId': paymentId, - 'priorityRaw': priorityRaw, - 'accountIndex': accountIndex, - 'preferredInputs': preferredInputs - }); - - class Transaction { final String displayLabel; late final String subaddressLabel = monero.Wallet_getSubaddressLabel( diff --git a/cw_monero/lib/monero_wallet.dart b/cw_monero/lib/monero_wallet.dart index 5637f82e5..0a56c5cbc 100644 --- a/cw_monero/lib/monero_wallet.dart +++ b/cw_monero/lib/monero_wallet.dart @@ -402,6 +402,7 @@ abstract class MoneroWalletBase extends WalletBase