I’m trying to understand exceptional semantics and rollback nodes and I found this odd behavior from daml studio v. 2.0 and 2.1.1. In particular, the program below throws a double spend error. From all of my reading of the docs, it seem like it shouldn’t be the case? In particular, it looks like studio believes that transaction #1:3 consumes the contract #0:0? However, #1:3 appears under a rollback node. From Exceptions — Daml SDK 2.1.1 documentation it seems like this should not be a double spend. Am I missing something?
template Foo with owner : Party where signatory owner nonconsuming choice Catch : () controller owner do try do exercise self Fail catch GeneralError _ -> pure () nonconsuming choice Fail : () controller owner do exercise self Archive abort "" test: Script () test = script do a <- allocateParty "a" c <- submit a do createCmd Foo with owner = a submit a do exerciseCmd c Catch submit a do exerciseCmd c Catch
Script execution failed on commit at Main:30:3: Attempt to exercise a consumed contract #0:0 (Main:Foo) Consumed by: #1:3 Ledger time: 1970-01-01T00:00:00Z Partial transaction: Committed transactions: TX 0 1970-01-01T00:00:00Z (Main:25:8) #0:0 │ consumed by: #1:3 │ referenced by #1:0, #1:2, #1:3 │ known to (since): 'a' (0) └─> create Main:Foo with owner = 'a' TX 1 1970-01-01T00:00:00Z (Main:28:3) #1:0 │ known to (since): 'a' (1) └─> 'a' exercises Catch on #0:0 (Main:Foo) with children: #1:1 │ known to (since): 'a' (1) └─> rollback children: #1:2 │ known to (since): 'a' (1) └─> 'a' exercises Fail on #0:0 (Main:Foo) with children: #1:3 │ known to (since): 'a' (1) └─> 'a' exercises Archive on #0:0 (Main:Foo) with