From b26b9f6c4bd4e322f994c46d979bc16d93db359a Mon Sep 17 00:00:00 2001 From: Svarog Date: Fri, 15 Jul 2022 14:12:34 +0300 Subject: [PATCH] Implement multi-layer auto-compound (#2115) Co-authored-by: Michael Sutton --- .../daemon/server/split_transaction.go | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/cmd/kaspawallet/daemon/server/split_transaction.go b/cmd/kaspawallet/daemon/server/split_transaction.go index fd672b019d..b2154c9007 100644 --- a/cmd/kaspawallet/daemon/server/split_transaction.go +++ b/cmd/kaspawallet/daemon/server/split_transaction.go @@ -27,18 +27,10 @@ func (s *server) maybeAutoCompoundTransaction(transactionBytes []byte, toAddress return nil, err } - splitTransactions, err := s.maybeSplitTransaction(transaction, changeAddress) + splitTransactions, err := s.maybeSplitAndMergeTransaction(transaction, toAddress, changeAddress, changeWalletAddress) if err != nil { return nil, err } - if len(splitTransactions) > 1 { - mergeTransaction, err := s.mergeTransaction(splitTransactions, transaction, toAddress, changeAddress, changeWalletAddress) - if err != nil { - return nil, err - } - splitTransactions = append(splitTransactions, mergeTransaction) - } - splitTransactionsBytes := make([][]byte, len(splitTransactions)) for i, splitTransaction := range splitTransactions { splitTransactionsBytes[i], err = serialization.SerializePartiallySignedTransaction(splitTransaction) @@ -113,8 +105,8 @@ func (s *server) mergeTransaction( return serialization.DeserializePartiallySignedTransaction(mergeTransactionBytes) } -func (s *server) maybeSplitTransaction(transaction *serialization.PartiallySignedTransaction, - changeAddress util.Address) ([]*serialization.PartiallySignedTransaction, error) { +func (s *server) maybeSplitAndMergeTransaction(transaction *serialization.PartiallySignedTransaction, toAddress util.Address, + changeAddress util.Address, changeWalletAddress *walletAddress) ([]*serialization.PartiallySignedTransaction, error) { transactionMass, err := s.estimateMassAfterSignatures(transaction) if err != nil { @@ -141,6 +133,20 @@ func (s *server) maybeSplitTransaction(transaction *serialization.PartiallySigne } } + if len(splitTransactions) > 1 { + mergeTransaction, err := s.mergeTransaction(splitTransactions, transaction, toAddress, changeAddress, changeWalletAddress) + if err != nil { + return nil, err + } + // Recursion will be 2-3 iterations deep even in the rarest` cases, so considered safe.. + splitMergeTransaction, err := s.maybeSplitAndMergeTransaction(mergeTransaction, toAddress, changeAddress, changeWalletAddress) + if err != nil { + return nil, err + } + splitTransactions = append(splitTransactions, splitMergeTransaction...) + + } + return splitTransactions, nil }