Hello,
Can someone tell me how can I read in a script the value stored in the agreement
field of a contract?
I can set the value in it, but how can I print it out to the console, to see that the value I am storing in it is correct.
I donβt believe thereβs any way to do this. As far as I can tell, the only way to examine the text in the agreement clause of a Daml template is by looking at the source code of the template.
You can extract the text of the agreement from the contract payload using the agreement
function, see in the Prelude:
class HasAgreement t where
Exposes agreement function. Part of the Template constraint.
agreement
: t β TextThe agreement text of a contract
This is an example template and script:
module Main where
import DA.List (head)
import Daml.Script
type AssetId = ContractId Asset
template Asset
with
issuer : Party
owner : Party
name : Text
where
ensure name /= ""
agreement show issuer <> " has issued an asset of name " <> show name <> " for " <> show owner <> " as owner."
signatory issuer
observer owner
choice Give : AssetId
with
newOwner : Party
controller owner
do create this with
owner = newOwner
setup : Script ()
setup = script do
-- user_setup_begin
alice <- allocatePartyWithHint "Alice" (PartyIdHint "Alice")
bob <- allocatePartyWithHint "Bob" (PartyIdHint "Bob")
aliceId <- validateUserId "alice"
bobId <- validateUserId "bob"
createUser (User aliceId (Some alice)) [CanActAs alice]
createUser (User bobId (Some bob)) [CanActAs bob]
-- user_setup_end
aliceTV <- submit alice do
createCmd Asset with
issuer = alice
owner = alice
name = "TV"
bobTVid <- submit alice do
exerciseCmd aliceTV Give with newOwner = bob
bobTvInstances <- query @Asset bob
debug $ agreement (head bobTvInstances)._2
See the printed agreement text in the transaction view of the script result:
Transactions:
TX 0 1970-01-01T00:00:00Z (Main:36:14)
#0:0
β consumed by: #1:0
β referenced by #1:0
β disclosed to (since): 'Alice' (0)
ββ> 'Alice' creates Main:Asset
with
issuer = 'Alice'; owner = 'Alice'; name = "TV"
TX 1 1970-01-01T00:00:00Z (Main:42:14)
#1:0
β disclosed to (since): 'Alice' (1)
ββ> 'Alice' exercises Give on #0:0 (Main:Asset)
with
newOwner = 'Bob'
children:
#1:1
β disclosed to (since): 'Alice' (1), 'Bob' (1)
ββ> 'Alice' creates Main:Asset
with
issuer = 'Alice'; owner = 'Bob'; name = "TV"
Active contracts: #1:1
Return value: {}
Trace:
"'Alice' has issued an asset of name \"TV\" for 'Bob' as owner."
Thank you @gyorgybalazsi. I stand corrected.
Hi @doron_levi,
As @a_putkov explained, there is no way to access the stored value of the agreement text from within Daml. You can only recompute it with the agreement
function, as @gyorgybalazsi suggested. Note that, since Daml is deterministic, you can be sure that the recomputed version is equal to the stored value.
The only way to see the actual value stored is through the ledger API.
However, be aware that the agreement will be deprecated in 2.9, and it will be gone in 3.0, so it is maybe better to not rely on this feature.