Sjoerd1234
Sjoerd1234

Reputation: 148

DAML: Create a template in scenario requiring a ContractId as input and exercise a choice automatically after submit

I have 2 questions regarding DAML the possibility of automated choices and scenario. I have this template that requires the input of a ContractId:

template Create_Creation
  with     
    current_login     : Party
    artist            : Party
    title             : Text
    votingRight       : Set Party
    observers_list_id : ContractId Observers
  where 
    signatory current_login

I need to create some of these templates in scenario, but am unable to specify a ContractId (like #0:0), giving me errors such as: Couldn't match expected type 'ContractId Observers' with actual type 'Text' Is it possible to specify a ContractId in scenario?

Next, in the above template I have a choice defined called Load_all_creation_observers that creates a template Creation and loads the observers specified in template Observers into it as observers:

 choice Load_all_creation_observers : ContractId Creation 
      controller current_login
      do
        observers_list <- fetch observers_list_id
        create Creation with created_by = current_login; artist = artist; title = title;
        votingRight = votingRight; observers_list_id = observers_list_id; observers = observers_list.observers

template Observers
  with 
    superuser : Party
    observers : Set Party
  where 
    signatory superuser
    observer observers

As the code stands now, when a user creates a Create_Creation template he is required to perform the Load_all_creation_observers choice to create the Creation template with all the observers loaded into it. Is it possible to perform this choice automatically when a user submits the Create_Creation template? or maybe not make it a choice at all and define it as automated functionality like you would do in normal programming languages (if statements). You can only seem to define do functions in choices.

Upvotes: 1

Views: 290

Answers (2)

cocreature
cocreature

Reputation: 811

Given that the question about contract ids has already been answered, I’ll focus on your second question.

You cannot execute a choice automatically (you could have some off-ledger automation, e.g. a DAML trigger that does that but you don’t get any atomicity guarantees in that case). The way I would solve this problem is to define a new template with a single choice and then call that choice using CreateAndExercise on the ledger API. This is pretty much equivalent to defining a top-level function. For your example this would look something like the following

template CreateCreationTemplate
  with
    p : Party
  where
   signatory p
   choice CreateCreation : ContractId Creation
     with
      observers_list_id : ContractId Observers
      artist : Party
      title : Text
      votingRight : Set Party
     do observers_list <- fetch observers_list_id
        create Creation with
          created_by = p
          artist = artist
          title = title
          votingRight = votingRight
          observers_list_id = observers_list_id
          observers = observers_list.observers

You could have some of the fields of the choice as fields of a template but as a general guideline, I tend to only have the party as a field of the template when emulating top-level functions.

Depending on your usage, it is also possible to have a single “factory” template with a non-consuming CreateCreation choice.

Upvotes: 2

Recurse
Recurse

Reputation: 3585

In a scenario, the only contracts that exist on the ledger are those that have been created thus far in that scenario. So if there is an Observers contractId an Observers contract must have been created at some previous point in the scenario.

ContractIds are opaque and definitely not predictable, so it makes no sense to think of a contract-id literal. Instead, when the contract is created, bind the resulting id at that point. Ie.

  test = scenario do
    su <- getParty "Super User"
    obsId <- su submit create Observers with ...
    p1 <- getParty "Party 1"
    ccId <- p1 submit create Create_Creation with ...; observers_list_id = obsId

Upvotes: 1

Related Questions