-
Notifications
You must be signed in to change notification settings - Fork 2
/
Facts.daml
134 lines (111 loc) · 3.9 KB
/
Facts.daml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
-- Copyright (c) 2020, Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
-- SPDX-License-Identifier: Apache-2.0
daml 1.2
module Facts where
import RefData
{- ------------- Price Result -------------
An agreed fact on the price of an asset
-}
template PriceResult
with
partyA : Party
partyB : Party
ruleId : Text
assetProvider : Party
assetSymbol : Text
refDataIssuer : Party
refDataVersion : Int
price : Decimal
where
signatory partyA
signatory partyB
let
getAndCheckPriceRefData (refDataCid : ContractId PriceRefData) : Update Bool = do
refData <- fetch refDataCid
assertMsg "Reference data does not match result."
( refData.issuer == refDataIssuer
&& refData.assetProvider == assetProvider
&& refData.assetSymbol == assetSymbol )
return (refData.version == refDataVersion)
controller partyA can
nonconsuming CheckA
: Bool
with refDataCid: ContractId PriceRefData
do getAndCheckPriceRefData refDataCid
ArchiveA
: ()
with refDataCid: ContractId PriceRefData
do
checkResults <- getAndCheckPriceRefData refDataCid
assertMsg "Result is still valid. Cannot archive." (not checkResults)
controller partyB can
nonconsuming CheckB
: Bool
with refDataCid: ContractId PriceRefData
do getAndCheckPriceRefData refDataCid
ArchiveB
: ()
with refDataCid: ContractId PriceRefData
do
checkResults <- getAndCheckPriceRefData refDataCid
assertMsg "Result is still valid. Cannot archive." (not checkResults)
checkPriceResult : (Party) -> (ContractId PriceResult) -> (ContractId PriceRefData) -> Update Bool
checkPriceResult party priceResultCid refDataCid = do
pr <- do fetch priceResultCid
if party == pr.partyA then
do exercise priceResultCid CheckA with refDataCid
else
do exercise priceResultCid CheckB with refDataCid
{- ------------- Rule Result -------------
An agreed fact on the evaluation result of a rule
-}
template RuleResult
with
partyA : Party
partyB : Party
ruleId : Text
assetProvider : Party
assetSymbol : Text
refDataIssuer : Party
refDataVersion : Int
result : Bool
where
signatory partyA
signatory partyB
let
getAndCheckAssetRefData (refDataCid : ContractId AssetRefData) : Update Bool = do
refData <- fetch refDataCid
assertMsg "Reference data does not match result."
( refData.issuer == refDataIssuer
&& refData.assetProvider == assetProvider
&& refData.assetSymbol == assetSymbol )
return (refData.version == refDataVersion)
controller partyA can
nonconsuming RR_CheckA
: Bool
with refDataCid: ContractId AssetRefData
do getAndCheckAssetRefData refDataCid
RR_ArchiveA
: ()
with refDataCid: ContractId AssetRefData
do
checkResults <- getAndCheckAssetRefData refDataCid
assertMsg "Result is still valid. Cannot archive." (not checkResults)
controller partyB can
nonconsuming RR_CheckB
: Bool
with refDataCid: ContractId AssetRefData
do getAndCheckAssetRefData refDataCid
RR_ArchiveB
: ()
with refDataCid: ContractId AssetRefData
do
checkResults <- getAndCheckAssetRefData refDataCid
assertMsg "Result is still valid. Cannot archive." (not checkResults)
checkRuleResult : (Party) -> (ContractId RuleResult) -> (ContractId AssetRefData) -> Update Bool
checkRuleResult party ruleResultCid refDataCid = do
rr <- do fetch ruleResultCid
if party == rr.partyA then
do exercise ruleResultCid RR_CheckA with refDataCid
else
do exercise ruleResultCid RR_CheckB with refDataCid