# Covenants

In Mel's [data model](https://docs.melproject.org/concepts/data-model), every coin/UTXO is locked by a *covenant*, or a program that constrains what sort of transaction can spend it. Common covenants include:

* Checking that a transaction is signed by a particular public key
* Checking that a transaction is signed by some subset of keys (a *multisig* covenant)
* Encoding arbitrary stateful logic using *self-propagating* covenants

On the blockchain level, covenants are written in the low-level [MelVM](https://docs.melproject.org/resources/melvm-spec) language, but in practice covenants are programmed using the high-level [Melodeon](https://melodeonlang.org/) language. More info on specific programming patterns can be found in the [Melodeon guide](https://guide.melodeonlang.org/).
