Basic Contracts

To begin with, you’re going to write a very small Daml template, which represents a self-issued, non-transferable token. Because it’s a minimal template, it isn’t actually useful on its own - you’ll make it more useful later - but it’s enough that it can show you the most basic concepts:

  • Transactions
  • Daml Modules and Files
  • Templates
  • Contracts
  • Signatories

Hint

Remember that you can load all the code for this section into a folder intro1 by running daml new intro1 --template daml-intro-1

Daml Ledger Basics

Like most structures called ledgers, a Daml Ledger is just a list of commits. When we say commit, we mean the final result of when a party successfully submits a transaction to the ledger.

Transaction is a concept we’ll cover in more detail through this introduction. The most basic examples are the creation and archival of a contract.

A contract is active from the point where there is a committed transaction that creates it, up to the point where there is a committed transaction that archives it.

Individual contracts are immutable in the sense that an active contract can not be changed. You can only change the active contract set by creating a new contract, or archiving an old one.

Daml specifies what transactions are legal on a Daml Ledger. The rules the Daml code specifies are collectively called a Daml model or contract model.

Daml Modules and Files

Each .daml file defines a Daml Module at the top:

module Token where

Code comments in Daml are introduced with --:

-- A Daml file defines a module.
module Token where

Templates

A template defines a type of contract that can be created, and who has the right to do so. Contracts are instances of templates.

A simple template
template Token
  with
    owner : Party
  where
    signatory owner

You declare a template starting with the template keyword, which takes a name as an argument.

Daml is whitespace-aware and uses layout to structure blocks. Everything that’s below the first line is indented, and thus part of the template’s body.

Contracts contain data, referred to as the create arguments or simply arguments. The with block defines the data type of the create arguments by listing field names and their types. The single colon : means “of type”, so you can read this as “template Token with a field owner of type Party”.

Token contracts have a single field owner of type Party. The fields declared in a template’s with block are in scope in the rest of the template body, which is contained in a where block.

Signatories

The signatory keyword specifies the signatories of a contract. These are the parties whose authority is required to create the contract or archive it – just like a real contract. Every contract must have at least one signatory.

Furthermore, Daml ledgers guarantee that parties see all transactions where their authority is used. This means that signatories of a contract are guaranteed to see the creation and archival of that contract.

Next Up

In Test Templates Using Daml Script, you’ll learn about how to try out the Token contract template in Daml’s inbuilt Daml Script testing language.