Help Interpret Error Message
Trying to write Triggers,
/Users/maxhsu/Desktop/projects/wallet-refapp/triggers/daml/AcceptSwapTrigger.daml:34:21: error:
• No instance for (DA.Internal.Record.HasField
“asset” (Optional AssetInSwap) Asset.Asset)
arising from a use of ‘getField’
• In the ‘asset’ field of a record
In the third argument of ‘T.dedupExerciseByKey’, namely
‘Preapprove_Transfer_In {asset = (getField @“asset” offeredAsset)}’
In the expression:
T.dedupExerciseByKey
@AssetHoldingAccount
((getField @“assetType” (getField @“asset” offeredAsset)), p)
Preapprove_Transfer_In {asset = (getField @“asset” offeredAsset)}typecheck
acceptSwapTrigger: T.Trigger ()
acceptSwapTrigger = T.Trigger
{ initialize = pure (),
updateState = \_ -> pure (),
registeredTemplates = T.RegisteredTemplates [T.registeredTemplate @Trade, T.registeredTemplate @AssetHoldingAccount, T.registeredTemplate @TransferPreApproval],
rule = \p -> do
tradeRequests <- T.query @Trade
let isMe = (\tradeRequests -> tradeRequests.receiver == p)
let meList = filter (\(_, contract) -> isMe contract) tradeRequests
debug ("asset holding account invites", meList)
unless ( DA.Foldable.null meList ) do
case meList of
[] -> pure ()
(cid, c) :: _ -> do
optOfferedAsset <- T.queryContractId c.offeredAssetCid
let offeredAsset = (fromSome optOfferedAsset)
transferPreApproval <- T.queryContractId c.requestedAssetsTxPreApprovalCid
if(isSome offeredAsset) then
T.dedupExerciseByKey @AssetHoldingAccount (offeredAsset.asset.assetType, p) Preapprove_Transfer_In with
asset = offeredAsset.asset
else
debug "NOPE"
debug $ "TRIGGERED",
heartbeat = None
}
offeredAsset has the type
offeredAsset
: Optional (Optional AssetInSwap) -> Optional AssetInSwap
In my test scripts, I’m able to do
optOfferedAsset <- queryContractId alice trade.offeredAssetCid
let offeredAsset = (fromSome optOfferedAsset).asset
It turns the optional optOfferedAsset optOfferedAsset : Optional AssetInSwap
to
type offeredAsset : Asset
But I can’t do that in the trigger. Hence I’m trying the isSome
fromSome will crash if the value is None and otherwise give you back the underlying value. But then you’re checking if the result of fromSome, i…e, offeredAsset is Some which is a type error because offeredAsset is of type OfferedAsset.
Instead drop the fromSome and pattern match:
optOfferedAsset <- T.queryContractId c.offeredAssetCid
case optOfferedAsset of
Some offeredAsset ->
T.dedupExerciseByKey @AssetHoldingAccount (offeredAsset.asset.assetType, p) Preapprove_Transfer_In with
asset = offeredAsset.asset
else
debug "NOPE"
