diff --git a/dapps/valuetransfers/packages/tangle/errors.go b/dapps/valuetransfers/packages/tangle/errors.go
index 124ee4c6663fdac70830372b902ec366e1a3c0be..901bb7445429e5c91b253964aad13f3c4e968c5f 100644
--- a/dapps/valuetransfers/packages/tangle/errors.go
+++ b/dapps/valuetransfers/packages/tangle/errors.go
@@ -19,4 +19,6 @@ var (
 	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")
+	// ErrMaxTransactionInputCountExceeded is returned if the max number of inputs of the transaction is exceeded.
+	ErrMaxTransactionInputCountExceeded = errors.New("maximum transaction input count exceeded")
 )
diff --git a/dapps/valuetransfers/packages/tangle/tangle.go b/dapps/valuetransfers/packages/tangle/tangle.go
index 8a2a93861bfad300986a8a632addbea7ce724614..bd262f578658cfbef3b83ccdc1d21d27fc04477b 100644
--- a/dapps/valuetransfers/packages/tangle/tangle.go
+++ b/dapps/valuetransfers/packages/tangle/tangle.go
@@ -1593,6 +1593,11 @@ func (tangle *Tangle) ValidateTransactionToAttach(tx *transaction.Transaction) (
 		return
 	}
 
+	if !tx.InputsCountValid() {
+		err = ErrMaxTransactionInputCountExceeded
+		return
+	}
+
 	if !tx.SignaturesValid() {
 		err = ErrInvalidTransactionSignature
 		return
diff --git a/dapps/valuetransfers/packages/transaction/transaction.go b/dapps/valuetransfers/packages/transaction/transaction.go
index 760ded1db4a41edd801eb03722a6f0aea8d105fa..928827a1f6e93417ee8acddb7029537927522142 100644
--- a/dapps/valuetransfers/packages/transaction/transaction.go
+++ b/dapps/valuetransfers/packages/transaction/transaction.go
@@ -20,6 +20,11 @@ var (
 	ErrMaxDataPayloadSizeExceeded = errors.New("maximum data payload size exceeded")
 )
 
+const (
+	// MaxTransactionInputCount is the maximum number of inputs a transaction can have
+	MaxTransactionInputCount = 100
+)
+
 // region IMPLEMENT Transaction ////////////////////////////////////////////////////////////////////////////////////////////
 
 // Transaction represents a value transfer for IOTA. It consists out of a number of inputs, a number of outputs and their
@@ -172,6 +177,11 @@ func (transaction *Transaction) SignaturesValid() bool {
 	return signaturesValid
 }
 
+// InputsCountValid returns true if the number of inputs in this transaction is not greater than MaxTransactionInputCount.
+func (transaction *Transaction) InputsCountValid() bool {
+	return transaction.inputs.Size() <= MaxTransactionInputCount
+}
+
 // EssenceBytes return the bytes of the transaction excluding the Signatures. These bytes are later signed and used to
 // generate the Signatures.
 func (transaction *Transaction) EssenceBytes() []byte {
diff --git a/dapps/valuetransfers/packages/transaction/transaction_test.go b/dapps/valuetransfers/packages/transaction/transaction_test.go
index d260017163dc87b8fda6f6cfd58e74dd2e304a73..164beb5e6add389b15668ad2f149869b7e8d0c6e 100644
--- a/dapps/valuetransfers/packages/transaction/transaction_test.go
+++ b/dapps/valuetransfers/packages/transaction/transaction_test.go
@@ -204,3 +204,28 @@ func TestPutSignatureInvalid(t *testing.T) {
 	// valid signatures expected
 	assert.Equal(t, true, tx.SignaturesValid())
 }
+
+func TestInputCounts(t *testing.T) {
+	tx1 := createTransaction(MaxTransactionInputCount + 1, 1)
+	assert.False(t, tx1.InputsCountValid())
+
+	tx2 := createTransaction(MaxTransactionInputCount - 1, 1)
+	assert.True(t, tx2.InputsCountValid())
+}
+
+func createTransaction(inputCount int, outputCount int) *Transaction {
+	outputIds := make([]OutputID, 0)
+	for i := 0; i < inputCount; i++ {
+		outputIds = append(outputIds, NewOutputID(address.Random(), RandomID()))
+	}
+	inputs := NewInputs(outputIds...)
+
+	bal := balance.New(balance.ColorIOTA, 1)
+	outputMap := make(map[address.Address][]*balance.Balance)
+	for i := 0; i < outputCount; i++ {
+		outputMap[address.Random()] = []*balance.Balance{bal}
+	}
+	outputs := NewOutputs(outputMap)
+
+	return New(inputs, outputs)
+}
\ No newline at end of file