@@ -184,12 +184,12 @@ class _SendViewState extends ConsumerState<SendView> {
184184 // onChanged handler reading stale null value.
185185 if (paymentData.additionalParams.containsKey ('op_return' )) {
186186 final data = paymentData.additionalParams['op_return' ];
187- ref. read (pOpReturnData.notifier).state = data;
187+ _setOpReturnData ( data) ;
188188 Logging .instance.i (
189189 "Extracted OP_RETURN data from URI, length: ${data !.length ~/ 2 } bytes" ,
190190 );
191191 } else {
192- ref. read (pOpReturnData.notifier).state = null ;
192+ _setOpReturnData ( null ) ;
193193 }
194194
195195 _setValidAddressProviders (_address);
@@ -541,11 +541,50 @@ class _SendViewState extends ConsumerState<SendView> {
541541 Map <Amount , String > cachedFiroSparkFees = {};
542542 Map <Amount , String > cachedFiroPublicFees = {};
543543
544+ void _setOpReturnData (String ? data) {
545+ if (! mounted) {
546+ return ;
547+ }
548+ ref.read (pOpReturnData.notifier).state = data;
549+ }
550+
551+ Amount _addOpReturnFeeIfNeeded ({
552+ required Amount fee,
553+ required BigInt feeRate,
554+ required FiroWallet wallet,
555+ }) {
556+ final opReturnData = ref.read (pOpReturnData);
557+ if (opReturnData == null ||
558+ opReturnData.isEmpty ||
559+ ref.read (publicPrivateBalanceStateProvider) != BalanceType .public) {
560+ return fee;
561+ }
562+
563+ final extraOutputVSize = AddressUtils .opReturnOutputVSizeFromHex (
564+ opReturnData,
565+ );
566+ final extraFee = wallet.estimateTxFee (
567+ vSize: extraOutputVSize,
568+ feeRatePerKB: feeRate,
569+ );
570+
571+ return fee +
572+ Amount (
573+ rawValue: BigInt .from (extraFee),
574+ fractionDigits: coin.fractionDigits,
575+ );
576+ }
577+
544578 Future <String > calculateFees (Amount amount) async {
579+ final hasOpReturnData =
580+ isFiro &&
581+ ref.read (publicPrivateBalanceStateProvider) == BalanceType .public &&
582+ (ref.read (pOpReturnData)? .isNotEmpty ?? false );
583+
545584 if (isFiro) {
546585 switch (ref.read (publicPrivateBalanceStateProvider.state).state) {
547586 case BalanceType .public:
548- if (cachedFiroPublicFees[amount] != null ) {
587+ if (! hasOpReturnData && cachedFiroPublicFees[amount] != null ) {
549588 return cachedFiroPublicFees[amount]! ;
550589 }
551590 break ;
@@ -607,10 +646,18 @@ class _SendViewState extends ConsumerState<SendView> {
607646 switch (ref.read (publicPrivateBalanceStateProvider.state).state) {
608647 case BalanceType .public:
609648 fee = await firoWallet.estimateFeeFor (amount, feeRate);
610- cachedFiroPublicFees[amount] = ref
649+ fee = _addOpReturnFeeIfNeeded (
650+ fee: fee,
651+ feeRate: feeRate,
652+ wallet: firoWallet,
653+ );
654+ final formatted = ref
611655 .read (pAmountFormatter (coin))
612656 .format (fee, withUnitName: true , indicatePrecisionLoss: false );
613- return cachedFiroPublicFees[amount]! ;
657+ if (! hasOpReturnData) {
658+ cachedFiroPublicFees[amount] = formatted;
659+ }
660+ return formatted;
614661
615662 case BalanceType .private:
616663 fee = await firoWallet.estimateFeeForSpark (amount);
@@ -1146,6 +1193,9 @@ class _SendViewState extends ConsumerState<SendView> {
11461193 }
11471194
11481195 void clearSendForm () {
1196+ if (! mounted) {
1197+ return ;
1198+ }
11491199 sendToController.text = "" ;
11501200 cryptoAmountController.text = "" ;
11511201 baseAmountController.text = "" ;
@@ -1155,10 +1205,8 @@ class _SendViewState extends ConsumerState<SendView> {
11551205 memoController.text = "" ;
11561206 _address = "" ;
11571207 _addressToggleFlag = false ;
1158- ref.read (pOpReturnData.notifier).state = null ;
1159- if (mounted) {
1160- setState (() {});
1161- }
1208+ _setOpReturnData (null );
1209+ setState (() {});
11621210 }
11631211
11641212 String _getSendAllTitle (
@@ -1758,8 +1806,7 @@ class _SendViewState extends ConsumerState<SendView> {
17581806 if (parsed != null ) {
17591807 _applyUri (parsed);
17601808 } else {
1761- ref.read (pOpReturnData.notifier).state =
1762- null ;
1809+ _setOpReturnData (null );
17631810 await _checkSparkNameAndOrSetAddress (
17641811 newValue,
17651812 );
0 commit comments