packages feed

cleveland-0.3.1: src/Test/Cleveland/Internal/Actions/TransferTicket.hs

-- SPDX-FileCopyrightText: 2023 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

{-# OPTIONS_HADDOCK not-home #-}

-- | Machinery for transferring tickets from implicit accounts.
module Test.Cleveland.Internal.Actions.TransferTicket
  ( module Test.Cleveland.Internal.Actions.TransferTicket
  ) where

import Lorentz
import Morley.Client.Types
import Morley.Michelson.Typed (Dict(..), pattern VTicket)
import Morley.Tezos.Address
import Test.Cleveland.Internal.Abstract
import Test.Cleveland.Internal.Actions.MonadOpsInternal
import Test.Cleveland.Lorentz.Types

-- | Transfer tickets.
transferTicket
  :: forall cp vd arg m addr ticketerAddr mname.
     ( MonadOpsInternal m, NiceParameter arg, NiceComparable arg
     , ImplicitAddressParameterHelper addr cp (Ticket arg)
     , ToL1TAddress cp vd addr, ToAddress ticketerAddr
     , HasEntrypointArg cp (EntrypointRef mname) (Ticket arg)
     , HasCallStack
     )
  => addr -> EntrypointRef mname -> ticketerAddr -> arg -> Natural -> m [ContractEvent]
transferTicket to' epRef
  | (Dict, epName) <- useHasEntrypointArg @cp @_ @(Ticket arg) epRef
  = unsafeTransferTicket to' epName
  where _ = Dict @(ImplicitAddressParameterHelper addr cp (Ticket arg))

-- | Transfer tickets without checking the recipient can accept them.
unsafeTransferTicket
  :: forall arg m addr ticketerAddr.
     ( MonadOpsInternal m, NiceParameter arg, NiceComparable arg
     , ToL1Address addr, ToAddress ticketerAddr
     , HasCallStack
     )
  => addr -> EpName -> ticketerAddr -> arg -> Natural -> m [ContractEvent]
unsafeTransferTicket (toL1Address -> ttdTo) ttdEntrypoint (toAddress -> tTicketer) tData tAmount =
  withOpsCap \opsCap -> runSingleOperation opsCap "transfer_ticket" (OpTransferTicket ttData) \case
    OpTransferTicket ops -> Just ops
    _ -> Nothing
  where
    ttdParameter = VTicket tTicketer (toVal tData) tAmount
    ttData = TransferTicketData{..}

-- | Implicit address may only have the root entrypoint, so full parameter type
-- is exactly the argument parameter type. This is used to improve type
-- inference when using 'transferTicket' with implicit addresses.
type family ImplicitAddressParameterHelper addr cp arg :: Constraint where
  ImplicitAddressParameterHelper ImplicitAddress cp arg = cp ~ arg
  ImplicitAddressParameterHelper ImplicitAddressWithAlias cp arg = cp ~ arg
  ImplicitAddressParameterHelper _ _ _ = ()