From f4a382dc108953ac063ecbe454168bd98fea1487 Mon Sep 17 00:00:00 2001
From: Acha Bill <57879913+acha-bill@users.noreply.github.com>
Date: Thu, 9 Jul 2020 15:18:27 +0100
Subject: [PATCH] validate tx signature before issueing tx (#630)

* validate tx signature before issueing tx

* Fix typo

Co-authored-by: Angelo Capossele <angelocapossele@gmail.com>

* refactor

Co-authored-by: Angelo Capossele <angelocapossele@gmail.com>

Co-authored-by: Angelo Capossele <angelocapossele@gmail.com>
---
 dapps/valuetransfers/packages/tangle/errors.go  | 5 +++++
 dapps/valuetransfers/packages/tangle/factory.go | 6 ++++++
 dapps/valuetransfers/packages/tangle/tangle.go  | 7 -------
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/dapps/valuetransfers/packages/tangle/errors.go b/dapps/valuetransfers/packages/tangle/errors.go
index 935661ea..124ee4c6 100644
--- a/dapps/valuetransfers/packages/tangle/errors.go
+++ b/dapps/valuetransfers/packages/tangle/errors.go
@@ -14,4 +14,9 @@ var (
 
 	// ErrDoubleSpendForbidden represents an error that is triggered when a user tries to issue a double spend.
 	ErrDoubleSpendForbidden = errors.New("it is not allowed to issue a double spend")
+
+	// ErrTransactionDoesNotSpendAllFunds is returned if a transaction does not spend all of its inputs.
+	ErrTransactionDoesNotSpendAllFunds = errors.New("transaction does not spend all funds from inputs")
+	// ErrInvalidTransactionSignature is returned if the signature of a transaction is invalid.
+	ErrInvalidTransactionSignature = errors.New("missing or invalid transaction signature")
 )
diff --git a/dapps/valuetransfers/packages/tangle/factory.go b/dapps/valuetransfers/packages/tangle/factory.go
index 106ee55a..1b82b69f 100644
--- a/dapps/valuetransfers/packages/tangle/factory.go
+++ b/dapps/valuetransfers/packages/tangle/factory.go
@@ -30,6 +30,12 @@ func NewValueObjectFactory(tangle *Tangle, tipManager *tipmanager.TipManager) *V
 func (v *ValueObjectFactory) IssueTransaction(tx *transaction.Transaction) (valueObject *payload.Payload, err error) {
 	parent1, parent2 := v.tipManager.Tips()
 
+	// validate the transaction signature
+	if !tx.SignaturesValid() {
+		err = ErrInvalidTransactionSignature
+		return
+	}
+
 	// check if the tx that is supposed to be issued is a double spend
 	tx.Inputs().ForEach(func(outputId transaction.OutputID) bool {
 		v.tangle.TransactionOutput(outputId).Consume(func(output *Output) {
diff --git a/dapps/valuetransfers/packages/tangle/tangle.go b/dapps/valuetransfers/packages/tangle/tangle.go
index 877d9fd0..8a2a9386 100644
--- a/dapps/valuetransfers/packages/tangle/tangle.go
+++ b/dapps/valuetransfers/packages/tangle/tangle.go
@@ -21,13 +21,6 @@ import (
 	"github.com/iotaledger/goshimmer/packages/binary/storageprefix"
 )
 
-var (
-	// ErrTransactionDoesNotSpendAllFunds is returned if a transaction does not spend all of its inputs.
-	ErrTransactionDoesNotSpendAllFunds = errors.New("transaction does not spend all funds from inputs")
-	// ErrInvalidTransactionSignature is returned if the signature of a transaction is invalid.
-	ErrInvalidTransactionSignature = errors.New("invalid transaction signatures")
-)
-
 // Tangle represents the value tangle that consists out of value payloads.
 // It is an independent ontology, that lives inside the tangle.
 type Tangle struct {
-- 
GitLab