Basic builders

This tutorial introduces the basic claim constructors and shows how to use them to describe a payoff in terms of the future cashflows and other effects between the claim’s owner and their counterparty. At the end of this section, you should be able to model payoffs such as fixed rate bonds and FX forwards.

You can use the PayoffBuilder module to follow along and test the claims described below. When you run the runCreateAndLifecycle script, it will

  • create a Daml Finance Generic instrument wrapping your input claim
  • lifecycle the instrument at the specified dates
  • print out pending cashflows

Builders

Zero

The zero constructor is used to indicate the absence of cashflows and other contractual events. We can setup this very simple initial payoff as follows

    c = zero

    acquisitionDate = date 2023 Aug 01

The acquisition date is used to track the date at which two parties enter the contract and it is a required input to each claim.

One

The one constructor is used to deliver to the owner of the contract one unit of a specified instrument. For instance, the claim

    c = one "USD"

    acquisitionDate = date 2023 Aug 01

gives the owner an “immediate” right to receive one unit of the USD instrument.

We can verify that by lifecycling the claim: we define a set of lifecycle dates

    lifecycleDates =
      [
        date 2023 Aug 01
      , date 2023 Aug 03
      ]

and run the script to obtain

"--- EFFECT on 2023-08-01 ---"
"TARGET INSTRUMENT : MyClaim version 0"
"RECEIVING"
" => 1.0 USD"
"GIVING"

When we lifecycle as of 01 Aug 2023 a payment of 1 USD is received by the owner. This is recorded in the corresponding Effect contract. The claim then becomes worthless (it becomes the zero claim) and any subsequent lifecycling yields no additional effects.

Scale

The scale constructor is used to multiply a claim’s effects by a certain factor.

    c = scale (Const 100.0) $ one "USD"

    acquisitionDate = date 2023 Aug 01

As expected, lifecycling now yields

"--- EFFECT on 2023-08-01 ---"
"TARGET INSTRUMENT : MyClaim version 0"
"RECEIVING"
" => 100.0 USD"
"GIVING"

Give, And

The and constructor is used to sum effects from multiple sub-claims.

give is used to exchange rights and obligations, flipping the direction of effects.

We can define a very simple FX trade as follows, where the owner receives EUR in exchange for USD.

    c1 = scale (Const 90.0) $ one "EUR"
    c2 = scale (Const 100.0) $ one "USD"
    c = c1 `and` (give c2)

    acquisitionDate = date 2023 Aug 01

When the claim is lifecycled, we obtain

"--- EFFECT on 2023-08-01 ---"
"TARGET INSTRUMENT : MyClaim version 0"
"RECEIVING"
" => 90.0 EUR"
"GIVING"
" => 100.0 USD"

When you want to additively combine more than two claims, you can use the andList constructor.

Warning

By default, the and operator is the function defined in the Daml standard library. To use the claim constructor instead, use a qualified import. Alternatively, you can hide the function from the standard library by using the syntax

import Prelude hiding (and)

The same applies to the or operator, which is not covered in this section.

When

The when constructor is used to introduce a time shift, delaying the acquisition of another claim to a point in the future when a certain predicate is met. For instance, the claim

    maturity = date 2023 Aug 31
    c = when (at maturity) $ one "USD"

    acquisitionDate = date 2023 Aug 01

pays one USD once the maturity date is reached, but not before.

When this is lifecycled before maturity, no effect is generated. On the other hand, once we reach maturity we observe

"--- EFFECT on 2023-08-31 ---"
"TARGET INSTRUMENT : MyClaim version 0"
"RECEIVING"
" => 1.0 USD"
"GIVING"

The at function is used to construct a predicate which becomes True exactly at the input date, triggering the acquisition of the sub-claim one "USD".

Structuring financial instruments

Equipped with these basic claim builders, we can already structure a variety of real-world financial instruments.

Fixed Rate Bond

A fixed rate bond pays a fixed interest rate over its term and repays the principal amount at maturity. This can be represented as follows

interestAmount = Const 50.0
principal = Const 100000.0
c = andList [
    when (at d1) $ scale interestAmount $ one "USD"
  , when (at d2) $ scale interestAmount $ one "USD"
  , when (at maturity) $ scale (interestAmount + principal) $ one "USD"
  ]

for d1 d2 maturity.

FX Forward

As an exercise, try to model an FX Forward, which is a contractual agreement between two parties to exchange a pair of currencies at a set rate on a future date.

Summary

You have learned the basic claim constructors and are now able to structure some real-world financial instruments. The next tutorial will introduce Observations, which are used to model time-dependent market observables, such as stock prices and interest rates fixings.