Skip to content

Instantly share code, notes, and snippets.

@gyorgybalazsi
Last active May 16, 2022 11:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gyorgybalazsi/11093efa2475361ab9b33a4693c6e7fa to your computer and use it in GitHub Desktop.
Save gyorgybalazsi/11093efa2475361ab9b33a4693c6e7fa to your computer and use it in GitHub Desktop.
Decision
module Main where
import Daml.Script
import DA.List (sortOn, head)
import DA.Time
import DA.Assert ((===))
template Proposal
with
proposer : Party
acceptor : Party
proposal : Text
created : Time
where
signatory proposer, acceptor
observer acceptor
key (acceptor, proposer) : (Party, Party)
maintainer key._1
template Decision
with
acceptor : Party
decision : Text
observers : [Party]
where
signatory acceptor
observer observers
template Ballot
with
acceptor : Party
proposers : [Party]
where
signatory acceptor
observer proposers
nonconsuming choice MakeProposal : ContractId Proposal
with
proposal : Text
proposer : Party
controller proposer
do
now <- getTime
create Proposal with created = now, ..
choice MakeDecision : ContractId Decision
controller acceptor
do
res <- sequence [fetchByKey @Proposal (acceptor,p) | p <- proposers ]
assertMsg "At least one proposer has to make a proposal" $ not . null $ res
let sorted = sortOn (\(k,v) -> v.created) res
let (_, firstProposal) = head sorted
create Decision with decision = firstProposal.proposal, observers = proposers, ..
setup : Script ()
setup = script do
-- user_setup_begin
acceptor <- allocatePartyWithHint "Acceptor" (PartyIdHint "Acceptor")
proposer1 <- allocatePartyWithHint "Proposer1" (PartyIdHint "Proposer1")
proposer2 <- allocatePartyWithHint "Proposer2" (PartyIdHint "Proposer2")
acceptorId <- validateUserId "acceptor"
proposer1Id <- validateUserId "proposer1"
proposer2Id <- validateUserId "proposer2"
createUser (User acceptorId (Some acceptor)) [CanActAs acceptor]
createUser (User proposer1Id (Some proposer1)) [CanActAs proposer1]
createUser (User proposer2Id (Some proposer2)) [CanActAs proposer2]
-- user_setup_end
ballotCid <- submit acceptor $ createCmd Ballot with proposers = [proposer1,proposer2], ..
peopoal1Cid <- submit proposer1 $ exerciseCmd ballotCid MakeProposal with proposer = proposer1, proposal = "Falafel"
now <- getTime
let now' = now `addRelTime` minutes 5
setTime now'
proposal2Cid <- submit proposer2 $ exerciseCmd ballotCid MakeProposal with proposer = proposer2, proposal = "Tacos"
decisionCid <- submit acceptor $ exerciseCmd ballotCid MakeDecision
Some decision <- queryContractId acceptor decisionCid
decision.decision === "Falafel"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment