dev
dart 78 lines 2.3 KB
Raw
1 import 'package:cw_core/amount/money.dart';
2 import 'package:cw_core/exceptions.dart';
3 import 'package:cw_core/pending_transaction.dart';
4 import 'package:cw_core/utils/print_verbose.dart';
5 import 'package:cw_zcash/cw_zcash.dart';
6 import 'package:zkool/src/rust/api/pay.dart' as zkool_pay;
7 import 'package:zkool/src/rust/api/network.dart' as zkool_network;
8
9 class PendingZcashTransaction with PendingTransaction {
10 PendingZcashTransaction({
11 required this.zcashWallet,
12 required this.credentials,
13 required this.txPlan,
14 required this.fee,
15 required this.availableBalance,
16 });
17
18 final ZcashWallet zcashWallet;
19 final ZcashTransactionCredentials credentials;
20 final zkool_pay.PcztPackage txPlan;
21 String? _txId;
22 final Money availableBalance;
23
24 @override
25 String get id => _txId ?? '';
26
27 @override
28 String get hex => '';
29
30 @override
31 Money get amount {
32 final isAll = credentials.outputs.fold<bool>(false, (final a, final b) => a || (b.sendAll));
33 if (isAll) {
34 return availableBalance - fee;
35 }
36 return credentials.outputs
37 .map((final output) => output.cryptoAmount)
38 .reduce((final a, final b) => a + b);
39 }
40
41 @override
42 String get amountFormatted => amount.toString();
43
44 @override
45 final Money fee;
46
47 @override
48 Future<void> commit() async {
49 await ZcashWalletBase.runWithCoin(
50 accountId: zcashWallet.accountId,
51 func: (coin) async {
52 final signTx = await zkool_pay.signTransaction(pczt: txPlan, c: coin);
53 final txBytes = await zkool_pay.extractTransaction(package: signTx);
54 final currentHeight = await zkool_network.getCurrentHeight(c: coin);
55 final result = await zkool_pay.broadcastTransaction(
56 height: currentHeight,
57 txBytes: txBytes,
58 c: coin,
59 );
60 printV("result: $result");
61 final txId = ZcashWalletService.normalizeTxId(result);
62 if (txId.length != 64) {
63 throw TransactionCommitFailed(errorMessage: result);
64 }
65 _txId = txId;
66 zcashWallet.rememberPendingOutgoingAmount(txId, amount);
67 },
68 );
69 await zcashWallet.updateTransactions();
70 await zcashWallet.updateBalance();
71 }
72
73 @override
74 Future<Map<String, String>> commitUR() => throw UnimplementedError('UR not supported for Zcash');
75
76 @override
77 bool shouldCommitUR() => false;
78 }