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;