Linking Two Templates Together with Custom Record Types
It seems that I have a decent sized Logic error in my application. With many stated variables to be operated against by a Controller with a Choice, they were assigned no values. So @SteveSeow suggested a way to address this, and I have been working through it but have had some weirdness arise.
Fixed: If I do not match the exact Number of Parties in the final Controller/Choice section with the Number of Parties in the next, linking Templates, it fails.
I now also see that if I introduce a custom data record in the first contract like:
data QueryDetails = QueryDetails
with
currentPatient : Bool
covid19Related : Bool
queryName : Party
queryMessage : Text
queryDate : Date
deriving (Eq, Show)
Fixed, well actually removed the Data Record calls: then assign that QueryDetails as a Party in the next Template, it causes that Number of Parties imbalance issue.
Also, incorrect Templates code removed.
So two questions:
- Why am I getting Party numbering conflicts?
- Why is the use of custom data records in a Template causing issues in the next Template?
I read through Workflow factoring and thought it was correct.
Update: The templates now seem to talk to each other correctly, although on execution of the CommenceConsult in the PrescribingPhysician.daml file, I am getting authorization errors:
Last Build Execution: Navigator.log
5:07:03.141 [da-ui-backend-akka.actor.default-dispatcher-7] INFO c.d.n.s.platform.PlatformSubscriber - Command ‘2349414276b63aae’ completed with status ‘CommandStatusError(INVALID_ARGUMENT,Invalid argument: Command interpretation error in LF-DAMLe: Interpretation error: Error: node NodeId(0) (5b500d07f51bfc12c501a88e720e9a4fd34b1aff918a8faa37a27c47bafb84e1:PrescribingPhysician:CommenceConsult) requires authorizers Doctor,Medcentre,Patient, but only Doctor were given. Details: Last location: [DA.Internal.Prelude:378], partial transaction: root node NodeId(0): NodeCreate(ContractId(00fb2177dc86ea67ea125c91abbd0dd2a7019db81608bdd47801cec60fb39dffab),5b500d07f51bfc12c501a88e720e9a4fd34b1aff918a8faa37a27c47bafb84e1:PrescribingPhysician:CommenceConsult,ValueRecord(None,ImmArray((None,ValueParty(Medcentre)),(None,ValueParty(Doctor)),(None,ValueParty(Patient)),(None,ValueRecord(None,ImmArray((None,ValueBool(true)),(None,ValueBool(false)),(None,ValueParty(Johnny Boy)),(None,ValueInt64(3)),(None,ValueDate(2021-10-27)),(None,ValueText(Needs new Right Thumb)),(None,ValueBool(true)),(None,ValueText(Needs walking stick))))))),Simple line of placeholder textSimple line of placeholder text,TreeSet(Doctor, Medcentre, Patient),TreeSet(Doctor, Medcentre, Patient),None,V14).)’. akkaAddress=akka://da-ui-backend, sourceThread=da-ui-backend-akka.actor.default-dispatcher-5, akkaSource=akka://da-ui-backend/user/$a/party-Doctor, sourceActorSystem=da-ui-backend, akkaTimestamp=02:07:03.141UTC
Executing the following Templates, gives me the same result:
- template CommenceConsult
- template ContinueConsult
- template CompleteConsult
PrescribingPhysician:CommenceConsult) requires authorizers Doctor,Medcentre,Patient, but only Doctor were given.
Current CommenceConsult template
type CommenceConsultId = ContractId CommenceConsult -- Test, fail
template CommenceConsult
with
commenceMedcen : Party -- Medcentre OBS?
commenceDoctor : Party -- Doctor SIG
commencePatient : Party -- Patient SIG?
-- commenceDetails : DetailsCommenceConsult -- Data Record
commenceDetails : Text -- As Test
where
agreement
"Simple line of placeholder text"
<> "Simple line of placeholder text"
signatory commenceMedcen, commenceDoctor, commencePatient
controller commenceDoctor can
CommenceConsult_Start : ContractId CommenceConsult -- Doctor; start
do
create CommenceConsult
with
commenceDoctor,
commenceMedcen,
commencePatient,
commenceDetails
CommenceConsult_Cancel : () do return () -- Doctor; cancel
controller commenceMedcen can
CommenceConsult_Stop : () do return () -- Medcen; stop
controller commencePatient can
CommenceConsult_Terminate : () do return () -- Patient; terminate 8-)
controller commenceMedcen can
ContinueConsult_Cease : () do return () -- Doctor; cease
ContinueConsult_Action : ContractId ContinueConsult -- Doctor; action
do
create ContinueConsult
with
continueDoctor = commenceMedcen,
continueMedcen = commenceMedcen,
continuePatient = commencePatient
I have been over these templates a few times, according to daml.yaml, we are at version: 0.3.0 … well if nothing else, at least I am persistent ![]()
I don’t believe you can create composite and custom data type and set them as the values for a create argument that is expecting a Party. Let me and/or others confirm that.
Ah, well that might would explain it then, I’ll wait for an answer.
Update: After much reading, it seems that this is not doable directly. So, until I can work that out, the easy solution is to not use a Data Record to import Data from another Template. Although this issue was not actually causing the prime execution error … at least I have cleared that point up 
Hi @quidagis,
If this is still an issue, would you mind sharing a (small) repro? Preferably in the form of a single module file that includes both your template definitions and a failing test.
As things stand, it’s really hard for me to figure out what you were trying to achieve, what you were actually doing, and what the problem you encountered was. But based on the title, I’d say it should definitely be possible to use a custom record type to transmit data from one contract to another.
PS: Updating the opening message in-line with new information as you seem to have done here (I haven’t seen previous versions) makes it a bit hard to follow what’s going on; adding new information in new messages usually makes it easier to follow for other people, especially if they come to the thread a bit later.
Hi @Gary_Verhaegen Thank you for that reply. I am still wanting to address this but am heartened that it is likely possible. As per your request, I will put something together this week, with one of the specific examples that failed.
Re the updating messages, fair point.