Finlib tutorial: Temporary account disclosure
Hi, I’m following the finlib transfer tutorials but need a steer on the temporary disclosure exercise please.
My approach has been to add a new choice to the Workflow.Transfer.Request template along the lines of:
nonconsuming choice AddObserver : ContractId Request
with
newObserver : Party
controller receiverAccount.owner
do
(accountCid, _) <- fetchByKey @Account.I receiverAccount
let disclosureCid = toInterfaceContractId accountCid
-- call AddObservers choice on Disclosure using exerciseInterfaceByKey
pure this
However this doesn’t seem to be the right approach. My import of Disclosure:
import Daml.Finance.Interface.Util.Disclosure qualified as Disclosure (I)
fails as it is a member of a hidden package, and I am also not sure that fetchByKey is the correct way to go given that I want an interface Account and I’m not sure how to obtain this from the key. Thanks!
Hi @Ianw1,
Thanks for your question, this is useful feedback.
The hidden package error can be resolved by adding Daml.Finance.Interface.Util as a data dependency in your daml.yaml file. You will also need to include it in the get-dependencies.sh script.
Coming to the actual disclosure logic, your approach does make sense: within the choice, you want to
- fetch the
AccountCidfrom its key - use
toInterfaceContractIdto cast to theDisclosure.Iinterface - exercise the
AddObserverschoice
Given that language support for interface keys is not there yet, we have written a helper function Account.exerciseInterfaceByKey that reproduces the above steps.
Specifically, you can invoke
Account.exerciseInterfaceByKey @Disclosure.I receiverAccount receiverAccount.owner Disclosure.AddObservers
with
disclosers = singleton receiverAccount.owner
observersToAdd = ("Disclosure context", singleton currentOwner)
You will notice that the choice actor receiverAccount.owner is repeated twice:
- the first input is used to fetch the account cid
- the second input is used as input to the
AddObserverschoice
If you are interested in understanding more of the workaround that we used to get key support for interfaces, I tried to explain it here.
That said, your post made me realise that it might not be the best idea to expose new users to this sort of workaround. Hence I might discuss with the team if it makes sense to remove the temporary disclosure exercise until interface key support lands.
Thanks,
Matteo
Thanks @Matteo_Limberto that worked. I did see exerciseInterfaceByKey but didn’t realise I could use it with the Disclosure interface in the above way. I see now that this makes sense!
I think the exercise is fine but maybe just needs a pointer or two for people new to this. Specifically I would say the two points you mentioned above: editing the get-dependencies.sh/daml.yaml and using exerciseInterfaceByKey.
Thanks for the feedback, appreciated!