-- SPDX-FileCopyrightText: 2021 Oxhead Alpha -- SPDX-License-Identifier: LicenseRef-MIT-OA -- | Functions to submit transactions via @octez-client@ and node RPC. module Morley.Client.Action.Transaction ( runTransactions , lRunTransactions -- * Transfer , transfer , lTransfer -- Datatypes for batch transactions , TD (..) , LTransactionData (..) , TransactionData (..) ) where import Lorentz.Constraints import Morley.Client.Action.Common import Morley.Client.Action.Operation import Morley.Client.Logging import Morley.Client.RPC.Class import Morley.Client.RPC.Types import Morley.Client.TezosClient.Class import Morley.Client.Types import Morley.Michelson.Typed qualified as T import Morley.Michelson.Typed.Scope import Morley.Michelson.Untyped.Entrypoints import Morley.Tezos.Address import Morley.Tezos.Address.Alias (AddressOrAlias(..)) import Morley.Tezos.Core (Mutez) -- | Perform sequence of transactions to the contract. Returns operation hash -- and a list of RPC responses, or 'Nothing' in case an empty list was provided. runTransactions :: forall m env. ( HasTezosRpc m , HasTezosClient m , WithClientLog env m ) => ImplicitAddress -> [TransactionData] -> m (Maybe (OperationHash, [OperationInfo Result])) runTransactions sender transactions = runMaybeT do ts <- hoistMaybe $ nonEmpty transactions lift $ second toList <$> runTransactionsNonEmpty sender ts -- | Perform sequence of transactions to the contract. Returns operation hash -- and a list of RPC responses. runTransactionsNonEmpty :: forall m env. ( HasTezosRpc m , HasTezosClient m , WithClientLog env m ) => ImplicitAddress -> NonEmpty TransactionData -> m (OperationHash, NonEmpty (OperationInfo Result)) runTransactionsNonEmpty sender = runOperationsNonEmpty (AddressResolved sender) . map OpTransfer -- | Lorentz version of 'TransactionData'. data LTransactionData where LTransactionData :: forall (t :: Type). NiceParameter t => TD t -> LTransactionData -- | Lorentz version of 'runTransactions' lRunTransactions :: forall m env. ( HasTezosRpc m , HasTezosClient m , WithClientLog env m ) => ImplicitAddress -> [LTransactionData] -> m (Maybe (OperationHash, [OperationInfo Result])) lRunTransactions sender transactions = runTransactions sender $ map convertLTransactionData transactions where convertLTransactionData :: LTransactionData -> TransactionData convertLTransactionData (LTransactionData TD{tdParam=T.toVal -> tdParam, ..}) = TransactionData TD{..} transfer :: forall m t env kind. ( HasTezosRpc m , HasTezosClient m , WithClientLog env m , ParameterScope t , L1AddressKind kind ) => ImplicitAddress -> KindedAddress kind -> Mutez -> EpName -> T.Value t -> Maybe Mutez -> m (OperationHash, [IntOpEvent]) transfer from (Constrained -> tdReceiver) tdAmount tdEpName tdParam tdMbFee = (fmap . second) (getEvents . toList) . runTransactionsNonEmpty from . one $ TransactionData TD{..} where getEvents = concatMap \case OpTransfer i -> i _ -> [] lTransfer :: forall m t env kind. ( HasTezosRpc m , HasTezosClient m , WithClientLog env m , NiceParameter t , L1AddressKind kind ) => ImplicitAddress -> KindedAddress kind -> Mutez -> EpName -> t -> Maybe Mutez -> m (OperationHash, [IntOpEvent]) lTransfer from to amount epName = transfer from to amount epName . T.toVal