{-# LANGUAGE DeriveAnyClass, DerivingStrategies #-}
module Lorentz.Value
( Value
, IsoValue (..)
, IsoCValue (..)
, CValue (..)
, Integer
, Natural
, MText
, Bool (..)
, ByteString
, Address
, EpAddress (..)
, Mutez
, Timestamp
, ChainId
, KeyHash
, PublicKey
, Signature
, Set
, Map
, M.BigMap (..)
, M.Operation
, Maybe (..)
, List
, ContractRef (..)
, FutureContract (..)
, EntryPointCall
, SomeEntryPointCall
, toMutez
, mt
, timestampFromSeconds
, timestampFromUTCTime
, timestampQuote
, M.coerceContractRef
, embodyFutureContract
, ToAddress (..)
, ToContractRef (..)
, FromContractRef (..)
, convertContractRef
, Default (..)
) where
import Data.Default (Default(..))
import Data.Kind as Kind
import Lorentz.Constraints
import Michelson.Text
import Michelson.Typed
(ContractRef(..), EntryPointCall, IsoCValue(..), IsoValue(..), SomeEntryPointCall, Value)
import qualified Michelson.Typed as M
import Michelson.Typed.CValue (CValue(..))
import Michelson.Typed.EntryPoints (EpAddress(..))
import Tezos.Address (Address)
import Tezos.Core
(ChainId, Mutez, Timestamp, timestampFromSeconds, timestampFromUTCTime, timestampQuote, toMutez)
import Tezos.Crypto (KeyHash, PublicKey, Signature)
type List = []
newtype FutureContract p = FutureContract { futureContractAddress :: EpAddress }
deriving stock Generic
deriving anyclass IsoValue
embodyFutureContract
:: forall arg.
(NiceParameter arg, HasCallStack)
=> FutureContract arg -> ContractRef arg
embodyFutureContract (FutureContract (EpAddress addr M.NoEpName)) =
withDict (niceParameterEvi @arg) $ ContractRef addr def
embodyFutureContract _ =
error "not implemented for specific entrypoints"
class ToAddress a where
toAddress :: a -> Address
instance ToAddress Address where
toAddress = id
instance ToAddress EpAddress where
toAddress = eaAddress
instance ToAddress (FutureContract cp) where
toAddress = toAddress . futureContractAddress
instance ToAddress (ContractRef cp) where
toAddress = crAddress
class ToContractRef (cp :: Kind.Type) (contract :: Kind.Type) where
toContractRef :: HasCallStack => contract -> ContractRef cp
instance (cp ~ cp') => ToContractRef cp (ContractRef cp') where
toContractRef = id
instance (NiceParameter cp, cp ~ cp') => ToContractRef cp (FutureContract cp') where
toContractRef = embodyFutureContract
instance (NiceParameter cp) => ToContractRef cp EpAddress where
toContractRef = embodyFutureContract . FutureContract
instance (NiceParameter cp) => ToContractRef cp Address where
toContractRef addr = toContractRef $ EpAddress addr def
class FromContractRef (cp :: Kind.Type) (contract :: Kind.Type) where
fromContractAddr :: ContractRef cp -> contract
instance (cp ~ cp') => FromContractRef cp (ContractRef cp') where
fromContractAddr = id
instance (cp ~ cp') => FromContractRef cp (FutureContract cp') where
fromContractAddr = FutureContract . fromContractAddr
instance FromContractRef cp EpAddress where
fromContractAddr (ContractRef addr sepc) = EpAddress addr (M.sepcName sepc)
instance FromContractRef cp Address where
fromContractAddr = eaAddress . fromContractAddr
convertContractRef
:: forall cp contract2 contract1.
(ToContractRef cp contract1, FromContractRef cp contract2)
=> contract1 -> contract2
convertContractRef = fromContractAddr @cp . toContractRef