Вам не нужно ничего делать для создания экземпляра Voting
без использования Add
. Voting
определяет своих подписантов как actor, voted
, поэтому, если voted
является пустым или содержит одноэлементную запись, содержащую одну и ту же сторону, то у исходного экземпляра Voting
есть только одна подписавшая сторона. Это означает, что он может быть создан непосредственно actor
без дальнейшего взаимодействия. Я включил упрощенную демонстрацию этого в конце этого ответа.
Учитывая, что вы создали экземпляр Creation
, вы будете иметь копию своего списка избирателей в главной книге. В этот момент, если вы хотите использовать этот список, вам придется либо выполнить выбор по этому контракту, либо прочитать этот контракт из бухгалтерской книги. Последнее можно сделать с помощью fetch
, fetchByKey
, lookup
и lookupByKey
в рамках выбора другого контракта (хотя вам необходимо будет указать либо ключ, либо идентификатор контракта). Однако, так как этот экземпляр шаблона представляет полномочия для создания Voting
экземпляров, рекомендуется представлять эти полномочия непосредственно как выбор для Creation
.
Наконец, если вы измените тип данных voters
с Set
на List
, тогда вам также придется изменить соответствующие функции, которые используют этот параметр. Так, например, S.insert voter voted
должен был бы стать voter :: voted
или подобным.
daml 1.2
module Voting where
import DA.Next.Set as S
import DA.List as L
type Claim = Text
type VotingKey = (Party, Claim)
template Voting
with
actor : Party
claim : Claim
voters : Set Party
voted : Set Party
votes : [Bool]
where
signatory actor, voted
observer voters
key (actor, claim) : VotingKey
maintainer key._1
choice Decide : ContractId Decision
controller actor
do
assertMsg "At least 60% must have voted" $ ((size voters / 100) * 60) <= length votes
let approvals = length $ L.filter identity votes
let disapprovals = length $ L.filter not votes
let accept = approvals > disapprovals
create Decision with actor; claim; voters; accept
choice Vote : ContractId Voting
with
voter : Party
accept : Bool
controller voter
do
assertMsg "Voter not added" $ member voter voters
assertMsg "Voter already voted" . not $ member voter voted
create this with voted = S.insert voter voted; votes = accept :: votes
template Decision
with
actor : Party
claim : Claim
voters : Set Party
accept : Bool
where
signatory actor, voters
test = scenario do
alice <- getParty "Alice"
bob <- getParty "Bob"
charlie <- getParty "Charlie"
alice `submit` create
Voting with
actor = alice
claim = "Pizza"
voters = fromList [ alice, bob, charlie ]
voted = empty
votes = []