From 2d25c3d7a38729036876bfe3016051a73033288c Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Wed, 18 Sep 2024 13:45:32 +0300 Subject: [PATCH] Fix estimateFee change value --- .../daemon/server/create_unsigned_transaction.go | 10 +++++----- cmd/kaspawallet/daemon/server/split_transaction.go | 4 ++-- cmd/kaspawallet/parse.go | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go b/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go index 8e1097134..2576bf92f 100644 --- a/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go +++ b/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go @@ -198,7 +198,7 @@ func (s *server) selectUTXOsWithPreselected(preSelectedUTXOs []*walletUTXO, allo totalValue += utxo.UTXOEntry.Amount() // We're overestimating a bit by assuming that any transaction will have a change output - fee, err = s.estimateFee(selectedUTXOs, feeRate, maxFee, true) + fee, err = s.estimateFee(selectedUTXOs, feeRate, maxFee, spendAmount) if err != nil { return false, err } @@ -257,7 +257,7 @@ func (s *server) selectUTXOsWithPreselected(preSelectedUTXOs []*walletUTXO, allo return selectedUTXOs, totalReceived, totalValue - totalSpend, nil } -func (s *server) estimateFee(selectedUTXOs []*libkaspawallet.UTXO, feeRate float64, maxFee uint64, assumeChange bool) (uint64, error) { +func (s *server) estimateFee(selectedUTXOs []*libkaspawallet.UTXO, feeRate float64, maxFee uint64, recipientValue uint64) (uint64, error) { fakePubKey := [util.PublicKeySize]byte{} fakeAddr, err := util.NewAddressPublicKey(fakePubKey[:], s.params.Prefix) if err != nil { @@ -271,15 +271,15 @@ func (s *server) estimateFee(selectedUTXOs []*libkaspawallet.UTXO, feeRate float // This is an approximation for the distribution of value between the recipient output and the change output. var mockPayments []*libkaspawallet.Payment - if assumeChange { + if totalValue > recipientValue { mockPayments = []*libkaspawallet.Payment{ { Address: fakeAddr, - Amount: totalValue * 99 / 100, + Amount: recipientValue, }, { Address: fakeAddr, - Amount: totalValue / 100, + Amount: totalValue - recipientValue, // We ignore the fee since we expect it to be insignificant in mass calculation. }, } } else { diff --git a/cmd/kaspawallet/daemon/server/split_transaction.go b/cmd/kaspawallet/daemon/server/split_transaction.go index f37a17a02..199835af4 100644 --- a/cmd/kaspawallet/daemon/server/split_transaction.go +++ b/cmd/kaspawallet/daemon/server/split_transaction.go @@ -72,7 +72,7 @@ func (s *server) mergeTransaction( totalValue += output.Value } // We're overestimating a bit by assuming that any transaction will have a change output - fee, err := s.estimateFee(utxos, feeRate, maxFee, true) + fee, err := s.estimateFee(utxos, feeRate, maxFee, sentValue) if err != nil { return nil, err } @@ -253,7 +253,7 @@ func (s *server) createSplitTransaction(transaction *serialization.PartiallySign totalSompi += selectedUTXOs[i-startIndex].UTXOEntry.Amount() } if len(selectedUTXOs) != 0 { - fee, err := s.estimateFee(selectedUTXOs, feeRate, maxFee, false) + fee, err := s.estimateFee(selectedUTXOs, feeRate, maxFee, totalSompi) if err != nil { return nil, err } diff --git a/cmd/kaspawallet/parse.go b/cmd/kaspawallet/parse.go index 6c4fb590a..e6e7f6743 100644 --- a/cmd/kaspawallet/parse.go +++ b/cmd/kaspawallet/parse.go @@ -90,12 +90,13 @@ func parse(conf *parseConfig) error { fmt.Println() fee := allInputSompi - allOutputSompi - fmt.Printf("Fee:\t%d Sompi (%f KAS)\n\n", fee, float64(fee)/float64(constants.SompiPerKaspa)) + fmt.Printf("Fee:\t%d Sompi (%f KAS)\n", fee, float64(fee)/float64(constants.SompiPerKaspa)) mass, err := server.EstimateMassAfterSignatures(partiallySignedTransaction, keysFile.ECDSA, keysFile.MinimumSignatures, txMassCalculator) if err != nil { return err } + fmt.Printf("Mass: %d grams\n", mass) feeRate := float64(fee) / float64(mass) fmt.Printf("Fee rate: %.2f Sompi/Gram\n", feeRate) }