properly await multDest transactino so it won't freeze the UI (#2116)

cyan committed Mar 26, 2025 at 02:56 UTC 2f0cb28fb204229a847c5fdcac98a0c34edbd02d
2 files changed +22 -43
cw_monero/lib/api/transaction_history.dart
+21 -43
@@ -161,31 +161,39 @@ Future<PendingTransactionDescription> createTransactionSync(
161 );
162 }
163
164 -PendingTransactionDescription createTransactionMultDestSync(
164 +Future<PendingTransactionDescription> createTransactionMultDest(
165 {required List<MoneroOutput> outputs,
166 required String paymentId,
167 required int priorityRaw,
168 int accountIndex = 0,
169 - List<String> preferredInputs = const []}) {
169 + List<String> preferredInputs = const []}) async {
170
171 final dstAddrs = outputs.map((e) => e.address).toList();
172 final amounts = outputs.map((e) => monero.Wallet_amountFromString(e.amount)).toList();
173
174 - // printV("multDest: dstAddrs: $dstAddrs");
175 - // printV("multDest: amounts: $amounts");
174 + final waddr = wptr!.address;
175 +
176 + // force reconnection in case the os killed the connection
177 + Isolate.run(() async {
178 + monero.Wallet_synchronized(Pointer.fromAddress(waddr));
179 + });
180 +
181 + final txptr = Pointer<Void>.fromAddress(await Isolate.run(() {
182 + return monero.Wallet_createTransactionMultDest(
183 + Pointer.fromAddress(waddr),
184 + dstAddr: dstAddrs,
185 + isSweepAll: false,
186 + amounts: amounts,
187 + mixinCount: 0,
188 + pendingTransactionPriority: priorityRaw,
189 + subaddr_account: accountIndex,
190 + ).address;
191 + }));
192
177 - final txptr = monero.Wallet_createTransactionMultDest(
178 - wptr!,
179 - dstAddr: dstAddrs,
180 - isSweepAll: false,
181 - amounts: amounts,
182 - mixinCount: 0,
183 - pendingTransactionPriority: priorityRaw,
184 - subaddr_account: accountIndex,
185 - );
193 if (monero.PendingTransaction_status(txptr) != 0) {
194 throw CreationTransactionException(message: monero.PendingTransaction_errorString(txptr));
195 }
196 +
197 return PendingTransactionDescription(
198 amount: monero.PendingTransaction_amount(txptr),
199 fee: monero.PendingTransaction_fee(txptr),
@@ -255,21 +263,6 @@ Future<PendingTransactionDescription> _createTransactionSync(Map args) async {
263 preferredInputs: preferredInputs);
264 }
265
258 -PendingTransactionDescription _createTransactionMultDestSync(Map args) {
259 - final outputs = args['outputs'] as List<MoneroOutput>;
260 - final paymentId = args['paymentId'] as String;
261 - final priorityRaw = args['priorityRaw'] as int;
262 - final accountIndex = args['accountIndex'] as int;
263 - final preferredInputs = args['preferredInputs'] as List<String>;
264 -
265 - return createTransactionMultDestSync(
266 - outputs: outputs,
267 - paymentId: paymentId,
268 - priorityRaw: priorityRaw,
269 - accountIndex: accountIndex,
270 - preferredInputs: preferredInputs);
271 -}
272 -
266 Future<PendingTransactionDescription> createTransaction(
267 {required String address,
268 required int priorityRaw,
@@ -286,21 +279,6 @@ Future<PendingTransactionDescription> createTransaction(
279 'preferredInputs': preferredInputs
280 });
281
289 -Future<PendingTransactionDescription> createTransactionMultDest(
290 - {required List<MoneroOutput> outputs,
291 - required int priorityRaw,
292 - String paymentId = '',
293 - int accountIndex = 0,
294 - List<String> preferredInputs = const []}) async =>
295 - _createTransactionMultDestSync({
296 - 'outputs': outputs,
297 - 'paymentId': paymentId,
298 - 'priorityRaw': priorityRaw,
299 - 'accountIndex': accountIndex,
300 - 'preferredInputs': preferredInputs
301 - });
302 -
303 -
282 class Transaction {
283 final String displayLabel;
284 late final String subaddressLabel = monero.Wallet_getSubaddressLabel(
cw_monero/lib/monero_wallet.dart
+1
@@ -402,6 +402,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
402 outputs: moneroOutputs,
403 priorityRaw: _credentials.priority.serialize(),
404 accountIndex: walletAddresses.account!.id,
405 + paymentId: "",
406 preferredInputs: inputs);
407 } else {
408 final output = outputs.first;