Skip to content
Snippets Groups Projects
solidifier.go 1.69 KiB
package tangle

import (
	"github.com/iotaledger/goshimmer/packages/errors"
	"github.com/iotaledger/goshimmer/packages/ternary"
)

func UpdateSolidity(transaction *Transaction) (bool, errors.IdentifiableError) {
	// abort if transaction is solid already
	txMetadata, err := transaction.GetMetaData()
	if err != nil {
		return false, err
	} else if txMetadata.GetSolid() {
		return true, nil
	}

	// check solidity of branch transaction if it is not genesis
	if branchTransactionHash := transaction.GetBranchTransactionHash(); branchTransactionHash != ternary.Trinary("999999") {
		// abort if branch transaction is missing
		branchTransaction, err := GetTransaction(branchTransactionHash)
		if err != nil {
			return false, err
		} else if branchTransaction == nil {
			return false, nil
		}

		// abort if branch transaction is not solid
		if branchTransactionMetadata, err := branchTransaction.GetMetaData(); err != nil {
			return false, err
		} else if !branchTransactionMetadata.GetSolid() {
			return false, nil
		}
	}

	// check solidity of branch transaction if it is not genesis
	if trunkTransactionHash := transaction.GetBranchTransactionHash(); trunkTransactionHash != ternary.Trinary("999999") {
		// abort if trunk transaction is missing
		trunkTransaction, err := GetTransaction(trunkTransactionHash)
		if err != nil {
			return false, err
		} else if trunkTransaction == nil {
			return false, nil
		}

		// abort if trunk transaction is not solid
		if trunkTransactionMetadata, err := trunkTransaction.GetMetaData(); err != nil {
			return false, err
		} else if !trunkTransactionMetadata.GetSolid() {
			return false, nil
		}
	}

	// propagate solidity to all approvers
	txMetadata.SetSolid(true)

	return true, nil
}