diff --git a/domain/miningmanager/mempool/mempool.go b/domain/miningmanager/mempool/mempool.go index 530720a10..6362e483d 100644 --- a/domain/miningmanager/mempool/mempool.go +++ b/domain/miningmanager/mempool/mempool.go @@ -149,12 +149,6 @@ func (mp *mempool) BlockCandidateTransactions() []*externalapi.DomainTransaction var spamTxNewestUTXODaaScore uint64 for _, tx := range readyTxs { if len(tx.Outputs) > len(tx.Inputs) { - numExtraOuts := len(tx.Outputs) - len(tx.Inputs) - if numExtraOuts > 2 && tx.Fee < uint64(numExtraOuts)*constants.SompiPerKaspa { - log.Debugf("Filtered spam tx %s", consensushashing.TransactionID(tx)) - continue - } - hasCoinbaseInput := false for _, input := range tx.Inputs { if input.UTXOEntry.IsCoinbase() { @@ -163,6 +157,12 @@ func (mp *mempool) BlockCandidateTransactions() []*externalapi.DomainTransaction } } + numExtraOuts := len(tx.Outputs) - len(tx.Inputs) + if !hasCoinbaseInput && numExtraOuts > 2 && tx.Fee < uint64(numExtraOuts)*constants.SompiPerKaspa { + log.Debugf("Filtered spam tx %s", consensushashing.TransactionID(tx)) + continue + } + if hasCoinbaseInput || tx.Fee > uint64(numExtraOuts)*constants.SompiPerKaspa { candidateTxs = append(candidateTxs, tx) } else { diff --git a/domain/miningmanager/mempool/validate_and_insert_transaction.go b/domain/miningmanager/mempool/validate_and_insert_transaction.go index 831557e13..613e9f845 100644 --- a/domain/miningmanager/mempool/validate_and_insert_transaction.go +++ b/domain/miningmanager/mempool/validate_and_insert_transaction.go @@ -30,9 +30,17 @@ func (mp *mempool) validateAndInsertTransaction(transaction *externalapi.DomainT return nil, err } + hasCoinbaseInput := false + for _, input := range transaction.Inputs { + if input.UTXOEntry.IsCoinbase() { + hasCoinbaseInput = true + break + } + } + numExtraOuts := len(transaction.Outputs) - len(transaction.Inputs) - if numExtraOuts > 2 && transaction.Fee < uint64(numExtraOuts)*constants.SompiPerKaspa { - log.Warnf("Rejected spam tx %s from mempool", consensushashing.TransactionID(transaction)) + if !hasCoinbaseInput && numExtraOuts > 2 && transaction.Fee < uint64(numExtraOuts)*constants.SompiPerKaspa { + log.Warnf("Rejected spam tx %s from mempool (%d outputs)", consensushashing.TransactionID(transaction), len(transaction.Outputs)) return nil, transactionRuleError(RejectSpamTx, fmt.Sprintf("Rejected spam tx %s from mempool", consensushashing.TransactionID(transaction))) }