In the previous section we described how the verifyPathConstraints() function calls the verifyPath() function from ContractUtils. In this section you can see how verifyPath() works. You can also see the implementation of VerifyPaths in the cdl-example code repo.

This diagram shows an example of an implementation of VerifyPaths:

From the LedgerTransaction you can establish the Path in the transaction, as well as the status of the Primary input state. From the status of the Primary input state you can establish the set of allowed PathConstraints for the status of that input state. The verifyPath() function then takes the Path and checks it against each PathConstraint. If it can find a PathConstraint which allows the transaction Path then it returns true, if not, it will return false which will cause the verifyPathConstraints() function to throw a verification error.

Looking in detail, you can see the properties in Path and PathConstraint respectively, together with the checks that each PathConstraint property applies to its corresponding Path property:

Then, for the full description, you must add in the additionalStates checks in which each required additionStatesConstraint must be satisfied by at least one of the additionalStates in the transaction: