From d1321162820177a7ff023cf17965e8f79cf72049 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 20 Dec 2023 18:00:02 -0600 Subject: [PATCH] WIP spark spend progress --- .../send_view/confirm_transaction_view.dart | 13 ++++++-- lib/wallets/models/tx_data.dart | 7 +++++ .../spark_interface.dart | 31 +++++++------------ 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/lib/pages/send_view/confirm_transaction_view.dart b/lib/pages/send_view/confirm_transaction_view.dart index 9bcaf1b01..173722fa2 100644 --- a/lib/pages/send_view/confirm_transaction_view.dart +++ b/lib/pages/send_view/confirm_transaction_view.dart @@ -625,7 +625,9 @@ class _ConfirmTransactionViewState ), Builder( builder: (context) { - final amount = widget.txData.amount!; + // TODO: [prio=high] spark transaction specifics - better handling + final amount = widget.txData.amount ?? + widget.txData.amountSpark!; final externalCalls = ref.watch( prefsChangeNotifierProvider.select( (value) => value.externalCalls)); @@ -723,9 +725,12 @@ class _ConfirmTransactionViewState height: 2, ), SelectableText( + // TODO: [prio=high] spark transaction specifics - better handling widget.isPaynymTransaction ? widget.txData.paynymAccountLite!.nymName - : widget.txData.recipients!.first.address, + : widget.txData.recipients?.first.address ?? + widget.txData.sparkRecipients!.first + .address, style: STextStyles.desktopTextExtraExtraSmall( context) .copyWith( @@ -1072,7 +1077,9 @@ class _ConfirmTransactionViewState Builder(builder: (context) { final fee = widget.txData.fee!; - final amount = widget.txData.amount!; + // TODO: [prio=high] spark transaction specifics - better handling + final amount = + widget.txData.amount ?? widget.txData.amountSpark!; return SelectableText( ref .watch(pAmountFormatter(coin)) diff --git a/lib/wallets/models/tx_data.dart b/lib/wallets/models/tx_data.dart index 0cb1bcf49..f1b8bfa54 100644 --- a/lib/wallets/models/tx_data.dart +++ b/lib/wallets/models/tx_data.dart @@ -103,6 +103,13 @@ class TxData { .reduce((total, amount) => total += amount) : null; + Amount? get amountSpark => + sparkRecipients != null && sparkRecipients!.isNotEmpty + ? sparkRecipients! + .map((e) => e.amount) + .reduce((total, amount) => total += amount) + : null; + int? get estimatedSatsPerVByte => fee != null && vSize != null ? (fee!.raw ~/ BigInt.from(vSize!)).toInt() : null; diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index 863250e9c..382c53a7b 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:bitcoindart/bitcoindart.dart' as btc; -import 'package:bitcoindart/src/utils/script.dart' as bscript; import 'package:flutter/foundation.dart'; import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart'; import 'package:isar/isar.dart'; @@ -118,6 +117,7 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { Future prepareSendSpark({ required TxData txData, }) async { + // fetch spendable spark coins final coins = await mainDB.isar.sparkCoins .where() .walletIdEqualToAnyLTagHash(walletId) @@ -127,6 +127,7 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { .heightIsNotNull() .findAll(); + // prepare coin data for ffi final serializedCoins = coins .map((e) => ( serializedCoin: e.serializedCoinB64!, @@ -366,18 +367,6 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { // inputs - final opReturnScript = bscript.compile([ - 0xd3, // OP_SPARKSPEND - Uint8List(0), - ]); - - txb.addInput( - '0000000000000000000000000000000000000000000000000000000000000000', - 0xffffffff, - 0xffffffff, - opReturnScript, - ); - // final sig = extractedTx.getId(); // for (final coin in estimated.coins) { @@ -404,18 +393,20 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { .toList(), ); - print("SPARK SPEND ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - print("fee: ${spend.fee}"); - print("spend: ${spend.serializedSpendPayload}"); - print("scripts:"); - spend.outputScripts.forEach(print); - print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - for (final outputScript in spend.outputScripts) { txb.addOutput(outputScript, 0); } final extractedTx = txb.buildIncomplete(); + + extractedTx.addInput( + '0000000000000000000000000000000000000000000000000000000000000000' + .toUint8ListFromHex, + 0xffffffff, + 0xffffffff, + "d3".toUint8ListFromHex, // OP_SPARKSPEND + ); + extractedTx.setPayload(spend.serializedSpendPayload); final rawTxHex = extractedTx.toHex();