morley 1.19.1 → 1.19.2
raw patch · 92 files changed
+6796/−5775 lines, 92 filesdep +prettyprinterdep −fmtdep −wl-pprint-textdep ~vinylPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: prettyprinter
Dependencies removed: fmt, wl-pprint-text
Dependency ranges changed: vinyl
API changes (from Hackage documentation)
- Morley.Micheline.Class: instance Formatting.Buildable.Buildable Morley.Micheline.Class.FromExpressionError
- Morley.Micheline.Class: instance Morley.Micheline.Class.FromExp x op => Morley.Micheline.Class.FromExp x (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Micheline.Class: instance Morley.Micheline.Class.FromExp x op => Morley.Micheline.Class.FromExp x (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Micheline.Class: instance Morley.Michelson.Typed.Scope.HasNoOp t => Morley.Micheline.Class.ToExpression (Morley.Michelson.Typed.Aliases.Value t)
- Morley.Micheline.Expression: MichelinePrimitive :: Text -> MichelinePrimitive
- Morley.Micheline.Expression: instance Data.Aeson.Types.FromJSON.FromJSON Morley.Micheline.Expression.MichelinePrimitive
- Morley.Micheline.Expression: instance Data.Aeson.Types.ToJSON.ToJSON Morley.Micheline.Expression.MichelinePrimitive
- Morley.Micheline.Expression: instance Data.Data.Data Morley.Micheline.Expression.MichelinePrimitive
- Morley.Micheline.Expression: instance Data.String.IsString Morley.Micheline.Expression.MichelinePrimitive
- Morley.Micheline.Expression: instance Formatting.Buildable.Buildable Morley.Micheline.Expression.Expression
- Morley.Micheline.Expression: instance GHC.Classes.Eq Morley.Micheline.Expression.MichelinePrimitive
- Morley.Micheline.Expression: instance GHC.Classes.Ord Morley.Micheline.Expression.MichelinePrimitive
- Morley.Micheline.Expression: instance GHC.Show.Show Morley.Micheline.Expression.MichelinePrimitive
- Morley.Micheline.Expression: instance Language.Haskell.TH.Syntax.Lift Morley.Micheline.Expression.MichelinePrimitive
- Morley.Micheline.Expression: michelsonPrimitive :: Seq Text
- Morley.Micheline.Expression: newtype MichelinePrimitive
- Morley.Micheline.Json: instance Formatting.Buildable.Buildable Morley.Micheline.Json.TezosInt64
- Morley.Micheline.Json: instance Formatting.Buildable.Buildable Morley.Micheline.Json.TezosNat
- Morley.Michelson.Analyzer: instance Formatting.Buildable.Buildable Morley.Michelson.Analyzer.AnalyzerRes
- Morley.Michelson.Doc: instance Formatting.Buildable.Buildable Morley.Michelson.Doc.DocItemPos
- Morley.Michelson.ErrorPos: instance Formatting.Buildable.Buildable Morley.Michelson.ErrorPos.ErrorSrcPos
- Morley.Michelson.ErrorPos: instance Formatting.Buildable.Buildable Morley.Michelson.ErrorPos.SrcPos
- Morley.Michelson.ErrorPos: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Michelson.ErrorPos.ErrorSrcPos
- Morley.Michelson.Internal.ViewName: instance Formatting.Buildable.Buildable Morley.Michelson.Internal.ViewName.BadViewNameError
- Morley.Michelson.Internal.ViewName: instance Formatting.Buildable.Buildable Morley.Michelson.Internal.ViewName.ViewName
- Morley.Michelson.Internal.ViewsSet: instance Formatting.Buildable.Buildable Morley.Michelson.Internal.ViewsSet.ViewsSetError
- Morley.Michelson.Interpret: EvalOp :: ExceptT (MichelsonFailureWithStack Void) (RWS ContractEnv MorleyLogsBuilder InterpreterState) a -> EvalOp a
- Morley.Michelson.Interpret: StkEl :: Value t -> StkEl t
- Morley.Michelson.Interpret: instance Control.Monad.Error.Class.MonadError (Morley.Michelson.Interpret.MichelsonFailureWithStack Data.Void.Void) Morley.Michelson.Interpret.EvalOp
- Morley.Michelson.Interpret: instance Control.Monad.Reader.Class.MonadReader Morley.Michelson.Interpret.ContractEnv Morley.Michelson.Interpret.EvalOp
- Morley.Michelson.Interpret: instance Control.Monad.State.Class.MonadState Morley.Michelson.Interpret.InterpreterState Morley.Michelson.Interpret.EvalOp
- Morley.Michelson.Interpret: instance Control.Monad.Writer.Class.MonadWriter Morley.Michelson.Interpret.MorleyLogsBuilder Morley.Michelson.Interpret.EvalOp
- Morley.Michelson.Interpret: instance Formatting.Buildable.Buildable Morley.Michelson.Interpret.MorleyLogs
- Morley.Michelson.Interpret: instance Formatting.Buildable.Buildable Morley.Michelson.Interpret.RemainingSteps
- Morley.Michelson.Interpret: instance Formatting.Buildable.Buildable Morley.Michelson.Interpret.ViewLookupError
- Morley.Michelson.Interpret: instance Formatting.Buildable.Buildable ext => Formatting.Buildable.Buildable (Morley.Michelson.Interpret.InterpretError ext)
- Morley.Michelson.Interpret: instance Formatting.Buildable.Buildable ext => Formatting.Buildable.Buildable (Morley.Michelson.Interpret.MichelsonFailed ext)
- Morley.Michelson.Interpret: instance Formatting.Buildable.Buildable ext => Formatting.Buildable.Buildable (Morley.Michelson.Interpret.MichelsonFailureWithStack ext)
- Morley.Michelson.Interpret: instance GHC.Base.Applicative Morley.Michelson.Interpret.EvalOp
- Morley.Michelson.Interpret: instance GHC.Base.Functor Morley.Michelson.Interpret.EvalOp
- Morley.Michelson.Interpret: instance GHC.Base.Monad Morley.Michelson.Interpret.EvalOp
- Morley.Michelson.Interpret: instance GHC.Classes.Eq (Morley.Michelson.Interpret.StkEl t)
- Morley.Michelson.Interpret: instance GHC.Show.Show (Morley.Michelson.Interpret.StkEl t)
- Morley.Michelson.Interpret: instance Morley.Michelson.Interpret.InterpreterStateMonad Morley.Michelson.Interpret.EvalOp
- Morley.Michelson.Interpret: newtype EvalOp a
- Morley.Michelson.Interpret: newtype StkEl t
- Morley.Michelson.Macro: expandList :: [ParsedOp] -> [ExpandedOp]
- Morley.Michelson.Macro: instance Formatting.Buildable.Buildable Morley.Michelson.Macro.CadrStruct
- Morley.Michelson.Macro: instance Formatting.Buildable.Buildable Morley.Michelson.Macro.Macro
- Morley.Michelson.Macro: instance Formatting.Buildable.Buildable Morley.Michelson.Macro.PairStruct
- Morley.Michelson.Macro: instance Formatting.Buildable.Buildable Morley.Michelson.Macro.ParsedOp
- Morley.Michelson.Macro: instance Formatting.Buildable.Buildable Morley.Michelson.Macro.UnpairStruct
- Morley.Michelson.Optimizer: instance Data.Default.Class.Default Morley.Michelson.Optimizer.Ruleset
- Morley.Michelson.Optimizer: instance Formatting.Buildable.Buildable Morley.Michelson.Optimizer.OptimizationStage
- Morley.Michelson.Optimizer: instance Formatting.Buildable.Buildable Morley.Michelson.Optimizer.OptimizerStageStats
- Morley.Michelson.Optimizer: instance GHC.Base.Monoid Morley.Michelson.Optimizer.Ruleset
- Morley.Michelson.Optimizer: instance GHC.Base.Semigroup Morley.Michelson.Optimizer.Ruleset
- Morley.Michelson.Optimizer: instance GHC.Classes.Eq Morley.Michelson.Optimizer.OptimizationStage
- Morley.Michelson.Optimizer: instance GHC.Classes.Ord Morley.Michelson.Optimizer.OptimizationStage
- Morley.Michelson.Optimizer: orRule :: (Rule -> Rule) -> (Rule -> Rule) -> Rule -> Rule
- Morley.Michelson.Optimizer: orSimpleRule :: (Rule -> Rule) -> Rule -> Rule -> Rule
- Morley.Michelson.Parser.Error: instance Formatting.Buildable.Buildable Morley.Michelson.Parser.Error.ParserException
- Morley.Michelson.Parser.Instr: ops' :: Parser ParsedOp -> Parser [ParsedOp]
- Morley.Michelson.Parser.Types: instance Formatting.Buildable.Buildable Morley.Michelson.Parser.Types.MichelsonSource
- Morley.Michelson.Runtime: instance (Data.Typeable.Internal.Typeable a, GHC.Show.Show a, Formatting.Buildable.Buildable a) => GHC.Exception.Type.Exception (Morley.Michelson.Runtime.ExecutorError' a)
- Morley.Michelson.Runtime: instance Formatting.Buildable.Buildable Morley.Michelson.Runtime.ExecutorOp
- Morley.Michelson.Runtime: instance Formatting.Buildable.Buildable a => Formatting.Buildable.Buildable (Morley.Michelson.Runtime.ExecutorError' a)
- Morley.Michelson.Runtime.GState: instance Formatting.Buildable.Buildable Morley.Michelson.Runtime.GState.BigMapCounter
- Morley.Michelson.Runtime.GState: instance Formatting.Buildable.Buildable Morley.Michelson.Runtime.GState.ContractState
- Morley.Michelson.Runtime.GState: instance Formatting.Buildable.Buildable Morley.Michelson.Runtime.GState.GStateUpdate
- Morley.Michelson.Runtime.GState: instance Formatting.Buildable.Buildable Morley.Michelson.Runtime.GState.GStateUpdateError
- Morley.Michelson.Runtime.GState: instance Formatting.Buildable.Buildable Morley.Michelson.Runtime.GState.ImplicitState
- Morley.Michelson.Runtime.GState: instance Formatting.Buildable.Buildable Morley.Michelson.Runtime.GState.TicketKey
- Morley.Michelson.Runtime.Import: instance Formatting.Buildable.Buildable Morley.Michelson.Runtime.Import.ContractReadError
- Morley.Michelson.Runtime.Import: instance Formatting.Buildable.Buildable Morley.Michelson.Runtime.Import.ValueReadError
- Morley.Michelson.Text: instance Formatting.Buildable.Buildable Morley.Michelson.Text.MText
- Morley.Michelson.TypeCheck.Error: instance Formatting.Buildable.Buildable Morley.Michelson.TypeCheck.Error.ExtError
- Morley.Michelson.TypeCheck.Error: instance Formatting.Buildable.Buildable Morley.Michelson.TypeCheck.Error.StackSize
- Morley.Michelson.TypeCheck.Error: instance Formatting.Buildable.Buildable Morley.Michelson.TypeCheck.Error.TcTypeError
- Morley.Michelson.TypeCheck.Error: instance Formatting.Buildable.Buildable Morley.Michelson.TypeCheck.Error.TopLevelType
- Morley.Michelson.TypeCheck.Error: instance Formatting.Buildable.Buildable Morley.Michelson.TypeCheck.Error.TypeContext
- Morley.Michelson.TypeCheck.Error: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Michelson.TypeCheck.Error.TcTypeError
- Morley.Michelson.TypeCheck.Error: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Michelson.TypeCheck.Error.TopLevelType
- Morley.Michelson.TypeCheck.Error: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Michelson.TypeCheck.Error.TypeContext
- Morley.Michelson.TypeCheck.Error: instance Morley.Michelson.Printer.Util.RenderDoc op => Formatting.Buildable.Buildable (Morley.Michelson.TypeCheck.Error.TcError' op)
- Morley.Michelson.TypeCheck.Error: instance Morley.Michelson.Printer.Util.RenderDoc op => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.TypeCheck.Error.TcError' op)
- Morley.Michelson.TypeCheck.TypeCheck: instance Formatting.Buildable.Buildable Morley.Michelson.TypeCheck.TypeCheck.SomeParamType
- Morley.Michelson.TypeCheck.Types: instance Formatting.Buildable.Buildable (Morley.Michelson.TypeCheck.Types.HST ts)
- Morley.Michelson.TypeCheck.Types: instance Formatting.Buildable.Buildable (Morley.Michelson.TypeCheck.Types.SomeTcInstr inp)
- Morley.Michelson.TypeCheck.Types: instance Formatting.Buildable.Buildable (Morley.Michelson.TypeCheck.Types.SomeTcInstrOut inp)
- Morley.Michelson.TypeCheck.Types: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.TypeCheck.Types.HST ts)
- Morley.Michelson.Typed: BigMapAbsent :: BigMapPresence (t :: T)
- Morley.Michelson.Typed: BigMapPresent :: BigMapPresence (t :: T)
- Morley.Michelson.Typed: ContractAbsent :: ContractPresence (t :: T)
- Morley.Michelson.Typed: ContractPresent :: ContractPresence (t :: T)
- Morley.Michelson.Typed: NestedBigMapsAbsent :: NestedBigMapsPresence (t :: T)
- Morley.Michelson.Typed: NestedBigMapsPresent :: NestedBigMapsPresence (t :: T)
- Morley.Michelson.Typed: OpAbsent :: OpPresence (t :: T)
- Morley.Michelson.Typed: OpPresent :: OpPresence (t :: T)
- Morley.Michelson.Typed: TicketAbsent :: TicketPresence (t :: T)
- Morley.Michelson.Typed: TicketPresent :: TicketPresence (t :: T)
- Morley.Michelson.Typed: UnsafeViewsSet :: Map ViewName (SomeView' instr st) -> ViewsSet' instr st
- Morley.Michelson.Typed: data BigMapPresence (t :: T)
- Morley.Michelson.Typed: data ContractPresence (t :: T)
- Morley.Michelson.Typed: data NestedBigMapsPresence (t :: T)
- Morley.Michelson.Typed: data OpPresence (t :: T)
- Morley.Michelson.Typed: data TicketPresence (t :: T)
- Morley.Michelson.Typed: haskellRepStripFieldPrefix :: TypeDocHaskellRep a -> TypeDocHaskellRep a
- Morley.Michelson.Typed: mapEntriesOrdered :: Contract' instr cp st -> (ParamNotes cp -> a) -> (Notes st -> a) -> (ContractCode' instr cp st -> a) -> (forall arg ret. View' instr arg st ret -> a) -> [a]
- Morley.Michelson.Typed: type ComparableSuperC _ = ();
- Morley.Michelson.Typed: type UntypedValScope t = (SingI t, HasNoOp t)
- Morley.Michelson.Typed: type WellTypedSuperC _ = ();
- Morley.Michelson.Typed.AnnotatedValue: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.AnnotatedValue.AnnotatedValue v)
- Morley.Michelson.Typed.AnnotatedValue: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.AnnotatedValue.SomeAnnotatedValue
- Morley.Michelson.Typed.Annotation: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Annotation.Notes t)
- Morley.Michelson.Typed.Arith: instance (Formatting.Buildable.Buildable n, Formatting.Buildable.Buildable m) => Formatting.Buildable.Buildable (Morley.Michelson.Typed.Arith.ArithError n m)
- Morley.Michelson.Typed.Arith: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Arith.MutezArithErrorType
- Morley.Michelson.Typed.Arith: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Arith.ShiftArithErrorType
- Morley.Michelson.Typed.ClassifiedInstr.Internal.TH: toName :: forall a. (Enum a, Show a) => a -> Name
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.InstrClassSym1 a6989586621679381004)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.InstrClassSym2 a6989586621679381004 a6989586621679381005)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.InstrClassSym3 a6989586621679381004 a6989586621679381005 a6989586621679381006)
- Morley.Michelson.Typed.Contract: mapEntriesOrdered :: Contract' instr cp st -> (ParamNotes cp -> a) -> (Notes st -> a) -> (ContractCode' instr cp st -> a) -> (forall arg ret. View' instr arg st ret -> a) -> [a]
- Morley.Michelson.Typed.Convert: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Instr.Instr inp out)
- Morley.Michelson.Typed.Convert: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' Morley.Michelson.Typed.Instr.Instr t)
- Morley.Michelson.Typed.Convert: instance Morley.Michelson.Typed.Scope.HasNoOp t => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Typed.Value.Value' Morley.Michelson.Typed.Instr.Instr t)
- Morley.Michelson.Typed.Entrypoints: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Entrypoints.EntrypointCallT param arg)
- Morley.Michelson.Typed.Entrypoints: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Entrypoints.EpLiftSequence arg param)
- Morley.Michelson.Typed.Entrypoints: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Entrypoints.SomeEntrypointCallT arg)
- Morley.Michelson.Typed.Entrypoints: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Entrypoints.ArmCoord
- Morley.Michelson.Typed.Entrypoints: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Entrypoints.EpAddress
- Morley.Michelson.Typed.Entrypoints: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Entrypoints.ParamEpError
- Morley.Michelson.Typed.Entrypoints: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Entrypoints.ParseEpAddressError
- Morley.Michelson.Typed.Entrypoints: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Michelson.Typed.Entrypoints.ArmCoord
- Morley.Michelson.Typed.Entrypoints: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Michelson.Typed.Entrypoints.ParamEpError
- Morley.Michelson.Typed.Entrypoints: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Michelson.Typed.Entrypoints.ParseEpAddressError
- Morley.Michelson.Typed.Existential: instance (forall (t :: Morley.Michelson.Typed.T.T). cs t => Morley.Michelson.Typed.Scope.HasNoOp t) => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Typed.Existential.SomeConstrainedValue cs)
- Morley.Michelson.Typed.Haskell: haskellRepStripFieldPrefix :: TypeDocHaskellRep a -> TypeDocHaskellRep a
- Morley.Michelson.Typed.Haskell.Doc: haskellRepStripFieldPrefix :: TypeDocHaskellRep a -> TypeDocHaskellRep a
- Morley.Michelson.Typed.Haskell.Doc: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Haskell.Doc.DType
- Morley.Michelson.Typed.Haskell.Doc: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Haskell.Doc.DocTypeRepLHS
- Morley.Michelson.Typed.Haskell.Value: instance (GHC.Classes.Ord k, Formatting.Buildable.Buildable k, Formatting.Buildable.Buildable v) => Formatting.Buildable.Buildable (Morley.Michelson.Typed.Haskell.Value.BigMap k v)
- Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Haskell.Value.HasNoOpToT arg, Morley.Michelson.Typed.Scope.HasNoNestedBigMaps (Morley.Michelson.Typed.Haskell.Value.ToT arg), Morley.Michelson.Typed.Haskell.Value.WellTypedToT arg) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Haskell.Value.ContractRef arg)
- Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Scope.Comparable (Morley.Michelson.Typed.Haskell.Value.ToT a), Morley.Michelson.Typed.Haskell.Value.IsoValue a) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Haskell.Value.Ticket a)
- Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Scope.Comparable (Morley.Michelson.Typed.Haskell.Value.ToT c), GHC.Classes.Ord c, Morley.Michelson.Typed.Haskell.Value.IsoValue c) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Data.Set.Internal.Set c)
- Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Scope.Comparable (Morley.Michelson.Typed.Haskell.Value.ToT k), GHC.Classes.Ord k, Morley.Michelson.Typed.Haskell.Value.IsoValue k, Morley.Michelson.Typed.Haskell.Value.IsoValue v) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Data.Map.Internal.Map k v)
- Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Scope.Comparable (Morley.Michelson.Typed.Haskell.Value.ToT k), GHC.Classes.Ord k, Morley.Michelson.Typed.Haskell.Value.IsoValue k, Morley.Michelson.Typed.Haskell.Value.IsoValue v, Morley.Michelson.Typed.Haskell.Value.HasNoBigMapToT v, Morley.Michelson.Typed.Haskell.Value.HasNoOpToT v) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Haskell.Value.BigMap k v)
- Morley.Michelson.Typed.Haskell.Value: instance Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Haskell.Value.ContractRef arg) => Formatting.Buildable.Buildable (Morley.Michelson.Typed.Haskell.Value.ContractRef arg)
- Morley.Michelson.Typed.Haskell.Value: instance Morley.Michelson.Typed.Scope.WellTyped t => Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Aliases.Value t)
- Morley.Michelson.Typed.Haskell.Value: instance forall k1 (k2 :: k1) k3 (v :: k3). Formatting.Buildable.Buildable (Morley.Michelson.Typed.Haskell.Value.BigMapId k2 v)
- Morley.Michelson.Typed.Instr: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Instr.StackRef st)
- Morley.Michelson.Typed.Scope: -- | Constraints required for instance of a given type.
- Morley.Michelson.Typed.Scope: BigMapAbsent :: BigMapPresence (t :: T)
- Morley.Michelson.Typed.Scope: BigMapPresent :: BigMapPresence (t :: T)
- Morley.Michelson.Typed.Scope: ContractAbsent :: ContractPresence (t :: T)
- Morley.Michelson.Typed.Scope: ContractPresent :: ContractPresence (t :: T)
- Morley.Michelson.Typed.Scope: NestedBigMapsAbsent :: NestedBigMapsPresence (t :: T)
- Morley.Michelson.Typed.Scope: NestedBigMapsPresent :: NestedBigMapsPresence (t :: T)
- Morley.Michelson.Typed.Scope: OpAbsent :: OpPresence (t :: T)
- Morley.Michelson.Typed.Scope: OpPresent :: OpPresence (t :: T)
- Morley.Michelson.Typed.Scope: TicketAbsent :: TicketPresence (t :: T)
- Morley.Michelson.Typed.Scope: TicketPresent :: TicketPresence (t :: T)
- Morley.Michelson.Typed.Scope: data BigMapPresence (t :: T)
- Morley.Michelson.Typed.Scope: data ContractPresence (t :: T)
- Morley.Michelson.Typed.Scope: data NestedBigMapsPresence (t :: T)
- Morley.Michelson.Typed.Scope: data OpPresence (t :: T)
- Morley.Michelson.Typed.Scope: data TicketPresence (t :: T)
- Morley.Michelson.Typed.Scope: instance (Data.Singletons.SingI t, Morley.Michelson.Typed.Scope.Comparable t) => Morley.Michelson.Typed.Scope.ComparabilityScope t
- Morley.Michelson.Typed.Scope: instance (Data.Singletons.SingI t, Morley.Michelson.Typed.Scope.HasNoOp t, Morley.Michelson.Typed.Scope.HasNoBigMap t, Morley.Michelson.Typed.Scope.HasNoTicket t) => Morley.Michelson.Typed.Scope.ViewableScope t
- Morley.Michelson.Typed.Scope: instance (Data.Singletons.SingI t, Morley.Michelson.Typed.Scope.HasNoTicket t) => Morley.Michelson.Typed.Scope.DupableScope t
- Morley.Michelson.Typed.Scope: instance (Data.Singletons.SingI t, Morley.Michelson.Typed.Scope.WellTyped t, Morley.Michelson.Typed.Scope.HasNoOp t, Morley.Michelson.Typed.Scope.HasNoBigMap t, Morley.Michelson.Typed.Scope.HasNoContract t, Morley.Michelson.Typed.Scope.HasNoTicket t, Morley.Michelson.Typed.Scope.HasNoSaplingState t) => Morley.Michelson.Typed.Scope.ConstantScope t
- Morley.Michelson.Typed.Scope: instance (Data.Singletons.SingI t, Morley.Michelson.Typed.Scope.WellTyped t, Morley.Michelson.Typed.Scope.HasNoOp t, Morley.Michelson.Typed.Scope.HasNoBigMap t, Morley.Michelson.Typed.Scope.HasNoTicket t, Morley.Michelson.Typed.Scope.HasNoSaplingState t) => Morley.Michelson.Typed.Scope.PackedValScope t
- Morley.Michelson.Typed.Scope: instance (Data.Singletons.SingI t, Morley.Michelson.Typed.Scope.WellTyped t, Morley.Michelson.Typed.Scope.HasNoOp t, Morley.Michelson.Typed.Scope.HasNoNestedBigMaps t) => Morley.Michelson.Typed.Scope.ParameterScope t
- Morley.Michelson.Typed.Scope: instance (Data.Singletons.SingI t, Morley.Michelson.Typed.Scope.WellTyped t, Morley.Michelson.Typed.Scope.HasNoOp t, Morley.Michelson.Typed.Scope.HasNoNestedBigMaps t, Morley.Michelson.Typed.Scope.HasNoContract t) => Morley.Michelson.Typed.Scope.StorageScope t
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.CheckScope a, Morley.Michelson.Typed.Scope.CheckScope b) => Morley.Michelson.Typed.Scope.CheckScope (a, b)
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.ContainsBigMap t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.HasNoBigMap t
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.ContainsContract t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.HasNoContract t
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.ContainsNestedBigMaps t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.HasNoNestedBigMaps t
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.ContainsOp t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.HasNoOp t
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.ContainsSaplingState t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.HasNoSaplingState t
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.ContainsTicket t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.HasNoTicket t
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.WellTyped t, Morley.Michelson.Typed.Scope.PackedValScope t, Morley.Michelson.Typed.Scope.ConstantScope t) => Morley.Michelson.Typed.Scope.UnpackedValScope t
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoOp t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoBigMap t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoContract t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoTicket t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoSaplingState t a b, Morley.Michelson.Typed.Scope.WellTyped a, Morley.Michelson.Typed.Scope.WellTyped b) => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.ConstantScope t a b
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoOp t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoBigMap t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoTicket t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoSaplingState t a b, Morley.Michelson.Typed.Scope.WellTyped a, Morley.Michelson.Typed.Scope.WellTyped b) => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.PackedValScope t a b
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoOp t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoNestedBigMaps t a b, Morley.Michelson.Typed.Scope.WellTyped a, Morley.Michelson.Typed.Scope.WellTyped b) => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.ParameterScope t a b
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoOp t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoNestedBigMaps t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoContract t a b, Morley.Michelson.Typed.Scope.WellTyped a, Morley.Michelson.Typed.Scope.WellTyped b) => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.StorageScope t a b
- Morley.Michelson.Typed.Scope: instance (Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.PackedValScope t a b, Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.ConstantScope t a b, Morley.Michelson.Typed.Scope.WellTyped a, Morley.Michelson.Typed.Scope.WellTyped b) => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.UnpackedValScope t a b
- Morley.Michelson.Typed.Scope: instance Control.DeepSeq.NFData Morley.Michelson.Typed.Scope.BadTypeForScope
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI Morley.Michelson.Typed.Scope.ContainsBigMapSym
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI Morley.Michelson.Typed.Scope.ContainsContractSym
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI Morley.Michelson.Typed.Scope.ContainsNestedBigMapsSym
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI Morley.Michelson.Typed.Scope.ContainsOpSym
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI Morley.Michelson.Typed.Scope.ContainsTicketSym
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoBigMap 'Morley.Michelson.Typed.T.TOr a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoBigMap 'Morley.Michelson.Typed.T.TPair a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoContract 'Morley.Michelson.Typed.T.TOr a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoContract 'Morley.Michelson.Typed.T.TPair a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoNestedBigMaps 'Morley.Michelson.Typed.T.TOr a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoNestedBigMaps 'Morley.Michelson.Typed.T.TPair a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoOp 'Morley.Michelson.Typed.T.TOr a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoOp 'Morley.Michelson.Typed.T.TPair a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoTicket 'Morley.Michelson.Typed.T.TOr a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI a => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoTicket 'Morley.Michelson.Typed.T.TPair a b
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI k => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoOp 'Morley.Michelson.Typed.T.TBigMap k v
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI k => Morley.Michelson.Typed.Scope.WithDeMorganScope Morley.Michelson.Typed.Scope.HasNoOp 'Morley.Michelson.Typed.T.TMap k v
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI n => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TSaplingState n)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI n => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TSaplingTransaction n)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.ComparabilityScope t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.Comparable t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.ConstantScope t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.DupableScope t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.HasNoBigMap t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.HasNoContract t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.HasNoNestedBigMaps t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.HasNoOp t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.HasNoSaplingState t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.HasNoTicket t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.PackedValScope t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.ParameterScope t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.StorageScope t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.UnpackedValScope t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.ViewableScope t)
- Morley.Michelson.Typed.Scope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.CheckScope (Morley.Michelson.Typed.Scope.WellTyped t)
- Morley.Michelson.Typed.Scope: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Scope.BadTypeForScope
- Morley.Michelson.Typed.Scope: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Scope.NotWellTyped
- Morley.Michelson.Typed.Scope: instance GHC.Classes.Eq Morley.Michelson.Typed.Scope.BadTypeForScope
- Morley.Michelson.Typed.Scope: instance GHC.Generics.Generic Morley.Michelson.Typed.Scope.BadTypeForScope
- Morley.Michelson.Typed.Scope: instance GHC.Show.Show Morley.Michelson.Typed.Scope.BadTypeForScope
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Michelson.Typed.Scope.BadTypeForScope
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TAddress
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TBool
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TBytes
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TChainId
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TInt
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TKey
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TKeyHash
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TMutez
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TNat
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TNever
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TSignature
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TString
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TTimestamp
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.Comparable 'Morley.Michelson.Typed.T.TUnit
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.ComparableSuperC ('Morley.Michelson.Typed.T.TOption t) => Morley.Michelson.Typed.Scope.Comparable ('Morley.Michelson.Typed.T.TOption t)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.ComparableSuperC ('Morley.Michelson.Typed.T.TOr t1 t2) => Morley.Michelson.Typed.Scope.Comparable ('Morley.Michelson.Typed.T.TOr t1 t2)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.ComparableSuperC ('Morley.Michelson.Typed.T.TPair t1 t2) => Morley.Michelson.Typed.Scope.Comparable ('Morley.Michelson.Typed.T.TPair t1 t2)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TAddress
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TBls12381Fr
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TBls12381G1
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TBls12381G2
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TBool
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TBytes
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TChainId
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TChest
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TChestKey
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TInt
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TKey
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TKeyHash
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TMutez
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TNat
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TNever
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TOperation
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TSignature
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TString
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TTimestamp
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTyped 'Morley.Michelson.Typed.T.TUnit
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TBigMap k v) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TBigMap k v)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TContract t) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TContract t)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TLambda t1 t2) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TLambda t1 t2)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TList t) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TList t)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TMap k v) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TMap k v)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TOption t) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TOption t)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TOr t1 t2) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TOr t1 t2)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TPair t1 t2) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TPair t1 t2)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TSet t) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TSet t)
- Morley.Michelson.Typed.Scope: instance Morley.Michelson.Typed.Scope.WellTypedSuperC ('Morley.Michelson.Typed.T.TTicket t) => Morley.Michelson.Typed.Scope.WellTyped ('Morley.Michelson.Typed.T.TTicket t)
- Morley.Michelson.Typed.Scope: type ComparableSuperC _ = ();
- Morley.Michelson.Typed.Scope: type UntypedValScope t = (SingI t, HasNoOp t)
- Morley.Michelson.Typed.Scope: type WellTypedSuperC _ = ();
- Morley.Michelson.Typed.Scope: }
- Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TBigMapSym1 a6989586621679557351)
- Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TLambdaSym1 a6989586621679557345)
- Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TMapSym1 a6989586621679557348)
- Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TOrSym1 a6989586621679557342)
- Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TPairSym1 a6989586621679557339)
- Morley.Michelson.Typed.Sing: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Typed.Sing.SingT t)
- Morley.Michelson.Typed.T: instance Formatting.Buildable.Buildable (Morley.Util.MismatchError.MismatchError Morley.Michelson.Typed.T.T)
- Morley.Michelson.Typed.T: instance Formatting.Buildable.Buildable (Morley.Util.MismatchError.MismatchError [Morley.Michelson.Typed.T.T])
- Morley.Michelson.Typed.T: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.T.T
- Morley.Michelson.Typed.T: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Printer.Util.Prettier Morley.Michelson.Typed.T.T)
- Morley.Michelson.Typed.T: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Util.MismatchError.MismatchError Morley.Michelson.Typed.T.T)
- Morley.Michelson.Typed.T: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Util.MismatchError.MismatchError [Morley.Michelson.Typed.T.T])
- Morley.Michelson.Typed.Util: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Util.CtorEffectsApp x)
- Morley.Michelson.Typed.Value: instance (forall (t :: Morley.Michelson.Typed.T.T). Formatting.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' instr t)) => Formatting.Buildable.Buildable (Morley.Michelson.Typed.Value.Operation' instr)
- Morley.Michelson.Typed.Value: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' instr p) => Formatting.Buildable.Buildable (Morley.Michelson.Typed.Value.TransferTokens instr p)
- Morley.Michelson.Typed.Value: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' instr st) => Formatting.Buildable.Buildable (Morley.Michelson.Typed.Value.CreateContract instr cp st)
- Morley.Michelson.Typed.Value: instance Formatting.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' instr t) => Formatting.Buildable.Buildable (Morley.Michelson.Typed.Value.Emit instr t)
- Morley.Michelson.Typed.Value: instance Formatting.Buildable.Buildable Morley.Michelson.Typed.Value.SetDelegate
- Morley.Michelson.Typed.Value: instance Morley.Michelson.Typed.Scope.Comparable t => GHC.Classes.Ord (Morley.Michelson.Typed.Value.Value' instr t)
- Morley.Michelson.Typed.View: UnsafeViewsSet :: Map ViewName (SomeView' instr st) -> ViewsSet' instr st
- Morley.Michelson.Untyped.Annotation: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Annotation.AnnotationSet
- Morley.Michelson.Untyped.Annotation: instance Morley.Michelson.Untyped.Annotation.KnownAnnTag tag => Formatting.Buildable.Buildable (Morley.Michelson.Untyped.Annotation.Annotation tag)
- Morley.Michelson.Untyped.Contract: instance Formatting.Buildable.Buildable (Morley.Michelson.Untyped.Contract.ContractBlock op)
- Morley.Michelson.Untyped.Contract: instance Morley.Michelson.Printer.Util.RenderDoc op => Formatting.Buildable.Buildable (Morley.Michelson.Untyped.Contract.Contract' op)
- Morley.Michelson.Untyped.Contract: mapContractCode :: (op -> op) -> Contract' op -> Contract' op
- Morley.Michelson.Untyped.Entrypoints: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Entrypoints.EpName
- Morley.Michelson.Untyped.Entrypoints: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Entrypoints.EpNameFromRefAnnError
- Morley.Michelson.Untyped.Entrypoints: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Michelson.Untyped.Entrypoints.EpNameFromRefAnnError
- Morley.Michelson.Untyped.Ext: instance Control.DeepSeq.NFData op => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Ext.ExtInstrAbstract op)
- Morley.Michelson.Untyped.Ext: instance Control.DeepSeq.NFData op => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Ext.TestAssert op)
- Morley.Michelson.Untyped.Ext: instance Data.Aeson.Types.FromJSON.FromJSON op => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Ext.ExtInstrAbstract op)
- Morley.Michelson.Untyped.Ext: instance Data.Aeson.Types.FromJSON.FromJSON op => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Ext.TestAssert op)
- Morley.Michelson.Untyped.Ext: instance Data.Aeson.Types.ToJSON.ToJSON op => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Ext.ExtInstrAbstract op)
- Morley.Michelson.Untyped.Ext: instance Data.Aeson.Types.ToJSON.ToJSON op => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Ext.TestAssert op)
- Morley.Michelson.Untyped.Ext: instance Data.Data.Data op => Data.Data.Data (Morley.Michelson.Untyped.Ext.ExtInstrAbstract op)
- Morley.Michelson.Untyped.Ext: instance Data.Data.Data op => Data.Data.Data (Morley.Michelson.Untyped.Ext.TestAssert op)
- Morley.Michelson.Untyped.Ext: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Ext.PrintComment
- Morley.Michelson.Untyped.Ext: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Ext.StackRef
- Morley.Michelson.Untyped.Ext: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Ext.StackTypePattern
- Morley.Michelson.Untyped.Ext: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Ext.TyVar
- Morley.Michelson.Untyped.Ext: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Ext.Var
- Morley.Michelson.Untyped.Ext: instance Formatting.Buildable.Buildable op => Formatting.Buildable.Buildable (Morley.Michelson.Untyped.Ext.ExtInstrAbstract op)
- Morley.Michelson.Untyped.Ext: instance Formatting.Buildable.Buildable op => Formatting.Buildable.Buildable (Morley.Michelson.Untyped.Ext.TestAssert op)
- Morley.Michelson.Untyped.Ext: instance GHC.Base.Functor Morley.Michelson.Untyped.Ext.ExtInstrAbstract
- Morley.Michelson.Untyped.Ext: instance GHC.Base.Functor Morley.Michelson.Untyped.Ext.TestAssert
- Morley.Michelson.Untyped.Ext: instance GHC.Classes.Eq op => GHC.Classes.Eq (Morley.Michelson.Untyped.Ext.ExtInstrAbstract op)
- Morley.Michelson.Untyped.Ext: instance GHC.Classes.Eq op => GHC.Classes.Eq (Morley.Michelson.Untyped.Ext.TestAssert op)
- Morley.Michelson.Untyped.Ext: instance GHC.Generics.Generic (Morley.Michelson.Untyped.Ext.ExtInstrAbstract op)
- Morley.Michelson.Untyped.Ext: instance GHC.Generics.Generic (Morley.Michelson.Untyped.Ext.TestAssert op)
- Morley.Michelson.Untyped.Ext: instance GHC.Show.Show op => GHC.Show.Show (Morley.Michelson.Untyped.Ext.ExtInstrAbstract op)
- Morley.Michelson.Untyped.Ext: instance GHC.Show.Show op => GHC.Show.Show (Morley.Michelson.Untyped.Ext.TestAssert op)
- Morley.Michelson.Untyped.Ext: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Untyped.Ext.ExtInstrAbstract op)
- Morley.Michelson.Untyped.Instr: instance (Morley.Michelson.Printer.Util.RenderDoc op, Formatting.Buildable.Buildable op) => Formatting.Buildable.Buildable (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Michelson.Untyped.Instr: instance Control.DeepSeq.NFData op => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Michelson.Untyped.Instr: instance Data.Aeson.Types.FromJSON.FromJSON op => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Michelson.Untyped.Instr: instance Data.Aeson.Types.ToJSON.ToJSON op => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Michelson.Untyped.Instr: instance Data.Data.Data op => Data.Data.Data (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Michelson.Untyped.Instr: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Instr.ExpandedOp
- Morley.Michelson.Untyped.Instr: instance GHC.Base.Functor Morley.Michelson.Untyped.Instr.InstrAbstract
- Morley.Michelson.Untyped.Instr: instance GHC.Classes.Eq op => GHC.Classes.Eq (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Michelson.Untyped.Instr: instance GHC.Generics.Generic (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Michelson.Untyped.Instr: instance GHC.Show.Show op => GHC.Show.Show (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Michelson.Untyped.Instr: instance Morley.Michelson.Printer.Util.RenderDoc op => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Untyped.Instr.InstrAbstract op)
- Morley.Michelson.Untyped.Type: instance Formatting.Buildable.Buildable (Morley.Util.MismatchError.MismatchError Morley.Michelson.Untyped.Type.Ty)
- Morley.Michelson.Untyped.Type: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Type.ParameterType
- Morley.Michelson.Untyped.Type: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Type.T
- Morley.Michelson.Untyped.Type: instance Formatting.Buildable.Buildable Morley.Michelson.Untyped.Type.Ty
- Morley.Michelson.Untyped.Type: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Printer.Util.Prettier Morley.Michelson.Untyped.Type.ParameterType)
- Morley.Michelson.Untyped.Type: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Printer.Util.Prettier Morley.Michelson.Untyped.Type.Ty)
- Morley.Michelson.Untyped.Type: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Util.MismatchError.MismatchError Morley.Michelson.Untyped.Type.Ty)
- Morley.Michelson.Untyped.Value: instance Control.DeepSeq.NFData op => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Value.Elt op)
- Morley.Michelson.Untyped.Value: instance Control.DeepSeq.NFData op => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Michelson.Untyped.Value: instance Data.Aeson.Types.FromJSON.FromJSON op => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Value.Elt op)
- Morley.Michelson.Untyped.Value: instance Data.Aeson.Types.FromJSON.FromJSON op => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Michelson.Untyped.Value: instance Data.Aeson.Types.ToJSON.ToJSON op => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Value.Elt op)
- Morley.Michelson.Untyped.Value: instance Data.Aeson.Types.ToJSON.ToJSON op => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Michelson.Untyped.Value: instance Data.Data.Data op => Data.Data.Data (Morley.Michelson.Untyped.Value.Elt op)
- Morley.Michelson.Untyped.Value: instance Data.Data.Data op => Data.Data.Data (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Michelson.Untyped.Value: instance GHC.Base.Functor Morley.Michelson.Untyped.Value.Elt
- Morley.Michelson.Untyped.Value: instance GHC.Base.Functor Morley.Michelson.Untyped.Value.Value'
- Morley.Michelson.Untyped.Value: instance GHC.Classes.Eq op => GHC.Classes.Eq (Morley.Michelson.Untyped.Value.Elt op)
- Morley.Michelson.Untyped.Value: instance GHC.Classes.Eq op => GHC.Classes.Eq (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Michelson.Untyped.Value: instance GHC.Generics.Generic (Morley.Michelson.Untyped.Value.Elt op)
- Morley.Michelson.Untyped.Value: instance GHC.Generics.Generic (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Michelson.Untyped.Value: instance GHC.Show.Show op => GHC.Show.Show (Morley.Michelson.Untyped.Value.Elt op)
- Morley.Michelson.Untyped.Value: instance GHC.Show.Show op => GHC.Show.Show (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Michelson.Untyped.Value: instance Morley.Michelson.Printer.Util.RenderDoc op => Formatting.Buildable.Buildable (Morley.Michelson.Untyped.Value.Elt op)
- Morley.Michelson.Untyped.Value: instance Morley.Michelson.Printer.Util.RenderDoc op => Formatting.Buildable.Buildable (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Michelson.Untyped.Value: instance Morley.Michelson.Printer.Util.RenderDoc op => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Untyped.Value.Elt op)
- Morley.Michelson.Untyped.Value: instance Morley.Michelson.Printer.Util.RenderDoc op => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Untyped.Value.Value' op)
- Morley.Michelson.Untyped.Value: linearizeRightCombValuePair :: Value' op -> NonEmpty (Value' op)
- Morley.Michelson.Untyped.View: UnsafeViewsSet :: Map ViewName (View' instr) -> ViewsSet instr
- Morley.Tezos.Address: instance Formatting.Buildable.Buildable (Morley.Tezos.Address.KindedAddress kind)
- Morley.Tezos.Address: instance Formatting.Buildable.Buildable Morley.Tezos.Address.GlobalCounter
- Morley.Tezos.Address: instance Formatting.Buildable.Buildable Morley.Tezos.Address.ParseAddressError
- Morley.Tezos.Address: instance Formatting.Buildable.Buildable Morley.Tezos.Address.ParseAddressRawError
- Morley.Tezos.Address: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Tezos.Address.ParseAddressError
- Morley.Tezos.Address: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Tezos.Address.ParseAddressRawError
- Morley.Tezos.Address.Alias: instance Formatting.Buildable.Buildable (Morley.Tezos.Address.Alias.AddressOrAlias kind)
- Morley.Tezos.Address.Alias: instance Formatting.Buildable.Buildable (Morley.Tezos.Address.Alias.Alias kind)
- Morley.Tezos.Address.Alias: instance Formatting.Buildable.Buildable Morley.Tezos.Address.Alias.SomeAddressOrAlias
- Morley.Tezos.Address.Kinds: instance Formatting.Buildable.Buildable Morley.Tezos.Address.Kinds.AddressKind
- Morley.Tezos.Core: instance Formatting.Buildable.Buildable Morley.Tezos.Core.ChainId
- Morley.Tezos.Core: instance Formatting.Buildable.Buildable Morley.Tezos.Core.Mutez
- Morley.Tezos.Core: instance Formatting.Buildable.Buildable Morley.Tezos.Core.ParseChainIdError
- Morley.Tezos.Core: instance Formatting.Buildable.Buildable Morley.Tezos.Core.Timestamp
- Morley.Tezos.Crypto: instance Formatting.Buildable.Buildable (Morley.Tezos.Crypto.Hash kind)
- Morley.Tezos.Crypto: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.KeyType
- Morley.Tezos.Crypto: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.ParseSignatureRawError
- Morley.Tezos.Crypto: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.PublicKey
- Morley.Tezos.Crypto: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.SecretKey
- Morley.Tezos.Crypto: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.Signature
- Morley.Tezos.Crypto.BLS: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.BLS.PublicKey
- Morley.Tezos.Crypto.BLS: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.BLS.SecretKey
- Morley.Tezos.Crypto.BLS: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.BLS.Signature
- Morley.Tezos.Crypto.BLS12381: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.BLS12381.DeserializationError
- Morley.Tezos.Crypto.BLS12381: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Tezos.Crypto.BLS12381.DeserializationError
- Morley.Tezos.Crypto.Ed25519: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.Ed25519.PublicKey
- Morley.Tezos.Crypto.Ed25519: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.Ed25519.SecretKey
- Morley.Tezos.Crypto.Ed25519: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.Ed25519.Signature
- Morley.Tezos.Crypto.P256: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.P256.PublicKey
- Morley.Tezos.Crypto.P256: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.P256.SecretKey
- Morley.Tezos.Crypto.P256: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.P256.Signature
- Morley.Tezos.Crypto.Secp256k1: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.Secp256k1.PublicKey
- Morley.Tezos.Crypto.Secp256k1: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.Secp256k1.SecretKey
- Morley.Tezos.Crypto.Secp256k1: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.Secp256k1.Signature
- Morley.Tezos.Crypto.Timelock: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.Timelock.TLTime
- Morley.Tezos.Crypto.Util: instance Formatting.Buildable.Buildable Morley.Tezos.Crypto.Util.CryptoParseError
- Morley.Tezos.Crypto.Util: instance Morley.Michelson.Printer.Util.RenderDoc Morley.Tezos.Crypto.Util.CryptoParseError
- Morley.Util.Binary: instance Formatting.Buildable.Buildable Morley.Util.Binary.UnpackError
- Morley.Util.Constrained: instance forall k (c :: k -> GHC.Types.Constraint) (f :: k -> *). (forall (a :: k). c a => Formatting.Buildable.Buildable (f a)) => Formatting.Buildable.Buildable (Morley.Util.Constrained.Constrained c f)
- Morley.Util.Instances: instance Formatting.Buildable.Buildable GHC.Num.Natural.Natural
- Morley.Util.Instances: instance Formatting.Buildable.Buildable a => Formatting.Buildable.Buildable (Data.Functor.Identity.Identity a)
- Morley.Util.Interpolate.Internal: indentF'' :: Int -> Builder -> Builder
- Morley.Util.Label: instance Formatting.Buildable.Buildable (Morley.Util.Label.Label name)
- Morley.Util.MismatchError: instance Formatting.Buildable.Buildable a => Formatting.Buildable.Buildable (Morley.Util.MismatchError.MismatchError a)
- Morley.Util.MismatchError: instance Morley.Michelson.Printer.Util.RenderDoc a => Morley.Michelson.Printer.Util.RenderDoc (Morley.Util.MismatchError.MismatchError a)
- Morley.Util.MismatchError: renderDocDiff :: RenderDoc a => RenderContext -> MismatchError a -> Doc
- Morley.Util.MismatchError: renderDocDiffList :: RenderDoc a => RenderContext -> MismatchError [a] -> Doc
- Morley.Util.Named: instance (GHC.TypeLits.KnownSymbol name, Formatting.Buildable.Buildable (f a)) => Formatting.Buildable.Buildable (Named.Internal.NamedF f a name)
- Morley.Util.Peano: (|-) :: forall k (a :: k) (b :: k) r. (a :~: b) -> (a ~ b => r) -> r
- Morley.Util.Peano: infixr 1 |-
- Morley.Util.Peano: instance forall k (l :: [k]) (a :: Morley.Util.Peano.Peano). Morley.Util.Type.MockableConstraint (Morley.Util.Peano.RequireLongerOrSameLength l a)
- Morley.Util.Peano: instance forall k (l :: [k]) (a :: Morley.Util.Peano.Peano). Morley.Util.Type.MockableConstraint (Morley.Util.Peano.RequireLongerThan l a)
- Morley.Util.SizedList: instance Formatting.Buildable.Buildable a => Formatting.Buildable.Buildable (Morley.Util.SizedList.SizedList' n a)
- Morley.Util.SizedList: instance Formatting.Buildable.Buildable a => Formatting.Buildable.Buildable (Morley.Util.SizedList.SomeSizedList a)
- Morley.Util.Type: class MockableConstraint (c :: Constraint)
- Morley.Util.Type: failUnlessEvi :: forall cond msg. FailUnless cond msg :- (cond ~ 'True)
- Morley.Util.Type: failWhenEvi :: forall cond msg. FailWhen cond msg :- (cond ~ 'False)
- Morley.Util.Type: instance (Morley.Util.Type.MockableConstraint c1, Morley.Util.Type.MockableConstraint c2) => Morley.Util.Type.MockableConstraint (c1, c2)
- Morley.Util.Type: instance (Morley.Util.Type.MockableConstraint c1, Morley.Util.Type.MockableConstraint c2, Morley.Util.Type.MockableConstraint c3) => Morley.Util.Type.MockableConstraint (c1, c2, c3)
- Morley.Util.Type: instance (Morley.Util.Type.MockableConstraint c1, Morley.Util.Type.MockableConstraint c2, Morley.Util.Type.MockableConstraint c3, Morley.Util.Type.MockableConstraint c4) => Morley.Util.Type.MockableConstraint (c1, c2, c3, c4)
- Morley.Util.Type: instance (Morley.Util.Type.MockableConstraint c1, Morley.Util.Type.MockableConstraint c2, Morley.Util.Type.MockableConstraint c3, Morley.Util.Type.MockableConstraint c4, Morley.Util.Type.MockableConstraint c5) => Morley.Util.Type.MockableConstraint (c1, c2, c3, c4, c5)
- Morley.Util.Type: instance forall k (a :: k) (b :: k). Morley.Util.Type.MockableConstraint (a GHC.Types.~ b)
- Morley.Util.Type: instance forall k (c :: k -> GHC.Types.Constraint) (a :: k). c a => Morley.Util.Type.MockableConstraint (c a)
- Morley.Util.Type: listOfTypesConcatAssociativityAxiom :: forall a b c. Dict (ConcatListOfTypesAssociativity a b c)
- Morley.Util.Type: type ConcatListOfTypesAssociativity a b c = ((a ++ b) ++ c) ~ (a ++ (b ++ c))
- Morley.Util.Type: unsafeProvideConstraint :: MockableConstraint c => Dict c
+ Morley.App.CLI: argParser :: Parser (IO ())
+ Morley.App.REPL: runRepl :: IO ()
+ Morley.Micheline.Class: instance (Morley.Micheline.Class.EndResult r GHC.Types.~ r) => Morley.Micheline.Class.WithArgsRec x r r
+ Morley.Micheline.Class: instance (Morley.Micheline.Class.FromExp x a, Morley.Micheline.Class.WithArgsRec x b r) => Morley.Micheline.Class.WithArgsRec x (a -> b) r
+ Morley.Micheline.Class: instance Fmt.Buildable.Buildable Morley.Micheline.Class.FromExpErrorReason
+ Morley.Micheline.Class: instance Fmt.Buildable.Buildable Morley.Micheline.Class.FromExpressionError
+ Morley.Micheline.Class: instance GHC.Classes.Eq Morley.Micheline.Class.FromExpErrorReason
+ Morley.Micheline.Class: instance GHC.Show.Show Morley.Micheline.Class.FromExpErrorReason
+ Morley.Micheline.Class: instance Morley.Micheline.Class.FromExp x GHC.Num.Natural.Natural
+ Morley.Micheline.Class: instance Morley.Micheline.Class.FromExp x GHC.Types.Word
+ Morley.Micheline.Class: instance Morley.Micheline.Class.FromExp x op => Morley.Micheline.Class.FromExp x (Morley.Michelson.Untyped.Instr.InstrAbstract [] op)
+ Morley.Micheline.Class: instance Morley.Micheline.Class.FromExp x op => Morley.Micheline.Class.FromExp x (Morley.Michelson.Untyped.Value.Value' [] op)
+ Morley.Micheline.Class: instance Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidOp t => Morley.Micheline.Class.ToExpression (Morley.Michelson.Typed.Aliases.Value t)
+ Morley.Micheline.Class: instance forall k (r :: k). Morley.Micheline.Class.CountArgs r r
+ Morley.Micheline.Class: instance forall k b (r :: k) a. Morley.Micheline.Class.CountArgs b r => Morley.Micheline.Class.CountArgs (a -> b) r
+ Morley.Micheline.Expression: MPTConstant :: MichelinePrimitiveTag
+ Morley.Micheline.Expression: MPTInstr :: MichelinePrimitiveTag
+ Morley.Micheline.Expression: MPTKeyword :: MichelinePrimitiveTag
+ Morley.Micheline.Expression: MPTRemoved :: MichelinePrimitiveTag
+ Morley.Micheline.Expression: MPTType :: MichelinePrimitiveTag
+ Morley.Micheline.Expression: MPTValue :: MichelinePrimitiveTag
+ Morley.Micheline.Expression: Prim_ABS :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_ADD :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_ADDRESS :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_AMOUNT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_AND :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_APPLY :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_BALANCE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_BLAKE2B :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_BYTES :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CAR :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CAST :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CDR :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CHAIN_ID :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CHECK_SIGNATURE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_COMPARE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CONCAT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CONS :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CONTRACT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CREATE_ACCOUNT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_CREATE_CONTRACT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_DIG :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_DIP :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_DROP :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_DUG :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_DUP :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_EDIV :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_EMIT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_EMPTY_BIG_MAP :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_EMPTY_MAP :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_EMPTY_SET :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_EQ :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_EXEC :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_Elt :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_FAILWITH :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_False :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_GE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_GET :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_GET_AND_UPDATE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_GT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_HASH_KEY :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_IF :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_IF_CONS :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_IF_LEFT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_IF_NONE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_IMPLICIT_ACCOUNT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_INT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_ISNAT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_ITER :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_JOIN_TICKETS :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_KECCAK :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LAMBDA :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LAMBDA_REC :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LEFT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LEVEL :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LOOP :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LOOP_LEFT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LSL :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LSR :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_LT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_Lambda_rec :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_Left :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_MAP :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_MEM :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_MIN_BLOCK_TIME :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_MUL :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_NAT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_NEG :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_NEQ :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_NEVER :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_NIL :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_NONE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_NOT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_NOW :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_None :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_OPEN_CHEST :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_OR :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_PACK :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_PAIR :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_PAIRING_CHECK :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_PUSH :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_Pair :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_READ_TICKET :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_RENAME :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_RIGHT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_Right :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SAPLING_EMPTY_STATE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SAPLING_VERIFY_UPDATE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SELF :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SELF_ADDRESS :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SENDER :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SET_DELEGATE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SHA256 :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SHA3 :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SHA512 :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SIZE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SLICE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SOME :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SOURCE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SPLIT_TICKET :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_STEPS_TO_QUOTA :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SUB :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SUB_MUTEZ :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_SWAP :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_Some :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_TICKET :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_TICKET_DEPRECATED :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_TOTAL_VOTING_POWER :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_TRANSFER_TOKENS :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_True :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_UNIT :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_UNPACK :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_UNPAIR :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_UPDATE :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_Unit :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_VIEW :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_VOTING_POWER :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_XOR :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_address :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_big_map :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_bls12_381_fr :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_bls12_381_g1 :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_bls12_381_g2 :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_bool :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_bytes :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_chain_id :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_chest :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_chest_key :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_code :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_constant :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_contract :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_int :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_key :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_key_hash :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_lambda :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_list :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_map :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_mutez :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_nat :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_never :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_operation :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_option :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_or :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_pair :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_parameter :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_sapling_state :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_sapling_transaction :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_sapling_transaction_deprecated :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_set :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_signature :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_storage :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_string :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_ticket :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_timestamp :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_tx_rollup_l2_address :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_unit :: MichelinePrimitive
+ Morley.Micheline.Expression: Prim_view :: MichelinePrimitive
+ Morley.Micheline.Expression: [C_Prim_ABS] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_ADDRESS] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_ADD] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_AMOUNT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_AND] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_APPLY] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_BALANCE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_BLAKE2B] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_BYTES] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_CAR] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_CAST] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_CDR] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_CHAIN_ID] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_CHECK_SIGNATURE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_COMPARE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_CONCAT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_CONS] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_CONTRACT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_CREATE_ACCOUNT] :: ClassifiedMichelinePrimitive 'MPTRemoved
+ Morley.Micheline.Expression: [C_Prim_CREATE_CONTRACT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_DIG] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_DIP] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_DROP] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_DUG] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_DUP] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_EDIV] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_EMIT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_EMPTY_BIG_MAP] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_EMPTY_MAP] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_EMPTY_SET] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_EQ] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_EXEC] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_Elt] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_FAILWITH] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_False] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_GET] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_GET_AND_UPDATE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_GE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_GT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_HASH_KEY] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_IF] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_IF_CONS] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_IF_LEFT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_IF_NONE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_IMPLICIT_ACCOUNT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_INT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_ISNAT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_ITER] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_JOIN_TICKETS] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_KECCAK] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LAMBDA] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LAMBDA_REC] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LEFT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LEVEL] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LOOP] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LOOP_LEFT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LSL] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LSR] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_LT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_Lambda_rec] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_Left] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_MAP] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_MEM] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_MIN_BLOCK_TIME] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_MUL] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_NAT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_NEG] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_NEQ] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_NEVER] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_NIL] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_NONE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_NOT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_NOW] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_None] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_OPEN_CHEST] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_OR] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_PACK] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_PAIRING_CHECK] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_PAIR] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_PUSH] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_Pair] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_READ_TICKET] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_RENAME] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_RIGHT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_Right] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_SAPLING_EMPTY_STATE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SAPLING_VERIFY_UPDATE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SELF] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SELF_ADDRESS] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SENDER] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SET_DELEGATE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SHA256] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SHA3] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SHA512] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SIZE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SLICE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SOME] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SOURCE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SPLIT_TICKET] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_STEPS_TO_QUOTA] :: ClassifiedMichelinePrimitive 'MPTRemoved
+ Morley.Micheline.Expression: [C_Prim_SUB] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SUB_MUTEZ] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_SWAP] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_Some] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_TICKET] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_TICKET_DEPRECATED] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_TOTAL_VOTING_POWER] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_TRANSFER_TOKENS] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_True] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_UNIT] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_UNPACK] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_UNPAIR] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_UPDATE] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_Unit] :: ClassifiedMichelinePrimitive 'MPTValue
+ Morley.Micheline.Expression: [C_Prim_VIEW] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_VOTING_POWER] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_XOR] :: ClassifiedMichelinePrimitive 'MPTInstr
+ Morley.Micheline.Expression: [C_Prim_address] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_big_map] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_bls12_381_fr] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_bls12_381_g1] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_bls12_381_g2] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_bool] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_bytes] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_chain_id] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_chest] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_chest_key] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_code] :: ClassifiedMichelinePrimitive 'MPTKeyword
+ Morley.Micheline.Expression: [C_Prim_constant] :: ClassifiedMichelinePrimitive 'MPTConstant
+ Morley.Micheline.Expression: [C_Prim_contract] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_int] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_key] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_key_hash] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_lambda] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_list] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_map] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_mutez] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_nat] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_never] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_operation] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_option] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_or] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_pair] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_parameter] :: ClassifiedMichelinePrimitive 'MPTKeyword
+ Morley.Micheline.Expression: [C_Prim_sapling_state] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_sapling_transaction] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_sapling_transaction_deprecated] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_set] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_signature] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_storage] :: ClassifiedMichelinePrimitive 'MPTKeyword
+ Morley.Micheline.Expression: [C_Prim_string] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_ticket] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_timestamp] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_tx_rollup_l2_address] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_unit] :: ClassifiedMichelinePrimitive 'MPTType
+ Morley.Micheline.Expression: [C_Prim_view] :: ClassifiedMichelinePrimitive 'MPTKeyword
+ Morley.Micheline.Expression: [SMPTConstant] :: SingMichelinePrimitiveTag ('MPTConstant :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression: [SMPTInstr] :: SingMichelinePrimitiveTag ('MPTInstr :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression: [SMPTKeyword] :: SingMichelinePrimitiveTag ('MPTKeyword :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression: [SMPTRemoved] :: SingMichelinePrimitiveTag ('MPTRemoved :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression: [SMPTType] :: SingMichelinePrimitiveTag ('MPTType :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression: [SMPTValue] :: SingMichelinePrimitiveTag ('MPTValue :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression: data ClassifiedMichelinePrimitive (tag_a8B8X :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression: data MichelinePrimitive
+ Morley.Micheline.Expression: data MichelinePrimitiveTag
+ Morley.Micheline.Expression: data SingMichelinePrimitiveTag :: MichelinePrimitiveTag -> Type
+ Morley.Micheline.Expression: instance Fmt.Buildable.Buildable Morley.Micheline.Expression.Expression
+ Morley.Micheline.Expression: withClassifiedPrim :: MichelinePrimitive -> (forall tag. Sing tag -> ClassifiedMichelinePrimitive tag -> r) -> r
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: MPTConstant :: MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: MPTInstr :: MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: MPTKeyword :: MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: MPTRemoved :: MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: MPTType :: MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: MPTValue :: MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_ABS :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_ADD :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_ADDRESS :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_AMOUNT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_AND :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_APPLY :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_BALANCE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_BLAKE2B :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_BYTES :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CAR :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CAST :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CDR :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CHAIN_ID :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CHECK_SIGNATURE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_COMPARE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CONCAT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CONS :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CONTRACT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CREATE_ACCOUNT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_CREATE_CONTRACT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_DIG :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_DIP :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_DROP :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_DUG :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_DUP :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_EDIV :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_EMIT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_EMPTY_BIG_MAP :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_EMPTY_MAP :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_EMPTY_SET :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_EQ :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_EXEC :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_Elt :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_FAILWITH :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_False :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_GE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_GET :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_GET_AND_UPDATE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_GT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_HASH_KEY :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_IF :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_IF_CONS :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_IF_LEFT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_IF_NONE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_IMPLICIT_ACCOUNT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_INT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_ISNAT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_ITER :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_JOIN_TICKETS :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_KECCAK :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LAMBDA :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LAMBDA_REC :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LEFT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LEVEL :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LOOP :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LOOP_LEFT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LSL :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LSR :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_LT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_Lambda_rec :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_Left :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_MAP :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_MEM :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_MIN_BLOCK_TIME :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_MUL :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_NAT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_NEG :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_NEQ :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_NEVER :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_NIL :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_NONE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_NOT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_NOW :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_None :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_OPEN_CHEST :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_OR :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_PACK :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_PAIR :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_PAIRING_CHECK :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_PUSH :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_Pair :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_READ_TICKET :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_RENAME :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_RIGHT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_Right :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SAPLING_EMPTY_STATE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SAPLING_VERIFY_UPDATE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SELF :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SELF_ADDRESS :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SENDER :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SET_DELEGATE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SHA256 :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SHA3 :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SHA512 :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SIZE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SLICE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SOME :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SOURCE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SPLIT_TICKET :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_STEPS_TO_QUOTA :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SUB :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SUB_MUTEZ :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_SWAP :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_Some :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_TICKET :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_TICKET_DEPRECATED :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_TOTAL_VOTING_POWER :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_TRANSFER_TOKENS :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_True :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_UNIT :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_UNPACK :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_UNPAIR :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_UPDATE :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_Unit :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_VIEW :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_VOTING_POWER :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_XOR :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_address :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_big_map :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_bls12_381_fr :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_bls12_381_g1 :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_bls12_381_g2 :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_bool :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_bytes :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_chain_id :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_chest :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_chest_key :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_code :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_constant :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_contract :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_int :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_key :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_key_hash :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_lambda :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_list :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_map :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_mutez :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_nat :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_never :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_operation :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_option :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_or :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_pair :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_parameter :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_sapling_state :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_sapling_transaction :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_sapling_transaction_deprecated :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_set :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_signature :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_storage :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_string :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_ticket :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_timestamp :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_tx_rollup_l2_address :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_unit :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: Prim_view :: MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: [SMPTConstant] :: SingMichelinePrimitiveTag ('MPTConstant :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: [SMPTInstr] :: SingMichelinePrimitiveTag ('MPTInstr :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: [SMPTKeyword] :: SingMichelinePrimitiveTag ('MPTKeyword :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: [SMPTRemoved] :: SingMichelinePrimitiveTag ('MPTRemoved :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: [SMPTType] :: SingMichelinePrimitiveTag ('MPTType :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: [SMPTValue] :: SingMichelinePrimitiveTag ('MPTValue :: MichelinePrimitiveTag)
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: data MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: data MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: data SingMichelinePrimitiveTag :: MichelinePrimitiveTag -> Type
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Aeson.Types.FromJSON.FromJSON Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Aeson.Types.ToJSON.ToJSON Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Data.Data Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Singletons.Decide.SDecide Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Singletons.SingI 'Morley.Micheline.Expression.Internal.MichelinePrimitive.MPTConstant
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Singletons.SingI 'Morley.Micheline.Expression.Internal.MichelinePrimitive.MPTInstr
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Singletons.SingI 'Morley.Micheline.Expression.Internal.MichelinePrimitive.MPTKeyword
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Singletons.SingI 'Morley.Micheline.Expression.Internal.MichelinePrimitive.MPTRemoved
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Singletons.SingI 'Morley.Micheline.Expression.Internal.MichelinePrimitive.MPTType
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Singletons.SingI 'Morley.Micheline.Expression.Internal.MichelinePrimitive.MPTValue
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Singletons.SingKind Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Type.Coercion.TestCoercion Morley.Micheline.Expression.Internal.MichelinePrimitive.SingMichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Data.Type.Equality.TestEquality Morley.Micheline.Expression.Internal.MichelinePrimitive.SingMichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Fmt.Buildable.Buildable Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Fmt.Buildable.Buildable Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Classes.Eq Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Classes.Eq Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Classes.Ord Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Enum.Bounded Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Enum.Bounded Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Enum.Enum Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Enum.Enum Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Read.Read Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Show.Show Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance GHC.Show.Show Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Language.Haskell.TH.Syntax.Lift Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitive
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: instance Language.Haskell.TH.Syntax.Lift Morley.Micheline.Expression.Internal.MichelinePrimitive.MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: primClassification :: MichelinePrimitive -> MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.MichelinePrimitive: type family MPTKeywordSym0 :: MichelinePrimitiveTag
+ Morley.Micheline.Expression.Internal.TH: primFromName :: Name -> MichelinePrimitive
+ Morley.Micheline.Expression.Internal.TH: withMichelinePrimitiveCons :: (Name -> Name -> Q r) -> Q [r]
+ Morley.Micheline.Json: instance Fmt.Buildable.Buildable Morley.Micheline.Json.TezosInt64
+ Morley.Micheline.Json: instance Fmt.Buildable.Buildable Morley.Micheline.Json.TezosNat
+ Morley.Michelson.Analyzer: instance Fmt.Buildable.Buildable Morley.Michelson.Analyzer.AnalyzerRes
+ Morley.Michelson.Doc: instance Fmt.Buildable.Buildable Morley.Michelson.Doc.DocItemPos
+ Morley.Michelson.ErrorPos: instance Fmt.Buildable.Buildable Morley.Michelson.ErrorPos.ErrorSrcPos
+ Morley.Michelson.ErrorPos: instance Fmt.Buildable.Buildable Morley.Michelson.ErrorPos.SrcPos
+ Morley.Michelson.Internal.ViewName: instance Fmt.Buildable.Buildable Morley.Michelson.Internal.ViewName.BadViewNameError
+ Morley.Michelson.Internal.ViewName: instance Fmt.Buildable.Buildable Morley.Michelson.Internal.ViewName.ViewName
+ Morley.Michelson.Internal.ViewsSet: instance Fmt.Buildable.Buildable Morley.Michelson.Internal.ViewsSet.ViewsSetError
+ Morley.Michelson.Interpret: EvalOpT :: ExceptT (MichelsonFailureWithStack Void) (RWST (ContractEnv' (EvalOpT m)) MorleyLogsBuilder InterpreterState m) a -> EvalOpT m a
+ Morley.Michelson.Interpret: MkStkEl :: meta t -> Value t -> StkEl meta t
+ Morley.Michelson.Interpret: NoStkElMeta :: NoStkElMeta t
+ Morley.Michelson.Interpret: [seMeta] :: StkEl meta t -> meta t
+ Morley.Michelson.Interpret: class (forall t. Eq (meta t), forall t. Show (meta t)) => StkElMeta meta m
+ Morley.Michelson.Interpret: data NoStkElMeta t
+ Morley.Michelson.Interpret: data StkEl meta t
+ Morley.Michelson.Interpret: instance (forall (t :: Morley.Michelson.Typed.T.T). GHC.Classes.Eq (meta t)) => Data.GADT.Internal.GEq (Morley.Michelson.Interpret.StkEl meta)
+ Morley.Michelson.Interpret: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Morley.Michelson.Interpret.EvalOpT m)
+ Morley.Michelson.Interpret: instance Control.Monad.Trans.Class.MonadTrans Morley.Michelson.Interpret.EvalOpT
+ Morley.Michelson.Interpret: instance Fmt.Buildable.Buildable Morley.Michelson.Interpret.MorleyLogs
+ Morley.Michelson.Interpret: instance Fmt.Buildable.Buildable Morley.Michelson.Interpret.RemainingSteps
+ Morley.Michelson.Interpret: instance Fmt.Buildable.Buildable Morley.Michelson.Interpret.ViewLookupError
+ Morley.Michelson.Interpret: instance Fmt.Buildable.Buildable ext => Fmt.Buildable.Buildable (Morley.Michelson.Interpret.InterpretError ext)
+ Morley.Michelson.Interpret: instance Fmt.Buildable.Buildable ext => Fmt.Buildable.Buildable (Morley.Michelson.Interpret.MichelsonFailed ext)
+ Morley.Michelson.Interpret: instance Fmt.Buildable.Buildable ext => Fmt.Buildable.Buildable (Morley.Michelson.Interpret.MichelsonFailureWithStack ext)
+ Morley.Michelson.Interpret: instance GHC.Base.Applicative m => Morley.Michelson.Interpret.StkElMeta Morley.Michelson.Interpret.NoStkElMeta m
+ Morley.Michelson.Interpret: instance GHC.Base.Functor m => GHC.Base.Functor (Morley.Michelson.Interpret.EvalOpT m)
+ Morley.Michelson.Interpret: instance GHC.Base.Monad m => Control.Monad.Error.Class.MonadError (Morley.Michelson.Interpret.MichelsonFailureWithStack Data.Void.Void) (Morley.Michelson.Interpret.EvalOpT m)
+ Morley.Michelson.Interpret: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader (Morley.Michelson.Interpret.ContractEnv' (Morley.Michelson.Interpret.EvalOpT m)) (Morley.Michelson.Interpret.EvalOpT m)
+ Morley.Michelson.Interpret: instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState Morley.Michelson.Interpret.InterpreterState (Morley.Michelson.Interpret.EvalOpT m)
+ Morley.Michelson.Interpret: instance GHC.Base.Monad m => Control.Monad.Writer.Class.MonadWriter Morley.Michelson.Interpret.MorleyLogsBuilder (Morley.Michelson.Interpret.EvalOpT m)
+ Morley.Michelson.Interpret: instance GHC.Base.Monad m => GHC.Base.Applicative (Morley.Michelson.Interpret.EvalOpT m)
+ Morley.Michelson.Interpret: instance GHC.Base.Monad m => GHC.Base.Monad (Morley.Michelson.Interpret.EvalOpT m)
+ Morley.Michelson.Interpret: instance GHC.Base.Monad m => Morley.Michelson.Interpret.InterpreterStateMonad (Morley.Michelson.Interpret.EvalOpT m)
+ Morley.Michelson.Interpret: instance GHC.Classes.Eq (meta t) => GHC.Classes.Eq (Morley.Michelson.Interpret.StkEl meta t)
+ Morley.Michelson.Interpret: instance GHC.Show.Show (meta t) => GHC.Show.Show (Morley.Michelson.Interpret.StkEl meta t)
+ Morley.Michelson.Interpret: instance forall k (t :: k). GHC.Classes.Eq (Morley.Michelson.Interpret.NoStkElMeta t)
+ Morley.Michelson.Interpret: instance forall k (t :: k). GHC.Show.Show (Morley.Michelson.Interpret.NoStkElMeta t)
+ Morley.Michelson.Interpret: interpret' :: forall cp st arg m. Monad m => Contract cp st -> EntrypointCallT cp arg -> Value arg -> Value st -> ContractEnv' (EvalOpT m) -> InterpreterState -> m (ContractReturn st)
+ Morley.Michelson.Interpret: mapToStkEl :: forall meta inp m. (Applicative m, StkElMeta meta m) => Rec Value inp -> m (Rec (StkEl meta) inp)
+ Morley.Michelson.Interpret: mapToValue :: Rec (StkEl meta) inp -> Rec Value inp
+ Morley.Michelson.Interpret: mkDuplicateStkEl :: forall meta t m. (Applicative m, StkElMeta meta m) => StkEl meta t -> m (StkEl meta t)
+ Morley.Michelson.Interpret: mkStkEl :: forall meta t m. (Applicative m, StkElMeta meta m) => Value t -> m (StkEl meta t)
+ Morley.Michelson.Interpret: mkStkElMeta :: StkElMeta meta m => Maybe (meta t) -> Value t -> m (meta t)
+ Morley.Michelson.Interpret: newtype EvalOpT m a
+ Morley.Michelson.Interpret: pattern StkEl :: Value t -> StkEl meta t
+ Morley.Michelson.Interpret: runEvalOpT :: Monad m => EvalOpT m a -> ContractEnv' (EvalOpT m) -> InterpreterState -> m (RunEvalOpReturn a)
+ Morley.Michelson.Interpret: seMetaL :: forall meta_ad9gK t_ad9gL meta_ad9ko. Lens (StkEl meta_ad9gK t_ad9gL) (StkEl meta_ad9ko t_ad9gL) (meta_ad9gK t_ad9gL) (meta_ad9ko t_ad9gL)
+ Morley.Michelson.Interpret: seValueL :: forall meta_ad9gK t_ad9gL. Lens' (StkEl meta_ad9gK t_ad9gL) (Value t_ad9gL)
+ Morley.Michelson.Interpret: type EvalM' ext m = (MonadReader (ContractEnv' m) m, InterpreterStateMonad m, MonadWriter MorleyLogsBuilder m, MonadError (MichelsonFailureWithStack ext) m)
+ Morley.Michelson.Interpret: type EvalOp = EvalOpT Identity
+ Morley.Michelson.Macro: PSSequence :: [op] -> ParsedSeq op
+ Morley.Michelson.Macro: PSSingleMacro :: SrcPos -> Macro -> ParsedSeq op
+ Morley.Michelson.Macro: data ParsedSeq op
+ Morley.Michelson.Macro: expandSeq :: ParsedSeq ExpandedOp -> [ExpandedOp]
+ Morley.Michelson.Macro: instance Control.DeepSeq.NFData op => Control.DeepSeq.NFData (Morley.Michelson.Macro.ParsedSeq op)
+ Morley.Michelson.Macro: instance Data.Aeson.Types.FromJSON.FromJSON op => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Macro.ParsedSeq op)
+ Morley.Michelson.Macro: instance Data.Aeson.Types.ToJSON.ToJSON op => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Macro.ParsedSeq op)
+ Morley.Michelson.Macro: instance Data.Data.Data op => Data.Data.Data (Morley.Michelson.Macro.ParsedSeq op)
+ Morley.Michelson.Macro: instance Data.Foldable.Foldable Morley.Michelson.Macro.ParsedSeq
+ Morley.Michelson.Macro: instance Fmt.Buildable.Buildable Morley.Michelson.Macro.CadrStruct
+ Morley.Michelson.Macro: instance Fmt.Buildable.Buildable Morley.Michelson.Macro.Macro
+ Morley.Michelson.Macro: instance Fmt.Buildable.Buildable Morley.Michelson.Macro.PairStruct
+ Morley.Michelson.Macro: instance Fmt.Buildable.Buildable Morley.Michelson.Macro.ParsedOp
+ Morley.Michelson.Macro: instance Fmt.Buildable.Buildable Morley.Michelson.Macro.UnpairStruct
+ Morley.Michelson.Macro: instance Fmt.Buildable.Buildable op => Fmt.Buildable.Buildable (Morley.Michelson.Macro.ParsedSeq op)
+ Morley.Michelson.Macro: instance GHC.Base.Functor Morley.Michelson.Macro.ParsedSeq
+ Morley.Michelson.Macro: instance GHC.Classes.Eq op => GHC.Classes.Eq (Morley.Michelson.Macro.ParsedSeq op)
+ Morley.Michelson.Macro: instance GHC.Generics.Generic (Morley.Michelson.Macro.ParsedSeq op)
+ Morley.Michelson.Macro: instance GHC.Show.Show op => GHC.Show.Show (Morley.Michelson.Macro.ParsedSeq op)
+ Morley.Michelson.Optimizer: OptimizationStageFixup :: Int -> OptimizationStage
+ Morley.Michelson.Optimizer: instance Fmt.Buildable.Buildable Morley.Michelson.Optimizer.OptimizerStageStats
+ Morley.Michelson.Optimizer.Internal.Rules: adjacentDips :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: adjacentDrops :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: branchShortCut :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: commuteArith :: forall n m s out. Instr (n : (m : s)) out -> Maybe (Instr (m : (n : s)) out)
+ Morley.Michelson.Optimizer.Internal.Rules: compareWithZero :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: defaultRules :: Ruleset
+ Morley.Michelson.Optimizer.Internal.Rules: defaultRulesAndPushPack :: Ruleset
+ Morley.Michelson.Optimizer.Internal.Rules: dig1AndDug1AreSwap :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: digDug :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: dipDrop2swapDrop :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: dipSwapDrop :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: dropMeta :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: dupDugDrop :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: dupSwap2dup :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: emptyDip :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: flattenSeqLHS :: Rule -> Rule
+ Morley.Michelson.Optimizer.Internal.Rules: ifNopNop2Drop :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: internalNop :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: isSomeOnIf :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: justDoubleDrops :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: justDrops :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: mainStageRules :: [Rule]
+ Morley.Michelson.Optimizer.Internal.Rules: noDipNeeded :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: nopIsNeutralForSeq :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: notIf :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: pairMisc :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: pairUnpair :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: pushPack :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: redundantIf :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: removeExtStackType :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: removeNesting :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: rollDips :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: rollPairN :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: rollUnpairN :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: simpleDups :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: specificPush :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: swapBeforeCommutative :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: unpairMisc :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: unrollDips :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: unrollDropN :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: unrollPairN :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: unrollUnpairN :: Rule
+ Morley.Michelson.Optimizer.Internal.Rules: variousNops :: Rule
+ Morley.Michelson.Optimizer.Internal.Ruleset: OptimizationStageFixup :: Int -> OptimizationStage
+ Morley.Michelson.Optimizer.Internal.Ruleset: OptimizationStageMain :: Int -> OptimizationStage
+ Morley.Michelson.Optimizer.Internal.Ruleset: OptimizationStageMainExtended :: Int -> OptimizationStage
+ Morley.Michelson.Optimizer.Internal.Ruleset: OptimizationStagePrepare :: Int -> OptimizationStage
+ Morley.Michelson.Optimizer.Internal.Ruleset: OptimizationStageRollAdjacent :: Int -> OptimizationStage
+ Morley.Michelson.Optimizer.Internal.Ruleset: Rule :: (forall inp out. Instr inp out -> Maybe (Instr inp out)) -> Rule
+ Morley.Michelson.Optimizer.Internal.Ruleset: Ruleset :: Map OptimizationStage (NonEmpty Rule) -> Ruleset
+ Morley.Michelson.Optimizer.Internal.Ruleset: [unRule] :: Rule -> forall inp out. Instr inp out -> Maybe (Instr inp out)
+ Morley.Michelson.Optimizer.Internal.Ruleset: [unRuleset] :: Ruleset -> Map OptimizationStage (NonEmpty Rule)
+ Morley.Michelson.Optimizer.Internal.Ruleset: alterRulesAtPrio :: ([Rule] -> [Rule]) -> OptimizationStage -> Ruleset -> Ruleset
+ Morley.Michelson.Optimizer.Internal.Ruleset: clearRulesAtPrio :: OptimizationStage -> Ruleset -> Ruleset
+ Morley.Michelson.Optimizer.Internal.Ruleset: data OptimizationStage
+ Morley.Michelson.Optimizer.Internal.Ruleset: insertRuleAtPrio :: OptimizationStage -> Rule -> Ruleset -> Ruleset
+ Morley.Michelson.Optimizer.Internal.Ruleset: instance Data.Default.Class.Default Morley.Michelson.Optimizer.Internal.Ruleset.Ruleset
+ Morley.Michelson.Optimizer.Internal.Ruleset: instance Fmt.Buildable.Buildable Morley.Michelson.Optimizer.Internal.Ruleset.OptimizationStage
+ Morley.Michelson.Optimizer.Internal.Ruleset: instance GHC.Base.Monoid Morley.Michelson.Optimizer.Internal.Ruleset.Ruleset
+ Morley.Michelson.Optimizer.Internal.Ruleset: instance GHC.Base.Semigroup Morley.Michelson.Optimizer.Internal.Ruleset.Ruleset
+ Morley.Michelson.Optimizer.Internal.Ruleset: instance GHC.Classes.Eq Morley.Michelson.Optimizer.Internal.Ruleset.OptimizationStage
+ Morley.Michelson.Optimizer.Internal.Ruleset: instance GHC.Classes.Ord Morley.Michelson.Optimizer.Internal.Ruleset.OptimizationStage
+ Morley.Michelson.Optimizer.Internal.Ruleset: newtype Rule
+ Morley.Michelson.Optimizer.Internal.Ruleset: newtype Ruleset
+ Morley.Michelson.Optimizer.Internal.Ruleset: rulesAtPrio :: OptimizationStage -> Ruleset -> [Rule]
+ Morley.Michelson.Optimizer.Utils: applyOnce :: Rule -> Instr inp out -> (Any Bool, Instr inp out)
+ Morley.Michelson.Optimizer.Utils: fixpoint :: (Rule -> Rule) -> Rule
+ Morley.Michelson.Optimizer.Utils: infixr 8 :#
+ Morley.Michelson.Optimizer.Utils: linearizeAndReapply :: Rule -> Instr inp out -> Instr inp out
+ Morley.Michelson.Optimizer.Utils: orRule :: (Rule -> Rule) -> (Rule -> Rule) -> Rule -> Rule
+ Morley.Michelson.Optimizer.Utils: orSimpleRule :: (Rule -> Rule) -> Rule -> Rule -> Rule
+ Morley.Michelson.Optimizer.Utils: pattern (:#) :: Instr inp b -> Instr b out -> Instr inp out
+ Morley.Michelson.Optimizer.Utils: whileApplies :: Rule -> Rule
+ Morley.Michelson.Parser: rawOpsSequence :: Parser a -> Parser [ParsedOp]
+ Morley.Michelson.Parser.Error: instance Fmt.Buildable.Buildable Morley.Michelson.Parser.Error.ParserException
+ Morley.Michelson.Parser.Instr: dipOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr
+ Morley.Michelson.Parser.Macro: allMacros :: Parser (ParsedSeq ParsedOp) -> Parser Macro
+ Morley.Michelson.Parser.Macro: allSingleTokenMacros :: Parser Macro
+ Morley.Michelson.Parser.Macro: diipMac :: Parser [ParsedOp] -> Parser Macro
+ Morley.Michelson.Parser.Types: instance Fmt.Buildable.Buildable Morley.Michelson.Parser.Types.MichelsonSource
+ Morley.Michelson.Printer.Util: instance Morley.Michelson.Printer.Util.RenderDoc Fmt.Utils.Doc
+ Morley.Michelson.Printer.Util: instance Morley.Michelson.Printer.Util.RenderDoc a => Fmt.Buildable.Buildable a
+ Morley.Michelson.Printer.Util: instance Morley.Michelson.Printer.Util.RenderDoc a => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Printer.Util.Prettier a)
+ Morley.Michelson.Printer.Util: printRenderDoc :: (RenderDoc a, FromSimpleDoc b) => Bool -> a -> b
+ Morley.Michelson.Runtime: ExecutorError :: [ExecutorOp] -> ExecutorErrorPrim a -> ExecutorError' a
+ Morley.Michelson.Runtime: [eeCallStack] :: ExecutorError' a -> [ExecutorOp]
+ Morley.Michelson.Runtime: [eeError] :: ExecutorError' a -> ExecutorErrorPrim a
+ Morley.Michelson.Runtime: data ExecutorErrorPrim a
+ Morley.Michelson.Runtime: instance (Data.Typeable.Internal.Typeable a, GHC.Show.Show a, Fmt.Buildable.Buildable a) => GHC.Exception.Type.Exception (Morley.Michelson.Runtime.ExecutorError' a)
+ Morley.Michelson.Runtime: instance (Data.Typeable.Internal.Typeable a, GHC.Show.Show a, Fmt.Buildable.Buildable a) => GHC.Exception.Type.Exception (Morley.Michelson.Runtime.ExecutorErrorPrim a)
+ Morley.Michelson.Runtime: instance Data.Foldable.Foldable Morley.Michelson.Runtime.ExecutorErrorPrim
+ Morley.Michelson.Runtime: instance Data.Traversable.Traversable Morley.Michelson.Runtime.ExecutorErrorPrim
+ Morley.Michelson.Runtime: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.ExecutorOp
+ Morley.Michelson.Runtime: instance Fmt.Buildable.Buildable a => Fmt.Buildable.Buildable (Morley.Michelson.Runtime.ExecutorError' a)
+ Morley.Michelson.Runtime: instance Fmt.Buildable.Buildable a => Fmt.Buildable.Buildable (Morley.Michelson.Runtime.ExecutorErrorPrim a)
+ Morley.Michelson.Runtime: instance GHC.Base.Functor Morley.Michelson.Runtime.ExecutorErrorPrim
+ Morley.Michelson.Runtime: instance GHC.Show.Show a => GHC.Show.Show (Morley.Michelson.Runtime.ExecutorErrorPrim a)
+ Morley.Michelson.Runtime.GState: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.GState.BigMapCounter
+ Morley.Michelson.Runtime.GState: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.GState.ContractState
+ Morley.Michelson.Runtime.GState: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.GState.GStateUpdate
+ Morley.Michelson.Runtime.GState: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.GState.GStateUpdateError
+ Morley.Michelson.Runtime.GState: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.GState.ImplicitState
+ Morley.Michelson.Runtime.GState: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.GState.TicketKey
+ Morley.Michelson.Runtime.Import: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.Import.ContractReadError
+ Morley.Michelson.Runtime.Import: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.Import.ValueReadError
+ Morley.Michelson.Runtime.TxData: instance Fmt.Buildable.Buildable Morley.Michelson.Runtime.TxData.TxParam
+ Morley.Michelson.Text: instance Fmt.Buildable.Buildable Morley.Michelson.Text.MText
+ Morley.Michelson.TypeCheck.Error: TCOpSeq :: [TypeCheckedOp op] -> TCOpSeq op
+ Morley.Michelson.TypeCheck.Error: instance (Morley.Michelson.Printer.Util.RenderDoc op, Fmt.Buildable.Buildable op) => Fmt.Buildable.Buildable (Morley.Michelson.TypeCheck.Error.TcError' op)
+ Morley.Michelson.TypeCheck.Error: instance Control.DeepSeq.NFData op => Control.DeepSeq.NFData (Morley.Michelson.TypeCheck.Error.TCOpSeq op)
+ Morley.Michelson.TypeCheck.Error: instance Fmt.Buildable.Buildable Morley.Michelson.TypeCheck.Error.ExtError
+ Morley.Michelson.TypeCheck.Error: instance Fmt.Buildable.Buildable Morley.Michelson.TypeCheck.Error.StackSize
+ Morley.Michelson.TypeCheck.Error: instance Fmt.Buildable.Buildable Morley.Michelson.TypeCheck.Error.TcTypeError
+ Morley.Michelson.TypeCheck.Error: instance Fmt.Buildable.Buildable Morley.Michelson.TypeCheck.Error.TopLevelType
+ Morley.Michelson.TypeCheck.Error: instance Fmt.Buildable.Buildable Morley.Michelson.TypeCheck.Error.TypeContext
+ Morley.Michelson.TypeCheck.Error: instance GHC.Base.Functor Morley.Michelson.TypeCheck.Error.TCOpSeq
+ Morley.Michelson.TypeCheck.Error: instance GHC.Classes.Eq op => GHC.Classes.Eq (Morley.Michelson.TypeCheck.Error.TCOpSeq op)
+ Morley.Michelson.TypeCheck.Error: instance GHC.Generics.Generic (Morley.Michelson.TypeCheck.Error.TCOpSeq op)
+ Morley.Michelson.TypeCheck.Error: instance GHC.Show.Show op => GHC.Show.Show (Morley.Michelson.TypeCheck.Error.TCOpSeq op)
+ Morley.Michelson.TypeCheck.Error: instance Morley.Michelson.Printer.Util.RenderDoc op => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.TypeCheck.Error.TCOpSeq op)
+ Morley.Michelson.TypeCheck.Error: newtype TCOpSeq op
+ Morley.Michelson.TypeCheck.TypeCheck: instance Fmt.Buildable.Buildable Morley.Michelson.TypeCheck.TypeCheck.SomeParamType
+ Morley.Michelson.TypeCheck.TypeCheckedOp: IllTypedNest :: [IllTypedInstr op] -> IllTypedInstr op
+ Morley.Michelson.TypeCheck.TypeCheckedOp: [MixedOp] :: Nesting -> SomeSingInstr -> [IllTypedInstr op] -> TypeCheckedOp op
+ Morley.Michelson.TypeCheck.TypeCheckedOp: [SomeSingInstr] :: (SingI inp, SingI out) => Instr inp out -> SomeSingInstr
+ Morley.Michelson.TypeCheck.TypeCheckedOp: data Nesting
+ Morley.Michelson.TypeCheck.TypeCheckedOp: data SomeSingInstr
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance Control.DeepSeq.NFData Morley.Michelson.TypeCheck.TypeCheckedOp.Nesting
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance Control.DeepSeq.NFData Morley.Michelson.TypeCheck.TypeCheckedOp.SomeSingInstr
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance GHC.Classes.Eq Morley.Michelson.TypeCheck.TypeCheckedOp.Nesting
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance GHC.Classes.Eq Morley.Michelson.TypeCheck.TypeCheckedOp.SomeSingInstr
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance GHC.Classes.Ord Morley.Michelson.TypeCheck.TypeCheckedOp.Nesting
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance GHC.Enum.Bounded Morley.Michelson.TypeCheck.TypeCheckedOp.Nesting
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance GHC.Enum.Enum Morley.Michelson.TypeCheck.TypeCheckedOp.Nesting
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance GHC.Num.Num Morley.Michelson.TypeCheck.TypeCheckedOp.Nesting
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance GHC.Show.Show Morley.Michelson.TypeCheck.TypeCheckedOp.Nesting
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance GHC.Show.Show Morley.Michelson.TypeCheck.TypeCheckedOp.SomeSingInstr
+ Morley.Michelson.TypeCheck.TypeCheckedOp: instance Morley.Michelson.Printer.Util.RenderDoc op => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.TypeCheck.TypeCheckedOp.IllTypedInstr op)
+ Morley.Michelson.TypeCheck.TypeCheckedOp: withSomeTcInstr :: SomeTcInstr inp -> (forall out. (SingI inp, SingI out) => Instr inp out -> r) -> r
+ Morley.Michelson.TypeCheck.TypeCheckedSeq: IllTypedNest :: [IllTypedInstr op] -> IllTypedInstr op
+ Morley.Michelson.TypeCheck.TypeCheckedSeq: [MixedOp] :: Nesting -> SomeSingInstr -> [IllTypedInstr op] -> TypeCheckedOp op
+ Morley.Michelson.TypeCheck.TypeCheckedSeq: data Nesting
+ Morley.Michelson.TypeCheck.Types: instance Fmt.Buildable.Buildable (Morley.Michelson.TypeCheck.Types.HST ts)
+ Morley.Michelson.TypeCheck.Types: instance Fmt.Buildable.Buildable (Morley.Michelson.TypeCheck.Types.SomeTcInstr inp)
+ Morley.Michelson.TypeCheck.Types: instance Fmt.Buildable.Buildable (Morley.Michelson.TypeCheck.Types.SomeTcInstrOut inp)
+ Morley.Michelson.Typed: PSBigMap :: TPredicateSym
+ Morley.Michelson.Typed: PSContract :: TPredicateSym
+ Morley.Michelson.Typed: PSNestedBigMaps :: TPredicateSym
+ Morley.Michelson.Typed: PSNonComparable :: TPredicateSym
+ Morley.Michelson.Typed: PSOp :: TPredicateSym
+ Morley.Michelson.Typed: PSSaplingState :: TPredicateSym
+ Morley.Michelson.Typed: PSTicket :: TPredicateSym
+ Morley.Michelson.Typed: ViewsSet :: Map ViewName (SomeView' instr st) -> ViewsSet' instr st
+ Morley.Michelson.Typed: [SPSBigMap] :: SingTPredicateSym ('PSBigMap :: TPredicateSym)
+ Morley.Michelson.Typed: [SPSContract] :: SingTPredicateSym ('PSContract :: TPredicateSym)
+ Morley.Michelson.Typed: [SPSNestedBigMaps] :: SingTPredicateSym ('PSNestedBigMaps :: TPredicateSym)
+ Morley.Michelson.Typed: [SPSNonComparable] :: SingTPredicateSym ('PSNonComparable :: TPredicateSym)
+ Morley.Michelson.Typed: [SPSOp] :: SingTPredicateSym ('PSOp :: TPredicateSym)
+ Morley.Michelson.Typed: [SPSSaplingState] :: SingTPredicateSym ('PSSaplingState :: TPredicateSym)
+ Morley.Michelson.Typed: [SPSTicket] :: SingTPredicateSym ('PSTicket :: TPredicateSym)
+ Morley.Michelson.Typed: [TAbsent] :: ContainsT p t ~ 'False => TPresence p t
+ Morley.Michelson.Typed: [TPresent] :: ContainsT p t ~ 'True => TPresence p t
+ Morley.Michelson.Typed: checkTPresence :: forall p ty. Sing p -> Sing ty -> TPresence p ty
+ Morley.Michelson.Typed: class ForbidManyT (ForbidT p t) '[p] t => ForbidT p t
+ Morley.Michelson.Typed: class UntypedValScopeC (UntypedValScope t) t => UntypedValScope t
+ Morley.Michelson.Typed: comparableImplies :: forall t proxy. ForbidNonComparable t => proxy t -> Dict (ComparabilityImplies t)
+ Morley.Michelson.Typed: convertContractCodeOptimized :: forall param store. (SingI param, SingI store) => ContractCode param store -> Contract
+ Morley.Michelson.Typed: convertContractOptimized :: Contract param store -> Contract
+ Morley.Michelson.Typed: data SingTPredicateSym :: TPredicateSym -> Type
+ Morley.Michelson.Typed: data TPredicateSym
+ Morley.Michelson.Typed: data TPresence p t
+ Morley.Michelson.Typed: deMorganForbidT :: forall a b r p. (ContainsT p a || ContainsT p b) ~ 'False => Sing p -> Sing a -> Sing b -> ((ForbidT p a, ForbidT p b) => r) -> r
+ Morley.Michelson.Typed: pattern BigMapPresent :: () => ContainsBigMap t ~ 'True => BigMapPresence t
+ Morley.Michelson.Typed: pattern ContractPresent :: () => ContainsContract t ~ 'True => ContractPresence t
+ Morley.Michelson.Typed: pattern NestedBigMapsPresent :: () => ContainsNestedBigMaps t ~ 'True => NestedBigMapsPresence t
+ Morley.Michelson.Typed: pattern OpAbsent :: () => ContainsOp t ~ 'False => OpPresence t
+ Morley.Michelson.Typed: pattern SaplingStatePresent :: () => ContainsSaplingState t ~ 'True => SaplingStatePresence t
+ Morley.Michelson.Typed: pattern TicketPresent :: () => ContainsTicket t ~ 'True => TicketPresence t
+ Morley.Michelson.Typed: pattern UnsafeViewsSet :: Map ViewName (SomeView' instr st) -> ViewsSet' instr st
+ Morley.Michelson.Typed: tAbsence :: Sing p -> Sing t -> Maybe (ContainsT p t :~: 'False)
+ Morley.Michelson.Typed: tPresence :: Sing p -> Sing t -> Maybe (ContainsT p t :~: 'True)
+ Morley.Michelson.Typed: type BigMapPresence (t :: T) = TPresence 'PSBigMap t
+ Morley.Michelson.Typed: type ContainsBigMap t = ContainsT 'PSBigMap t
+ Morley.Michelson.Typed: type ContainsContract t = ContainsT 'PSContract t
+ Morley.Michelson.Typed: type ContainsNestedBigMaps t = ContainsT 'PSNestedBigMaps t
+ Morley.Michelson.Typed: type ContainsOp t = ContainsT 'PSOp t
+ Morley.Michelson.Typed: type ContainsTicket t = ContainsT 'PSTicket t
+ Morley.Michelson.Typed: type ContractPresence (t :: T) = TPresence 'PSContract t
+ Morley.Michelson.Typed: type IsComparable t = Not (ContainsT 'PSNonComparable t)
+ Morley.Michelson.Typed: type NestedBigMapsPresence (t :: T) = TPresence 'PSNestedBigMaps t
+ Morley.Michelson.Typed: type OpPresence (t :: T) = TPresence 'PSOp t
+ Morley.Michelson.Typed: type TicketPresence (t :: T) = TPresence 'PSTicket t
+ Morley.Michelson.Typed.AnnotatedValue: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.AnnotatedValue.AnnotatedValue v)
+ Morley.Michelson.Typed.AnnotatedValue: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.AnnotatedValue.SomeAnnotatedValue
+ Morley.Michelson.Typed.Arith: instance (Fmt.Buildable.Buildable n, Fmt.Buildable.Buildable m) => Fmt.Buildable.Buildable (Morley.Michelson.Typed.Arith.ArithError n m)
+ Morley.Michelson.Typed.Arith: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Arith.MutezArithErrorType
+ Morley.Michelson.Typed.Arith: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Arith.ShiftArithErrorType
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.TH: promote :: forall a. (Enum a, Lift a) => a -> TypeQ
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.InstrClassSym1 a6989586621679387875)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.InstrClassSym2 a6989586621679387875 a6989586621679387876)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.InstrClassSym3 a6989586621679387875 a6989586621679387876 a6989586621679387877)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Language.Haskell.TH.Syntax.Lift Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.FailureType
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Language.Haskell.TH.Syntax.Lift Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.HasAnns
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Language.Haskell.TH.Syntax.Lift Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.IsMichelson
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: instance Language.Haskell.TH.Syntax.Lift Morley.Michelson.Typed.ClassifiedInstr.Internal.Types.NumChildren
+ Morley.Michelson.Typed.Convert: convertContractCodeOptimized :: forall param store. (SingI param, SingI store) => ContractCode param store -> Contract
+ Morley.Michelson.Typed.Convert: convertContractOptimized :: Contract param store -> Contract
+ Morley.Michelson.Typed.Convert: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' Morley.Michelson.Typed.Instr.Instr t)
+ Morley.Michelson.Typed.Convert: instance Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidOp t => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Typed.Value.Value' Morley.Michelson.Typed.Instr.Instr t)
+ Morley.Michelson.Typed.Entrypoints: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Entrypoints.EntrypointCallT param arg)
+ Morley.Michelson.Typed.Entrypoints: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Entrypoints.EpLiftSequence arg param)
+ Morley.Michelson.Typed.Entrypoints: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Entrypoints.SomeEntrypointCallT arg)
+ Morley.Michelson.Typed.Entrypoints: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Entrypoints.ArmCoord
+ Morley.Michelson.Typed.Entrypoints: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Entrypoints.EpAddress
+ Morley.Michelson.Typed.Entrypoints: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Entrypoints.ParamEpError
+ Morley.Michelson.Typed.Entrypoints: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Entrypoints.ParseEpAddressError
+ Morley.Michelson.Typed.Existential: instance (forall (t :: Morley.Michelson.Typed.T.T). cs t => Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidOp t) => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Typed.Existential.SomeConstrainedValue cs)
+ Morley.Michelson.Typed.Haskell.Doc: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Haskell.Doc.DType
+ Morley.Michelson.Typed.Haskell.Doc: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Haskell.Doc.DocTypeRepLHS
+ Morley.Michelson.Typed.Haskell.Value: instance (GHC.Classes.Ord k, Fmt.Buildable.Buildable k, Fmt.Buildable.Buildable v) => Fmt.Buildable.Buildable (Morley.Michelson.Typed.Haskell.Value.BigMap k v)
+ Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Haskell.Value.HasNoOpToT arg, Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidNestedBigMaps (Morley.Michelson.Typed.Haskell.Value.ToT arg), Morley.Michelson.Typed.Haskell.Value.WellTypedToT arg) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Haskell.Value.ContractRef arg)
+ Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Scope.Internal.Comparable.Comparable (Morley.Michelson.Typed.Haskell.Value.ToT a), Morley.Michelson.Typed.Haskell.Value.IsoValue a) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Haskell.Value.Ticket a)
+ Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Scope.Internal.Comparable.Comparable (Morley.Michelson.Typed.Haskell.Value.ToT c), GHC.Classes.Ord c, Morley.Michelson.Typed.Haskell.Value.IsoValue c) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Data.Set.Internal.Set c)
+ Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Scope.Internal.Comparable.Comparable (Morley.Michelson.Typed.Haskell.Value.ToT k), GHC.Classes.Ord k, Morley.Michelson.Typed.Haskell.Value.IsoValue k, Morley.Michelson.Typed.Haskell.Value.IsoValue v) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Data.Map.Internal.Map k v)
+ Morley.Michelson.Typed.Haskell.Value: instance (Morley.Michelson.Typed.Scope.Internal.Comparable.Comparable (Morley.Michelson.Typed.Haskell.Value.ToT k), GHC.Classes.Ord k, Morley.Michelson.Typed.Haskell.Value.IsoValue k, Morley.Michelson.Typed.Haskell.Value.IsoValue v, Morley.Michelson.Typed.Haskell.Value.HasNoBigMapToT v, Morley.Michelson.Typed.Haskell.Value.HasNoOpToT v) => Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Haskell.Value.BigMap k v)
+ Morley.Michelson.Typed.Haskell.Value: instance Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Haskell.Value.ContractRef arg) => Fmt.Buildable.Buildable (Morley.Michelson.Typed.Haskell.Value.ContractRef arg)
+ Morley.Michelson.Typed.Haskell.Value: instance Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped t => Morley.Michelson.Typed.Haskell.Value.IsoValue (Morley.Michelson.Typed.Aliases.Value t)
+ Morley.Michelson.Typed.Haskell.Value: instance forall k1 (k2 :: k1) k3 (v :: k3). Fmt.Buildable.Buildable (Morley.Michelson.Typed.Haskell.Value.BigMapId k2 v)
+ Morley.Michelson.Typed.Instr: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Instr.StackRef st)
+ Morley.Michelson.Typed.Operation: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Operation.EmitOperation
+ Morley.Michelson.Typed.Operation: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Operation.OriginationOperation
+ Morley.Michelson.Typed.Operation: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Operation.SetDelegateOperation
+ Morley.Michelson.Typed.Operation: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Operation.TransferOperation
+ Morley.Michelson.Typed.Scope: PSBigMap :: TPredicateSym
+ Morley.Michelson.Typed.Scope: PSContract :: TPredicateSym
+ Morley.Michelson.Typed.Scope: PSNestedBigMaps :: TPredicateSym
+ Morley.Michelson.Typed.Scope: PSNonComparable :: TPredicateSym
+ Morley.Michelson.Typed.Scope: PSOp :: TPredicateSym
+ Morley.Michelson.Typed.Scope: PSSaplingState :: TPredicateSym
+ Morley.Michelson.Typed.Scope: PSTicket :: TPredicateSym
+ Morley.Michelson.Typed.Scope: [SPSBigMap] :: SingTPredicateSym ('PSBigMap :: TPredicateSym)
+ Morley.Michelson.Typed.Scope: [SPSContract] :: SingTPredicateSym ('PSContract :: TPredicateSym)
+ Morley.Michelson.Typed.Scope: [SPSNestedBigMaps] :: SingTPredicateSym ('PSNestedBigMaps :: TPredicateSym)
+ Morley.Michelson.Typed.Scope: [SPSNonComparable] :: SingTPredicateSym ('PSNonComparable :: TPredicateSym)
+ Morley.Michelson.Typed.Scope: [SPSOp] :: SingTPredicateSym ('PSOp :: TPredicateSym)
+ Morley.Michelson.Typed.Scope: [SPSSaplingState] :: SingTPredicateSym ('PSSaplingState :: TPredicateSym)
+ Morley.Michelson.Typed.Scope: [SPSTicket] :: SingTPredicateSym ('PSTicket :: TPredicateSym)
+ Morley.Michelson.Typed.Scope: [TAbsent] :: ContainsT p t ~ 'False => TPresence p t
+ Morley.Michelson.Typed.Scope: [TPresent] :: ContainsT p t ~ 'True => TPresence p t
+ Morley.Michelson.Typed.Scope: checkTPresence :: forall p ty. Sing p -> Sing ty -> TPresence p ty
+ Morley.Michelson.Typed.Scope: class ForbidManyT (ForbidT p t) '[p] t => ForbidT p t
+ Morley.Michelson.Typed.Scope: class UntypedValScopeC (UntypedValScope t) t => UntypedValScope t
+ Morley.Michelson.Typed.Scope: comparableImplies :: forall t proxy. ForbidNonComparable t => proxy t -> Dict (ComparabilityImplies t)
+ Morley.Michelson.Typed.Scope: data SingTPredicateSym :: TPredicateSym -> Type
+ Morley.Michelson.Typed.Scope: data TPredicateSym
+ Morley.Michelson.Typed.Scope: data TPresence p t
+ Morley.Michelson.Typed.Scope: deMorganForbidT :: forall a b r p. (ContainsT p a || ContainsT p b) ~ 'False => Sing p -> Sing a -> Sing b -> ((ForbidT p a, ForbidT p b) => r) -> r
+ Morley.Michelson.Typed.Scope: pattern BigMapAbsent :: () => ContainsBigMap t ~ 'False => BigMapPresence t
+ Morley.Michelson.Typed.Scope: pattern ContractAbsent :: () => ContainsContract t ~ 'False => ContractPresence t
+ Morley.Michelson.Typed.Scope: pattern NestedBigMapsAbsent :: () => ContainsNestedBigMaps t ~ 'False => NestedBigMapsPresence t
+ Morley.Michelson.Typed.Scope: pattern OpAbsent :: () => ContainsOp t ~ 'False => OpPresence t
+ Morley.Michelson.Typed.Scope: pattern SaplingStateAbsent :: () => ContainsSaplingState t ~ 'False => SaplingStatePresence t
+ Morley.Michelson.Typed.Scope: pattern TicketAbsent :: () => ContainsTicket t ~ 'False => TicketPresence t
+ Morley.Michelson.Typed.Scope: tAbsence :: Sing p -> Sing t -> Maybe (ContainsT p t :~: 'False)
+ Morley.Michelson.Typed.Scope: tPresence :: Sing p -> Sing t -> Maybe (ContainsT p t :~: 'True)
+ Morley.Michelson.Typed.Scope: type BigMapPresence (t :: T) = TPresence 'PSBigMap t
+ Morley.Michelson.Typed.Scope: type ContainsBigMap t = ContainsT 'PSBigMap t
+ Morley.Michelson.Typed.Scope: type ContainsContract t = ContainsT 'PSContract t
+ Morley.Michelson.Typed.Scope: type ContainsNestedBigMaps t = ContainsT 'PSNestedBigMaps t
+ Morley.Michelson.Typed.Scope: type ContainsOp t = ContainsT 'PSOp t
+ Morley.Michelson.Typed.Scope: type ContainsTicket t = ContainsT 'PSTicket t
+ Morley.Michelson.Typed.Scope: type ContractPresence (t :: T) = TPresence 'PSContract t
+ Morley.Michelson.Typed.Scope: type IsComparable t = Not (ContainsT 'PSNonComparable t)
+ Morley.Michelson.Typed.Scope: type NestedBigMapsPresence (t :: T) = TPresence 'PSNestedBigMaps t
+ Morley.Michelson.Typed.Scope: type OpPresence (t :: T) = TPresence 'PSOp t
+ Morley.Michelson.Typed.Scope: type TicketPresence (t :: T) = TPresence 'PSTicket t
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: checkScope :: CheckScope c => Either BadTypeForScope (Dict c)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: class CheckScope (c :: Constraint)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance (Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope a, Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope b) => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (a, b)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.Comparable.Comparable t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidBigMap t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidContract t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidNestedBigMaps t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidOp t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidSaplingState t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidTicket t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.Scopes.ComparabilityScope t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.Scopes.ConstantScope t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.Scopes.DupableScope t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.Scopes.PackedValScope t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.Scopes.ParameterScope t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.Scopes.StorageScope t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.Scopes.UnpackedValScope t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.Scopes.ViewableScope t)
+ Morley.Michelson.Typed.Scope.Internal.CheckScope: instance Data.Singletons.SingI t => Morley.Michelson.Typed.Scope.Internal.CheckScope.CheckScope (Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped t)
+ Morley.Michelson.Typed.Scope.Internal.Comparable: [CanBeCompared] :: (Comparable t, ComparabilityImplies t) => Comparability t
+ Morley.Michelson.Typed.Scope.Internal.Comparable: [CannotBeCompared] :: ContainsT 'PSNonComparable t ~ 'True => Comparability t
+ Morley.Michelson.Typed.Scope.Internal.Comparable: checkComparability :: Sing t -> Comparability t
+ Morley.Michelson.Typed.Scope.Internal.Comparable: class (SingI t, RecSuperC Comparable t, ForbidNonComparable t) => Comparable t
+ Morley.Michelson.Typed.Scope.Internal.Comparable: comparabilityPresence :: Sing t -> Maybe (Dict (Comparable t))
+ Morley.Michelson.Typed.Scope.Internal.Comparable: comparableImplies :: forall t proxy. ForbidNonComparable t => proxy t -> Dict (ComparabilityImplies t)
+ Morley.Michelson.Typed.Scope.Internal.Comparable: data Comparability t
+ Morley.Michelson.Typed.Scope.Internal.Comparable: instance (Data.Singletons.SingI t, Morley.Michelson.Typed.Scope.Internal.Comparable.RecSuperC Morley.Michelson.Typed.Scope.Internal.Comparable.Comparable t, Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidNonComparable t) => Morley.Michelson.Typed.Scope.Internal.Comparable.Comparable t
+ Morley.Michelson.Typed.Scope.Internal.Comparable: instance GHC.Show.Show (Morley.Michelson.Typed.Scope.Internal.Comparable.Comparability t)
+ Morley.Michelson.Typed.Scope.Internal.Comparable: type ComparabilityImplies t = (ForbidOp t, ForbidNestedBigMaps t, ForbidTicket t, ForbidSaplingState t, ForbidBigMap t, ForbidContract t, ForbidNonComparable t)
+ Morley.Michelson.Typed.Scope.Internal.Comparable: type family RecSuperC c t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: bigMapAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidBigMap t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: checkBigMapPresence :: Sing (ty :: T) -> TPresence 'PSBigMap ty
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: checkContractTypePresence :: Sing (ty :: T) -> TPresence 'PSContract ty
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: checkNestedBigMapsPresence :: Sing (ty :: T) -> TPresence 'PSNestedBigMaps ty
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: checkOpPresence :: Sing (ty :: T) -> TPresence 'PSOp ty
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: checkTicketPresence :: Sing (ty :: T) -> TPresence 'PSTicket ty
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: class (ContainsBigMap t ~ 'False) => HasNoBigMap t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: class (ContainsContract t ~ 'False) => HasNoContract t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: class (ContainsNestedBigMaps t ~ 'False) => HasNoNestedBigMaps t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: class (ContainsOp t ~ 'False) => HasNoOp t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: class (ContainsSaplingState t ~ 'False) => HasNoSaplingState t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: class (ContainsTicket t ~ 'False) => HasNoTicket t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: comparabilityImpliesNoNestedBigMaps :: forall t. (SingI t, IsComparable t ~ 'True) => ContainsNestedBigMaps t :~: 'False
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: comparabilityImpliesNoOp :: forall t. (SingI t, IsComparable t ~ 'True) => ContainsOp t :~: 'False
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: contractTypeAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidContract t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: getComparableProofS :: Sing (a :: T) -> Maybe (Dict (Comparable a))
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: instance (Morley.Michelson.Typed.Scope.Internal.Deprecated.ContainsBigMap t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.Internal.Deprecated.HasNoBigMap t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: instance (Morley.Michelson.Typed.Scope.Internal.Deprecated.ContainsContract t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.Internal.Deprecated.HasNoContract t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: instance (Morley.Michelson.Typed.Scope.Internal.Deprecated.ContainsNestedBigMaps t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.Internal.Deprecated.HasNoNestedBigMaps t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: instance (Morley.Michelson.Typed.Scope.Internal.Deprecated.ContainsOp t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.Internal.Deprecated.HasNoOp t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: instance (Morley.Michelson.Typed.Scope.Internal.Deprecated.ContainsSaplingState t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.Internal.Deprecated.HasNoSaplingState t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: instance (Morley.Michelson.Typed.Scope.Internal.Deprecated.ContainsTicket t GHC.Types.~ 'GHC.Types.False) => Morley.Michelson.Typed.Scope.Internal.Deprecated.HasNoTicket t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: nestedBigMapsAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidNestedBigMaps t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: opAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidOp t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: pattern BigMapPresent :: () => ContainsBigMap t ~ 'True => BigMapPresence t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: pattern ContractPresent :: () => ContainsContract t ~ 'True => ContractPresence t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: pattern NestedBigMapsPresent :: () => ContainsNestedBigMaps t ~ 'True => NestedBigMapsPresence t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: pattern OpPresent :: () => ContainsOp t ~ 'True => OpPresence t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: pattern SaplingStatePresent :: () => ContainsSaplingState t ~ 'True => SaplingStatePresence t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: pattern TicketPresent :: () => ContainsTicket t ~ 'True => TicketPresence t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type BigMapPresence (t :: T) = TPresence 'PSBigMap t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ContainsBigMap t = ContainsT 'PSBigMap t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ContainsContract t = ContainsT 'PSContract t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ContainsNestedBigMaps t = ContainsT 'PSNestedBigMaps t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ContainsOp t = ContainsT 'PSOp t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ContainsSaplingState t = ContainsT 'PSSaplingState t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ContainsTicket t = ContainsT 'PSTicket t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ContractPresence (t :: T) = TPresence 'PSContract t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type IsComparable t = Not (ContainsT 'PSNonComparable t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type NestedBigMapsPresence (t :: T) = TPresence 'PSNestedBigMaps t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type OpPresence (t :: T) = TPresence 'PSOp t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ProperConstantBetterErrors t = (SingI t, WellTyped t, ForbidOp t, ForbidBigMap t, ForbidContract t, ForbidTicket t, ForbidSaplingState t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ProperDupableBetterErrors t = (SingI t, ForbidTicket t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ProperNonComparableValBetterErrors t = (SingI t, ForbidNonComparable t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ProperPackedValBetterErrors t = (SingI t, WellTyped t, ForbidOp t, ForbidBigMap t, ForbidTicket t, ForbidSaplingState t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ProperParameterBetterErrors t = (SingI t, WellTyped t, ForbidOp t, ForbidNestedBigMaps t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ProperStorageBetterErrors t = (SingI t, WellTyped t, ForbidOp t, ForbidNestedBigMaps t, ForbidContract t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ProperUnpackedValBetterErrors t = (ProperPackedValBetterErrors t, ProperConstantBetterErrors t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ProperUntypedValBetterErrors t = (SingI t, ForbidOp t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type ProperViewableBetterErrors t = (SingI t, ForbidOp t, ForbidBigMap t, ForbidTicket t)
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type SaplingStatePresence (t :: T) = TPresence 'PSSaplingState t
+ Morley.Michelson.Typed.Scope.Internal.Deprecated: type TicketPresence (t :: T) = TPresence 'PSTicket t
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: PSBigMap :: TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: PSContract :: TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: PSNestedBigMaps :: TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: PSNonComparable :: TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: PSOp :: TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: PSSaplingState :: TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: PSTicket :: TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: [SPSBigMap] :: SingTPredicateSym ('PSBigMap :: TPredicateSym)
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: [SPSContract] :: SingTPredicateSym ('PSContract :: TPredicateSym)
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: [SPSNestedBigMaps] :: SingTPredicateSym ('PSNestedBigMaps :: TPredicateSym)
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: [SPSNonComparable] :: SingTPredicateSym ('PSNonComparable :: TPredicateSym)
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: [SPSOp] :: SingTPredicateSym ('PSOp :: TPredicateSym)
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: [SPSSaplingState] :: SingTPredicateSym ('PSSaplingState :: TPredicateSym)
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: [SPSTicket] :: SingTPredicateSym ('PSTicket :: TPredicateSym)
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: class ForbidManySuperC ps t => ForbidManyT' c ps' ps t where {
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: class ForbidManyT (ForbidT p t) '[p] t => ForbidT p t
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: data SingTPredicateSym :: TPredicateSym -> Type
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: data TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance (Type.Errors.IfStuck (Morley.Michelson.Typed.Scope.Internal.ForbidT.ContainsT p t) (Type.Errors.DelayError (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidManyTStuckErr c ps' t)) (Fcf.Combinators.Pure (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidManyT' c ps' ps t)), Morley.Util.Type.FailWhen (Morley.Michelson.Typed.Scope.Internal.ForbidT.ContainsT p t) (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidTErrorMsg p t)) => Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidManyT' c ps' (p : ps) t
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Singletons.Decide.SDecide Morley.Michelson.Typed.Scope.Internal.ForbidT.TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Singletons.SingI 'Morley.Michelson.Typed.Scope.Internal.ForbidT.PSBigMap
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Singletons.SingI 'Morley.Michelson.Typed.Scope.Internal.ForbidT.PSContract
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Singletons.SingI 'Morley.Michelson.Typed.Scope.Internal.ForbidT.PSNestedBigMaps
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Singletons.SingI 'Morley.Michelson.Typed.Scope.Internal.ForbidT.PSNonComparable
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Singletons.SingI 'Morley.Michelson.Typed.Scope.Internal.ForbidT.PSOp
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Singletons.SingI 'Morley.Michelson.Typed.Scope.Internal.ForbidT.PSSaplingState
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Singletons.SingI 'Morley.Michelson.Typed.Scope.Internal.ForbidT.PSTicket
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Singletons.SingKind Morley.Michelson.Typed.Scope.Internal.ForbidT.TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Type.Coercion.TestCoercion Morley.Michelson.Typed.Scope.Internal.ForbidT.SingTPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Data.Type.Equality.TestEquality Morley.Michelson.Typed.Scope.Internal.ForbidT.SingTPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidManyT (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidT p t) '[p] t => Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidT p t
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: instance Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidManyT' c ps' '[] t
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type ForbidBigMap = ForbidT 'PSBigMap " Convenience synonym"
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type ForbidContract = ForbidT 'PSContract " Convenience synonym"
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type ForbidManyT c ps = ForbidManyT' c ps ps
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type ForbidManyTStuckErr c ps t = 'Text "Can't check if type" :$$: 'ShowType t :$$: 'Text "contains " :<>: TPredicateSymTypeNames ps :<>: 'Text ". Perhaps you need to add" :$$: 'ShowType c :$$: 'Text "constraint? You can also try adding a type annotation."
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type ForbidNestedBigMaps = ForbidT 'PSNestedBigMaps " Convenience synonym"
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type ForbidNonComparable = ForbidT 'PSNonComparable " Convenience synonym"
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type ForbidOp = ForbidT 'PSOp " Convenience synonym"
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type ForbidSaplingState = ForbidT 'PSSaplingState " Convenience synonym"
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type ForbidTicket = ForbidT 'PSTicket " Convenience synonym"
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: type family PSOpSym0 :: TPredicateSym
+ Morley.Michelson.Typed.Scope.Internal.ForbidT: }
+ Morley.Michelson.Typed.Scope.Internal.Presence: [TAbsent] :: ContainsT p t ~ 'False => TPresence p t
+ Morley.Michelson.Typed.Scope.Internal.Presence: [TPresent] :: ContainsT p t ~ 'True => TPresence p t
+ Morley.Michelson.Typed.Scope.Internal.Presence: checkTPresence :: forall p ty. Sing p -> Sing ty -> TPresence p ty
+ Morley.Michelson.Typed.Scope.Internal.Presence: data TPresence p t
+ Morley.Michelson.Typed.Scope.Internal.Presence: instance GHC.Show.Show (Morley.Michelson.Typed.Scope.Internal.Presence.TPresence t p)
+ Morley.Michelson.Typed.Scope.Internal.Presence: tAbsence :: Sing p -> Sing t -> Maybe (ContainsT p t :~: 'False)
+ Morley.Michelson.Typed.Scope.Internal.Presence: tPresence :: Sing p -> Sing t -> Maybe (ContainsT p t :~: 'True)
+ Morley.Michelson.Typed.Scope.Internal.Scopes: class ComparabilityScopeC (ComparabilityScope t) t => ComparabilityScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: class ConstantScopeC (ConstantScope t) t => ConstantScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: class DupableScopeC (DupableScope t) t => DupableScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: class PackedValScopeC (PackedValScope t) t => PackedValScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: class ParameterScopeC (ParameterScope t) t => ParameterScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: class StorageScopeC (StorageScope t) t => StorageScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: class UnpackedValScopeC (UnpackedValScope t) t => UnpackedValScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: class UntypedValScopeC (UntypedValScope t) t => UntypedValScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: class ViewableScopeC (ViewableScope t) t => ViewableScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: instance Morley.Michelson.Typed.Scope.Internal.Scopes.ComparabilityScopeC (Morley.Michelson.Typed.Scope.Internal.Scopes.ComparabilityScope t) t => Morley.Michelson.Typed.Scope.Internal.Scopes.ComparabilityScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: instance Morley.Michelson.Typed.Scope.Internal.Scopes.ConstantScopeC (Morley.Michelson.Typed.Scope.Internal.Scopes.ConstantScope t) t => Morley.Michelson.Typed.Scope.Internal.Scopes.ConstantScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: instance Morley.Michelson.Typed.Scope.Internal.Scopes.DupableScopeC (Morley.Michelson.Typed.Scope.Internal.Scopes.DupableScope t) t => Morley.Michelson.Typed.Scope.Internal.Scopes.DupableScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: instance Morley.Michelson.Typed.Scope.Internal.Scopes.PackedValScopeC (Morley.Michelson.Typed.Scope.Internal.Scopes.PackedValScope t) t => Morley.Michelson.Typed.Scope.Internal.Scopes.PackedValScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: instance Morley.Michelson.Typed.Scope.Internal.Scopes.ParameterScopeC (Morley.Michelson.Typed.Scope.Internal.Scopes.ParameterScope t) t => Morley.Michelson.Typed.Scope.Internal.Scopes.ParameterScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: instance Morley.Michelson.Typed.Scope.Internal.Scopes.StorageScopeC (Morley.Michelson.Typed.Scope.Internal.Scopes.StorageScope t) t => Morley.Michelson.Typed.Scope.Internal.Scopes.StorageScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: instance Morley.Michelson.Typed.Scope.Internal.Scopes.UnpackedValScopeC (Morley.Michelson.Typed.Scope.Internal.Scopes.UnpackedValScope t) t => Morley.Michelson.Typed.Scope.Internal.Scopes.UnpackedValScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: instance Morley.Michelson.Typed.Scope.Internal.Scopes.UntypedValScopeC (Morley.Michelson.Typed.Scope.Internal.Scopes.UntypedValScope t) t => Morley.Michelson.Typed.Scope.Internal.Scopes.UntypedValScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: instance Morley.Michelson.Typed.Scope.Internal.Scopes.ViewableScopeC (Morley.Michelson.Typed.Scope.Internal.Scopes.ViewableScope t) t => Morley.Michelson.Typed.Scope.Internal.Scopes.ViewableScope t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type CommonScopeC c ps t = (SingI t, ForbidManyT c ps t, WellTyped t)
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type ComparabilityScopeC c t = (SingI t, ForbidManyT c '[ 'PSNonComparable] t, Comparable t)
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type ConstantScopeC c t = CommonScopeC c ['PSOp, 'PSBigMap, 'PSContract, 'PSTicket, 'PSSaplingState] t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type DupableScopeC c t = (SingI t, ForbidManyT c '[ 'PSTicket] t)
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type PackedValScopeC c t = CommonScopeC c ['PSOp, 'PSBigMap, 'PSTicket, 'PSSaplingState] t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type ParameterScopeC c t = CommonScopeC c ['PSOp, 'PSNestedBigMaps] t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type StorageScopeC c t = CommonScopeC c ['PSOp, 'PSNestedBigMaps, 'PSContract] t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type UnpackedValScopeC c t = ConstantScopeC c t
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type UntypedValScopeC c t = (SingI t, ForbidManyT c '[ 'PSOp] t)
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type ViewableScopeC c t = (SingI t, ForbidManyT c ['PSOp, 'PSBigMap, 'PSTicket] t)
+ Morley.Michelson.Typed.Scope.Internal.Scopes: type family IsDupableScope (t :: T) :: Bool
+ Morley.Michelson.Typed.Scope.Internal.TH: byTPredicateSymCases :: ExpQ -> [(Name, ExpQ)] -> ExpQ -> ExpQ
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: BtHasBigMap :: BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: BtHasContract :: BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: BtHasNestedBigMap :: BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: BtHasSaplingState :: BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: BtHasTicket :: BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: BtIsOperation :: BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: BtNotComparable :: BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: NotWellTyped :: T -> BadTypeForScope -> NotWellTyped
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: [nwtBadType] :: NotWellTyped -> T
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: [nwtCause] :: NotWellTyped -> BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: class (SingI t, RecSuperC WellTyped t, WellTypedConstraints t) => WellTyped t
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: data BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: data NotWellTyped
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: getWTP :: forall t. SingI t => Either NotWellTyped (Dict (WellTyped t))
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: getWTP' :: Sing t -> Either NotWellTyped (Dict (WellTyped t))
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: instance (Data.Singletons.SingI t, Morley.Michelson.Typed.Scope.Internal.Comparable.RecSuperC Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped t, Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTypedConstraints t) => Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped t
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: instance Control.DeepSeq.NFData Morley.Michelson.Typed.Scope.Internal.WellTyped.BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Scope.Internal.WellTyped.BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Scope.Internal.WellTyped.NotWellTyped
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: instance GHC.Classes.Eq Morley.Michelson.Typed.Scope.Internal.WellTyped.BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: instance GHC.Generics.Generic Morley.Michelson.Typed.Scope.Internal.WellTyped.BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: instance GHC.Show.Show Morley.Michelson.Typed.Scope.Internal.WellTyped.BadTypeForScope
+ Morley.Michelson.Typed.Scope.Internal.WellTyped: type family WellTypedConstraints t
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: class WithDeMorganScope (c :: T -> Constraint) t a b
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: deMorganForbidT :: forall a b r p. (ContainsT p a || ContainsT p b) ~ 'False => Sing p -> Sing a -> Sing b -> ((ForbidT p a, ForbidT p b) => r) -> r
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance (Data.Singletons.SingI a, Data.Singletons.SingI p) => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidT p) 'Morley.Michelson.Typed.T.TOr a b
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance (Data.Singletons.SingI a, Data.Singletons.SingI p) => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidT p) 'Morley.Michelson.Typed.T.TPair a b
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance (Data.Singletons.SingI k, Data.Singletons.SingI p) => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope (Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidT p) 'Morley.Michelson.Typed.T.TMap k v
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance (Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidOp t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidBigMap t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidContract t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidTicket t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidSaplingState t a b, Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped a, Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped b) => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.Scopes.ConstantScope t a b
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance (Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidOp t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidBigMap t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidTicket t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidSaplingState t a b, Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped a, Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped b) => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.Scopes.PackedValScope t a b
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance (Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidOp t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidNestedBigMaps t a b, Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped a, Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped b) => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.Scopes.ParameterScope t a b
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance (Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidOp t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidNestedBigMaps t a b, Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidContract t a b, Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped a, Morley.Michelson.Typed.Scope.Internal.WellTyped.WellTyped b) => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.Scopes.StorageScope t a b
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance Data.Singletons.SingI k => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidContract 'Morley.Michelson.Typed.T.TBigMap k v
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance Data.Singletons.SingI k => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidOp 'Morley.Michelson.Typed.T.TBigMap k v
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance Data.Singletons.SingI k => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidSaplingState 'Morley.Michelson.Typed.T.TBigMap k v
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: instance Data.Singletons.SingI k => Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope.WithDeMorganScope Morley.Michelson.Typed.Scope.Internal.ForbidT.ForbidTicket 'Morley.Michelson.Typed.T.TBigMap k v
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: simpleWithDeMorgan :: forall a b ret op. ((ContainsT op a || ContainsT op b) ~ 'False, SingI a) => Sing op -> ((ContainsT op a ~ 'False, ContainsT op b ~ 'False) => ret) -> ret
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: simpleWithDeMorgan' :: forall b ret op a. (ContainsT op a || ContainsT op b) ~ 'False => Sing op -> Sing a -> ((ContainsT op a ~ 'False, ContainsT op b ~ 'False) => ret) -> ret
+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope: withDeMorganScope :: (WithDeMorganScope c t a b, c (t a b)) => ((c a, c b) => ret) -> ret
+ Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TBigMapSym1 a6989586621679673770)
+ Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TLambdaSym1 a6989586621679673764)
+ Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TMapSym1 a6989586621679673767)
+ Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TOrSym1 a6989586621679673761)
+ Morley.Michelson.Typed.Sing: instance Data.Singletons.TH.SuppressUnusedWarnings.SuppressUnusedWarnings (Morley.Michelson.Typed.Sing.TPairSym1 a6989586621679673758)
+ Morley.Michelson.Typed.Sing: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Sing.SingT t)
+ Morley.Michelson.Typed.T: instance Fmt.Buildable.Buildable (Morley.Util.MismatchError.MismatchError Morley.Michelson.Typed.T.T)
+ Morley.Michelson.Typed.T: instance Fmt.Buildable.Buildable (Morley.Util.MismatchError.MismatchError [Morley.Michelson.Typed.T.T])
+ Morley.Michelson.Typed.T: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.T.T
+ Morley.Michelson.Typed.Util: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Util.CtorEffectsApp x)
+ Morley.Michelson.Typed.Value: instance (forall (t :: Morley.Michelson.Typed.T.T). Fmt.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' instr t)) => Fmt.Buildable.Buildable (Morley.Michelson.Typed.Value.Operation' instr)
+ Morley.Michelson.Typed.Value: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' instr p) => Fmt.Buildable.Buildable (Morley.Michelson.Typed.Value.TransferTokens instr p)
+ Morley.Michelson.Typed.Value: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' instr st) => Fmt.Buildable.Buildable (Morley.Michelson.Typed.Value.CreateContract instr cp st)
+ Morley.Michelson.Typed.Value: instance Fmt.Buildable.Buildable (Morley.Michelson.Typed.Value.Value' instr t) => Fmt.Buildable.Buildable (Morley.Michelson.Typed.Value.Emit instr t)
+ Morley.Michelson.Typed.Value: instance Fmt.Buildable.Buildable Morley.Michelson.Typed.Value.SetDelegate
+ Morley.Michelson.Typed.Value: instance Morley.Michelson.Typed.Scope.Internal.Comparable.Comparable t => GHC.Classes.Ord (Morley.Michelson.Typed.Value.Value' instr t)
+ Morley.Michelson.Typed.View: ViewsSet :: Map ViewName (SomeView' instr st) -> ViewsSet' instr st
+ Morley.Michelson.Typed.View: pattern UnsafeViewsSet :: Map ViewName (SomeView' instr st) -> ViewsSet' instr st
+ Morley.Michelson.Untyped.Contract: CBEDuplicate :: NonEmpty Entry -> ContractBlockError
+ Morley.Michelson.Untyped.Contract: CBEMissing :: Entry -> ContractBlockError
+ Morley.Michelson.Untyped.Contract: data ContractBlockError
+ Morley.Michelson.Untyped.Contract: instance (GHC.Classes.Eq e, GHC.Classes.Eq a) => GHC.Classes.Eq (Morley.Michelson.Untyped.Contract.Validation e a)
+ Morley.Michelson.Untyped.Contract: instance (GHC.Show.Show e, GHC.Show.Show a) => GHC.Show.Show (Morley.Michelson.Untyped.Contract.Validation e a)
+ Morley.Michelson.Untyped.Contract: instance Fmt.Buildable.Buildable (Morley.Michelson.Untyped.Contract.ContractBlock op)
+ Morley.Michelson.Untyped.Contract: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Contract.ContractBlockError
+ Morley.Michelson.Untyped.Contract: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Contract.Entry
+ Morley.Michelson.Untyped.Contract: instance GHC.Base.Functor (Morley.Michelson.Untyped.Contract.Validation e)
+ Morley.Michelson.Untyped.Contract: instance GHC.Base.Semigroup e => GHC.Base.Applicative (Morley.Michelson.Untyped.Contract.Validation e)
+ Morley.Michelson.Untyped.Contract: instance GHC.Classes.Eq Morley.Michelson.Untyped.Contract.ContractBlockError
+ Morley.Michelson.Untyped.Contract: instance GHC.Show.Show Morley.Michelson.Untyped.Contract.ContractBlockError
+ Morley.Michelson.Untyped.Entrypoints: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Entrypoints.EpName
+ Morley.Michelson.Untyped.Entrypoints: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Entrypoints.EpNameFromRefAnnError
+ Morley.Michelson.Untyped.Ext: instance (Data.Foldable.Foldable f, Fmt.Buildable.Buildable op) => Fmt.Buildable.Buildable (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f op)
+ Morley.Michelson.Untyped.Ext: instance (Data.Foldable.Foldable f, Fmt.Buildable.Buildable op) => Fmt.Buildable.Buildable (Morley.Michelson.Untyped.Ext.TestAssert f op)
+ Morley.Michelson.Untyped.Ext: instance (Data.Typeable.Internal.Typeable f, Data.Typeable.Internal.Typeable op, Data.Data.Data (f op)) => Data.Data.Data (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f op)
+ Morley.Michelson.Untyped.Ext: instance (Data.Typeable.Internal.Typeable f, Data.Typeable.Internal.Typeable op, Data.Data.Data (f op)) => Data.Data.Data (Morley.Michelson.Untyped.Ext.TestAssert f op)
+ Morley.Michelson.Untyped.Ext: instance Control.DeepSeq.NFData (f op) => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f op)
+ Morley.Michelson.Untyped.Ext: instance Control.DeepSeq.NFData (f op) => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Ext.TestAssert f op)
+ Morley.Michelson.Untyped.Ext: instance Data.Aeson.Types.FromJSON.FromJSON (f op) => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f op)
+ Morley.Michelson.Untyped.Ext: instance Data.Aeson.Types.FromJSON.FromJSON (f op) => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Ext.TestAssert f op)
+ Morley.Michelson.Untyped.Ext: instance Data.Aeson.Types.ToJSON.ToJSON (f op) => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f op)
+ Morley.Michelson.Untyped.Ext: instance Data.Aeson.Types.ToJSON.ToJSON (f op) => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Ext.TestAssert f op)
+ Morley.Michelson.Untyped.Ext: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Ext.PrintComment
+ Morley.Michelson.Untyped.Ext: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Ext.StackRef
+ Morley.Michelson.Untyped.Ext: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Ext.StackTypePattern
+ Morley.Michelson.Untyped.Ext: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Ext.TyVar
+ Morley.Michelson.Untyped.Ext: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Ext.Var
+ Morley.Michelson.Untyped.Ext: instance GHC.Base.Functor f => GHC.Base.Functor (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f)
+ Morley.Michelson.Untyped.Ext: instance GHC.Base.Functor f => GHC.Base.Functor (Morley.Michelson.Untyped.Ext.TestAssert f)
+ Morley.Michelson.Untyped.Ext: instance GHC.Classes.Eq (f op) => GHC.Classes.Eq (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f op)
+ Morley.Michelson.Untyped.Ext: instance GHC.Classes.Eq (f op) => GHC.Classes.Eq (Morley.Michelson.Untyped.Ext.TestAssert f op)
+ Morley.Michelson.Untyped.Ext: instance GHC.Generics.Generic (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f op)
+ Morley.Michelson.Untyped.Ext: instance GHC.Generics.Generic (Morley.Michelson.Untyped.Ext.TestAssert f op)
+ Morley.Michelson.Untyped.Ext: instance GHC.Show.Show (f op) => GHC.Show.Show (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f op)
+ Morley.Michelson.Untyped.Ext: instance GHC.Show.Show (f op) => GHC.Show.Show (Morley.Michelson.Untyped.Ext.TestAssert f op)
+ Morley.Michelson.Untyped.Ext: instance Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Untyped.Ext.ExtInstrAbstract f op)
+ Morley.Michelson.Untyped.Ext: instance Morley.Michelson.Untyped.HoistInstr.HoistInstr Morley.Michelson.Untyped.Ext.ExtInstrAbstract
+ Morley.Michelson.Untyped.Ext: instance Morley.Michelson.Untyped.HoistInstr.HoistInstr Morley.Michelson.Untyped.Ext.TestAssert
+ Morley.Michelson.Untyped.HoistInstr: class HoistInstr n
+ Morley.Michelson.Untyped.HoistInstr: hoistInstr :: HoistInstr n => (f a -> g a) -> n f a -> n g a
+ Morley.Michelson.Untyped.Instr: instance (Control.DeepSeq.NFData op, Control.DeepSeq.NFData (f op)) => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Instr.InstrAbstract f op)
+ Morley.Michelson.Untyped.Instr: instance (Data.Aeson.Types.FromJSON.FromJSON op, Data.Aeson.Types.FromJSON.FromJSON (f op)) => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Instr.InstrAbstract f op)
+ Morley.Michelson.Untyped.Instr: instance (Data.Aeson.Types.ToJSON.ToJSON op, Data.Aeson.Types.ToJSON.ToJSON (f op)) => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Instr.InstrAbstract f op)
+ Morley.Michelson.Untyped.Instr: instance (Data.Foldable.Foldable f, Morley.Michelson.Printer.Util.RenderDoc op, Fmt.Buildable.Buildable op) => Fmt.Buildable.Buildable (Morley.Michelson.Untyped.Instr.InstrAbstract f op)
+ Morley.Michelson.Untyped.Instr: instance (Data.Typeable.Internal.Typeable f, Data.Data.Data op, Data.Data.Data (f op)) => Data.Data.Data (Morley.Michelson.Untyped.Instr.InstrAbstract f op)
+ Morley.Michelson.Untyped.Instr: instance (GHC.Classes.Eq op, GHC.Classes.Eq (f op)) => GHC.Classes.Eq (Morley.Michelson.Untyped.Instr.InstrAbstract f op)
+ Morley.Michelson.Untyped.Instr: instance (GHC.Show.Show op, GHC.Show.Show (f op)) => GHC.Show.Show (Morley.Michelson.Untyped.Instr.InstrAbstract f op)
+ Morley.Michelson.Untyped.Instr: instance (Morley.Michelson.Printer.Util.RenderDoc op, Data.Foldable.Foldable f) => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Untyped.Instr.InstrAbstract f op)
+ Morley.Michelson.Untyped.Instr: instance Fmt.Buildable.Buildable Morley.Michelson.Untyped.Instr.ExpandedOp
+ Morley.Michelson.Untyped.Instr: instance GHC.Base.Functor f => GHC.Base.Functor (Morley.Michelson.Untyped.Instr.InstrAbstract f)
+ Morley.Michelson.Untyped.Instr: instance GHC.Generics.Generic (Morley.Michelson.Untyped.Instr.InstrAbstract f op)
+ Morley.Michelson.Untyped.Instr: instance Morley.Michelson.Untyped.HoistInstr.HoistInstr Morley.Michelson.Untyped.Instr.InstrAbstract
+ Morley.Michelson.Untyped.Type: instance Fmt.Buildable.Buildable (Morley.Util.MismatchError.MismatchError Morley.Michelson.Untyped.Type.Ty)
+ Morley.Michelson.Untyped.Value: instance (Data.Foldable.Foldable f, Morley.Michelson.Printer.Util.RenderDoc op) => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Untyped.Value.Elt f op)
+ Morley.Michelson.Untyped.Value: instance (Data.Foldable.Foldable f, Morley.Michelson.Printer.Util.RenderDoc op) => Morley.Michelson.Printer.Util.RenderDoc (Morley.Michelson.Untyped.Value.Value' f op)
+ Morley.Michelson.Untyped.Value: instance GHC.Base.Functor f => GHC.Base.Functor (Morley.Michelson.Untyped.Value.Elt f)
+ Morley.Michelson.Untyped.Value: instance GHC.Base.Functor f => GHC.Base.Functor (Morley.Michelson.Untyped.Value.Value' f)
+ Morley.Michelson.Untyped.Value: instance Morley.Michelson.Untyped.HoistInstr.HoistInstr Morley.Michelson.Untyped.Value.Elt
+ Morley.Michelson.Untyped.Value: instance Morley.Michelson.Untyped.HoistInstr.HoistInstr Morley.Michelson.Untyped.Value.Value'
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). (Data.Typeable.Internal.Typeable op, Data.Typeable.Internal.Typeable f, Data.Typeable.Internal.Typeable k, Data.Data.Data (f op)) => Data.Data.Data (Morley.Michelson.Untyped.Value.Elt f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). (Data.Typeable.Internal.Typeable op, Data.Typeable.Internal.Typeable f, Data.Typeable.Internal.Typeable k, Data.Data.Data (f op)) => Data.Data.Data (Morley.Michelson.Untyped.Value.Value' f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). Control.DeepSeq.NFData (f op) => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Value.Elt f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). Control.DeepSeq.NFData (f op) => Control.DeepSeq.NFData (Morley.Michelson.Untyped.Value.Value' f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). Data.Aeson.Types.FromJSON.FromJSON (f op) => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Value.Elt f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). Data.Aeson.Types.FromJSON.FromJSON (f op) => Data.Aeson.Types.FromJSON.FromJSON (Morley.Michelson.Untyped.Value.Value' f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). Data.Aeson.Types.ToJSON.ToJSON (f op) => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Value.Elt f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). Data.Aeson.Types.ToJSON.ToJSON (f op) => Data.Aeson.Types.ToJSON.ToJSON (Morley.Michelson.Untyped.Value.Value' f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). GHC.Classes.Eq (f op) => GHC.Classes.Eq (Morley.Michelson.Untyped.Value.Elt f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). GHC.Classes.Eq (f op) => GHC.Classes.Eq (Morley.Michelson.Untyped.Value.Value' f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). GHC.Generics.Generic (Morley.Michelson.Untyped.Value.Elt f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). GHC.Generics.Generic (Morley.Michelson.Untyped.Value.Value' f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). GHC.Show.Show (f op) => GHC.Show.Show (Morley.Michelson.Untyped.Value.Elt f op)
+ Morley.Michelson.Untyped.Value: instance forall k (f :: k -> *) (op :: k). GHC.Show.Show (f op) => GHC.Show.Show (Morley.Michelson.Untyped.Value.Value' f op)
+ Morley.Michelson.Untyped.View: ViewsSet :: Map ViewName (View' instr) -> ViewsSet instr
+ Morley.Michelson.Untyped.View: pattern UnsafeViewsSet :: Map ViewName (View' instr) -> ViewsSet instr
+ Morley.Tezos.Address: instance Fmt.Buildable.Buildable (Morley.Tezos.Address.KindedAddress kind)
+ Morley.Tezos.Address: instance Fmt.Buildable.Buildable Morley.Tezos.Address.GlobalCounter
+ Morley.Tezos.Address: instance Fmt.Buildable.Buildable Morley.Tezos.Address.ParseAddressError
+ Morley.Tezos.Address: instance Fmt.Buildable.Buildable Morley.Tezos.Address.ParseAddressRawError
+ Morley.Tezos.Address.Alias: instance Fmt.Buildable.Buildable (Morley.Tezos.Address.Alias.AddressOrAlias kind)
+ Morley.Tezos.Address.Alias: instance Fmt.Buildable.Buildable (Morley.Tezos.Address.Alias.Alias kind)
+ Morley.Tezos.Address.Alias: instance Fmt.Buildable.Buildable Morley.Tezos.Address.Alias.SomeAddressOrAlias
+ Morley.Tezos.Address.Kinds: instance Fmt.Buildable.Buildable Morley.Tezos.Address.Kinds.AddressKind
+ Morley.Tezos.Core: instance Fmt.Buildable.Buildable Morley.Tezos.Core.ChainId
+ Morley.Tezos.Core: instance Fmt.Buildable.Buildable Morley.Tezos.Core.Mutez
+ Morley.Tezos.Core: instance Fmt.Buildable.Buildable Morley.Tezos.Core.ParseChainIdError
+ Morley.Tezos.Core: instance Fmt.Buildable.Buildable Morley.Tezos.Core.Timestamp
+ Morley.Tezos.Crypto: instance Fmt.Buildable.Buildable (Morley.Tezos.Crypto.Hash kind)
+ Morley.Tezos.Crypto: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.KeyType
+ Morley.Tezos.Crypto: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.ParseSignatureRawError
+ Morley.Tezos.Crypto: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.PublicKey
+ Morley.Tezos.Crypto: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.SecretKey
+ Morley.Tezos.Crypto: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.Signature
+ Morley.Tezos.Crypto.BLS: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.BLS.PublicKey
+ Morley.Tezos.Crypto.BLS: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.BLS.SecretKey
+ Morley.Tezos.Crypto.BLS: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.BLS.Signature
+ Morley.Tezos.Crypto.BLS12381: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.BLS12381.DeserializationError
+ Morley.Tezos.Crypto.Ed25519: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.Ed25519.PublicKey
+ Morley.Tezos.Crypto.Ed25519: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.Ed25519.SecretKey
+ Morley.Tezos.Crypto.Ed25519: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.Ed25519.Signature
+ Morley.Tezos.Crypto.P256: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.P256.PublicKey
+ Morley.Tezos.Crypto.P256: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.P256.SecretKey
+ Morley.Tezos.Crypto.P256: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.P256.Signature
+ Morley.Tezos.Crypto.Secp256k1: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.Secp256k1.PublicKey
+ Morley.Tezos.Crypto.Secp256k1: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.Secp256k1.SecretKey
+ Morley.Tezos.Crypto.Secp256k1: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.Secp256k1.Signature
+ Morley.Tezos.Crypto.Timelock: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.Timelock.TLTime
+ Morley.Tezos.Crypto.Util: instance Fmt.Buildable.Buildable Morley.Tezos.Crypto.Util.CryptoParseError
+ Morley.Util.Binary: instance Fmt.Buildable.Buildable Morley.Util.Binary.UnpackError
+ Morley.Util.Constrained: instance forall k (c :: k -> GHC.Types.Constraint) (f :: k -> *). (forall (a :: k). c a => Fmt.Buildable.Buildable (f a)) => Fmt.Buildable.Buildable (Morley.Util.Constrained.Constrained c f)
+ Morley.Util.Label: instance Fmt.Buildable.Buildable (Morley.Util.Label.Label name)
+ Morley.Util.MismatchError: buildDocDiff :: Buildable a => MismatchError a -> Doc
+ Morley.Util.MismatchError: buildDocDiffList :: Buildable a => MismatchError [a] -> Doc
+ Morley.Util.MismatchError: instance Fmt.Buildable.Buildable a => Fmt.Buildable.Buildable (Morley.Util.MismatchError.MismatchError a)
+ Morley.Util.Named: instance (GHC.TypeLits.KnownSymbol name, Fmt.Buildable.Buildable (f a)) => Fmt.Buildable.Buildable (Named.Internal.NamedF f a name)
+ Morley.Util.SizedList: instance Fmt.Buildable.Buildable a => Fmt.Buildable.Buildable (Morley.Util.SizedList.SizedList' n a)
+ Morley.Util.SizedList: instance Fmt.Buildable.Buildable a => Fmt.Buildable.Buildable (Morley.Util.SizedList.SomeSizedList a)
- Morley.AsRPC: rpcHasNoBigMapEvi :: forall (t :: T). SingI t => Dict (HasNoBigMap (TAsRPC t))
+ Morley.AsRPC: rpcHasNoBigMapEvi :: forall (t :: T). (SingI t, ForbidBigMap t) => Dict (ForbidBigMap (TAsRPC t))
- Morley.AsRPC: rpcHasNoContractEvi :: forall (t :: T). (SingI t, HasNoContract t) => HasNoContract t :- HasNoContract (TAsRPC t)
+ Morley.AsRPC: rpcHasNoContractEvi :: forall (t :: T). (SingI t, ForbidContract t) => Dict (ForbidContract (TAsRPC t))
- Morley.AsRPC: rpcHasNoNestedBigMapsEvi :: forall (t :: T). SingI t => Dict (HasNoNestedBigMaps (TAsRPC t))
+ Morley.AsRPC: rpcHasNoNestedBigMapsEvi :: forall (t :: T). (SingI t, ForbidNestedBigMaps t) => Dict (ForbidNestedBigMaps (TAsRPC t))
- Morley.AsRPC: rpcHasNoOpEvi :: forall (t :: T). (SingI t, HasNoOp t) => HasNoOp t :- HasNoOp (TAsRPC t)
+ Morley.AsRPC: rpcHasNoOpEvi :: forall (t :: T). (SingI t, ForbidOp t) => Dict (ForbidOp (TAsRPC t))
- Morley.AsRPC: rpcSingIEvi :: forall (t :: T). SingI t :- SingI (TAsRPC t)
+ Morley.AsRPC: rpcSingIEvi :: forall t. SingI t => Dict (SingI (TAsRPC t))
- Morley.AsRPC: rpcStorageScopeEvi :: forall (t :: T). StorageScope t :- StorageScope (TAsRPC t)
+ Morley.AsRPC: rpcStorageScopeEvi :: forall (t :: T). StorageScope t => Dict (StorageScope (TAsRPC t))
- Morley.Micheline.Class: FromExpError :: Exp x -> Text -> FromExpError x
+ Morley.Micheline.Class: FromExpError :: Exp x -> FromExpErrorReason -> FromExpError x
- Morley.Micheline.Expression: _ExpBytes :: Prism' (Exp d) (XExpBytes d, ByteString)
+ Morley.Micheline.Expression: _ExpBytes :: forall x_a8Be1. Prism' (Exp x_a8Be1) (XExpBytes x_a8Be1, ByteString)
- Morley.Micheline.Expression: _ExpInt :: Prism' (Exp d) (XExpInt d, Integer)
+ Morley.Micheline.Expression: _ExpInt :: forall x_a8Be1. Prism' (Exp x_a8Be1) (XExpInt x_a8Be1, Integer)
- Morley.Micheline.Expression: _ExpPrim :: Prism' (Exp d) (XExpPrim d, MichelinePrimAp d)
+ Morley.Micheline.Expression: _ExpPrim :: forall x_a8Be1. Prism' (Exp x_a8Be1) (XExpPrim x_a8Be1, MichelinePrimAp x_a8Be1)
- Morley.Micheline.Expression: _ExpSeq :: Prism' (Exp d) (XExpSeq d, [Exp d])
+ Morley.Micheline.Expression: _ExpSeq :: forall x_a8Be1. Prism' (Exp x_a8Be1) (XExpSeq x_a8Be1, [Exp x_a8Be1])
- Morley.Micheline.Expression: _ExpString :: Prism' (Exp d) (XExpString d, Text)
+ Morley.Micheline.Expression: _ExpString :: forall x_a8Be1. Prism' (Exp x_a8Be1) (XExpString x_a8Be1, Text)
- Morley.Micheline.Expression: expressionPrim' :: Text -> [Expression] -> [Annotation] -> Expression
+ Morley.Micheline.Expression: expressionPrim' :: MichelinePrimitive -> [Expression] -> [Annotation] -> Expression
- Morley.Micheline.Expression: mpaAnnotsL :: forall x_a676o. Lens' (MichelinePrimAp x_a676o) [Annotation]
+ Morley.Micheline.Expression: mpaAnnotsL :: forall x_a8BdT. Lens' (MichelinePrimAp x_a8BdT) [Annotation]
- Morley.Micheline.Expression: mpaArgsL :: forall x_a676o x_a68Hk. Lens (MichelinePrimAp x_a676o) (MichelinePrimAp x_a68Hk) [Exp x_a676o] [Exp x_a68Hk]
+ Morley.Micheline.Expression: mpaArgsL :: forall x_a8BdT x_a8Dlb. Lens (MichelinePrimAp x_a8BdT) (MichelinePrimAp x_a8Dlb) [Exp x_a8BdT] [Exp x_a8Dlb]
- Morley.Micheline.Expression: mpaPrimL :: forall x_a676o. Lens' (MichelinePrimAp x_a676o) MichelinePrimitive
+ Morley.Micheline.Expression: mpaPrimL :: forall x_a8BdT. Lens' (MichelinePrimAp x_a8BdT) MichelinePrimitive
- Morley.Michelson.Interpret: [SomeItStack] :: ExtInstr inp -> Rec StkEl inp -> SomeItStack
+ Morley.Michelson.Interpret: [SomeItStack] :: ExtInstr inp -> Rec (StkEl meta) inp -> SomeItStack meta
- Morley.Michelson.Interpret: [seValue] :: StkEl t -> Value t
+ Morley.Michelson.Interpret: [seValue] :: StkEl meta t -> Value t
- Morley.Michelson.Interpret: data SomeItStack
+ Morley.Michelson.Interpret: data SomeItStack meta
- Morley.Michelson.Interpret: interpretInstrAnnotated :: ContractEnv -> Instr inp out -> Rec Value inp -> Either (MichelsonFailureWithStack Void) (Rec StkEl out)
+ Morley.Michelson.Interpret: interpretInstrAnnotated :: ContractEnv -> Instr inp out -> Rec Value inp -> Either (MichelsonFailureWithStack Void) (Rec (StkEl NoStkElMeta) out)
- Morley.Michelson.Interpret: interpretView' :: forall ret st m arg ext. EvalM' ext m => (forall inp out. Instr inp out -> Rec StkEl inp -> m (Rec StkEl out)) -> (ContractEnv' m -> ContractEnv' m) -> View arg st ret -> Value st -> Value arg -> m (Value ret)
+ Morley.Michelson.Interpret: interpretView' :: forall ret st m arg ext meta. (StkElMeta meta m, EvalM' ext m) => (forall inp out. Instr inp out -> Rec (StkEl meta) inp -> m (Rec (StkEl meta) out)) -> (ContractEnv' m -> ContractEnv' m) -> View arg st ret -> Value st -> Value arg -> m (Value ret)
- Morley.Michelson.Interpret: mkInitStack :: Value param -> Value st -> Rec StkEl (ContractInp param st)
+ Morley.Michelson.Interpret: mkInitStack :: Value param -> Value st -> Rec Value (ContractInp param st)
- Morley.Michelson.Interpret: runInstr :: EvalM' ext m => InstrRunner m
+ Morley.Michelson.Interpret: runInstr :: forall ext meta m. (StkElMeta meta m, EvalM' ext m) => InstrRunner meta m
- Morley.Michelson.Interpret: runInstrImpl :: forall ext m. EvalM' ext m => InstrRunner m -> InstrRunner m
+ Morley.Michelson.Interpret: runInstrImpl :: forall ext meta m. (EvalM' ext m, StkElMeta meta m) => InstrRunner meta m -> InstrRunner meta m
- Morley.Michelson.Interpret: runInstrNoGas :: EvalM m => InstrRunner m
+ Morley.Michelson.Interpret: runInstrNoGas :: EvalM m => InstrRunner NoStkElMeta m
- Morley.Michelson.Interpret: type InstrRunner m = forall inp out. Instr inp out -> Rec StkEl inp -> m (Rec StkEl out)
+ Morley.Michelson.Interpret: type InstrRunner meta m = forall inp out. Instr inp out -> Rec (StkEl meta) inp -> m (Rec (StkEl meta) out)
- Morley.Michelson.Macro: CMP :: ParsedInstr -> VarAnn -> Macro
+ Morley.Michelson.Macro: CMP :: ParsedInstr -> Macro
- Morley.Michelson.Macro: DIIP :: Word -> [ParsedOp] -> Macro
+ Morley.Michelson.Macro: DIIP :: Word -> ParsedSeq ParsedOp -> Macro
- Morley.Michelson.Macro: IFCMP :: ParsedInstr -> VarAnn -> [ParsedOp] -> [ParsedOp] -> Macro
+ Morley.Michelson.Macro: IFCMP :: ParsedInstr -> ParsedSeq ParsedOp -> ParsedSeq ParsedOp -> Macro
- Morley.Michelson.Macro: IFX :: ParsedInstr -> [ParsedOp] -> [ParsedOp] -> Macro
+ Morley.Michelson.Macro: IFX :: ParsedInstr -> ParsedSeq ParsedOp -> ParsedSeq ParsedOp -> Macro
- Morley.Michelson.Macro: IF_RIGHT :: [ParsedOp] -> [ParsedOp] -> Macro
+ Morley.Michelson.Macro: IF_RIGHT :: ParsedSeq ParsedOp -> ParsedSeq ParsedOp -> Macro
- Morley.Michelson.Macro: IF_SOME :: [ParsedOp] -> [ParsedOp] -> Macro
+ Morley.Michelson.Macro: IF_SOME :: ParsedSeq ParsedOp -> ParsedSeq ParsedOp -> Macro
- Morley.Michelson.Macro: MAP_CADR :: [CadrStruct] -> VarAnn -> FieldAnn -> [ParsedOp] -> Macro
+ Morley.Michelson.Macro: MAP_CADR :: [CadrStruct] -> VarAnn -> FieldAnn -> ParsedSeq ParsedOp -> Macro
- Morley.Michelson.Macro: expandMapCadr :: ErrorSrcPos -> [CadrStruct] -> VarAnn -> FieldAnn -> [ParsedOp] -> [ExpandedOp]
+ Morley.Michelson.Macro: expandMapCadr :: ErrorSrcPos -> [CadrStruct] -> VarAnn -> FieldAnn -> ParsedSeq ParsedOp -> [ExpandedOp]
- Morley.Michelson.Macro: expandPapair :: ErrorSrcPos -> PairStruct -> TypeAnn -> VarAnn -> [ExpandedOp]
+ Morley.Michelson.Macro: expandPapair :: ErrorSrcPos -> PairStruct -> TypeAnn -> VarAnn -> Either ExpandedInstr [ExpandedOp]
- Morley.Michelson.Macro: type ParsedInstr = InstrAbstract ParsedOp
+ Morley.Michelson.Macro: type ParsedInstr = InstrAbstract ParsedSeq ParsedOp
- Morley.Michelson.Macro: type ParsedUExtInstr = ExtInstrAbstract ParsedOp
+ Morley.Michelson.Macro: type ParsedUExtInstr = ExtInstrAbstract ParsedSeq ParsedOp
- Morley.Michelson.Macro: type ParsedValue = Value' ParsedOp
+ Morley.Michelson.Macro: type ParsedValue = Value' ParsedSeq ParsedOp
- Morley.Michelson.Parser: bytesLiteral :: Parser (Value' op)
+ Morley.Michelson.Parser: bytesLiteral :: Parser (Value' f op)
- Morley.Michelson.Parser: codeEntry :: Parser [ParsedOp]
+ Morley.Michelson.Parser: codeEntry :: Parser ParsedOp
- Morley.Michelson.Parser: intLiteral :: Parser (Value' op)
+ Morley.Michelson.Parser: intLiteral :: Parser (Value' f op)
- Morley.Michelson.Parser: ops :: Parser [ParsedOp]
+ Morley.Michelson.Parser: ops :: Parser (ParsedSeq ParsedOp)
- Morley.Michelson.Parser.Instr: cmpOp :: Parser ParsedInstr
+ Morley.Michelson.Parser.Instr: cmpOp :: Parser VarAnn -> Parser ParsedInstr
- Morley.Michelson.Parser.Instr: mapOp :: Parser ParsedOp -> Parser ParsedInstr
+ Morley.Michelson.Parser.Instr: mapOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr
- Morley.Michelson.Parser.Instr: primInstr :: Parser (Contract' ParsedOp) -> Parser ParsedOp -> Parser ParsedInstr
+ Morley.Michelson.Parser.Instr: primInstr :: Parser (Contract' ParsedOp) -> Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr
- Morley.Michelson.Parser.Macro: ifCmpMac :: Parser ParsedOp -> Parser Macro
+ Morley.Michelson.Parser.Macro: ifCmpMac :: Parser (ParsedSeq ParsedOp) -> Parser Macro
- Morley.Michelson.Parser.Macro: macro :: Parser ParsedOp -> Parser Macro
+ Morley.Michelson.Parser.Macro: macro :: Parser (ParsedSeq ParsedOp) -> Parser Macro
- Morley.Michelson.Parser.Macro: mapCadrMac :: Parser ParsedOp -> Parser Macro
+ Morley.Michelson.Parser.Macro: mapCadrMac :: Parser (ParsedSeq ParsedOp) -> Parser Macro
- Morley.Michelson.Parser.Value: bytesLiteral :: Parser (Value' op)
+ Morley.Michelson.Parser.Value: bytesLiteral :: Parser (Value' f op)
- Morley.Michelson.Parser.Value: intLiteral :: Parser (Value' op)
+ Morley.Michelson.Parser.Value: intLiteral :: Parser (Value' f op)
- Morley.Michelson.Parser.Value: value' :: Parser ParsedOp -> Parser ParsedValue
+ Morley.Michelson.Parser.Value: value' :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue
- Morley.Michelson.Printer: printDoc :: Bool -> Doc -> Text
+ Morley.Michelson.Printer: printDoc :: Bool -> Doc -> LText
- Morley.Michelson.Printer: printTypedValue :: forall t. ProperUntypedValBetterErrors t => Bool -> Value t -> Text
+ Morley.Michelson.Printer: printTypedValue :: forall t. UntypedValScope t => Bool -> Value t -> Text
- Morley.Michelson.Printer: printUntypedValue :: RenderDoc op => Bool -> Value' op -> Text
+ Morley.Michelson.Printer: printUntypedValue :: (Foldable f, RenderDoc op) => Bool -> Value' f op -> Text
- Morley.Michelson.Printer.Util: buildRenderDoc :: RenderDoc a => a -> Builder
+ Morley.Michelson.Printer.Util: buildRenderDoc :: RenderDoc a => a -> Doc
- Morley.Michelson.Printer.Util: buildRenderDocExtended :: RenderDoc a => a -> Builder
+ Morley.Michelson.Printer.Util: buildRenderDocExtended :: RenderDoc a => a -> Doc
- Morley.Michelson.Printer.Util: printDoc :: Bool -> Doc -> Text
+ Morley.Michelson.Printer.Util: printDoc :: Bool -> Doc -> LText
- Morley.Michelson.Printer.Util: renderOpsList :: RenderDoc op => Bool -> [op] -> Doc
+ Morley.Michelson.Printer.Util: renderOpsList :: (RenderDoc op, Foldable f) => Bool -> f op -> Doc
- Morley.Michelson.Printer.Util: renderOpsListNoBraces :: RenderDoc op => Bool -> [op] -> Doc
+ Morley.Michelson.Printer.Util: renderOpsListNoBraces :: (RenderDoc op, Foldable f) => Bool -> f op -> Doc
- Morley.Michelson.Runtime: EEAmbiguousAlias :: Text -> ImplicitAddress -> ContractAddress -> ExecutorError' a
+ Morley.Michelson.Runtime: EEAmbiguousAlias :: Text -> ImplicitAddress -> ContractAddress -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEDeprecatedType :: TcError -> ExecutorError' a
+ Morley.Michelson.Runtime: EEDeprecatedType :: TcError -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEEmptyImplicitContract :: a -> ExecutorError' a
+ Morley.Michelson.Runtime: EEEmptyImplicitContract :: a -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEFailedToApplyUpdates :: GStateUpdateError -> ExecutorError' a
+ Morley.Michelson.Runtime: EEFailedToApplyUpdates :: GStateUpdateError -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEGlobalEmitOp :: ExecutorError' a
+ Morley.Michelson.Runtime: EEGlobalEmitOp :: ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEGlobalOperationSourceNotImplicit :: Address -> ExecutorError' a
+ Morley.Michelson.Runtime: EEGlobalOperationSourceNotImplicit :: Address -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEIllTypedParameter :: a -> TcError -> ExecutorError' a
+ Morley.Michelson.Runtime: EEIllTypedParameter :: a -> TcError -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEInterpreterFailed :: a -> InterpretError Void -> ExecutorError' a
+ Morley.Michelson.Runtime: EEInterpreterFailed :: a -> InterpretError Void -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EENotEnoughFunds :: a -> Mutez -> ExecutorError' a
+ Morley.Michelson.Runtime: EENotEnoughFunds :: a -> Mutez -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEOperationReplay :: ExecutorOp -> ExecutorError' a
+ Morley.Michelson.Runtime: EEOperationReplay :: ExecutorOp -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EETransactionFromContract :: a -> Mutez -> ExecutorError' a
+ Morley.Michelson.Runtime: EETransactionFromContract :: a -> Mutez -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEUnexpectedParameterType :: a -> MismatchError T -> ExecutorError' a
+ Morley.Michelson.Runtime: EEUnexpectedParameterType :: a -> MismatchError T -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEUnknownAddressAlias :: SomeAlias -> ExecutorError' a
+ Morley.Michelson.Runtime: EEUnknownAddressAlias :: SomeAlias -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEUnknownContract :: a -> ExecutorError' a
+ Morley.Michelson.Runtime: EEUnknownContract :: a -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEUnknownEntrypoint :: EpName -> ExecutorError' a
+ Morley.Michelson.Runtime: EEUnknownEntrypoint :: EpName -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEUnknownL1AddressAlias :: Text -> ExecutorError' a
+ Morley.Michelson.Runtime: EEUnknownL1AddressAlias :: Text -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEUnknownManager :: a -> ExecutorError' a
+ Morley.Michelson.Runtime: EEUnknownManager :: a -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEUnknownSender :: a -> ExecutorError' a
+ Morley.Michelson.Runtime: EEUnknownSender :: a -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEViewArgTcError :: a -> TcError -> ExecutorError' a
+ Morley.Michelson.Runtime: EEViewArgTcError :: a -> TcError -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEViewLookupError :: a -> ViewLookupError -> ExecutorError' a
+ Morley.Michelson.Runtime: EEViewLookupError :: a -> ViewLookupError -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEWrongParameterType :: a -> ExecutorError' a
+ Morley.Michelson.Runtime: EEWrongParameterType :: a -> ExecutorErrorPrim a
- Morley.Michelson.Runtime: EEZeroTransaction :: a -> ExecutorError' a
+ Morley.Michelson.Runtime: EEZeroTransaction :: a -> ExecutorErrorPrim a
- Morley.Michelson.Runtime.GState: toTicketKey :: forall t. HasNoOp t => Value ('TTicket t) -> (TicketKey, Natural)
+ Morley.Michelson.Runtime.GState: toTicketKey :: forall t. Value ('TTicket t) -> (TicketKey, Natural)
- Morley.Michelson.TypeCheck: typeCheckExt :: forall s op. (SingI s, IsInstrOp op) => TcInstrBase op -> ExtInstrAbstract op -> HST s -> TypeCheckInstrNoExcept op (TypeCheckedSeq op s)
+ Morley.Michelson.TypeCheck: typeCheckExt :: forall s op. (SingI s, IsInstrOp op) => TcInstrBase op -> ExtInstrAbstract [] op -> HST s -> TypeCheckInstrNoExcept op (TypeCheckedSeq op s)
- Morley.Michelson.TypeCheck: typeCheckInstr :: forall op. IsInstrOp op => TcInstrBase op -> TcInstr op (InstrAbstract op)
+ Morley.Michelson.TypeCheck: typeCheckInstr :: forall op. IsInstrOp op => TcInstrBase op -> TcInstr op (InstrAbstract [] op)
- Morley.Michelson.TypeCheck.Error: InvalidInstruction :: InstrAbstract () -> Text -> TcTypeError
+ Morley.Michelson.TypeCheck.Error: InvalidInstruction :: InstrAbstract [] () -> Text -> TcTypeError
- Morley.Michelson.TypeCheck.Error: TcFailedOnInstr :: InstrAbstract op -> SomeHST -> ErrorSrcPos -> Maybe TypeContext -> Maybe TcTypeError -> TcError' op
+ Morley.Michelson.TypeCheck.Error: TcFailedOnInstr :: InstrAbstract [] op -> SomeHST -> ErrorSrcPos -> Maybe TypeContext -> Maybe TcTypeError -> TcError' op
- Morley.Michelson.TypeCheck.Error: TcFailedOnValue :: Value' op -> T -> Text -> ErrorSrcPos -> Maybe TcTypeError -> TcError' op
+ Morley.Michelson.TypeCheck.Error: TcFailedOnValue :: Value' [] op -> T -> Text -> ErrorSrcPos -> Maybe TcTypeError -> TcError' op
- Morley.Michelson.TypeCheck.Error: TcIncompletelyTyped :: TcError' op -> Contract' (TypeCheckedOp op) -> TcError' op
+ Morley.Michelson.TypeCheck.Error: TcIncompletelyTyped :: TcError' op -> Contract' (TCOpSeq op) -> TcError' op
- Morley.Michelson.TypeCheck.Error: TcIncompletelyTypedView :: TcError' op -> View' (TypeCheckedOp op) -> TcError' op
+ Morley.Michelson.TypeCheck.Error: TcIncompletelyTypedView :: TcError' op -> View' (TCOpSeq op) -> TcError' op
- Morley.Michelson.TypeCheck.Ext: typeCheckExt :: forall s op. (SingI s, IsInstrOp op) => TcInstrBase op -> ExtInstrAbstract op -> HST s -> TypeCheckInstrNoExcept op (TypeCheckedSeq op s)
+ Morley.Michelson.TypeCheck.Ext: typeCheckExt :: forall s op. (SingI s, IsInstrOp op) => TcInstrBase op -> ExtInstrAbstract [] op -> HST s -> TypeCheckInstrNoExcept op (TypeCheckedSeq op s)
- Morley.Michelson.TypeCheck.Helpers: addImpl :: forall a b inp rs m op. (Each '[SingI] [a, b], inp ~ (a : (b : rs)), SingI rs, MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> Sing b -> HST inp -> VarAnn -> InstrAbstract op -> m (SomeTcInstr inp)
+ Morley.Michelson.TypeCheck.Helpers: addImpl :: forall a b inp rs m op. (Each '[SingI] [a, b], inp ~ (a : (b : rs)), SingI rs, MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> Sing b -> HST inp -> VarAnn -> InstrAbstract [] op -> m (SomeTcInstr inp)
- Morley.Michelson.TypeCheck.Helpers: arithImpl :: forall aop inp m n s t op. (WellTyped (ArithRes aop n m), inp ~ (n : (m : s)), MonadReader TypeCheckInstrEnv t) => (Anns '[VarAnn] -> Instr inp (ArithRes aop n m : s)) -> HST inp -> VarAnn -> InstrAbstract op -> t (SomeTcInstr inp)
+ Morley.Michelson.TypeCheck.Helpers: arithImpl :: forall aop inp m n s t op. (WellTyped (ArithRes aop n m), inp ~ (n : (m : s)), MonadReader TypeCheckInstrEnv t) => (Anns '[VarAnn] -> Instr inp (ArithRes aop n m : s)) -> HST inp -> VarAnn -> InstrAbstract [] op -> t (SomeTcInstr inp)
- Morley.Michelson.TypeCheck.Helpers: edivImpl :: forall a b inp rs m op. (SingI rs, Each '[SingI] [a, b], inp ~ (a : (b : rs)), MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> Sing b -> HST inp -> VarAnn -> InstrAbstract op -> m (SomeTcInstr inp)
+ Morley.Michelson.TypeCheck.Helpers: edivImpl :: forall a b inp rs m op. (SingI rs, Each '[SingI] [a, b], inp ~ (a : (b : rs)), MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> Sing b -> HST inp -> VarAnn -> InstrAbstract [] op -> m (SomeTcInstr inp)
- Morley.Michelson.TypeCheck.Helpers: mulImpl :: forall a b inp rs m op. (Each '[SingI] [a, b], inp ~ (a : (b : rs)), SingI rs, MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> Sing b -> HST inp -> VarAnn -> InstrAbstract op -> m (SomeTcInstr inp)
+ Morley.Michelson.TypeCheck.Helpers: mulImpl :: forall a b inp rs m op. (Each '[SingI] [a, b], inp ~ (a : (b : rs)), SingI rs, MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> Sing b -> HST inp -> VarAnn -> InstrAbstract [] op -> m (SomeTcInstr inp)
- Morley.Michelson.TypeCheck.Helpers: onScopeCheckInstrErr :: forall (t :: T) op m a. (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m, SingI t) => InstrAbstract op -> SomeHST -> Maybe TypeContext -> Either BadTypeForScope a -> m a
+ Morley.Michelson.TypeCheck.Helpers: onScopeCheckInstrErr :: forall (t :: T) op m a. (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m, SingI t) => InstrAbstract [] op -> SomeHST -> Maybe TypeContext -> Either BadTypeForScope a -> m a
- Morley.Michelson.TypeCheck.Helpers: onTypeCheckInstrErr :: (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => InstrAbstract op -> SomeHST -> Maybe TypeContext -> Either TcTypeError a -> m a
+ Morley.Michelson.TypeCheck.Helpers: onTypeCheckInstrErr :: (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => InstrAbstract [] op -> SomeHST -> Maybe TypeContext -> Either TcTypeError a -> m a
- Morley.Michelson.TypeCheck.Helpers: subImpl :: forall a b inp rs m op. (Each '[SingI] [a, b], inp ~ (a : (b : rs)), SingI rs, MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> Sing b -> HST inp -> VarAnn -> InstrAbstract op -> m (SomeTcInstr inp)
+ Morley.Michelson.TypeCheck.Helpers: subImpl :: forall a b inp rs m op. (Each '[SingI] [a, b], inp ~ (a : (b : rs)), SingI rs, MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> Sing b -> HST inp -> VarAnn -> InstrAbstract [] op -> m (SomeTcInstr inp)
- Morley.Michelson.TypeCheck.Helpers: typeCheckInstrErr :: (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => InstrAbstract op -> SomeHST -> Maybe TypeContext -> m a
+ Morley.Michelson.TypeCheck.Helpers: typeCheckInstrErr :: (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => InstrAbstract [] op -> SomeHST -> Maybe TypeContext -> m a
- Morley.Michelson.TypeCheck.Helpers: typeCheckInstrErr' :: (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => InstrAbstract op -> SomeHST -> Maybe TypeContext -> TcTypeError -> m a
+ Morley.Michelson.TypeCheck.Helpers: typeCheckInstrErr' :: (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => InstrAbstract [] op -> SomeHST -> Maybe TypeContext -> TcTypeError -> m a
- Morley.Michelson.TypeCheck.Helpers: withCompareableCheck :: forall a m v ts op. (SingI ts, MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> InstrAbstract op -> HST ts -> (Comparable a => v) -> m v
+ Morley.Michelson.TypeCheck.Helpers: withCompareableCheck :: forall a m v ts op. (SingI ts, MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a -> InstrAbstract [] op -> HST ts -> (Comparable a => v) -> m v
- Morley.Michelson.TypeCheck.Instr: typeCheckContract' :: IsInstrOp op => TcInstrBase op -> Contract' op -> TypeCheckResult op SomeContract
+ Morley.Michelson.TypeCheck.Instr: typeCheckContract' :: TcInstrBase op -> Contract' op -> TypeCheckResult op SomeContract
- Morley.Michelson.TypeCheck.Instr: typeCheckContractAndStorage' :: IsInstrOp op => TcInstrBase op -> Contract' op -> Value' op -> TypeCheckResult op SomeContractAndStorage
+ Morley.Michelson.TypeCheck.Instr: typeCheckContractAndStorage' :: IsInstrOp op => TcInstrBase op -> Contract' op -> Value' [] op -> TypeCheckResult op SomeContractAndStorage
- Morley.Michelson.TypeCheck.Instr: typeCheckInstr :: forall op. IsInstrOp op => TcInstrBase op -> TcInstr op (InstrAbstract op)
+ Morley.Michelson.TypeCheck.Instr: typeCheckInstr :: forall op. IsInstrOp op => TcInstrBase op -> TcInstr op (InstrAbstract [] op)
- Morley.Michelson.TypeCheck.Instr: typeCheckTopLevelType' :: IsInstrOp op => TcInstrBase op -> Maybe TcOriginatedContracts -> Ty -> Value' op -> TypeCheckResult op SomeValue
+ Morley.Michelson.TypeCheck.Instr: typeCheckTopLevelType' :: IsInstrOp op => TcInstrBase op -> Maybe TcOriginatedContracts -> Ty -> Value' [] op -> TypeCheckResult op SomeValue
- Morley.Michelson.TypeCheck.Instr: typeCheckView' :: (WellTyped st, IsInstrOp op) => TcInstrBase op -> Notes st -> View' op -> TypeCheck op (SomeView st)
+ Morley.Michelson.TypeCheck.Instr: typeCheckView' :: WellTyped st => TcInstrBase op -> Notes st -> View' op -> TypeCheck op (SomeView st)
- Morley.Michelson.TypeCheck.Instr: typeCheckViews' :: forall st op. (WellTyped st, IsInstrOp op) => TcInstrBase op -> Contract' (TypeCheckedOp op) -> Notes st -> ViewsSet op -> TypeCheck op (ViewsSet st)
+ Morley.Michelson.TypeCheck.Instr: typeCheckViews' :: forall st op. WellTyped st => TcInstrBase op -> Contract' (TypeCheckedOp op) -> Notes st -> ViewsSet op -> TypeCheck op (ViewsSet st)
- Morley.Michelson.TypeCheck.Instr: typeVerifyContract' :: forall cp st op. (SingI cp, SingI st, IsInstrOp op) => TcInstrBase op -> Contract' op -> TypeCheckResult op (Contract cp st)
+ Morley.Michelson.TypeCheck.Instr: typeVerifyContract' :: forall cp st op. (SingI cp, SingI st) => TcInstrBase op -> Contract' op -> TypeCheckResult op (Contract cp st)
- Morley.Michelson.TypeCheck.Instr: typeVerifyView' :: forall arg ret st op. (SingI arg, SingI ret, WellTyped st, IsInstrOp op) => TcInstrBase op -> Notes st -> View' op -> TypeCheckResult op (View arg st ret)
+ Morley.Michelson.TypeCheck.Instr: typeVerifyView' :: forall arg ret st op. (SingI arg, SingI ret, WellTyped st) => TcInstrBase op -> Notes st -> View' op -> TypeCheckResult op (View arg st ret)
- Morley.Michelson.TypeCheck.TypeCheck: TypeCheckValue :: (Value' op, T) -> Maybe BigMapFinder -> TypeCheckMode op
+ Morley.Michelson.TypeCheck.TypeCheck: TypeCheckValue :: (Value' [] op, T) -> Maybe BigMapFinder -> TypeCheckMode op
- Morley.Michelson.TypeCheck.TypeCheck: guarding :: IsInstrOp op => InstrAbstract op -> TypeCheckInstr op a -> (a -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)
+ Morley.Michelson.TypeCheck.TypeCheck: guarding :: IsInstrOp op => InstrAbstract [] op -> TypeCheckInstr op a -> (a -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)
- Morley.Michelson.TypeCheck.TypeCheck: guarding_ :: IsInstrOp op => InstrAbstract op -> TypeCheckInstr op a -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)
+ Morley.Michelson.TypeCheck.TypeCheck: guarding_ :: IsInstrOp op => InstrAbstract [] op -> TypeCheckInstr op a -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)
- Morley.Michelson.TypeCheck.TypeCheck: liftInstr :: IsInstrOp op => InstrAbstract op -> op
+ Morley.Michelson.TypeCheck.TypeCheck: liftInstr :: IsInstrOp op => InstrAbstract [] op -> op
- Morley.Michelson.TypeCheck.TypeCheck: tcModeL :: forall op_a9zPJ op_a9zXk. Iso (TypeCheckEnv op_a9zPJ) (TypeCheckEnv op_a9zXk) (TypeCheckMode op_a9zPJ) (TypeCheckMode op_a9zXk)
+ Morley.Michelson.TypeCheck.TypeCheck: tcModeL :: forall op_aaim7 op_aaiuj. Iso (TypeCheckEnv op_aaim7) (TypeCheckEnv op_aaiuj) (TypeCheckMode op_aaim7) (TypeCheckMode op_aaiuj)
- Morley.Michelson.TypeCheck.TypeCheck: tryOpToVal :: IsInstrOp op => op -> Maybe (Value' op)
+ Morley.Michelson.TypeCheck.TypeCheck: tryOpToVal :: IsInstrOp op => op -> Maybe (Value' [] op)
- Morley.Michelson.TypeCheck.TypeCheck: tryValToOp :: IsInstrOp op => Value' op -> Maybe op
+ Morley.Michelson.TypeCheck.TypeCheck: tryValToOp :: IsInstrOp op => Value' [] op -> Maybe op
- Morley.Michelson.TypeCheck.TypeCheckedOp: [IllTypedOp] :: IllTypedInstr op -> TypeCheckedOp op
+ Morley.Michelson.TypeCheck.TypeCheckedOp: [IllTypedOp] :: [IllTypedInstr op] -> TypeCheckedOp op
- Morley.Michelson.TypeCheck.TypeCheckedOp: [WellTypedOp] :: (SingI inp, SingI out) => Instr inp out -> TypeCheckedOp op
+ Morley.Michelson.TypeCheck.TypeCheckedOp: [WellTypedOp] :: SomeSingInstr -> TypeCheckedOp op
- Morley.Michelson.TypeCheck.TypeCheckedOp: type TypeCheckedInstr op = InstrAbstract (TypeCheckedOp op)
+ Morley.Michelson.TypeCheck.TypeCheckedOp: type TypeCheckedInstr op = InstrAbstract [] (TypeCheckedOp op)
- Morley.Michelson.TypeCheck.TypeCheckedSeq: MixedSeq :: SomeTcInstr inp -> TcError' op -> [IllTypedInstr op] -> TypeCheckedSeq op inp
+ Morley.Michelson.TypeCheck.TypeCheckedSeq: MixedSeq :: Nesting -> SomeTcInstr inp -> TcError' op -> [IllTypedInstr op] -> TypeCheckedSeq op inp
- Morley.Michelson.TypeCheck.TypeCheckedSeq: [IllTypedOp] :: IllTypedInstr op -> TypeCheckedOp op
+ Morley.Michelson.TypeCheck.TypeCheckedSeq: [IllTypedOp] :: [IllTypedInstr op] -> TypeCheckedOp op
- Morley.Michelson.TypeCheck.TypeCheckedSeq: [WellTypedOp] :: (SingI inp, SingI out) => Instr inp out -> TypeCheckedOp op
+ Morley.Michelson.TypeCheck.TypeCheckedSeq: [WellTypedOp] :: SomeSingInstr -> TypeCheckedOp op
- Morley.Michelson.TypeCheck.TypeCheckedSeq: type TypeCheckedInstr op = InstrAbstract (TypeCheckedOp op)
+ Morley.Michelson.TypeCheck.TypeCheckedSeq: type TypeCheckedInstr op = InstrAbstract [] (TypeCheckedOp op)
- Morley.Michelson.TypeCheck.Value: tcFailedOnValue :: Value' op -> T -> Text -> Maybe TcTypeError -> TypeCheckInstr op a
+ Morley.Michelson.TypeCheck.Value: tcFailedOnValue :: Value' [] op -> T -> Text -> Maybe TcTypeError -> TypeCheckInstr op a
- Morley.Michelson.TypeCheck.Value: typeCheckValImpl :: forall ty op. (SingI ty, IsInstrOp op) => Maybe TcOriginatedContracts -> TcInstrBase op -> Value' op -> TypeCheckInstr op (Value ty)
+ Morley.Michelson.TypeCheck.Value: typeCheckValImpl :: forall ty op. (SingI ty, IsInstrOp op) => Maybe TcOriginatedContracts -> TcInstrBase op -> Value' [] op -> TypeCheckInstr op (Value ty)
- Morley.Michelson.Typed: [AnnCOMPARE] :: (Comparable n, SingI n) => AnnVar -> Instr (n : (n : s)) ('TInt : s)
+ Morley.Michelson.Typed: [AnnCOMPARE] :: Comparable n => AnnVar -> Instr (n : (n : s)) ('TInt : s)
- Morley.Michelson.Typed: [AnnEMPTY_BIG_MAP] :: (SingI a, SingI b, Comparable a, HasNoBigMap b) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TBigMap a b : s)
+ Morley.Michelson.Typed: [AnnEMPTY_BIG_MAP] :: (SingI b, Comparable a, ForbidBigMap b) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TBigMap a b : s)
- Morley.Michelson.Typed: [AnnEMPTY_MAP] :: (SingI a, SingI b, Comparable a) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TMap a b : s)
+ Morley.Michelson.Typed: [AnnEMPTY_MAP] :: (SingI b, Comparable a) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TMap a b : s)
- Morley.Michelson.Typed: [AnnEMPTY_SET] :: (SingI e, Comparable e) => Anns '[TypeAnn, VarAnn, Notes e] -> Instr s ('TSet e : s)
+ Morley.Michelson.Typed: [AnnEMPTY_SET] :: Comparable e => Anns '[TypeAnn, VarAnn, Notes e] -> Instr s ('TSet e : s)
- Morley.Michelson.Typed: [CanBeCompared] :: Comparable t => Comparability t
+ Morley.Michelson.Typed: [CanBeCompared] :: (Comparable t, ComparabilityImplies t) => Comparability t
- Morley.Michelson.Typed: [CannotBeCompared] :: IsComparable t ~ 'False => Comparability t
+ Morley.Michelson.Typed: [CannotBeCompared] :: ContainsT 'PSNonComparable t ~ 'True => Comparability t
- Morley.Michelson.Typed: [STBigMap] :: forall (n_a2ism :: T) (n_a2isn :: T). () => Sing n_a2ism -> Sing n_a2isn -> SingT ('TBigMap n_a2ism n_a2isn :: T)
+ Morley.Michelson.Typed: [STBigMap] :: forall (n_a2MK5 :: T) (n_a2MK6 :: T). () => Sing n_a2MK5 -> Sing n_a2MK6 -> SingT ('TBigMap n_a2MK5 n_a2MK6 :: T)
- Morley.Michelson.Typed: [STContract] :: forall (n_a2is2 :: T). () => Sing n_a2is2 -> SingT ('TContract n_a2is2 :: T)
+ Morley.Michelson.Typed: [STContract] :: forall (n_a2MJL :: T). () => Sing n_a2MJL -> SingT ('TContract n_a2MJL :: T)
- Morley.Michelson.Typed: [STLambda] :: forall (n_a2ise :: T) (n_a2isf :: T). () => Sing n_a2ise -> Sing n_a2isf -> SingT ('TLambda n_a2ise n_a2isf :: T)
+ Morley.Michelson.Typed: [STLambda] :: forall (n_a2MJX :: T) (n_a2MJY :: T). () => Sing n_a2MJX -> Sing n_a2MJY -> SingT ('TLambda n_a2MJX n_a2MJY :: T)
- Morley.Michelson.Typed: [STList] :: forall (n_a2irY :: T). () => Sing n_a2irY -> SingT ('TList n_a2irY :: T)
+ Morley.Michelson.Typed: [STList] :: forall (n_a2MJH :: T). () => Sing n_a2MJH -> SingT ('TList n_a2MJH :: T)
- Morley.Michelson.Typed: [STMap] :: forall (n_a2isi :: T) (n_a2isj :: T). () => Sing n_a2isi -> Sing n_a2isj -> SingT ('TMap n_a2isi n_a2isj :: T)
+ Morley.Michelson.Typed: [STMap] :: forall (n_a2MK1 :: T) (n_a2MK2 :: T). () => Sing n_a2MK1 -> Sing n_a2MK2 -> SingT ('TMap n_a2MK1 n_a2MK2 :: T)
- Morley.Michelson.Typed: [STOption] :: forall (n_a2irW :: T). () => Sing n_a2irW -> SingT ('TOption n_a2irW :: T)
+ Morley.Michelson.Typed: [STOption] :: forall (n_a2MJF :: T). () => Sing n_a2MJF -> SingT ('TOption n_a2MJF :: T)
- Morley.Michelson.Typed: [STOr] :: forall (n_a2isa :: T) (n_a2isb :: T). () => Sing n_a2isa -> Sing n_a2isb -> SingT ('TOr n_a2isa n_a2isb :: T)
+ Morley.Michelson.Typed: [STOr] :: forall (n_a2MJT :: T) (n_a2MJU :: T). () => Sing n_a2MJT -> Sing n_a2MJU -> SingT ('TOr n_a2MJT n_a2MJU :: T)
- Morley.Michelson.Typed: [STPair] :: forall (n_a2is6 :: T) (n_a2is7 :: T). () => Sing n_a2is6 -> Sing n_a2is7 -> SingT ('TPair n_a2is6 n_a2is7 :: T)
+ Morley.Michelson.Typed: [STPair] :: forall (n_a2MJP :: T) (n_a2MJQ :: T). () => Sing n_a2MJP -> Sing n_a2MJQ -> SingT ('TPair n_a2MJP n_a2MJQ :: T)
- Morley.Michelson.Typed: [STSaplingState] :: forall (n_a2isq :: Nat). () => Sing n_a2isq -> SingT ('TSaplingState n_a2isq :: T)
+ Morley.Michelson.Typed: [STSaplingState] :: forall (n_a2MK9 :: Nat). () => Sing n_a2MK9 -> SingT ('TSaplingState n_a2MK9 :: T)
- Morley.Michelson.Typed: [STSaplingTransaction] :: forall (n_a2iss :: Nat). () => Sing n_a2iss -> SingT ('TSaplingTransaction n_a2iss :: T)
+ Morley.Michelson.Typed: [STSaplingTransaction] :: forall (n_a2MKb :: Nat). () => Sing n_a2MKb -> SingT ('TSaplingTransaction n_a2MKb :: T)
- Morley.Michelson.Typed: [STSet] :: forall (n_a2is0 :: T). () => Sing n_a2is0 -> SingT ('TSet n_a2is0 :: T)
+ Morley.Michelson.Typed: [STSet] :: forall (n_a2MJJ :: T). () => Sing n_a2MJJ -> SingT ('TSet n_a2MJJ :: T)
- Morley.Michelson.Typed: [STTicket] :: forall (n_a2is4 :: T). () => Sing n_a2is4 -> SingT ('TTicket n_a2is4 :: T)
+ Morley.Michelson.Typed: [STTicket] :: forall (n_a2MJN :: T). () => Sing n_a2MJN -> SingT ('TTicket n_a2MJN :: T)
- Morley.Michelson.Typed: [VBigMap] :: forall k v instr. (SingI k, SingI v, Comparable k, HasNoBigMap v) => Maybe Natural -> Map (Value' instr k) (Value' instr v) -> Value' instr ('TBigMap k v)
+ Morley.Michelson.Typed: [VBigMap] :: forall k v instr. (SingI v, Comparable k, ForbidBigMap v) => Maybe Natural -> Map (Value' instr k) (Value' instr v) -> Value' instr ('TBigMap k v)
- Morley.Michelson.Typed: [VContract] :: forall arg instr. (SingI arg, HasNoOp arg) => Address -> SomeEntrypointCallT arg -> Value' instr ('TContract arg)
+ Morley.Michelson.Typed: [VContract] :: forall arg instr. (SingI arg, ForbidOp arg) => Address -> SomeEntrypointCallT arg -> Value' instr ('TContract arg)
- Morley.Michelson.Typed: [VLam] :: forall inp out instr. (SingI inp, SingI out, forall i o. Show (instr i o), forall i o. Eq (instr i o), forall i o. NFData (instr i o)) => LambdaCode' instr inp out -> Value' instr ('TLambda inp out)
+ Morley.Michelson.Typed: [VLam] :: forall inp out instr. (SingI inp, SingI out) => LambdaCode' instr inp out -> Value' instr ('TLambda inp out)
- Morley.Michelson.Typed: [VMap] :: forall k v instr. (SingI k, SingI v, Comparable k) => Map (Value' instr k) (Value' instr v) -> Value' instr ('TMap k v)
+ Morley.Michelson.Typed: [VMap] :: forall k v instr. (SingI v, Comparable k) => Map (Value' instr k) (Value' instr v) -> Value' instr ('TMap k v)
- Morley.Michelson.Typed: [VSet] :: forall t instr. (SingI t, Comparable t) => Set (Value' instr t) -> Value' instr ('TSet t)
+ Morley.Michelson.Typed: [VSet] :: forall t instr. Comparable t => Set (Value' instr t) -> Value' instr ('TSet t)
- Morley.Michelson.Typed: bigMapAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoBigMap t)
+ Morley.Michelson.Typed: bigMapAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidBigMap t)
- Morley.Michelson.Typed: buildStack :: [T] -> Builder
+ Morley.Michelson.Typed: buildStack :: [T] -> Doc
- Morley.Michelson.Typed: buildVContract :: Value' instr ('TContract arg) -> Builder
+ Morley.Michelson.Typed: buildVContract :: Value' instr ('TContract arg) -> Doc
- Morley.Michelson.Typed: checkBigMapPresence :: Sing (ty :: T) -> BigMapPresence ty
+ Morley.Michelson.Typed: checkBigMapPresence :: Sing (ty :: T) -> TPresence 'PSBigMap ty
- Morley.Michelson.Typed: checkContractTypePresence :: Sing (ty :: T) -> ContractPresence ty
+ Morley.Michelson.Typed: checkContractTypePresence :: Sing (ty :: T) -> TPresence 'PSContract ty
- Morley.Michelson.Typed: checkNestedBigMapsPresence :: Sing (ty :: T) -> NestedBigMapsPresence ty
+ Morley.Michelson.Typed: checkNestedBigMapsPresence :: Sing (ty :: T) -> TPresence 'PSNestedBigMaps ty
- Morley.Michelson.Typed: checkOpPresence :: Sing (ty :: T) -> OpPresence ty
+ Morley.Michelson.Typed: checkOpPresence :: Sing (ty :: T) -> TPresence 'PSOp ty
- Morley.Michelson.Typed: checkTicketPresence :: Sing (ty :: T) -> TicketPresence ty
+ Morley.Michelson.Typed: checkTicketPresence :: Sing (ty :: T) -> TPresence 'PSTicket ty
- Morley.Michelson.Typed: class (SingI t, Comparable t) => ComparabilityScope t
+ Morley.Michelson.Typed: class ComparabilityScopeC (ComparabilityScope t) t => ComparabilityScope t
- Morley.Michelson.Typed: class (IsComparable t ~ 'True, SingI t, ComparableSuperC t) => Comparable t where {
+ Morley.Michelson.Typed: class (SingI t, RecSuperC Comparable t, ForbidNonComparable t) => Comparable t
- Morley.Michelson.Typed: class (SingI t, WellTyped t, HasNoOp t, HasNoBigMap t, HasNoContract t, HasNoTicket t, HasNoSaplingState t) => ConstantScope t
+ Morley.Michelson.Typed: class ConstantScopeC (ConstantScope t) t => ConstantScope t
- Morley.Michelson.Typed: class (SingI t, HasNoTicket t) => DupableScope t
+ Morley.Michelson.Typed: class DupableScopeC (DupableScope t) t => DupableScope t
- Morley.Michelson.Typed: class (SingI t, WellTyped t, HasNoOp t, HasNoBigMap t, HasNoTicket t, HasNoSaplingState t) => PackedValScope t
+ Morley.Michelson.Typed: class PackedValScopeC (PackedValScope t) t => PackedValScope t
- Morley.Michelson.Typed: class (SingI t, WellTyped t, HasNoOp t, HasNoNestedBigMaps t) => ParameterScope t
+ Morley.Michelson.Typed: class ParameterScopeC (ParameterScope t) t => ParameterScope t
- Morley.Michelson.Typed: class (SingI t, WellTyped t, HasNoOp t, HasNoNestedBigMaps t, HasNoContract t) => StorageScope t
+ Morley.Michelson.Typed: class StorageScopeC (StorageScope t) t => StorageScope t
- Morley.Michelson.Typed: class (WellTyped t, PackedValScope t, ConstantScope t) => UnpackedValScope t
+ Morley.Michelson.Typed: class UnpackedValScopeC (UnpackedValScope t) t => UnpackedValScope t
- Morley.Michelson.Typed: class (SingI t, HasNoOp t, HasNoBigMap t, HasNoTicket t) => ViewableScope t
+ Morley.Michelson.Typed: class ViewableScopeC (ViewableScope t) t => ViewableScope t
- Morley.Michelson.Typed: class (SingI t, WellTypedSuperC t) => WellTyped (t :: T) where {
+ Morley.Michelson.Typed: class (SingI t, RecSuperC WellTyped t, WellTypedConstraints t) => WellTyped t
- Morley.Michelson.Typed: contractTypeAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoContract t)
+ Morley.Michelson.Typed: contractTypeAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidContract t)
- Morley.Michelson.Typed: crDescriptionL :: forall a_a9136. Lens' (ConstructorRep a_a9136) (Maybe Text)
+ Morley.Michelson.Typed: crDescriptionL :: forall a_a9H8N. Lens' (ConstructorRep a_a9H8N) (Maybe Text)
- Morley.Michelson.Typed: crFieldsL :: forall a_a9136 a_a914k. Lens (ConstructorRep a_a9136) (ConstructorRep a_a914k) [FieldRep a_a9136] [FieldRep a_a914k]
+ Morley.Michelson.Typed: crFieldsL :: forall a_a9H8N a_a9Ha1. Lens (ConstructorRep a_a9H8N) (ConstructorRep a_a9Ha1) [FieldRep a_a9H8N] [FieldRep a_a9Ha1]
- Morley.Michelson.Typed: crNameL :: forall a_a9136. Lens' (ConstructorRep a_a9136) Text
+ Morley.Michelson.Typed: crNameL :: forall a_a9H8N. Lens' (ConstructorRep a_a9H8N) Text
- Morley.Michelson.Typed: frDescriptionL :: forall a_a9135. Lens' (FieldRep a_a9135) (Maybe Text)
+ Morley.Michelson.Typed: frDescriptionL :: forall a_a9H8M. Lens' (FieldRep a_a9H8M) (Maybe Text)
- Morley.Michelson.Typed: frNameL :: forall a_a9135. Lens' (FieldRep a_a9135) (Maybe Text)
+ Morley.Michelson.Typed: frNameL :: forall a_a9H8M. Lens' (FieldRep a_a9H8M) (Maybe Text)
- Morley.Michelson.Typed: frTypeRepL :: forall a_a9135 a_a916d. Lens (FieldRep a_a9135) (FieldRep a_a916d) a_a9135 a_a916d
+ Morley.Michelson.Typed: frTypeRepL :: forall a_a9H8M a_a9HbU. Lens (FieldRep a_a9H8M) (FieldRep a_a9HbU) a_a9H8M a_a9HbU
- Morley.Michelson.Typed: nestedBigMapsAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoNestedBigMaps t)
+ Morley.Michelson.Typed: nestedBigMapsAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidNestedBigMaps t)
- Morley.Michelson.Typed: opAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoOp t)
+ Morley.Michelson.Typed: opAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidOp t)
- Morley.Michelson.Typed: pattern CREATE_CONTRACT :: forall {inp_a7wXL} {out_a7wXM}. () => forall (p_X0 :: T) (g_X1 :: T) (s_X2 :: [T]). (inp_a7wXL ~ '(:) ('TOption 'TKeyHash) ('(:) 'TMutez ('(:) g_X1 s_X2)), out_a7wXM ~ '(:) 'TOperation ('(:) 'TAddress s_X2), ParameterScope p_X0, StorageScope g_X1, IsNotInView) => Contract' Instr p_X0 g_X1 -> Instr inp_a7wXL out_a7wXM
+ Morley.Michelson.Typed: pattern CREATE_CONTRACT :: forall {inp_a7REs} {out_a7REt}. () => forall (p_X0 :: T) (g_X1 :: T) (s_X2 :: [T]). (inp_a7REs ~ '(:) ('TOption 'TKeyHash) ('(:) 'TMutez ('(:) g_X1 s_X2)), out_a7REt ~ '(:) 'TOperation ('(:) 'TAddress s_X2), ParameterScope p_X0, StorageScope g_X1, IsNotInView) => Contract' Instr p_X0 g_X1 -> Instr inp_a7REs out_a7REt
- Morley.Michelson.Typed: pattern CONTRACT :: forall {inp_a7wXE} {out_a7wXF}. () => forall (p_X0 :: T) (s_X1 :: [T]). (inp_a7wXE ~ '(:) 'TAddress s_X1, out_a7wXF ~ '(:) ('TOption ('TContract p_X0)) s_X1, ParameterScope p_X0) => EpName -> Instr inp_a7wXE out_a7wXF
+ Morley.Michelson.Typed: pattern CONTRACT :: forall {inp_a7REl} {out_a7REm}. () => forall (p_X0 :: T) (s_X1 :: [T]). (inp_a7REl ~ '(:) 'TAddress s_X1, out_a7REm ~ '(:) ('TOption ('TContract p_X0)) s_X1, ParameterScope p_X0) => EpName -> Instr inp_a7REl out_a7REm
- Morley.Michelson.Typed: pattern EMIT :: forall {inp_a7wYM} {out_a7wYN}. () => forall (t_X0 :: T) (s_X1 :: [T]). (inp_a7wYM ~ '(:) t_X0 s_X1, out_a7wYN ~ '(:) 'TOperation s_X1, PackedValScope t_X0) => FieldAnn -> Maybe (Notes t_X0) -> Instr inp_a7wYM out_a7wYN
+ Morley.Michelson.Typed: pattern EMIT :: forall {inp_a7RFt} {out_a7RFu}. () => forall (t_X0 :: T) (s_X1 :: [T]). (inp_a7RFt ~ '(:) t_X0 s_X1, out_a7RFu ~ '(:) 'TOperation s_X1, PackedValScope t_X0) => FieldAnn -> Maybe (Notes t_X0) -> Instr inp_a7RFt out_a7RFu
- Morley.Michelson.Typed: pattern EQ :: forall {inp_a7wXf} {out_a7wXg}. () => forall (n_X0 :: T) (s_X1 :: [T]). (inp_a7wXf ~ '(:) n_X0 s_X1, out_a7wXg ~ '(:) (UnaryArithRes Eq' n_X0) s_X1, UnaryArithOp Eq' n_X0) => Instr inp_a7wXf out_a7wXg
+ Morley.Michelson.Typed: pattern EQ :: forall {inp_a7RDW} {out_a7RDX}. () => forall (n_X0 :: T) (s_X1 :: [T]). (inp_a7RDW ~ '(:) n_X0 s_X1, out_a7RDX ~ '(:) (UnaryArithRes Eq' n_X0) s_X1, UnaryArithOp Eq' n_X0) => Instr inp_a7RDW out_a7RDX
- Morley.Michelson.Typed: pattern DUPN :: forall {inp_a7wVE} {out_a7wVF}. () => forall (n_X0 :: Peano) (inp_a7rS5 :: [T]) (out_a7rS6 :: [T]) (a_X1 :: T). (inp_a7wVE ~ inp_a7rS5, out_a7wVF ~ out_a7rS6, ConstraintDUPN n_X0 inp_a7rS5 out_a7rS6 a_X1, DupableScope a_X1) => PeanoNatural n_X0 -> Instr inp_a7wVE out_a7wVF
+ Morley.Michelson.Typed: pattern DUPN :: forall {inp_a7RCl} {out_a7RCm}. () => forall (n_X0 :: Peano) (inp_a7Mty :: [T]) (out_a7Mtz :: [T]) (a_X1 :: T). (inp_a7RCl ~ inp_a7Mty, out_a7RCm ~ out_a7Mtz, ConstraintDUPN n_X0 inp_a7Mty out_a7Mtz a_X1, DupableScope a_X1) => PeanoNatural n_X0 -> Instr inp_a7RCl out_a7RCm
- Morley.Michelson.Typed: pattern SAPLING_EMPTY_STATE :: forall {inp_a7wYE} {out_a7wYF}. () => forall (n_X0 :: Peano) (s_a7rVL :: [T]). (inp_a7wYE ~ s_a7rVL, out_a7wYF ~ '(:) ('TSaplingState n_X0) s_a7rVL) => Sing n_X0 -> Instr inp_a7wYE out_a7wYF
+ Morley.Michelson.Typed: pattern SAPLING_EMPTY_STATE :: forall {inp_a7RFl} {out_a7RFm}. () => forall (n_X0 :: Peano) (s_a7Mxe :: [T]). (inp_a7RFl ~ s_a7Mxe, out_a7RFm ~ '(:) ('TSaplingState n_X0) s_a7Mxe) => Sing n_X0 -> Instr inp_a7RFl out_a7RFm
- Morley.Michelson.Typed: pattern SELF :: forall {inp_a7wXB} {out_a7wXC}. () => forall (arg_X0 :: T) (s_a7rV3 :: [T]). (inp_a7wXB ~ s_a7rV3, out_a7wXC ~ '(:) ('TContract arg_X0) s_a7rV3, ParameterScope arg_X0, IsNotInView) => SomeEntrypointCallT arg_X0 -> Instr inp_a7wXB out_a7wXC
+ Morley.Michelson.Typed: pattern SELF :: forall {inp_a7REi} {out_a7REj}. () => forall (arg_X0 :: T) (s_a7Mww :: [T]). (inp_a7REi ~ s_a7Mww, out_a7REj ~ '(:) ('TContract arg_X0) s_a7Mww, ParameterScope arg_X0, IsNotInView) => SomeEntrypointCallT arg_X0 -> Instr inp_a7REi out_a7REj
- Morley.Michelson.Typed: pattern PUSH :: forall {inp_a7wVH} {out_a7wVI}. () => forall (t_X0 :: T) (s_a7rSk :: [T]). (inp_a7wVH ~ s_a7rSk, out_a7wVI ~ '(:) t_X0 s_a7rSk, ConstantScope t_X0) => Value' Instr t_X0 -> Instr inp_a7wVH out_a7wVI
+ Morley.Michelson.Typed: pattern PUSH :: forall {inp_a7RCo} {out_a7RCp}. () => forall (t_X0 :: T) (s_a7MtN :: [T]). (inp_a7RCo ~ s_a7MtN, out_a7RCp ~ '(:) t_X0 s_a7MtN, ConstantScope t_X0) => Value' Instr t_X0 -> Instr inp_a7RCo out_a7RCp
- Morley.Michelson.Typed: pattern VIEW :: forall {inp_a7wXy} {out_a7wXz}. () => forall (arg_X0 :: T) (ret_X1 :: T) (s_X2 :: [T]). (inp_a7wXy ~ '(:) arg_X0 ('(:) 'TAddress s_X2), out_a7wXz ~ '(:) ('TOption ret_X1) s_X2, SingI arg_X0, ViewableScope ret_X1) => ViewName -> Instr inp_a7wXy out_a7wXz
+ Morley.Michelson.Typed: pattern VIEW :: forall {inp_a7REf} {out_a7REg}. () => forall (arg_X0 :: T) (ret_X1 :: T) (s_X2 :: [T]). (inp_a7REf ~ '(:) arg_X0 ('(:) 'TAddress s_X2), out_a7REg ~ '(:) ('TOption ret_X1) s_X2, SingI arg_X0, ViewableScope ret_X1) => ViewName -> Instr inp_a7REf out_a7REg
- Morley.Michelson.Typed: type ForbidBigMap t = FailWhen (ContainsBigMap t) ('Text "BigMaps are not allowed in this scope")
+ Morley.Michelson.Typed: type ForbidBigMap = ForbidT 'PSBigMap " Convenience synonym"
- Morley.Michelson.Typed: type ForbidContract t = FailWhen (ContainsContract t) ('Text "Type `contract` is not allowed in this scope")
+ Morley.Michelson.Typed: type ForbidContract = ForbidT 'PSContract " Convenience synonym"
- Morley.Michelson.Typed: type ForbidNestedBigMaps t = FailWhen (ContainsNestedBigMaps t) ('Text "Nested BigMaps are not allowed")
+ Morley.Michelson.Typed: type ForbidNestedBigMaps = ForbidT 'PSNestedBigMaps " Convenience synonym"
- Morley.Michelson.Typed: type ForbidNonComparable t = FailUnless (IsComparable t) ('Text "Only comparable types are allowed here")
+ Morley.Michelson.Typed: type ForbidNonComparable = ForbidT 'PSNonComparable " Convenience synonym"
- Morley.Michelson.Typed: type ForbidOp t = FailWhen (ContainsOp t) ('Text "Operations are not allowed in this scope")
+ Morley.Michelson.Typed: type ForbidOp = ForbidT 'PSOp " Convenience synonym"
- Morley.Michelson.Typed: type ForbidTicket t = FailWhen (ContainsTicket t) ('Text "Type `ticket` is not allowed in this scope")
+ Morley.Michelson.Typed: type ForbidTicket = ForbidT 'PSTicket " Convenience synonym"
- Morley.Michelson.Typed: type HasNoOpToT a = (IsoValue a, HasNoOp (ToT a))
+ Morley.Michelson.Typed: type HasNoOpToT a = (IsoValue a, ForbidOp (ToT a))
- Morley.Michelson.Typed: typeDocBuiltMichelsonRep :: TypeHasDoc a => Proxy a -> Builder
+ Morley.Michelson.Typed: typeDocBuiltMichelsonRep :: TypeHasDoc a => Proxy a -> Doc
- Morley.Michelson.Typed: untypeValue :: HasNoOp t => Value' Instr t -> Value
+ Morley.Michelson.Typed: untypeValue :: ForbidOp t => Value' Instr t -> Value
- Morley.Michelson.Typed: untypeValueHashable :: HasNoOp t => Value' Instr t -> Value
+ Morley.Michelson.Typed: untypeValueHashable :: ForbidOp t => Value' Instr t -> Value
- Morley.Michelson.Typed: untypeValueOptimized :: HasNoOp t => Value' Instr t -> Value
+ Morley.Michelson.Typed: untypeValueOptimized :: ForbidOp t => Value' Instr t -> Value
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnABS] :: forall (n_i7X9S :: T) (s_i7X9T :: [T]). UnaryArithOp Abs n_i7X9S => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9S s_i7X9T) ('(:) (UnaryArithRes Abs n_i7X9S) s_i7X9T)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnABS] :: forall (n_i8iay :: T) (s_i8iaz :: [T]). UnaryArithOp Abs n_i8iay => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iay s_i8iaz) ('(:) (UnaryArithRes Abs n_i8iay) s_i8iaz)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnADDRESS] :: forall (a_i7XaS :: T) (s_i7XaT :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TContract a_i7XaS) s_i7XaT) ('(:) 'TAddress s_i7XaT)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnADDRESS] :: forall (a_i8iby :: T) (s_i8ibz :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TContract a_i8iby) s_i8ibz) ('(:) 'TAddress s_i8ibz)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnADD] :: forall (n_i7X9F :: T) (m_i7X9G :: T) (s_i7X9H :: [T]). ArithOp Add n_i7X9F m_i7X9G => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9F ('(:) m_i7X9G s_i7X9H)) ('(:) (ArithRes Add n_i7X9F m_i7X9G) s_i7X9H)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnADD] :: forall (n_i8ial :: T) (m_i8iam :: T) (s_i8ian :: [T]). ArithOp Add n_i8ial m_i8iam => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ial ('(:) m_i8iam s_i8ian)) ('(:) (ArithRes Add n_i8ial m_i8iam) s_i8ian)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnAMOUNT] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TMutez inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnAMOUNT] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TMutez inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnAND] :: forall (n_i7Xa5 :: T) (m_i7Xa6 :: T) (s_i7Xa7 :: [T]). ArithOp And n_i7Xa5 m_i7Xa6 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xa5 ('(:) m_i7Xa6 s_i7Xa7)) ('(:) (ArithRes And n_i7Xa5 m_i7Xa6) s_i7Xa7)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnAND] :: forall (n_i8iaL :: T) (m_i8iaM :: T) (s_i8iaN :: [T]). ArithOp And n_i8iaL m_i8iaM => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaL ('(:) m_i8iaM s_i8iaN)) ('(:) (ArithRes And n_i8iaL m_i8iaM) s_i8iaN)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnAPPLY] :: forall (a_i7X9e :: T) (b_i7X9f :: T) (c_i7X9g :: T) (s_i7X9h :: [T]). (ConstantScope a_i7X9e, SingI b_i7X9f) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X9e ('(:) ('TLambda ('TPair a_i7X9e b_i7X9f) c_i7X9g) s_i7X9h)) ('(:) ('TLambda b_i7X9f c_i7X9g) s_i7X9h)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnAPPLY] :: forall (a_i8i9U :: T) (b_i8i9V :: T) (c_i8i9W :: T) (s_i8i9X :: [T]). (ConstantScope a_i8i9U, SingI b_i8i9V) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i9U ('(:) ('TLambda ('TPair a_i8i9U b_i8i9V) c_i8i9W) s_i8i9X)) ('(:) ('TLambda b_i8i9V c_i8i9W) s_i8i9X)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnBALANCE] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TMutez inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnBALANCE] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TMutez inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnBLAKE2B] :: forall (s_i7XaN :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaN) ('(:) 'TBytes s_i7XaN)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnBLAKE2B] :: forall (s_i8ibt :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibt) ('(:) 'TBytes s_i8ibt)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnBYTES] :: forall (n_i7Xat :: T) (s_i7Xau :: [T]). ToBytesArithOp n_i7Xat => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xat s_i7Xau) ('(:) 'TBytes s_i7Xau)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnBYTES] :: forall (n_i8ib9 :: T) (s_i8iba :: [T]). ToBytesArithOp n_i8ib9 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib9 s_i8iba) ('(:) 'TBytes s_i8iba)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCAR] :: forall (a_i7X7Q :: T) (b_i7X7R :: T) (s_i7X7S :: [T]). () => Anns ('(:) VarAnn ('(:) FieldAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i7X7Q b_i7X7R) s_i7X7S) ('(:) a_i7X7Q s_i7X7S)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCAR] :: forall (a_i8i8w :: T) (b_i8i8x :: T) (s_i8i8y :: [T]). () => Anns ('(:) VarAnn ('(:) FieldAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i8i8w b_i8i8x) s_i8i8y) ('(:) a_i8i8w s_i8i8y)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCAST] :: forall (a_i7X9q :: T) (s_i7X9r :: [T]). SingI a_i7X9q => Anns ('(:) VarAnn ('(:) (Notes a_i7X9q) ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X9q s_i7X9r) ('(:) a_i7X9q s_i7X9r)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCAST] :: forall (a_i8ia6 :: T) (s_i8ia7 :: [T]). SingI a_i8ia6 => Anns ('(:) VarAnn ('(:) (Notes a_i8ia6) ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8ia6 s_i8ia7) ('(:) a_i8ia6 s_i8ia7)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCDR] :: forall (a_i7X7T :: T) (b_i7X7U :: T) (s_i7X7V :: [T]). () => Anns ('(:) VarAnn ('(:) FieldAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i7X7T b_i7X7U) s_i7X7V) ('(:) b_i7X7U s_i7X7V)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCDR] :: forall (a_i8i8z :: T) (b_i8i8A :: T) (s_i8i8B :: [T]). () => Anns ('(:) VarAnn ('(:) FieldAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i8i8z b_i8i8A) s_i8i8B) ('(:) b_i8i8A s_i8i8B)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCHAIN_ID] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TChainId inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCHAIN_ID] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TChainId inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCHECK_SIGNATURE] :: forall (s_i7XaK :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKey ('(:) 'TSignature ('(:) 'TBytes s_i7XaK))) ('(:) 'TBool s_i7XaK)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCHECK_SIGNATURE] :: forall (s_i8ibq :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKey ('(:) 'TSignature ('(:) 'TBytes s_i8ibq))) ('(:) 'TBool s_i8ibq)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCOMPARE] :: forall (n_i7Xad :: T) (s_i7Xae :: [T]). (Comparable n_i7Xad, SingI n_i7Xad) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xad ('(:) n_i7Xad s_i7Xae)) ('(:) 'TInt s_i7Xae)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCOMPARE] :: forall (n_i8iaT :: T) (s_i8iaU :: [T]). Comparable n_i8iaT => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaT ('(:) n_i8iaT s_i8iaU)) ('(:) 'TInt s_i8iaU)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCONCAT'] :: forall (c_i7X9A :: T) (s_i7X9B :: [T]). ConcatOp c_i7X9A => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TList c_i7X9A) s_i7X9B) ('(:) c_i7X9A s_i7X9B)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCONCAT'] :: forall (c_i8iag :: T) (s_i8iah :: [T]). ConcatOp c_i8iag => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TList c_i8iag) s_i8iah) ('(:) c_i8iag s_i8iah)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCONCAT] :: forall (c_i7X9y :: T) (s_i7X9z :: [T]). ConcatOp c_i7X9y => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i7X9y ('(:) c_i7X9y s_i7X9z)) ('(:) c_i7X9y s_i7X9z)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCONCAT] :: forall (c_i8iae :: T) (s_i8iaf :: [T]). ConcatOp c_i8iae => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i8iae ('(:) c_i8iae s_i8iaf)) ('(:) c_i8iae s_i8iaf)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCONS] :: forall (a_i7X8z :: T) (s_i7X8A :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X8z ('(:) ('TList a_i7X8z) s_i7X8A)) ('(:) ('TList a_i7X8z) s_i7X8A)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCONS] :: forall (a_i8i9f :: T) (s_i8i9g :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i9f ('(:) ('TList a_i8i9f) s_i8i9g)) ('(:) ('TList a_i8i9f) s_i8i9g)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCONTRACT] :: forall (p_i7XaA :: T) (s_i7XaB :: [T]). ParameterScope p_i7XaA => Anns ('(:) VarAnn ('(:) (Notes p_i7XaA) ('[] :: [Type]))) -> EpName -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TAddress s_i7XaB) ('(:) ('TOption ('TContract p_i7XaA)) s_i7XaB)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCONTRACT] :: forall (p_i8ibg :: T) (s_i8ibh :: [T]). ParameterScope p_i8ibg => Anns ('(:) VarAnn ('(:) (Notes p_i8ibg) ('[] :: [Type]))) -> EpName -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TAddress s_i8ibh) ('(:) ('TOption ('TContract p_i8ibg)) s_i8ibh)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCREATE_CONTRACT] :: forall (p_i7XaF :: T) (g_i7XaG :: T) (s_i7XaH :: [T]). (ParameterScope p_i7XaF, StorageScope g_i7XaG, IsNotInView) => Anns ('(:) VarAnn ('(:) VarAnn ('[] :: [Type]))) -> Contract' Instr p_i7XaF g_i7XaG -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TOption 'TKeyHash) ('(:) 'TMutez ('(:) g_i7XaG s_i7XaH))) ('(:) 'TOperation ('(:) 'TAddress s_i7XaH))
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnCREATE_CONTRACT] :: forall (p_i8ibl :: T) (g_i8ibm :: T) (s_i8ibn :: [T]). (ParameterScope p_i8ibl, StorageScope g_i8ibm, IsNotInView) => Anns ('(:) VarAnn ('(:) VarAnn ('[] :: [Type]))) -> Contract' Instr p_i8ibl g_i8ibm -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TOption 'TKeyHash) ('(:) 'TMutez ('(:) g_i8ibm s_i8ibn))) ('(:) 'TOperation ('(:) 'TAddress s_i8ibn))
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnDUPN] :: forall (n_i7X80 :: Peano) (inp_i7X7N :: [T]) (out_i7X7O :: [T]) (a_i7X81 :: T). (ConstraintDUPN n_i7X80 inp_i7X7N out_i7X7O a_i7X81, DupableScope a_i7X81) => AnnVar -> PeanoNatural n_i7X80 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnDUPN] :: forall (n_i8i8G :: Peano) (inp_i8i8t :: [T]) (out_i8i8u :: [T]) (a_i8i8H :: T). (ConstraintDUPN n_i8i8G inp_i8i8t out_i8i8u a_i8i8H, DupableScope a_i8i8H) => AnnVar -> PeanoNatural n_i8i8G -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnDUP] :: forall (a_i7X7Y :: T) (s_i7X7Z :: [T]). DupableScope a_i7X7Y => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X7Y s_i7X7Z) ('(:) a_i7X7Y ('(:) a_i7X7Y s_i7X7Z))
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnDUP] :: forall (a_i8i8E :: T) (s_i8i8F :: [T]). DupableScope a_i8i8E => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i8E s_i8i8F) ('(:) a_i8i8E ('(:) a_i8i8E s_i8i8F))
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEDIV] :: forall (n_i7X9P :: T) (m_i7X9Q :: T) (s_i7X9R :: [T]). ArithOp EDiv n_i7X9P m_i7X9Q => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9P ('(:) m_i7X9Q s_i7X9R)) ('(:) (ArithRes EDiv n_i7X9P m_i7X9Q) s_i7X9R)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEDIV] :: forall (n_i8iav :: T) (m_i8iaw :: T) (s_i8iax :: [T]). ArithOp EDiv n_i8iav m_i8iaw => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iav ('(:) m_i8iaw s_i8iax)) ('(:) (ArithRes EDiv n_i8iav m_i8iaw) s_i8iax)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEMIT] :: forall (t_i7Xb9 :: T) (s_i7Xba :: [T]). PackedValScope t_i7Xb9 => AnnVar -> FieldAnn -> Maybe (Notes t_i7Xb9) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveNonStandardAnns) ('(:) t_i7Xb9 s_i7Xba) ('(:) 'TOperation s_i7Xba)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEMIT] :: forall (t_i8ibP :: T) (s_i8ibQ :: [T]). PackedValScope t_i8ibP => AnnVar -> FieldAnn -> Maybe (Notes t_i8ibP) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveNonStandardAnns) ('(:) t_i8ibP s_i8ibQ) ('(:) 'TOperation s_i8ibQ)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEMPTY_BIG_MAP] :: forall (a_i7X8I :: T) (b_i7X8J :: T) (inp_i7X7N :: [T]). (SingI a_i7X8I, SingI b_i7X8J, Comparable a_i7X8I, HasNoBigMap b_i7X8J) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i7X8I) ('(:) (Notes b_i7X8J) ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TBigMap a_i7X8I b_i7X8J) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEMPTY_BIG_MAP] :: forall (b_i8i9o :: T) (a_i8i9p :: T) (inp_i8i8t :: [T]). (SingI b_i8i9o, Comparable a_i8i9p, ForbidBigMap b_i8i9o) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i8i9p) ('(:) (Notes b_i8i9o) ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TBigMap a_i8i9p b_i8i9o) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEMPTY_MAP] :: forall (a_i7X8G :: T) (b_i7X8H :: T) (inp_i7X7N :: [T]). (SingI a_i7X8G, SingI b_i7X8H, Comparable a_i7X8G) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i7X8G) ('(:) (Notes b_i7X8H) ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TMap a_i7X8G b_i7X8H) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEMPTY_MAP] :: forall (b_i8i9m :: T) (a_i8i9n :: T) (inp_i8i8t :: [T]). (SingI b_i8i9m, Comparable a_i8i9n) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i8i9n) ('(:) (Notes b_i8i9m) ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TMap a_i8i9n b_i8i9m) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEMPTY_SET] :: forall (e_i7X8F :: T) (inp_i7X7N :: [T]). (SingI e_i7X8F, Comparable e_i7X8F) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes e_i7X8F) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TSet e_i7X8F) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEMPTY_SET] :: forall (e_i8i9l :: T) (inp_i8i8t :: [T]). Comparable e_i8i9l => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes e_i8i9l) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TSet e_i8i9l) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEQ] :: forall (n_i7Xaf :: T) (s_i7Xag :: [T]). UnaryArithOp Eq' n_i7Xaf => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xaf s_i7Xag) ('(:) (UnaryArithRes Eq' n_i7Xaf) s_i7Xag)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEQ] :: forall (n_i8iaV :: T) (s_i8iaW :: [T]). UnaryArithOp Eq' n_i8iaV => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaV s_i8iaW) ('(:) (UnaryArithRes Eq' n_i8iaV) s_i8iaW)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEXEC] :: forall (t1_i7X9b :: T) (t2_i7X9c :: T) (s_i7X9d :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) t1_i7X9b ('(:) ('TLambda t1_i7X9b t2_i7X9c) s_i7X9d)) ('(:) t2_i7X9c s_i7X9d)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnEXEC] :: forall (t1_i8i9R :: T) (t2_i8i9S :: T) (s_i8i9T :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) t1_i8i9R ('(:) ('TLambda t1_i8i9R t2_i8i9S) s_i8i9T)) ('(:) t2_i8i9S s_i8i9T)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGETN] :: forall (ix_i7X8S :: Peano) (pair_i7X8T :: T) (s_i7X8U :: [T]). ConstraintGetN ix_i7X8S pair_i7X8T => AnnVar -> PeanoNatural ix_i7X8S -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) pair_i7X8T s_i7X8U) ('(:) (GetN ix_i7X8S pair_i7X8T) s_i7X8U)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGETN] :: forall (ix_i8i9y :: Peano) (pair_i8i9z :: T) (s_i8i9A :: [T]). ConstraintGetN ix_i8i9y pair_i8i9z => AnnVar -> PeanoNatural ix_i8i9y -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) pair_i8i9z s_i8i9A) ('(:) (GetN ix_i8i9y pair_i8i9z) s_i8i9A)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGET] :: forall (c_i7X8Q :: T) (s_i7X8R :: [T]). (GetOp c_i7X8Q, SingI (GetOpVal c_i7X8Q)) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (GetOpKey c_i7X8Q) ('(:) c_i7X8Q s_i7X8R)) ('(:) ('TOption (GetOpVal c_i7X8Q)) s_i7X8R)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGET] :: forall (c_i8i9w :: T) (s_i8i9x :: [T]). (GetOp c_i8i9w, SingI (GetOpVal c_i8i9w)) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (GetOpKey c_i8i9w) ('(:) c_i8i9w s_i8i9x)) ('(:) ('TOption (GetOpVal c_i8i9w)) s_i8i9x)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGET_AND_UPDATE] :: forall (c_i7X91 :: T) (s_i7X92 :: [T]). (GetOp c_i7X91, UpdOp c_i7X91, SingI (GetOpVal c_i7X91), (~) (UpdOpKey c_i7X91) (GetOpKey c_i7X91)) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (UpdOpKey c_i7X91) ('(:) (UpdOpParams c_i7X91) ('(:) c_i7X91 s_i7X92))) ('(:) ('TOption (GetOpVal c_i7X91)) ('(:) c_i7X91 s_i7X92))
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGET_AND_UPDATE] :: forall (c_i8i9H :: T) (s_i8i9I :: [T]). (GetOp c_i8i9H, UpdOp c_i8i9H, SingI (GetOpVal c_i8i9H), (~) (UpdOpKey c_i8i9H) (GetOpKey c_i8i9H)) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (UpdOpKey c_i8i9H) ('(:) (UpdOpParams c_i8i9H) ('(:) c_i8i9H s_i8i9I))) ('(:) ('TOption (GetOpVal c_i8i9H)) ('(:) c_i8i9H s_i8i9I))
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGE] :: forall (n_i7Xap :: T) (s_i7Xaq :: [T]). UnaryArithOp Ge n_i7Xap => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xap s_i7Xaq) ('(:) (UnaryArithRes Ge n_i7Xap) s_i7Xaq)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGE] :: forall (n_i8ib5 :: T) (s_i8ib6 :: [T]). UnaryArithOp Ge n_i8ib5 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib5 s_i8ib6) ('(:) (UnaryArithRes Ge n_i8ib5) s_i8ib6)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGT] :: forall (n_i7Xal :: T) (s_i7Xam :: [T]). UnaryArithOp Gt n_i7Xal => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xal s_i7Xam) ('(:) (UnaryArithRes Gt n_i7Xal) s_i7Xam)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnGT] :: forall (n_i8ib1 :: T) (s_i8ib2 :: [T]). UnaryArithOp Gt n_i8ib1 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib1 s_i8ib2) ('(:) (UnaryArithRes Gt n_i8ib1) s_i8ib2)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnHASH_KEY] :: forall (s_i7XaQ :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKey s_i7XaQ) ('(:) 'TKeyHash s_i7XaQ)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnHASH_KEY] :: forall (s_i8ibw :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKey s_i8ibw) ('(:) 'TKeyHash s_i8ibw)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnIMPLICIT_ACCOUNT] :: forall (s_i7XaI :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKeyHash s_i7XaI) ('(:) ('TContract 'TUnit) s_i7XaI)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnIMPLICIT_ACCOUNT] :: forall (s_i8ibo :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKeyHash s_i8ibo) ('(:) ('TContract 'TUnit) s_i8ibo)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnINT] :: forall (n_i7Xar :: T) (s_i7Xas :: [T]). ToIntArithOp n_i7Xar => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xar s_i7Xas) ('(:) 'TInt s_i7Xas)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnINT] :: forall (n_i8ib7 :: T) (s_i8ib8 :: [T]). ToIntArithOp n_i8ib7 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib7 s_i8ib8) ('(:) 'TInt s_i8ib8)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnISNAT] :: forall (s_i7X9E :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TInt s_i7X9E) ('(:) ('TOption 'TNat) s_i7X9E)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnISNAT] :: forall (s_i8iak :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TInt s_i8iak) ('(:) ('TOption 'TNat) s_i8iak)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnJOIN_TICKETS] :: forall (a_i7Xb3 :: T) (s_i7Xb4 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair ('TTicket a_i7Xb3) ('TTicket a_i7Xb3)) s_i7Xb4) ('(:) ('TOption ('TTicket a_i7Xb3)) s_i7Xb4)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnJOIN_TICKETS] :: forall (a_i8ibJ :: T) (s_i8ibK :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair ('TTicket a_i8ibJ) ('TTicket a_i8ibJ)) s_i8ibK) ('(:) ('TOption ('TTicket a_i8ibJ)) s_i8ibK)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnKECCAK] :: forall (s_i7XaP :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaP) ('(:) 'TBytes s_i7XaP)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnKECCAK] :: forall (s_i8ibv :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibv) ('(:) 'TBytes s_i8ibv)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLAMBDA] :: forall (i_i7X97 :: T) (o_i7X98 :: T) (inp_i7X7N :: [T]). (SingI i_i7X97, SingI o_i7X98) => Anns ('(:) VarAnn ('(:) (Notes i_i7X97) ('(:) (Notes o_i7X98) ('[] :: [Type])))) -> RemFail Instr ('(:) i_i7X97 ('[] :: [T])) ('(:) o_i7X98 ('[] :: [T])) -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TLambda i_i7X97 o_i7X98) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLAMBDA] :: forall (i_i8i9N :: T) (o_i8i9O :: T) (inp_i8i8t :: [T]). (SingI i_i8i9N, SingI o_i8i9O) => Anns ('(:) VarAnn ('(:) (Notes i_i8i9N) ('(:) (Notes o_i8i9O) ('[] :: [Type])))) -> RemFail Instr ('(:) i_i8i9N ('[] :: [T])) ('(:) o_i8i9O ('[] :: [T])) -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TLambda i_i8i9N o_i8i9O) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLAMBDA_REC] :: forall (i_i7X99 :: T) (o_i7X9a :: T) (inp_i7X7N :: [T]). (SingI i_i7X99, SingI o_i7X9a) => Anns ('(:) VarAnn ('(:) (Notes i_i7X99) ('(:) (Notes o_i7X9a) ('[] :: [Type])))) -> RemFail Instr ('(:) i_i7X99 ('(:) ('TLambda i_i7X99 o_i7X9a) ('[] :: [T]))) ('(:) o_i7X9a ('[] :: [T])) -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TLambda i_i7X99 o_i7X9a) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLAMBDA_REC] :: forall (i_i8i9P :: T) (o_i8i9Q :: T) (inp_i8i8t :: [T]). (SingI i_i8i9P, SingI o_i8i9Q) => Anns ('(:) VarAnn ('(:) (Notes i_i8i9P) ('(:) (Notes o_i8i9Q) ('[] :: [Type])))) -> RemFail Instr ('(:) i_i8i9P ('(:) ('TLambda i_i8i9P o_i8i9Q) ('[] :: [T]))) ('(:) o_i8i9Q ('[] :: [T])) -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TLambda i_i8i9P o_i8i9Q) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLEFT] :: forall (b_i7X8p :: T) (a_i7X8q :: T) (s_i7X8r :: [T]). SingI b_i7X8p => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('(:) (Notes b_i7X8p) ('[] :: [Type])))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X8q s_i7X8r) ('(:) ('TOr a_i7X8q b_i7X8p) s_i7X8r)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLEFT] :: forall (b_i8i95 :: T) (a_i8i96 :: T) (s_i8i97 :: [T]). SingI b_i8i95 => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('(:) (Notes b_i8i95) ('[] :: [Type])))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i96 s_i8i97) ('(:) ('TOr a_i8i96 b_i8i95) s_i8i97)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLEVEL] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TNat inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLEVEL] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TNat inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLE] :: forall (n_i7Xan :: T) (s_i7Xao :: [T]). UnaryArithOp Le n_i7Xan => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xan s_i7Xao) ('(:) (UnaryArithRes Le n_i7Xan) s_i7Xao)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLE] :: forall (n_i8ib3 :: T) (s_i8ib4 :: [T]). UnaryArithOp Le n_i8ib3 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib3 s_i8ib4) ('(:) (UnaryArithRes Le n_i8ib3) s_i8ib4)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLSL] :: forall (n_i7X9W :: T) (m_i7X9X :: T) (s_i7X9Y :: [T]). ArithOp Lsl n_i7X9W m_i7X9X => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9W ('(:) m_i7X9X s_i7X9Y)) ('(:) (ArithRes Lsl n_i7X9W m_i7X9X) s_i7X9Y)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLSL] :: forall (n_i8iaC :: T) (m_i8iaD :: T) (s_i8iaE :: [T]). ArithOp Lsl n_i8iaC m_i8iaD => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaC ('(:) m_i8iaD s_i8iaE)) ('(:) (ArithRes Lsl n_i8iaC m_i8iaD) s_i8iaE)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLSR] :: forall (n_i7X9Z :: T) (m_i7Xa0 :: T) (s_i7Xa1 :: [T]). ArithOp Lsr n_i7X9Z m_i7Xa0 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9Z ('(:) m_i7Xa0 s_i7Xa1)) ('(:) (ArithRes Lsr n_i7X9Z m_i7Xa0) s_i7Xa1)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLSR] :: forall (n_i8iaF :: T) (m_i8iaG :: T) (s_i8iaH :: [T]). ArithOp Lsr n_i8iaF m_i8iaG => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaF ('(:) m_i8iaG s_i8iaH)) ('(:) (ArithRes Lsr n_i8iaF m_i8iaG) s_i8iaH)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLT] :: forall (n_i7Xaj :: T) (s_i7Xak :: [T]). UnaryArithOp Lt n_i7Xaj => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xaj s_i7Xak) ('(:) (UnaryArithRes Lt n_i7Xaj) s_i7Xak)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnLT] :: forall (n_i8iaZ :: T) (s_i8ib0 :: [T]). UnaryArithOp Lt n_i8iaZ => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaZ s_i8ib0) ('(:) (UnaryArithRes Lt n_i8iaZ) s_i8ib0)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnMAP] :: forall (c_i7X8K :: T) (b_i7X8L :: T) (s_i7X8M :: [T]). (MapOp c_i7X8K, SingI b_i7X8L) => AnnVar -> Instr ('(:) (MapOpInp c_i7X8K) s_i7X8M) ('(:) b_i7X8L s_i7X8M) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i7X8K s_i7X8M) ('(:) (MapOpRes c_i7X8K b_i7X8L) s_i7X8M)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnMAP] :: forall (c_i8i9q :: T) (b_i8i9r :: T) (s_i8i9s :: [T]). (MapOp c_i8i9q, SingI b_i8i9r) => AnnVar -> Instr ('(:) (MapOpInp c_i8i9q) s_i8i9s) ('(:) b_i8i9r s_i8i9s) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i8i9q s_i8i9s) ('(:) (MapOpRes c_i8i9q b_i8i9r) s_i8i9s)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnMEM] :: forall (c_i7X8O :: T) (s_i7X8P :: [T]). MemOp c_i7X8O => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (MemOpKey c_i7X8O) ('(:) c_i7X8O s_i7X8P)) ('(:) 'TBool s_i7X8P)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnMEM] :: forall (c_i8i9u :: T) (s_i8i9v :: [T]). MemOp c_i8i9u => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (MemOpKey c_i8i9u) ('(:) c_i8i9u s_i8i9v)) ('(:) 'TBool s_i8i9v)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnMIN_BLOCK_TIME] :: forall (inp_i7X7N :: [T]). () => [AnyAnn] -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveNonStandardAnns) inp_i7X7N ('(:) 'TNat inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnMIN_BLOCK_TIME] :: forall (inp_i8i8t :: [T]). () => [AnyAnn] -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveNonStandardAnns) inp_i8i8t ('(:) 'TNat inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnMUL] :: forall (n_i7X9M :: T) (m_i7X9N :: T) (s_i7X9O :: [T]). ArithOp Mul n_i7X9M m_i7X9N => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9M ('(:) m_i7X9N s_i7X9O)) ('(:) (ArithRes Mul n_i7X9M m_i7X9N) s_i7X9O)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnMUL] :: forall (n_i8ias :: T) (m_i8iat :: T) (s_i8iau :: [T]). ArithOp Mul n_i8ias m_i8iat => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ias ('(:) m_i8iat s_i8iau)) ('(:) (ArithRes Mul n_i8ias m_i8iat) s_i8iau)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNAT] :: forall (s_i7Xav :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7Xav) ('(:) 'TNat s_i7Xav)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNAT] :: forall (s_i8ibb :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibb) ('(:) 'TNat s_i8ibb)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNEG] :: forall (n_i7X9U :: T) (s_i7X9V :: [T]). UnaryArithOp Neg n_i7X9U => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9U s_i7X9V) ('(:) (UnaryArithRes Neg n_i7X9U) s_i7X9V)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNEG] :: forall (n_i8iaA :: T) (s_i8iaB :: [T]). UnaryArithOp Neg n_i8iaA => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaA s_i8iaB) ('(:) (UnaryArithRes Neg n_i8iaA) s_i8iaB)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNEQ] :: forall (n_i7Xah :: T) (s_i7Xai :: [T]). UnaryArithOp Neq n_i7Xah => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xah s_i7Xai) ('(:) (UnaryArithRes Neq n_i7Xah) s_i7Xai)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNEQ] :: forall (n_i8iaX :: T) (s_i8iaY :: [T]). UnaryArithOp Neq n_i8iaX => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaX s_i8iaY) ('(:) (UnaryArithRes Neq n_i8iaX) s_i8iaY)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNIL] :: forall (p_i7X8y :: T) (inp_i7X7N :: [T]). SingI p_i7X8y => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes p_i7X8y) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TList p_i7X8y) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNIL] :: forall (p_i8i9e :: T) (inp_i8i8t :: [T]). SingI p_i8i9e => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes p_i8i9e) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TList p_i8i9e) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNONE] :: forall (a_i7X8c :: T) (inp_i7X7N :: [T]). SingI a_i7X8c => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i7X8c) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TOption a_i7X8c) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNONE] :: forall (a_i8i8S :: T) (inp_i8i8t :: [T]). SingI a_i8i8S => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i8i8S) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TOption a_i8i8S) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNOT] :: forall (n_i7Xab :: T) (s_i7Xac :: [T]). (SingI n_i7Xab, UnaryArithOp Not n_i7Xab) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xab s_i7Xac) ('(:) (UnaryArithRes Not n_i7Xab) s_i7Xac)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNOT] :: forall (n_i8iaR :: T) (s_i8iaS :: [T]). (SingI n_i8iaR, UnaryArithOp Not n_i8iaR) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaR s_i8iaS) ('(:) (UnaryArithRes Not n_i8iaR) s_i8iaS)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNOW] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TTimestamp inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnNOW] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TTimestamp inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnOPEN_CHEST] :: forall (s_i7Xb5 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TChestKey ('(:) 'TChest ('(:) 'TNat s_i7Xb5))) ('(:) ('TOr 'TBytes 'TBool) s_i7Xb5)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnOPEN_CHEST] :: forall (s_i8ibL :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TChestKey ('(:) 'TChest ('(:) 'TNat s_i8ibL))) ('(:) ('TOr 'TBytes 'TBool) s_i8ibL)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnOR] :: forall (n_i7Xa2 :: T) (m_i7Xa3 :: T) (s_i7Xa4 :: [T]). ArithOp Or n_i7Xa2 m_i7Xa3 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xa2 ('(:) m_i7Xa3 s_i7Xa4)) ('(:) (ArithRes Or n_i7Xa2 m_i7Xa3) s_i7Xa4)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnOR] :: forall (n_i8iaI :: T) (m_i8iaJ :: T) (s_i8iaK :: [T]). ArithOp Or n_i8iaI m_i8iaJ => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaI ('(:) m_i8iaJ s_i8iaK)) ('(:) (ArithRes Or n_i8iaI m_i8iaJ) s_i8iaK)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPACK] :: forall (a_i7X9u :: T) (s_i7X9v :: [T]). PackedValScope a_i7X9u => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X9u s_i7X9v) ('(:) 'TBytes s_i7X9v)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPACK] :: forall (a_i8iaa :: T) (s_i8iab :: [T]). PackedValScope a_i8iaa => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8iaa s_i8iab) ('(:) 'TBytes s_i8iab)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPAIRING_CHECK] :: forall (s_i7XaR :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TList ('TPair 'TBls12381G1 'TBls12381G2)) s_i7XaR) ('(:) 'TBool s_i7XaR)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPAIRING_CHECK] :: forall (s_i8ibx :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TList ('TPair 'TBls12381G1 'TBls12381G2)) s_i8ibx) ('(:) 'TBool s_i8ibx)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPAIRN] :: forall (n_i7X8l :: Peano) (inp_i7X7N :: [T]). ConstraintPairN n_i7X8l inp_i7X7N => AnnVar -> PeanoNatural n_i7X8l -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) (RightComb (LazyTake n_i7X8l inp_i7X7N)) (Drop n_i7X8l inp_i7X7N))
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPAIRN] :: forall (n_i8i91 :: Peano) (inp_i8i8t :: [T]). ConstraintPairN n_i8i91 inp_i8i8t => AnnVar -> PeanoNatural n_i8i91 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) (RightComb (LazyTake n_i8i91 inp_i8i8t)) (Drop n_i8i91 inp_i8i8t))
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPAIR] :: forall (a_i7X8f :: T) (b_i7X8g :: T) (s_i7X8h :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X8f ('(:) b_i7X8g s_i7X8h)) ('(:) ('TPair a_i7X8f b_i7X8g) s_i7X8h)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPAIR] :: forall (a_i8i8V :: T) (b_i8i8W :: T) (s_i8i8X :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i8V ('(:) b_i8i8W s_i8i8X)) ('(:) ('TPair a_i8i8V b_i8i8W) s_i8i8X)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPUSH] :: forall (t_i7X89 :: T) (inp_i7X7N :: [T]). ConstantScope t_i7X89 => Anns ('(:) VarAnn ('(:) (Notes t_i7X89) ('[] :: [Type]))) -> Value' Instr t_i7X89 -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) t_i7X89 inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnPUSH] :: forall (t_i8i8P :: T) (inp_i8i8t :: [T]). ConstantScope t_i8i8P => Anns ('(:) VarAnn ('(:) (Notes t_i8i8P) ('[] :: [Type]))) -> Value' Instr t_i8i8P -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) t_i8i8P inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnREAD_TICKET] :: forall (a_i7XaZ :: T) (s_i7Xb0 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TTicket a_i7XaZ) s_i7Xb0) ('(:) (RightComb ('(:) 'TAddress ('(:) a_i7XaZ ('(:) 'TNat ('[] :: [T]))))) ('(:) ('TTicket a_i7XaZ) s_i7Xb0))
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnREAD_TICKET] :: forall (a_i8ibF :: T) (s_i8ibG :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TTicket a_i8ibF) s_i8ibG) ('(:) (RightComb ('(:) 'TAddress ('(:) a_i8ibF ('(:) 'TNat ('[] :: [T]))))) ('(:) ('TTicket a_i8ibF) s_i8ibG))
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnRENAME] :: forall (a_i7X9s :: T) (s_i7X9t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X9s s_i7X9t) ('(:) a_i7X9s s_i7X9t)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnRENAME] :: forall (a_i8ia8 :: T) (s_i8ia9 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8ia8 s_i8ia9) ('(:) a_i8ia8 s_i8ia9)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnRIGHT] :: forall (a_i7X8s :: T) (b_i7X8t :: T) (s_i7X8u :: [T]). SingI a_i7X8s => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('(:) (Notes a_i7X8s) ('[] :: [Type])))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) b_i7X8t s_i7X8u) ('(:) ('TOr a_i7X8s b_i7X8t) s_i7X8u)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnRIGHT] :: forall (a_i8i98 :: T) (b_i8i99 :: T) (s_i8i9a :: [T]). SingI a_i8i98 => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('(:) (Notes a_i8i98) ('[] :: [Type])))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) b_i8i99 s_i8i9a) ('(:) ('TOr a_i8i98 b_i8i99) s_i8i9a)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSAPLING_EMPTY_STATE] :: forall (n_i7Xb6 :: Peano) (inp_i7X7N :: [T]). () => AnnVar -> Sing n_i7Xb6 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TSaplingState n_i7Xb6) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSAPLING_EMPTY_STATE] :: forall (n_i8ibM :: Peano) (inp_i8i8t :: [T]). () => AnnVar -> Sing n_i8ibM -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TSaplingState n_i8ibM) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSAPLING_VERIFY_UPDATE] :: forall (n_i7Xb7 :: Peano) (s_i7Xb8 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TSaplingTransaction n_i7Xb7) ('(:) ('TSaplingState n_i7Xb7) s_i7Xb8)) ('(:) ('TOption ('TPair 'TBytes ('TPair 'TInt ('TSaplingState n_i7Xb7)))) s_i7Xb8)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSAPLING_VERIFY_UPDATE] :: forall (n_i8ibN :: Peano) (s_i8ibO :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TSaplingTransaction n_i8ibN) ('(:) ('TSaplingState n_i8ibN) s_i8ibO)) ('(:) ('TOption ('TPair 'TBytes ('TPair 'TInt ('TSaplingState n_i8ibN)))) s_i8ibO)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSELF] :: forall (arg_i7Xaz :: T) (inp_i7X7N :: [T]). (ParameterScope arg_i7Xaz, IsNotInView) => AnnVar -> SomeEntrypointCallT arg_i7Xaz -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TContract arg_i7Xaz) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSELF] :: forall (arg_i8ibf :: T) (inp_i8i8t :: [T]). (ParameterScope arg_i8ibf, IsNotInView) => AnnVar -> SomeEntrypointCallT arg_i8ibf -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TContract arg_i8ibf) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSELF_ADDRESS] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TAddress inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSELF_ADDRESS] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TAddress inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSENDER] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TAddress inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSENDER] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TAddress inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSET_DELEGATE] :: forall (s_i7XaE :: [T]). IsNotInView => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TOption 'TKeyHash) s_i7XaE) ('(:) 'TOperation s_i7XaE)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSET_DELEGATE] :: forall (s_i8ibk :: [T]). IsNotInView => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TOption 'TKeyHash) s_i8ibk) ('(:) 'TOperation s_i8ibk)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSHA256] :: forall (s_i7XaL :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaL) ('(:) 'TBytes s_i7XaL)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSHA256] :: forall (s_i8ibr :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibr) ('(:) 'TBytes s_i8ibr)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSHA3] :: forall (s_i7XaO :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaO) ('(:) 'TBytes s_i7XaO)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSHA3] :: forall (s_i8ibu :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibu) ('(:) 'TBytes s_i8ibu)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSHA512] :: forall (s_i7XaM :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaM) ('(:) 'TBytes s_i7XaM)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSHA512] :: forall (s_i8ibs :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibs) ('(:) 'TBytes s_i8ibs)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSIZE] :: forall (c_i7X8D :: T) (s_i7X8E :: [T]). SizeOp c_i7X8D => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i7X8D s_i7X8E) ('(:) 'TNat s_i7X8E)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSIZE] :: forall (c_i8i9j :: T) (s_i8i9k :: [T]). SizeOp c_i8i9j => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i8i9j s_i8i9k) ('(:) 'TNat s_i8i9k)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSLICE] :: forall (c_i7X9C :: T) (s_i7X9D :: [T]). (SliceOp c_i7X9C, SingI c_i7X9C) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TNat ('(:) 'TNat ('(:) c_i7X9C s_i7X9D))) ('(:) ('TOption c_i7X9C) s_i7X9D)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSLICE] :: forall (c_i8iai :: T) (s_i8iaj :: [T]). (SliceOp c_i8iai, SingI c_i8iai) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TNat ('(:) 'TNat ('(:) c_i8iai s_i8iaj))) ('(:) ('TOption c_i8iai) s_i8iaj)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSOME] :: forall (a_i7X8a :: T) (s_i7X8b :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X8a s_i7X8b) ('(:) ('TOption a_i7X8a) s_i7X8b)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSOME] :: forall (a_i8i8Q :: T) (s_i8i8R :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i8Q s_i8i8R) ('(:) ('TOption a_i8i8Q) s_i8i8R)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSOURCE] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TAddress inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSOURCE] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TAddress inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSPLIT_TICKET] :: forall (a_i7Xb1 :: T) (s_i7Xb2 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TTicket a_i7Xb1) ('(:) ('TPair 'TNat 'TNat) s_i7Xb2)) ('(:) ('TOption ('TPair ('TTicket a_i7Xb1) ('TTicket a_i7Xb1))) s_i7Xb2)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSPLIT_TICKET] :: forall (a_i8ibH :: T) (s_i8ibI :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TTicket a_i8ibH) ('(:) ('TPair 'TNat 'TNat) s_i8ibI)) ('(:) ('TOption ('TPair ('TTicket a_i8ibH) ('TTicket a_i8ibH))) s_i8ibI)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSUB] :: forall (n_i7X9I :: T) (m_i7X9J :: T) (s_i7X9K :: [T]). ArithOp Sub n_i7X9I m_i7X9J => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9I ('(:) m_i7X9J s_i7X9K)) ('(:) (ArithRes Sub n_i7X9I m_i7X9J) s_i7X9K)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSUB] :: forall (n_i8iao :: T) (m_i8iap :: T) (s_i8iaq :: [T]). ArithOp Sub n_i8iao m_i8iap => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iao ('(:) m_i8iap s_i8iaq)) ('(:) (ArithRes Sub n_i8iao m_i8iap) s_i8iaq)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSUB_MUTEZ] :: forall (s_i7X9L :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TMutez ('(:) 'TMutez s_i7X9L)) ('(:) ('TOption 'TMutez) s_i7X9L)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnSUB_MUTEZ] :: forall (s_i8iar :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TMutez ('(:) 'TMutez s_i8iar)) ('(:) ('TOption 'TMutez) s_i8iar)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnTICKET] :: forall (a_i7XaX :: T) (s_i7XaY :: [T]). Comparable a_i7XaX => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7XaX ('(:) 'TNat s_i7XaY)) ('(:) ('TOption ('TTicket a_i7XaX)) s_i7XaY)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnTICKET] :: forall (a_i8ibD :: T) (s_i8ibE :: [T]). Comparable a_i8ibD => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8ibD ('(:) 'TNat s_i8ibE)) ('(:) ('TOption ('TTicket a_i8ibD)) s_i8ibE)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnTICKET_DEPRECATED] :: forall (a_i7XaV :: T) (s_i7XaW :: [T]). Comparable a_i7XaV => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7XaV ('(:) 'TNat s_i7XaW)) ('(:) ('TTicket a_i7XaV) s_i7XaW)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnTICKET_DEPRECATED] :: forall (a_i8ibB :: T) (s_i8ibC :: [T]). Comparable a_i8ibB => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8ibB ('(:) 'TNat s_i8ibC)) ('(:) ('TTicket a_i8ibB) s_i8ibC)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnTOTAL_VOTING_POWER] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TNat inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnTOTAL_VOTING_POWER] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TNat inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnTRANSFER_TOKENS] :: forall (p_i7XaC :: T) (s_i7XaD :: [T]). (ParameterScope p_i7XaC, IsNotInView) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) p_i7XaC ('(:) 'TMutez ('(:) ('TContract p_i7XaC) s_i7XaD))) ('(:) 'TOperation s_i7XaD)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnTRANSFER_TOKENS] :: forall (p_i8ibi :: T) (s_i8ibj :: [T]). (ParameterScope p_i8ibi, IsNotInView) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) p_i8ibi ('(:) 'TMutez ('(:) ('TContract p_i8ibi) s_i8ibj))) ('(:) 'TOperation s_i8ibj)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUNIT] :: forall (inp_i7X7N :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TUnit inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUNIT] :: forall (inp_i8i8t :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TUnit inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUNPACK] :: forall (a_i7X9w :: T) (s_i7X9x :: [T]). (UnpackedValScope a_i7X9w, SingI a_i7X9w) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i7X9w) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7X9x) ('(:) ('TOption a_i7X9w) s_i7X9x)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUNPACK] :: forall (a_i8iac :: T) (s_i8iad :: [T]). (UnpackedValScope a_i8iac, SingI a_i8iac) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i8iac) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8iad) ('(:) ('TOption a_i8iac) s_i8iad)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUNPAIR] :: forall (a_i7X8i :: T) (b_i7X8j :: T) (s_i7X8k :: [T]). () => Anns ('(:) VarAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i7X8i b_i7X8j) s_i7X8k) ('(:) a_i7X8i ('(:) b_i7X8j s_i7X8k))
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUNPAIR] :: forall (a_i8i8Y :: T) (b_i8i8Z :: T) (s_i8i90 :: [T]). () => Anns ('(:) VarAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i8i8Y b_i8i8Z) s_i8i90) ('(:) a_i8i8Y ('(:) b_i8i8Z s_i8i90))
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUPDATEN] :: forall (ix_i7X8X :: Peano) (val_i7X8Y :: T) (pair_i7X8Z :: T) (s_i7X90 :: [T]). ConstraintUpdateN ix_i7X8X pair_i7X8Z => AnnVar -> PeanoNatural ix_i7X8X -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) val_i7X8Y ('(:) pair_i7X8Z s_i7X90)) ('(:) (UpdateN ix_i7X8X val_i7X8Y pair_i7X8Z) s_i7X90)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUPDATEN] :: forall (ix_i8i9D :: Peano) (val_i8i9E :: T) (pair_i8i9F :: T) (s_i8i9G :: [T]). ConstraintUpdateN ix_i8i9D pair_i8i9F => AnnVar -> PeanoNatural ix_i8i9D -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) val_i8i9E ('(:) pair_i8i9F s_i8i9G)) ('(:) (UpdateN ix_i8i9D val_i8i9E pair_i8i9F) s_i8i9G)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUPDATE] :: forall (c_i7X8V :: T) (s_i7X8W :: [T]). UpdOp c_i7X8V => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (UpdOpKey c_i7X8V) ('(:) (UpdOpParams c_i7X8V) ('(:) c_i7X8V s_i7X8W))) ('(:) c_i7X8V s_i7X8W)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnUPDATE] :: forall (c_i8i9B :: T) (s_i8i9C :: [T]). UpdOp c_i8i9B => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (UpdOpKey c_i8i9B) ('(:) (UpdOpParams c_i8i9B) ('(:) c_i8i9B s_i8i9C))) ('(:) c_i8i9B s_i8i9C)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnVIEW] :: forall (arg_i7Xaw :: T) (ret_i7Xax :: T) (s_i7Xay :: [T]). (SingI arg_i7Xaw, ViewableScope ret_i7Xax) => Anns ('(:) VarAnn ('(:) (Notes ret_i7Xax) ('[] :: [Type]))) -> ViewName -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) arg_i7Xaw ('(:) 'TAddress s_i7Xay)) ('(:) ('TOption ret_i7Xax) s_i7Xay)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnVIEW] :: forall (arg_i8ibc :: T) (ret_i8ibd :: T) (s_i8ibe :: [T]). (SingI arg_i8ibc, ViewableScope ret_i8ibd) => Anns ('(:) VarAnn ('(:) (Notes ret_i8ibd) ('[] :: [Type]))) -> ViewName -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) arg_i8ibc ('(:) 'TAddress s_i8ibe)) ('(:) ('TOption ret_i8ibd) s_i8ibe)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnVOTING_POWER] :: forall (s_i7XaJ :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKeyHash s_i7XaJ) ('(:) 'TNat s_i7XaJ)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnVOTING_POWER] :: forall (s_i8ibp :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKeyHash s_i8ibp) ('(:) 'TNat s_i8ibp)
- Morley.Michelson.Typed.ClassifiedInstr: [C_AnnXOR] :: forall (n_i7Xa8 :: T) (m_i7Xa9 :: T) (s_i7Xaa :: [T]). ArithOp Xor n_i7Xa8 m_i7Xa9 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xa8 ('(:) m_i7Xa9 s_i7Xaa)) ('(:) (ArithRes Xor n_i7Xa8 m_i7Xa9) s_i7Xaa)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_AnnXOR] :: forall (n_i8iaO :: T) (m_i8iaP :: T) (s_i8iaQ :: [T]). ArithOp Xor n_i8iaO m_i8iaP => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaO ('(:) m_i8iaP s_i8iaQ)) ('(:) (ArithRes Xor n_i8iaO m_i8iaP) s_i8iaQ)
- Morley.Michelson.Typed.ClassifiedInstr: [C_DIG] :: forall (n_i7X85 :: Peano) (inp_i7X7N :: [T]) (out_i7X7O :: [T]) (a_i7X86 :: T). ConstraintDIG n_i7X85 inp_i7X7N out_i7X7O a_i7X86 => PeanoNatural n_i7X85 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_DIG] :: forall (n_i8i8L :: Peano) (inp_i8i8t :: [T]) (out_i8i8u :: [T]) (a_i8i8M :: T). ConstraintDIG n_i8i8L inp_i8i8t out_i8i8u a_i8i8M => PeanoNatural n_i8i8L -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_DIPN] :: forall (n_i7X9l :: Peano) (inp_i7X7N :: [T]) (out_i7X7O :: [T]) (s_i7X9m :: [T]) (s'_i7X9n :: [T]). ConstraintDIPN n_i7X9l inp_i7X7N out_i7X7O s_i7X9m s'_i7X9n => PeanoNatural n_i7X9l -> Instr s_i7X9m s'_i7X9n -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_DIPN] :: forall (n_i8ia1 :: Peano) (inp_i8i8t :: [T]) (out_i8i8u :: [T]) (s_i8ia2 :: [T]) (s'_i8ia3 :: [T]). ConstraintDIPN n_i8ia1 inp_i8i8t out_i8i8u s_i8ia2 s'_i8ia3 => PeanoNatural n_i8ia1 -> Instr s_i8ia2 s'_i8ia3 -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_DIP] :: forall (a_i7X9i :: [T]) (c_i7X9j :: [T]) (b_i7X9k :: T). () => Instr a_i7X9i c_i7X9j -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) b_i7X9k a_i7X9i) ('(:) b_i7X9k c_i7X9j)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_DIP] :: forall (a_i8i9Y :: [T]) (c_i8i9Z :: [T]) (b_i8ia0 :: T). () => Instr a_i8i9Y c_i8i9Z -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) b_i8ia0 a_i8i9Y) ('(:) b_i8ia0 c_i8i9Z)
- Morley.Michelson.Typed.ClassifiedInstr: [C_DROPN] :: forall (n_i7X7X :: Peano) (inp_i7X7N :: [T]). RequireLongerOrSameLength inp_i7X7N n_i7X7X => PeanoNatural n_i7X7X -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i7X7N (Drop n_i7X7X inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_DROPN] :: forall (n_i8i8D :: Peano) (inp_i8i8t :: [T]). RequireLongerOrSameLength inp_i8i8t n_i8i8D => PeanoNatural n_i8i8D -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i8i8t (Drop n_i8i8D inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr: [C_DROP] :: forall (a_i7X7W :: T) (out_i7X7O :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i7X7W out_i7X7O) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_DROP] :: forall (a_i8i8C :: T) (out_i8i8u :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i8i8C out_i8i8u) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_DUG] :: forall (n_i7X87 :: Peano) (inp_i7X7N :: [T]) (out_i7X7O :: [T]) (a_i7X88 :: T). ConstraintDUG n_i7X87 inp_i7X7N out_i7X7O a_i7X88 => PeanoNatural n_i7X87 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_DUG] :: forall (n_i8i8N :: Peano) (inp_i8i8t :: [T]) (out_i8i8u :: [T]) (a_i8i8O :: T). ConstraintDUG n_i8i8N inp_i8i8t out_i8i8u a_i8i8O => PeanoNatural n_i8i8N -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_DocGroup] :: forall (inp_i7X7N :: [T]) (out_i7X7O :: [T]). () => DocGrouping -> Instr inp_i7X7N out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_DocGroup] :: forall (inp_i8i8t :: [T]) (out_i8i8u :: [T]). () => DocGrouping -> Instr inp_i8i8t out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_Ext] :: forall (inp_i7X7N :: [T]). () => ExtInstr inp_i7X7N -> ClassifiedInstr ('InstrClass 'MayHaveChildren 'FailingNormal 'Additional 'DoesNotHaveAnns) inp_i7X7N inp_i7X7N
+ Morley.Michelson.Typed.ClassifiedInstr: [C_Ext] :: forall (inp_i8i8t :: [T]). () => ExtInstr inp_i8i8t -> ClassifiedInstr ('InstrClass 'MayHaveChildren 'FailingNormal 'Additional 'DoesNotHaveAnns) inp_i8i8t inp_i8i8t
- Morley.Michelson.Typed.ClassifiedInstr: [C_FAILWITH] :: forall (a_i7X9o :: T) (s_i7X9p :: [T]) (out_i7X7O :: [T]). (SingI a_i7X9o, ConstantScope a_i7X9o) => ClassifiedInstr ('InstrClass 'NoChildren 'AlwaysFailing 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i7X9o s_i7X9p) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_FAILWITH] :: forall (a_i8ia4 :: T) (s_i8ia5 :: [T]) (out_i8i8u :: [T]). (SingI a_i8ia4, ConstantScope a_i8ia4) => ClassifiedInstr ('InstrClass 'NoChildren 'AlwaysFailing 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i8ia4 s_i8ia5) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_IF] :: forall (s_i7X93 :: [T]) (out_i7X7O :: [T]). () => Instr s_i7X93 out_i7X7O -> Instr s_i7X93 out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TBool s_i7X93) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_IF] :: forall (s_i8i9J :: [T]) (out_i8i8u :: [T]). () => Instr s_i8i9J out_i8i8u -> Instr s_i8i9J out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TBool s_i8i9J) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_IF_CONS] :: forall (a_i7X8B :: T) (s_i7X8C :: [T]) (out_i7X7O :: [T]). () => Instr ('(:) a_i7X8B ('(:) ('TList a_i7X8B) s_i7X8C)) out_i7X7O -> Instr s_i7X8C out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TList a_i7X8B) s_i7X8C) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_IF_CONS] :: forall (a_i8i9h :: T) (s_i8i9i :: [T]) (out_i8i8u :: [T]). () => Instr ('(:) a_i8i9h ('(:) ('TList a_i8i9h) s_i8i9i)) out_i8i8u -> Instr s_i8i9i out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TList a_i8i9h) s_i8i9i) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_IF_LEFT] :: forall (a_i7X8v :: T) (s_i7X8w :: [T]) (out_i7X7O :: [T]) (b_i7X8x :: T). () => Instr ('(:) a_i7X8v s_i7X8w) out_i7X7O -> Instr ('(:) b_i7X8x s_i7X8w) out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOr a_i7X8v b_i7X8x) s_i7X8w) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_IF_LEFT] :: forall (a_i8i9b :: T) (s_i8i9c :: [T]) (out_i8i8u :: [T]) (b_i8i9d :: T). () => Instr ('(:) a_i8i9b s_i8i9c) out_i8i8u -> Instr ('(:) b_i8i9d s_i8i9c) out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOr a_i8i9b b_i8i9d) s_i8i9c) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_IF_NONE] :: forall (s_i7X8d :: [T]) (out_i7X7O :: [T]) (a_i7X8e :: T). () => Instr s_i7X8d out_i7X7O -> Instr ('(:) a_i7X8e s_i7X8d) out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOption a_i7X8e) s_i7X8d) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_IF_NONE] :: forall (s_i8i8T :: [T]) (out_i8i8u :: [T]) (a_i8i8U :: T). () => Instr s_i8i8T out_i8i8u -> Instr ('(:) a_i8i8U s_i8i8T) out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOption a_i8i8U) s_i8i8T) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_ITER] :: forall (c_i7X8N :: T) (out_i7X7O :: [T]). IterOp c_i7X8N => Instr ('(:) (IterOpEl c_i7X8N) out_i7X7O) out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) c_i7X8N out_i7X7O) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_ITER] :: forall (c_i8i9t :: T) (out_i8i8u :: [T]). IterOp c_i8i9t => Instr ('(:) (IterOpEl c_i8i9t) out_i8i8u) out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) c_i8i9t out_i8i8u) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_LOOP] :: forall (out_i7X7O :: [T]). () => Instr out_i7X7O ('(:) 'TBool out_i7X7O) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TBool out_i7X7O) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_LOOP] :: forall (out_i8i8u :: [T]). () => Instr out_i8i8u ('(:) 'TBool out_i8i8u) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TBool out_i8i8u) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_LOOP_LEFT] :: forall (a_i7X94 :: T) (s_i7X95 :: [T]) (b_i7X96 :: T). () => Instr ('(:) a_i7X94 s_i7X95) ('(:) ('TOr a_i7X94 b_i7X96) s_i7X95) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOr a_i7X94 b_i7X96) s_i7X95) ('(:) b_i7X96 s_i7X95)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_LOOP_LEFT] :: forall (a_i8i9K :: T) (s_i8i9L :: [T]) (b_i8i9M :: T). () => Instr ('(:) a_i8i9K s_i8i9L) ('(:) ('TOr a_i8i9K b_i8i9M) s_i8i9L) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOr a_i8i9K b_i8i9M) s_i8i9L) ('(:) b_i8i9M s_i8i9L)
- Morley.Michelson.Typed.ClassifiedInstr: [C_Meta] :: forall (inp_i7X7N :: [T]) (out_i7X7O :: [T]). () => SomeMeta -> Instr inp_i7X7N out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_Meta] :: forall (inp_i8i8t :: [T]) (out_i8i8u :: [T]). () => SomeMeta -> Instr inp_i8i8t out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_NEVER] :: forall (s_i7XaU :: [T]) (out_i7X7O :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'AlwaysFailing 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TNever s_i7XaU) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_NEVER] :: forall (s_i8ibA :: [T]) (out_i8i8u :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'AlwaysFailing 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TNever s_i8ibA) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_Nested] :: forall (inp_i7X7N :: [T]) (out_i7X7O :: [T]). () => Instr inp_i7X7N out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Structural 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_Nested] :: forall (inp_i8i8t :: [T]) (out_i8i8u :: [T]). () => Instr inp_i8i8t out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Structural 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_Nop] :: forall (inp_i7X7N :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'Additional 'DoesNotHaveAnns) inp_i7X7N inp_i7X7N
+ Morley.Michelson.Typed.ClassifiedInstr: [C_Nop] :: forall (inp_i8i8t :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'Additional 'DoesNotHaveAnns) inp_i8i8t inp_i8i8t
- Morley.Michelson.Typed.ClassifiedInstr: [C_SWAP] :: forall (a_i7X82 :: T) (b_i7X83 :: T) (s_i7X84 :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i7X82 ('(:) b_i7X83 s_i7X84)) ('(:) b_i7X83 ('(:) a_i7X82 s_i7X84))
+ Morley.Michelson.Typed.ClassifiedInstr: [C_SWAP] :: forall (a_i8i8I :: T) (b_i8i8J :: T) (s_i8i8K :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i8i8I ('(:) b_i8i8J s_i8i8K)) ('(:) b_i8i8J ('(:) a_i8i8I s_i8i8K))
- Morley.Michelson.Typed.ClassifiedInstr: [C_Seq] :: forall (inp_i7X7N :: [T]) (b_i7X7P :: [T]) (out_i7X7O :: [T]). () => Instr inp_i7X7N b_i7X7P -> Instr b_i7X7P out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'Structural 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_Seq] :: forall (inp_i8i8t :: [T]) (b_i8i8v :: [T]) (out_i8i8u :: [T]). () => Instr inp_i8i8t b_i8i8v -> Instr b_i8i8v out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'Structural 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr: [C_UNPAIRN] :: forall (n_i7X8m :: Peano) (pair_i7X8n :: T) (s_i7X8o :: [T]). ConstraintUnpairN n_i7X8m pair_i7X8n => PeanoNatural n_i7X8m -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) pair_i7X8n s_i7X8o) ((++) (UnpairN n_i7X8m pair_i7X8n) s_i7X8o)
+ Morley.Michelson.Typed.ClassifiedInstr: [C_UNPAIRN] :: forall (n_i8i92 :: Peano) (pair_i8i93 :: T) (s_i8i94 :: [T]). ConstraintUnpairN n_i8i92 pair_i8i93 => PeanoNatural n_i8i92 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) pair_i8i93 s_i8i94) ((++) (UnpairN n_i8i92 pair_i8i93) s_i8i94)
- Morley.Michelson.Typed.ClassifiedInstr: [C_WithLoc] :: forall (inp_i7X7N :: [T]) (out_i7X7O :: [T]). () => ErrorSrcPos -> Instr inp_i7X7N out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr: [C_WithLoc] :: forall (inp_i8i8t :: [T]) (out_i8i8u :: [T]). () => ErrorSrcPos -> Instr inp_i8i8t out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnABS] :: forall (n_i7X9S :: T) (s_i7X9T :: [T]). UnaryArithOp Abs n_i7X9S => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9S s_i7X9T) ('(:) (UnaryArithRes Abs n_i7X9S) s_i7X9T)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnABS] :: forall (n_i8iay :: T) (s_i8iaz :: [T]). UnaryArithOp Abs n_i8iay => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iay s_i8iaz) ('(:) (UnaryArithRes Abs n_i8iay) s_i8iaz)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnADDRESS] :: forall (a_i7XaS :: T) (s_i7XaT :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TContract a_i7XaS) s_i7XaT) ('(:) 'TAddress s_i7XaT)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnADDRESS] :: forall (a_i8iby :: T) (s_i8ibz :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TContract a_i8iby) s_i8ibz) ('(:) 'TAddress s_i8ibz)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnADD] :: forall (n_i7X9F :: T) (m_i7X9G :: T) (s_i7X9H :: [T]). ArithOp Add n_i7X9F m_i7X9G => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9F ('(:) m_i7X9G s_i7X9H)) ('(:) (ArithRes Add n_i7X9F m_i7X9G) s_i7X9H)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnADD] :: forall (n_i8ial :: T) (m_i8iam :: T) (s_i8ian :: [T]). ArithOp Add n_i8ial m_i8iam => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ial ('(:) m_i8iam s_i8ian)) ('(:) (ArithRes Add n_i8ial m_i8iam) s_i8ian)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnAMOUNT] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TMutez inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnAMOUNT] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TMutez inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnAND] :: forall (n_i7Xa5 :: T) (m_i7Xa6 :: T) (s_i7Xa7 :: [T]). ArithOp And n_i7Xa5 m_i7Xa6 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xa5 ('(:) m_i7Xa6 s_i7Xa7)) ('(:) (ArithRes And n_i7Xa5 m_i7Xa6) s_i7Xa7)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnAND] :: forall (n_i8iaL :: T) (m_i8iaM :: T) (s_i8iaN :: [T]). ArithOp And n_i8iaL m_i8iaM => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaL ('(:) m_i8iaM s_i8iaN)) ('(:) (ArithRes And n_i8iaL m_i8iaM) s_i8iaN)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnAPPLY] :: forall (a_i7X9e :: T) (b_i7X9f :: T) (c_i7X9g :: T) (s_i7X9h :: [T]). (ConstantScope a_i7X9e, SingI b_i7X9f) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X9e ('(:) ('TLambda ('TPair a_i7X9e b_i7X9f) c_i7X9g) s_i7X9h)) ('(:) ('TLambda b_i7X9f c_i7X9g) s_i7X9h)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnAPPLY] :: forall (a_i8i9U :: T) (b_i8i9V :: T) (c_i8i9W :: T) (s_i8i9X :: [T]). (ConstantScope a_i8i9U, SingI b_i8i9V) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i9U ('(:) ('TLambda ('TPair a_i8i9U b_i8i9V) c_i8i9W) s_i8i9X)) ('(:) ('TLambda b_i8i9V c_i8i9W) s_i8i9X)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnBALANCE] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TMutez inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnBALANCE] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TMutez inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnBLAKE2B] :: forall (s_i7XaN :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaN) ('(:) 'TBytes s_i7XaN)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnBLAKE2B] :: forall (s_i8ibt :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibt) ('(:) 'TBytes s_i8ibt)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnBYTES] :: forall (n_i7Xat :: T) (s_i7Xau :: [T]). ToBytesArithOp n_i7Xat => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xat s_i7Xau) ('(:) 'TBytes s_i7Xau)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnBYTES] :: forall (n_i8ib9 :: T) (s_i8iba :: [T]). ToBytesArithOp n_i8ib9 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib9 s_i8iba) ('(:) 'TBytes s_i8iba)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCAR] :: forall (a_i7X7Q :: T) (b_i7X7R :: T) (s_i7X7S :: [T]). () => Anns ('(:) VarAnn ('(:) FieldAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i7X7Q b_i7X7R) s_i7X7S) ('(:) a_i7X7Q s_i7X7S)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCAR] :: forall (a_i8i8w :: T) (b_i8i8x :: T) (s_i8i8y :: [T]). () => Anns ('(:) VarAnn ('(:) FieldAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i8i8w b_i8i8x) s_i8i8y) ('(:) a_i8i8w s_i8i8y)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCAST] :: forall (a_i7X9q :: T) (s_i7X9r :: [T]). SingI a_i7X9q => Anns ('(:) VarAnn ('(:) (Notes a_i7X9q) ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X9q s_i7X9r) ('(:) a_i7X9q s_i7X9r)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCAST] :: forall (a_i8ia6 :: T) (s_i8ia7 :: [T]). SingI a_i8ia6 => Anns ('(:) VarAnn ('(:) (Notes a_i8ia6) ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8ia6 s_i8ia7) ('(:) a_i8ia6 s_i8ia7)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCDR] :: forall (a_i7X7T :: T) (b_i7X7U :: T) (s_i7X7V :: [T]). () => Anns ('(:) VarAnn ('(:) FieldAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i7X7T b_i7X7U) s_i7X7V) ('(:) b_i7X7U s_i7X7V)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCDR] :: forall (a_i8i8z :: T) (b_i8i8A :: T) (s_i8i8B :: [T]). () => Anns ('(:) VarAnn ('(:) FieldAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i8i8z b_i8i8A) s_i8i8B) ('(:) b_i8i8A s_i8i8B)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCHAIN_ID] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TChainId inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCHAIN_ID] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TChainId inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCHECK_SIGNATURE] :: forall (s_i7XaK :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKey ('(:) 'TSignature ('(:) 'TBytes s_i7XaK))) ('(:) 'TBool s_i7XaK)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCHECK_SIGNATURE] :: forall (s_i8ibq :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKey ('(:) 'TSignature ('(:) 'TBytes s_i8ibq))) ('(:) 'TBool s_i8ibq)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCOMPARE] :: forall (n_i7Xad :: T) (s_i7Xae :: [T]). (Comparable n_i7Xad, SingI n_i7Xad) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xad ('(:) n_i7Xad s_i7Xae)) ('(:) 'TInt s_i7Xae)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCOMPARE] :: forall (n_i8iaT :: T) (s_i8iaU :: [T]). Comparable n_i8iaT => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaT ('(:) n_i8iaT s_i8iaU)) ('(:) 'TInt s_i8iaU)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCONCAT'] :: forall (c_i7X9A :: T) (s_i7X9B :: [T]). ConcatOp c_i7X9A => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TList c_i7X9A) s_i7X9B) ('(:) c_i7X9A s_i7X9B)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCONCAT'] :: forall (c_i8iag :: T) (s_i8iah :: [T]). ConcatOp c_i8iag => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TList c_i8iag) s_i8iah) ('(:) c_i8iag s_i8iah)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCONCAT] :: forall (c_i7X9y :: T) (s_i7X9z :: [T]). ConcatOp c_i7X9y => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i7X9y ('(:) c_i7X9y s_i7X9z)) ('(:) c_i7X9y s_i7X9z)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCONCAT] :: forall (c_i8iae :: T) (s_i8iaf :: [T]). ConcatOp c_i8iae => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i8iae ('(:) c_i8iae s_i8iaf)) ('(:) c_i8iae s_i8iaf)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCONS] :: forall (a_i7X8z :: T) (s_i7X8A :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X8z ('(:) ('TList a_i7X8z) s_i7X8A)) ('(:) ('TList a_i7X8z) s_i7X8A)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCONS] :: forall (a_i8i9f :: T) (s_i8i9g :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i9f ('(:) ('TList a_i8i9f) s_i8i9g)) ('(:) ('TList a_i8i9f) s_i8i9g)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCONTRACT] :: forall (p_i7XaA :: T) (s_i7XaB :: [T]). ParameterScope p_i7XaA => Anns ('(:) VarAnn ('(:) (Notes p_i7XaA) ('[] :: [Type]))) -> EpName -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TAddress s_i7XaB) ('(:) ('TOption ('TContract p_i7XaA)) s_i7XaB)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCONTRACT] :: forall (p_i8ibg :: T) (s_i8ibh :: [T]). ParameterScope p_i8ibg => Anns ('(:) VarAnn ('(:) (Notes p_i8ibg) ('[] :: [Type]))) -> EpName -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TAddress s_i8ibh) ('(:) ('TOption ('TContract p_i8ibg)) s_i8ibh)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCREATE_CONTRACT] :: forall (p_i7XaF :: T) (g_i7XaG :: T) (s_i7XaH :: [T]). (ParameterScope p_i7XaF, StorageScope g_i7XaG, IsNotInView) => Anns ('(:) VarAnn ('(:) VarAnn ('[] :: [Type]))) -> Contract' Instr p_i7XaF g_i7XaG -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TOption 'TKeyHash) ('(:) 'TMutez ('(:) g_i7XaG s_i7XaH))) ('(:) 'TOperation ('(:) 'TAddress s_i7XaH))
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnCREATE_CONTRACT] :: forall (p_i8ibl :: T) (g_i8ibm :: T) (s_i8ibn :: [T]). (ParameterScope p_i8ibl, StorageScope g_i8ibm, IsNotInView) => Anns ('(:) VarAnn ('(:) VarAnn ('[] :: [Type]))) -> Contract' Instr p_i8ibl g_i8ibm -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TOption 'TKeyHash) ('(:) 'TMutez ('(:) g_i8ibm s_i8ibn))) ('(:) 'TOperation ('(:) 'TAddress s_i8ibn))
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnDUPN] :: forall (n_i7X80 :: Peano) (inp_i7X7N :: [T]) (out_i7X7O :: [T]) (a_i7X81 :: T). (ConstraintDUPN n_i7X80 inp_i7X7N out_i7X7O a_i7X81, DupableScope a_i7X81) => AnnVar -> PeanoNatural n_i7X80 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnDUPN] :: forall (n_i8i8G :: Peano) (inp_i8i8t :: [T]) (out_i8i8u :: [T]) (a_i8i8H :: T). (ConstraintDUPN n_i8i8G inp_i8i8t out_i8i8u a_i8i8H, DupableScope a_i8i8H) => AnnVar -> PeanoNatural n_i8i8G -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnDUP] :: forall (a_i7X7Y :: T) (s_i7X7Z :: [T]). DupableScope a_i7X7Y => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X7Y s_i7X7Z) ('(:) a_i7X7Y ('(:) a_i7X7Y s_i7X7Z))
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnDUP] :: forall (a_i8i8E :: T) (s_i8i8F :: [T]). DupableScope a_i8i8E => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i8E s_i8i8F) ('(:) a_i8i8E ('(:) a_i8i8E s_i8i8F))
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEDIV] :: forall (n_i7X9P :: T) (m_i7X9Q :: T) (s_i7X9R :: [T]). ArithOp EDiv n_i7X9P m_i7X9Q => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9P ('(:) m_i7X9Q s_i7X9R)) ('(:) (ArithRes EDiv n_i7X9P m_i7X9Q) s_i7X9R)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEDIV] :: forall (n_i8iav :: T) (m_i8iaw :: T) (s_i8iax :: [T]). ArithOp EDiv n_i8iav m_i8iaw => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iav ('(:) m_i8iaw s_i8iax)) ('(:) (ArithRes EDiv n_i8iav m_i8iaw) s_i8iax)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEMIT] :: forall (t_i7Xb9 :: T) (s_i7Xba :: [T]). PackedValScope t_i7Xb9 => AnnVar -> FieldAnn -> Maybe (Notes t_i7Xb9) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveNonStandardAnns) ('(:) t_i7Xb9 s_i7Xba) ('(:) 'TOperation s_i7Xba)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEMIT] :: forall (t_i8ibP :: T) (s_i8ibQ :: [T]). PackedValScope t_i8ibP => AnnVar -> FieldAnn -> Maybe (Notes t_i8ibP) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveNonStandardAnns) ('(:) t_i8ibP s_i8ibQ) ('(:) 'TOperation s_i8ibQ)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEMPTY_BIG_MAP] :: forall (a_i7X8I :: T) (b_i7X8J :: T) (inp_i7X7N :: [T]). (SingI a_i7X8I, SingI b_i7X8J, Comparable a_i7X8I, HasNoBigMap b_i7X8J) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i7X8I) ('(:) (Notes b_i7X8J) ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TBigMap a_i7X8I b_i7X8J) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEMPTY_BIG_MAP] :: forall (b_i8i9o :: T) (a_i8i9p :: T) (inp_i8i8t :: [T]). (SingI b_i8i9o, Comparable a_i8i9p, ForbidBigMap b_i8i9o) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i8i9p) ('(:) (Notes b_i8i9o) ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TBigMap a_i8i9p b_i8i9o) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEMPTY_MAP] :: forall (a_i7X8G :: T) (b_i7X8H :: T) (inp_i7X7N :: [T]). (SingI a_i7X8G, SingI b_i7X8H, Comparable a_i7X8G) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i7X8G) ('(:) (Notes b_i7X8H) ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TMap a_i7X8G b_i7X8H) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEMPTY_MAP] :: forall (b_i8i9m :: T) (a_i8i9n :: T) (inp_i8i8t :: [T]). (SingI b_i8i9m, Comparable a_i8i9n) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i8i9n) ('(:) (Notes b_i8i9m) ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TMap a_i8i9n b_i8i9m) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEMPTY_SET] :: forall (e_i7X8F :: T) (inp_i7X7N :: [T]). (SingI e_i7X8F, Comparable e_i7X8F) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes e_i7X8F) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TSet e_i7X8F) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEMPTY_SET] :: forall (e_i8i9l :: T) (inp_i8i8t :: [T]). Comparable e_i8i9l => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes e_i8i9l) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TSet e_i8i9l) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEQ] :: forall (n_i7Xaf :: T) (s_i7Xag :: [T]). UnaryArithOp Eq' n_i7Xaf => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xaf s_i7Xag) ('(:) (UnaryArithRes Eq' n_i7Xaf) s_i7Xag)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEQ] :: forall (n_i8iaV :: T) (s_i8iaW :: [T]). UnaryArithOp Eq' n_i8iaV => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaV s_i8iaW) ('(:) (UnaryArithRes Eq' n_i8iaV) s_i8iaW)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEXEC] :: forall (t1_i7X9b :: T) (t2_i7X9c :: T) (s_i7X9d :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) t1_i7X9b ('(:) ('TLambda t1_i7X9b t2_i7X9c) s_i7X9d)) ('(:) t2_i7X9c s_i7X9d)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnEXEC] :: forall (t1_i8i9R :: T) (t2_i8i9S :: T) (s_i8i9T :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) t1_i8i9R ('(:) ('TLambda t1_i8i9R t2_i8i9S) s_i8i9T)) ('(:) t2_i8i9S s_i8i9T)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGETN] :: forall (ix_i7X8S :: Peano) (pair_i7X8T :: T) (s_i7X8U :: [T]). ConstraintGetN ix_i7X8S pair_i7X8T => AnnVar -> PeanoNatural ix_i7X8S -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) pair_i7X8T s_i7X8U) ('(:) (GetN ix_i7X8S pair_i7X8T) s_i7X8U)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGETN] :: forall (ix_i8i9y :: Peano) (pair_i8i9z :: T) (s_i8i9A :: [T]). ConstraintGetN ix_i8i9y pair_i8i9z => AnnVar -> PeanoNatural ix_i8i9y -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) pair_i8i9z s_i8i9A) ('(:) (GetN ix_i8i9y pair_i8i9z) s_i8i9A)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGET] :: forall (c_i7X8Q :: T) (s_i7X8R :: [T]). (GetOp c_i7X8Q, SingI (GetOpVal c_i7X8Q)) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (GetOpKey c_i7X8Q) ('(:) c_i7X8Q s_i7X8R)) ('(:) ('TOption (GetOpVal c_i7X8Q)) s_i7X8R)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGET] :: forall (c_i8i9w :: T) (s_i8i9x :: [T]). (GetOp c_i8i9w, SingI (GetOpVal c_i8i9w)) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (GetOpKey c_i8i9w) ('(:) c_i8i9w s_i8i9x)) ('(:) ('TOption (GetOpVal c_i8i9w)) s_i8i9x)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGET_AND_UPDATE] :: forall (c_i7X91 :: T) (s_i7X92 :: [T]). (GetOp c_i7X91, UpdOp c_i7X91, SingI (GetOpVal c_i7X91), (~) (UpdOpKey c_i7X91) (GetOpKey c_i7X91)) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (UpdOpKey c_i7X91) ('(:) (UpdOpParams c_i7X91) ('(:) c_i7X91 s_i7X92))) ('(:) ('TOption (GetOpVal c_i7X91)) ('(:) c_i7X91 s_i7X92))
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGET_AND_UPDATE] :: forall (c_i8i9H :: T) (s_i8i9I :: [T]). (GetOp c_i8i9H, UpdOp c_i8i9H, SingI (GetOpVal c_i8i9H), (~) (UpdOpKey c_i8i9H) (GetOpKey c_i8i9H)) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (UpdOpKey c_i8i9H) ('(:) (UpdOpParams c_i8i9H) ('(:) c_i8i9H s_i8i9I))) ('(:) ('TOption (GetOpVal c_i8i9H)) ('(:) c_i8i9H s_i8i9I))
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGE] :: forall (n_i7Xap :: T) (s_i7Xaq :: [T]). UnaryArithOp Ge n_i7Xap => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xap s_i7Xaq) ('(:) (UnaryArithRes Ge n_i7Xap) s_i7Xaq)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGE] :: forall (n_i8ib5 :: T) (s_i8ib6 :: [T]). UnaryArithOp Ge n_i8ib5 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib5 s_i8ib6) ('(:) (UnaryArithRes Ge n_i8ib5) s_i8ib6)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGT] :: forall (n_i7Xal :: T) (s_i7Xam :: [T]). UnaryArithOp Gt n_i7Xal => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xal s_i7Xam) ('(:) (UnaryArithRes Gt n_i7Xal) s_i7Xam)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnGT] :: forall (n_i8ib1 :: T) (s_i8ib2 :: [T]). UnaryArithOp Gt n_i8ib1 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib1 s_i8ib2) ('(:) (UnaryArithRes Gt n_i8ib1) s_i8ib2)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnHASH_KEY] :: forall (s_i7XaQ :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKey s_i7XaQ) ('(:) 'TKeyHash s_i7XaQ)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnHASH_KEY] :: forall (s_i8ibw :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKey s_i8ibw) ('(:) 'TKeyHash s_i8ibw)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnIMPLICIT_ACCOUNT] :: forall (s_i7XaI :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKeyHash s_i7XaI) ('(:) ('TContract 'TUnit) s_i7XaI)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnIMPLICIT_ACCOUNT] :: forall (s_i8ibo :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKeyHash s_i8ibo) ('(:) ('TContract 'TUnit) s_i8ibo)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnINT] :: forall (n_i7Xar :: T) (s_i7Xas :: [T]). ToIntArithOp n_i7Xar => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xar s_i7Xas) ('(:) 'TInt s_i7Xas)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnINT] :: forall (n_i8ib7 :: T) (s_i8ib8 :: [T]). ToIntArithOp n_i8ib7 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib7 s_i8ib8) ('(:) 'TInt s_i8ib8)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnISNAT] :: forall (s_i7X9E :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TInt s_i7X9E) ('(:) ('TOption 'TNat) s_i7X9E)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnISNAT] :: forall (s_i8iak :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TInt s_i8iak) ('(:) ('TOption 'TNat) s_i8iak)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnJOIN_TICKETS] :: forall (a_i7Xb3 :: T) (s_i7Xb4 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair ('TTicket a_i7Xb3) ('TTicket a_i7Xb3)) s_i7Xb4) ('(:) ('TOption ('TTicket a_i7Xb3)) s_i7Xb4)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnJOIN_TICKETS] :: forall (a_i8ibJ :: T) (s_i8ibK :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair ('TTicket a_i8ibJ) ('TTicket a_i8ibJ)) s_i8ibK) ('(:) ('TOption ('TTicket a_i8ibJ)) s_i8ibK)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnKECCAK] :: forall (s_i7XaP :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaP) ('(:) 'TBytes s_i7XaP)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnKECCAK] :: forall (s_i8ibv :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibv) ('(:) 'TBytes s_i8ibv)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLAMBDA] :: forall (i_i7X97 :: T) (o_i7X98 :: T) (inp_i7X7N :: [T]). (SingI i_i7X97, SingI o_i7X98) => Anns ('(:) VarAnn ('(:) (Notes i_i7X97) ('(:) (Notes o_i7X98) ('[] :: [Type])))) -> RemFail Instr ('(:) i_i7X97 ('[] :: [T])) ('(:) o_i7X98 ('[] :: [T])) -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TLambda i_i7X97 o_i7X98) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLAMBDA] :: forall (i_i8i9N :: T) (o_i8i9O :: T) (inp_i8i8t :: [T]). (SingI i_i8i9N, SingI o_i8i9O) => Anns ('(:) VarAnn ('(:) (Notes i_i8i9N) ('(:) (Notes o_i8i9O) ('[] :: [Type])))) -> RemFail Instr ('(:) i_i8i9N ('[] :: [T])) ('(:) o_i8i9O ('[] :: [T])) -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TLambda i_i8i9N o_i8i9O) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLAMBDA_REC] :: forall (i_i7X99 :: T) (o_i7X9a :: T) (inp_i7X7N :: [T]). (SingI i_i7X99, SingI o_i7X9a) => Anns ('(:) VarAnn ('(:) (Notes i_i7X99) ('(:) (Notes o_i7X9a) ('[] :: [Type])))) -> RemFail Instr ('(:) i_i7X99 ('(:) ('TLambda i_i7X99 o_i7X9a) ('[] :: [T]))) ('(:) o_i7X9a ('[] :: [T])) -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TLambda i_i7X99 o_i7X9a) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLAMBDA_REC] :: forall (i_i8i9P :: T) (o_i8i9Q :: T) (inp_i8i8t :: [T]). (SingI i_i8i9P, SingI o_i8i9Q) => Anns ('(:) VarAnn ('(:) (Notes i_i8i9P) ('(:) (Notes o_i8i9Q) ('[] :: [Type])))) -> RemFail Instr ('(:) i_i8i9P ('(:) ('TLambda i_i8i9P o_i8i9Q) ('[] :: [T]))) ('(:) o_i8i9Q ('[] :: [T])) -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TLambda i_i8i9P o_i8i9Q) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLEFT] :: forall (b_i7X8p :: T) (a_i7X8q :: T) (s_i7X8r :: [T]). SingI b_i7X8p => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('(:) (Notes b_i7X8p) ('[] :: [Type])))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X8q s_i7X8r) ('(:) ('TOr a_i7X8q b_i7X8p) s_i7X8r)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLEFT] :: forall (b_i8i95 :: T) (a_i8i96 :: T) (s_i8i97 :: [T]). SingI b_i8i95 => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('(:) (Notes b_i8i95) ('[] :: [Type])))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i96 s_i8i97) ('(:) ('TOr a_i8i96 b_i8i95) s_i8i97)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLEVEL] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TNat inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLEVEL] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TNat inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLE] :: forall (n_i7Xan :: T) (s_i7Xao :: [T]). UnaryArithOp Le n_i7Xan => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xan s_i7Xao) ('(:) (UnaryArithRes Le n_i7Xan) s_i7Xao)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLE] :: forall (n_i8ib3 :: T) (s_i8ib4 :: [T]). UnaryArithOp Le n_i8ib3 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ib3 s_i8ib4) ('(:) (UnaryArithRes Le n_i8ib3) s_i8ib4)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLSL] :: forall (n_i7X9W :: T) (m_i7X9X :: T) (s_i7X9Y :: [T]). ArithOp Lsl n_i7X9W m_i7X9X => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9W ('(:) m_i7X9X s_i7X9Y)) ('(:) (ArithRes Lsl n_i7X9W m_i7X9X) s_i7X9Y)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLSL] :: forall (n_i8iaC :: T) (m_i8iaD :: T) (s_i8iaE :: [T]). ArithOp Lsl n_i8iaC m_i8iaD => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaC ('(:) m_i8iaD s_i8iaE)) ('(:) (ArithRes Lsl n_i8iaC m_i8iaD) s_i8iaE)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLSR] :: forall (n_i7X9Z :: T) (m_i7Xa0 :: T) (s_i7Xa1 :: [T]). ArithOp Lsr n_i7X9Z m_i7Xa0 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9Z ('(:) m_i7Xa0 s_i7Xa1)) ('(:) (ArithRes Lsr n_i7X9Z m_i7Xa0) s_i7Xa1)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLSR] :: forall (n_i8iaF :: T) (m_i8iaG :: T) (s_i8iaH :: [T]). ArithOp Lsr n_i8iaF m_i8iaG => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaF ('(:) m_i8iaG s_i8iaH)) ('(:) (ArithRes Lsr n_i8iaF m_i8iaG) s_i8iaH)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLT] :: forall (n_i7Xaj :: T) (s_i7Xak :: [T]). UnaryArithOp Lt n_i7Xaj => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xaj s_i7Xak) ('(:) (UnaryArithRes Lt n_i7Xaj) s_i7Xak)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnLT] :: forall (n_i8iaZ :: T) (s_i8ib0 :: [T]). UnaryArithOp Lt n_i8iaZ => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaZ s_i8ib0) ('(:) (UnaryArithRes Lt n_i8iaZ) s_i8ib0)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnMAP] :: forall (c_i7X8K :: T) (b_i7X8L :: T) (s_i7X8M :: [T]). (MapOp c_i7X8K, SingI b_i7X8L) => AnnVar -> Instr ('(:) (MapOpInp c_i7X8K) s_i7X8M) ('(:) b_i7X8L s_i7X8M) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i7X8K s_i7X8M) ('(:) (MapOpRes c_i7X8K b_i7X8L) s_i7X8M)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnMAP] :: forall (c_i8i9q :: T) (b_i8i9r :: T) (s_i8i9s :: [T]). (MapOp c_i8i9q, SingI b_i8i9r) => AnnVar -> Instr ('(:) (MapOpInp c_i8i9q) s_i8i9s) ('(:) b_i8i9r s_i8i9s) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i8i9q s_i8i9s) ('(:) (MapOpRes c_i8i9q b_i8i9r) s_i8i9s)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnMEM] :: forall (c_i7X8O :: T) (s_i7X8P :: [T]). MemOp c_i7X8O => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (MemOpKey c_i7X8O) ('(:) c_i7X8O s_i7X8P)) ('(:) 'TBool s_i7X8P)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnMEM] :: forall (c_i8i9u :: T) (s_i8i9v :: [T]). MemOp c_i8i9u => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (MemOpKey c_i8i9u) ('(:) c_i8i9u s_i8i9v)) ('(:) 'TBool s_i8i9v)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnMIN_BLOCK_TIME] :: forall (inp_i7X7N :: [T]). () => [AnyAnn] -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveNonStandardAnns) inp_i7X7N ('(:) 'TNat inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnMIN_BLOCK_TIME] :: forall (inp_i8i8t :: [T]). () => [AnyAnn] -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveNonStandardAnns) inp_i8i8t ('(:) 'TNat inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnMUL] :: forall (n_i7X9M :: T) (m_i7X9N :: T) (s_i7X9O :: [T]). ArithOp Mul n_i7X9M m_i7X9N => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9M ('(:) m_i7X9N s_i7X9O)) ('(:) (ArithRes Mul n_i7X9M m_i7X9N) s_i7X9O)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnMUL] :: forall (n_i8ias :: T) (m_i8iat :: T) (s_i8iau :: [T]). ArithOp Mul n_i8ias m_i8iat => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8ias ('(:) m_i8iat s_i8iau)) ('(:) (ArithRes Mul n_i8ias m_i8iat) s_i8iau)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNAT] :: forall (s_i7Xav :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7Xav) ('(:) 'TNat s_i7Xav)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNAT] :: forall (s_i8ibb :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibb) ('(:) 'TNat s_i8ibb)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNEG] :: forall (n_i7X9U :: T) (s_i7X9V :: [T]). UnaryArithOp Neg n_i7X9U => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9U s_i7X9V) ('(:) (UnaryArithRes Neg n_i7X9U) s_i7X9V)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNEG] :: forall (n_i8iaA :: T) (s_i8iaB :: [T]). UnaryArithOp Neg n_i8iaA => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaA s_i8iaB) ('(:) (UnaryArithRes Neg n_i8iaA) s_i8iaB)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNEQ] :: forall (n_i7Xah :: T) (s_i7Xai :: [T]). UnaryArithOp Neq n_i7Xah => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xah s_i7Xai) ('(:) (UnaryArithRes Neq n_i7Xah) s_i7Xai)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNEQ] :: forall (n_i8iaX :: T) (s_i8iaY :: [T]). UnaryArithOp Neq n_i8iaX => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaX s_i8iaY) ('(:) (UnaryArithRes Neq n_i8iaX) s_i8iaY)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNIL] :: forall (p_i7X8y :: T) (inp_i7X7N :: [T]). SingI p_i7X8y => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes p_i7X8y) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TList p_i7X8y) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNIL] :: forall (p_i8i9e :: T) (inp_i8i8t :: [T]). SingI p_i8i9e => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes p_i8i9e) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TList p_i8i9e) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNONE] :: forall (a_i7X8c :: T) (inp_i7X7N :: [T]). SingI a_i7X8c => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i7X8c) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TOption a_i7X8c) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNONE] :: forall (a_i8i8S :: T) (inp_i8i8t :: [T]). SingI a_i8i8S => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i8i8S) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TOption a_i8i8S) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNOT] :: forall (n_i7Xab :: T) (s_i7Xac :: [T]). (SingI n_i7Xab, UnaryArithOp Not n_i7Xab) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xab s_i7Xac) ('(:) (UnaryArithRes Not n_i7Xab) s_i7Xac)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNOT] :: forall (n_i8iaR :: T) (s_i8iaS :: [T]). (SingI n_i8iaR, UnaryArithOp Not n_i8iaR) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaR s_i8iaS) ('(:) (UnaryArithRes Not n_i8iaR) s_i8iaS)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNOW] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TTimestamp inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnNOW] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TTimestamp inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnOPEN_CHEST] :: forall (s_i7Xb5 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TChestKey ('(:) 'TChest ('(:) 'TNat s_i7Xb5))) ('(:) ('TOr 'TBytes 'TBool) s_i7Xb5)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnOPEN_CHEST] :: forall (s_i8ibL :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TChestKey ('(:) 'TChest ('(:) 'TNat s_i8ibL))) ('(:) ('TOr 'TBytes 'TBool) s_i8ibL)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnOR] :: forall (n_i7Xa2 :: T) (m_i7Xa3 :: T) (s_i7Xa4 :: [T]). ArithOp Or n_i7Xa2 m_i7Xa3 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xa2 ('(:) m_i7Xa3 s_i7Xa4)) ('(:) (ArithRes Or n_i7Xa2 m_i7Xa3) s_i7Xa4)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnOR] :: forall (n_i8iaI :: T) (m_i8iaJ :: T) (s_i8iaK :: [T]). ArithOp Or n_i8iaI m_i8iaJ => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaI ('(:) m_i8iaJ s_i8iaK)) ('(:) (ArithRes Or n_i8iaI m_i8iaJ) s_i8iaK)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPACK] :: forall (a_i7X9u :: T) (s_i7X9v :: [T]). PackedValScope a_i7X9u => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X9u s_i7X9v) ('(:) 'TBytes s_i7X9v)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPACK] :: forall (a_i8iaa :: T) (s_i8iab :: [T]). PackedValScope a_i8iaa => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8iaa s_i8iab) ('(:) 'TBytes s_i8iab)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPAIRING_CHECK] :: forall (s_i7XaR :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TList ('TPair 'TBls12381G1 'TBls12381G2)) s_i7XaR) ('(:) 'TBool s_i7XaR)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPAIRING_CHECK] :: forall (s_i8ibx :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TList ('TPair 'TBls12381G1 'TBls12381G2)) s_i8ibx) ('(:) 'TBool s_i8ibx)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPAIRN] :: forall (n_i7X8l :: Peano) (inp_i7X7N :: [T]). ConstraintPairN n_i7X8l inp_i7X7N => AnnVar -> PeanoNatural n_i7X8l -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) (RightComb (LazyTake n_i7X8l inp_i7X7N)) (Drop n_i7X8l inp_i7X7N))
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPAIRN] :: forall (n_i8i91 :: Peano) (inp_i8i8t :: [T]). ConstraintPairN n_i8i91 inp_i8i8t => AnnVar -> PeanoNatural n_i8i91 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) (RightComb (LazyTake n_i8i91 inp_i8i8t)) (Drop n_i8i91 inp_i8i8t))
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPAIR] :: forall (a_i7X8f :: T) (b_i7X8g :: T) (s_i7X8h :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X8f ('(:) b_i7X8g s_i7X8h)) ('(:) ('TPair a_i7X8f b_i7X8g) s_i7X8h)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPAIR] :: forall (a_i8i8V :: T) (b_i8i8W :: T) (s_i8i8X :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i8V ('(:) b_i8i8W s_i8i8X)) ('(:) ('TPair a_i8i8V b_i8i8W) s_i8i8X)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPUSH] :: forall (t_i7X89 :: T) (inp_i7X7N :: [T]). ConstantScope t_i7X89 => Anns ('(:) VarAnn ('(:) (Notes t_i7X89) ('[] :: [Type]))) -> Value' Instr t_i7X89 -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) t_i7X89 inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnPUSH] :: forall (t_i8i8P :: T) (inp_i8i8t :: [T]). ConstantScope t_i8i8P => Anns ('(:) VarAnn ('(:) (Notes t_i8i8P) ('[] :: [Type]))) -> Value' Instr t_i8i8P -> ClassifiedInstr ('InstrClass 'HasIndirectChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) t_i8i8P inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnREAD_TICKET] :: forall (a_i7XaZ :: T) (s_i7Xb0 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TTicket a_i7XaZ) s_i7Xb0) ('(:) (RightComb ('(:) 'TAddress ('(:) a_i7XaZ ('(:) 'TNat ('[] :: [T]))))) ('(:) ('TTicket a_i7XaZ) s_i7Xb0))
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnREAD_TICKET] :: forall (a_i8ibF :: T) (s_i8ibG :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TTicket a_i8ibF) s_i8ibG) ('(:) (RightComb ('(:) 'TAddress ('(:) a_i8ibF ('(:) 'TNat ('[] :: [T]))))) ('(:) ('TTicket a_i8ibF) s_i8ibG))
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnRENAME] :: forall (a_i7X9s :: T) (s_i7X9t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X9s s_i7X9t) ('(:) a_i7X9s s_i7X9t)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnRENAME] :: forall (a_i8ia8 :: T) (s_i8ia9 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8ia8 s_i8ia9) ('(:) a_i8ia8 s_i8ia9)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnRIGHT] :: forall (a_i7X8s :: T) (b_i7X8t :: T) (s_i7X8u :: [T]). SingI a_i7X8s => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('(:) (Notes a_i7X8s) ('[] :: [Type])))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) b_i7X8t s_i7X8u) ('(:) ('TOr a_i7X8s b_i7X8t) s_i7X8u)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnRIGHT] :: forall (a_i8i98 :: T) (b_i8i99 :: T) (s_i8i9a :: [T]). SingI a_i8i98 => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('(:) (Notes a_i8i98) ('[] :: [Type])))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) b_i8i99 s_i8i9a) ('(:) ('TOr a_i8i98 b_i8i99) s_i8i9a)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSAPLING_EMPTY_STATE] :: forall (n_i7Xb6 :: Peano) (inp_i7X7N :: [T]). () => AnnVar -> Sing n_i7Xb6 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TSaplingState n_i7Xb6) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSAPLING_EMPTY_STATE] :: forall (n_i8ibM :: Peano) (inp_i8i8t :: [T]). () => AnnVar -> Sing n_i8ibM -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TSaplingState n_i8ibM) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSAPLING_VERIFY_UPDATE] :: forall (n_i7Xb7 :: Peano) (s_i7Xb8 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TSaplingTransaction n_i7Xb7) ('(:) ('TSaplingState n_i7Xb7) s_i7Xb8)) ('(:) ('TOption ('TPair 'TBytes ('TPair 'TInt ('TSaplingState n_i7Xb7)))) s_i7Xb8)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSAPLING_VERIFY_UPDATE] :: forall (n_i8ibN :: Peano) (s_i8ibO :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TSaplingTransaction n_i8ibN) ('(:) ('TSaplingState n_i8ibN) s_i8ibO)) ('(:) ('TOption ('TPair 'TBytes ('TPair 'TInt ('TSaplingState n_i8ibN)))) s_i8ibO)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSELF] :: forall (arg_i7Xaz :: T) (inp_i7X7N :: [T]). (ParameterScope arg_i7Xaz, IsNotInView) => AnnVar -> SomeEntrypointCallT arg_i7Xaz -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) ('TContract arg_i7Xaz) inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSELF] :: forall (arg_i8ibf :: T) (inp_i8i8t :: [T]). (ParameterScope arg_i8ibf, IsNotInView) => AnnVar -> SomeEntrypointCallT arg_i8ibf -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) ('TContract arg_i8ibf) inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSELF_ADDRESS] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TAddress inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSELF_ADDRESS] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TAddress inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSENDER] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TAddress inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSENDER] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TAddress inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSET_DELEGATE] :: forall (s_i7XaE :: [T]). IsNotInView => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TOption 'TKeyHash) s_i7XaE) ('(:) 'TOperation s_i7XaE)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSET_DELEGATE] :: forall (s_i8ibk :: [T]). IsNotInView => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TOption 'TKeyHash) s_i8ibk) ('(:) 'TOperation s_i8ibk)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSHA256] :: forall (s_i7XaL :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaL) ('(:) 'TBytes s_i7XaL)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSHA256] :: forall (s_i8ibr :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibr) ('(:) 'TBytes s_i8ibr)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSHA3] :: forall (s_i7XaO :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaO) ('(:) 'TBytes s_i7XaO)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSHA3] :: forall (s_i8ibu :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibu) ('(:) 'TBytes s_i8ibu)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSHA512] :: forall (s_i7XaM :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7XaM) ('(:) 'TBytes s_i7XaM)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSHA512] :: forall (s_i8ibs :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8ibs) ('(:) 'TBytes s_i8ibs)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSIZE] :: forall (c_i7X8D :: T) (s_i7X8E :: [T]). SizeOp c_i7X8D => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i7X8D s_i7X8E) ('(:) 'TNat s_i7X8E)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSIZE] :: forall (c_i8i9j :: T) (s_i8i9k :: [T]). SizeOp c_i8i9j => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) c_i8i9j s_i8i9k) ('(:) 'TNat s_i8i9k)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSLICE] :: forall (c_i7X9C :: T) (s_i7X9D :: [T]). (SliceOp c_i7X9C, SingI c_i7X9C) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TNat ('(:) 'TNat ('(:) c_i7X9C s_i7X9D))) ('(:) ('TOption c_i7X9C) s_i7X9D)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSLICE] :: forall (c_i8iai :: T) (s_i8iaj :: [T]). (SliceOp c_i8iai, SingI c_i8iai) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TNat ('(:) 'TNat ('(:) c_i8iai s_i8iaj))) ('(:) ('TOption c_i8iai) s_i8iaj)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSOME] :: forall (a_i7X8a :: T) (s_i7X8b :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7X8a s_i7X8b) ('(:) ('TOption a_i7X8a) s_i7X8b)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSOME] :: forall (a_i8i8Q :: T) (s_i8i8R :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8i8Q s_i8i8R) ('(:) ('TOption a_i8i8Q) s_i8i8R)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSOURCE] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TAddress inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSOURCE] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TAddress inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSPLIT_TICKET] :: forall (a_i7Xb1 :: T) (s_i7Xb2 :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TTicket a_i7Xb1) ('(:) ('TPair 'TNat 'TNat) s_i7Xb2)) ('(:) ('TOption ('TPair ('TTicket a_i7Xb1) ('TTicket a_i7Xb1))) s_i7Xb2)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSPLIT_TICKET] :: forall (a_i8ibH :: T) (s_i8ibI :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TTicket a_i8ibH) ('(:) ('TPair 'TNat 'TNat) s_i8ibI)) ('(:) ('TOption ('TPair ('TTicket a_i8ibH) ('TTicket a_i8ibH))) s_i8ibI)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSUB] :: forall (n_i7X9I :: T) (m_i7X9J :: T) (s_i7X9K :: [T]). ArithOp Sub n_i7X9I m_i7X9J => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7X9I ('(:) m_i7X9J s_i7X9K)) ('(:) (ArithRes Sub n_i7X9I m_i7X9J) s_i7X9K)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSUB] :: forall (n_i8iao :: T) (m_i8iap :: T) (s_i8iaq :: [T]). ArithOp Sub n_i8iao m_i8iap => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iao ('(:) m_i8iap s_i8iaq)) ('(:) (ArithRes Sub n_i8iao m_i8iap) s_i8iaq)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSUB_MUTEZ] :: forall (s_i7X9L :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TMutez ('(:) 'TMutez s_i7X9L)) ('(:) ('TOption 'TMutez) s_i7X9L)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnSUB_MUTEZ] :: forall (s_i8iar :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TMutez ('(:) 'TMutez s_i8iar)) ('(:) ('TOption 'TMutez) s_i8iar)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnTICKET] :: forall (a_i7XaX :: T) (s_i7XaY :: [T]). Comparable a_i7XaX => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7XaX ('(:) 'TNat s_i7XaY)) ('(:) ('TOption ('TTicket a_i7XaX)) s_i7XaY)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnTICKET] :: forall (a_i8ibD :: T) (s_i8ibE :: [T]). Comparable a_i8ibD => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8ibD ('(:) 'TNat s_i8ibE)) ('(:) ('TOption ('TTicket a_i8ibD)) s_i8ibE)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnTICKET_DEPRECATED] :: forall (a_i7XaV :: T) (s_i7XaW :: [T]). Comparable a_i7XaV => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i7XaV ('(:) 'TNat s_i7XaW)) ('(:) ('TTicket a_i7XaV) s_i7XaW)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnTICKET_DEPRECATED] :: forall (a_i8ibB :: T) (s_i8ibC :: [T]). Comparable a_i8ibB => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) a_i8ibB ('(:) 'TNat s_i8ibC)) ('(:) ('TTicket a_i8ibB) s_i8ibC)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnTOTAL_VOTING_POWER] :: forall (inp_i7X7N :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TNat inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnTOTAL_VOTING_POWER] :: forall (inp_i8i8t :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TNat inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnTRANSFER_TOKENS] :: forall (p_i7XaC :: T) (s_i7XaD :: [T]). (ParameterScope p_i7XaC, IsNotInView) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) p_i7XaC ('(:) 'TMutez ('(:) ('TContract p_i7XaC) s_i7XaD))) ('(:) 'TOperation s_i7XaD)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnTRANSFER_TOKENS] :: forall (p_i8ibi :: T) (s_i8ibj :: [T]). (ParameterScope p_i8ibi, IsNotInView) => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) p_i8ibi ('(:) 'TMutez ('(:) ('TContract p_i8ibi) s_i8ibj))) ('(:) 'TOperation s_i8ibj)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUNIT] :: forall (inp_i7X7N :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i7X7N ('(:) 'TUnit inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUNIT] :: forall (inp_i8i8t :: [T]). () => Anns ('(:) TypeAnn ('(:) VarAnn ('[] :: [Type]))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) inp_i8i8t ('(:) 'TUnit inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUNPACK] :: forall (a_i7X9w :: T) (s_i7X9x :: [T]). (UnpackedValScope a_i7X9w, SingI a_i7X9w) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i7X9w) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i7X9x) ('(:) ('TOption a_i7X9w) s_i7X9x)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUNPACK] :: forall (a_i8iac :: T) (s_i8iad :: [T]). (UnpackedValScope a_i8iac, SingI a_i8iac) => Anns ('(:) TypeAnn ('(:) VarAnn ('(:) (Notes a_i8iac) ('[] :: [Type])))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TBytes s_i8iad) ('(:) ('TOption a_i8iac) s_i8iad)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUNPAIR] :: forall (a_i7X8i :: T) (b_i7X8j :: T) (s_i7X8k :: [T]). () => Anns ('(:) VarAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i7X8i b_i7X8j) s_i7X8k) ('(:) a_i7X8i ('(:) b_i7X8j s_i7X8k))
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUNPAIR] :: forall (a_i8i8Y :: T) (b_i8i8Z :: T) (s_i8i90 :: [T]). () => Anns ('(:) VarAnn ('(:) VarAnn ('(:) FieldAnn ('(:) FieldAnn ('[] :: [Type]))))) -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) ('TPair a_i8i8Y b_i8i8Z) s_i8i90) ('(:) a_i8i8Y ('(:) b_i8i8Z s_i8i90))
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUPDATEN] :: forall (ix_i7X8X :: Peano) (val_i7X8Y :: T) (pair_i7X8Z :: T) (s_i7X90 :: [T]). ConstraintUpdateN ix_i7X8X pair_i7X8Z => AnnVar -> PeanoNatural ix_i7X8X -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) val_i7X8Y ('(:) pair_i7X8Z s_i7X90)) ('(:) (UpdateN ix_i7X8X val_i7X8Y pair_i7X8Z) s_i7X90)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUPDATEN] :: forall (ix_i8i9D :: Peano) (val_i8i9E :: T) (pair_i8i9F :: T) (s_i8i9G :: [T]). ConstraintUpdateN ix_i8i9D pair_i8i9F => AnnVar -> PeanoNatural ix_i8i9D -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) val_i8i9E ('(:) pair_i8i9F s_i8i9G)) ('(:) (UpdateN ix_i8i9D val_i8i9E pair_i8i9F) s_i8i9G)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUPDATE] :: forall (c_i7X8V :: T) (s_i7X8W :: [T]). UpdOp c_i7X8V => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (UpdOpKey c_i7X8V) ('(:) (UpdOpParams c_i7X8V) ('(:) c_i7X8V s_i7X8W))) ('(:) c_i7X8V s_i7X8W)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnUPDATE] :: forall (c_i8i9B :: T) (s_i8i9C :: [T]). UpdOp c_i8i9B => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) (UpdOpKey c_i8i9B) ('(:) (UpdOpParams c_i8i9B) ('(:) c_i8i9B s_i8i9C))) ('(:) c_i8i9B s_i8i9C)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnVIEW] :: forall (arg_i7Xaw :: T) (ret_i7Xax :: T) (s_i7Xay :: [T]). (SingI arg_i7Xaw, ViewableScope ret_i7Xax) => Anns ('(:) VarAnn ('(:) (Notes ret_i7Xax) ('[] :: [Type]))) -> ViewName -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) arg_i7Xaw ('(:) 'TAddress s_i7Xay)) ('(:) ('TOption ret_i7Xax) s_i7Xay)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnVIEW] :: forall (arg_i8ibc :: T) (ret_i8ibd :: T) (s_i8ibe :: [T]). (SingI arg_i8ibc, ViewableScope ret_i8ibd) => Anns ('(:) VarAnn ('(:) (Notes ret_i8ibd) ('[] :: [Type]))) -> ViewName -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) arg_i8ibc ('(:) 'TAddress s_i8ibe)) ('(:) ('TOption ret_i8ibd) s_i8ibe)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnVOTING_POWER] :: forall (s_i7XaJ :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKeyHash s_i7XaJ) ('(:) 'TNat s_i7XaJ)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnVOTING_POWER] :: forall (s_i8ibp :: [T]). () => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) 'TKeyHash s_i8ibp) ('(:) 'TNat s_i8ibp)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnXOR] :: forall (n_i7Xa8 :: T) (m_i7Xa9 :: T) (s_i7Xaa :: [T]). ArithOp Xor n_i7Xa8 m_i7Xa9 => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i7Xa8 ('(:) m_i7Xa9 s_i7Xaa)) ('(:) (ArithRes Xor n_i7Xa8 m_i7Xa9) s_i7Xaa)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_AnnXOR] :: forall (n_i8iaO :: T) (m_i8iaP :: T) (s_i8iaQ :: [T]). ArithOp Xor n_i8iaO m_i8iaP => AnnVar -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesHaveStandardAnns) ('(:) n_i8iaO ('(:) m_i8iaP s_i8iaQ)) ('(:) (ArithRes Xor n_i8iaO m_i8iaP) s_i8iaQ)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DIG] :: forall (n_i7X85 :: Peano) (inp_i7X7N :: [T]) (out_i7X7O :: [T]) (a_i7X86 :: T). ConstraintDIG n_i7X85 inp_i7X7N out_i7X7O a_i7X86 => PeanoNatural n_i7X85 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DIG] :: forall (n_i8i8L :: Peano) (inp_i8i8t :: [T]) (out_i8i8u :: [T]) (a_i8i8M :: T). ConstraintDIG n_i8i8L inp_i8i8t out_i8i8u a_i8i8M => PeanoNatural n_i8i8L -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DIPN] :: forall (n_i7X9l :: Peano) (inp_i7X7N :: [T]) (out_i7X7O :: [T]) (s_i7X9m :: [T]) (s'_i7X9n :: [T]). ConstraintDIPN n_i7X9l inp_i7X7N out_i7X7O s_i7X9m s'_i7X9n => PeanoNatural n_i7X9l -> Instr s_i7X9m s'_i7X9n -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DIPN] :: forall (n_i8ia1 :: Peano) (inp_i8i8t :: [T]) (out_i8i8u :: [T]) (s_i8ia2 :: [T]) (s'_i8ia3 :: [T]). ConstraintDIPN n_i8ia1 inp_i8i8t out_i8i8u s_i8ia2 s'_i8ia3 => PeanoNatural n_i8ia1 -> Instr s_i8ia2 s'_i8ia3 -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DIP] :: forall (a_i7X9i :: [T]) (c_i7X9j :: [T]) (b_i7X9k :: T). () => Instr a_i7X9i c_i7X9j -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) b_i7X9k a_i7X9i) ('(:) b_i7X9k c_i7X9j)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DIP] :: forall (a_i8i9Y :: [T]) (c_i8i9Z :: [T]) (b_i8ia0 :: T). () => Instr a_i8i9Y c_i8i9Z -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) b_i8ia0 a_i8i9Y) ('(:) b_i8ia0 c_i8i9Z)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DROPN] :: forall (n_i7X7X :: Peano) (inp_i7X7N :: [T]). RequireLongerOrSameLength inp_i7X7N n_i7X7X => PeanoNatural n_i7X7X -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i7X7N (Drop n_i7X7X inp_i7X7N)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DROPN] :: forall (n_i8i8D :: Peano) (inp_i8i8t :: [T]). RequireLongerOrSameLength inp_i8i8t n_i8i8D => PeanoNatural n_i8i8D -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i8i8t (Drop n_i8i8D inp_i8i8t)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DROP] :: forall (a_i7X7W :: T) (out_i7X7O :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i7X7W out_i7X7O) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DROP] :: forall (a_i8i8C :: T) (out_i8i8u :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i8i8C out_i8i8u) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DUG] :: forall (n_i7X87 :: Peano) (inp_i7X7N :: [T]) (out_i7X7O :: [T]) (a_i7X88 :: T). ConstraintDUG n_i7X87 inp_i7X7N out_i7X7O a_i7X88 => PeanoNatural n_i7X87 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DUG] :: forall (n_i8i8N :: Peano) (inp_i8i8t :: [T]) (out_i8i8u :: [T]) (a_i8i8O :: T). ConstraintDUG n_i8i8N inp_i8i8t out_i8i8u a_i8i8O => PeanoNatural n_i8i8N -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DocGroup] :: forall (inp_i7X7N :: [T]) (out_i7X7O :: [T]). () => DocGrouping -> Instr inp_i7X7N out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_DocGroup] :: forall (inp_i8i8t :: [T]) (out_i8i8u :: [T]). () => DocGrouping -> Instr inp_i8i8t out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Ext] :: forall (inp_i7X7N :: [T]). () => ExtInstr inp_i7X7N -> ClassifiedInstr ('InstrClass 'MayHaveChildren 'FailingNormal 'Additional 'DoesNotHaveAnns) inp_i7X7N inp_i7X7N
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Ext] :: forall (inp_i8i8t :: [T]). () => ExtInstr inp_i8i8t -> ClassifiedInstr ('InstrClass 'MayHaveChildren 'FailingNormal 'Additional 'DoesNotHaveAnns) inp_i8i8t inp_i8i8t
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_FAILWITH] :: forall (a_i7X9o :: T) (s_i7X9p :: [T]) (out_i7X7O :: [T]). (SingI a_i7X9o, ConstantScope a_i7X9o) => ClassifiedInstr ('InstrClass 'NoChildren 'AlwaysFailing 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i7X9o s_i7X9p) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_FAILWITH] :: forall (a_i8ia4 :: T) (s_i8ia5 :: [T]) (out_i8i8u :: [T]). (SingI a_i8ia4, ConstantScope a_i8ia4) => ClassifiedInstr ('InstrClass 'NoChildren 'AlwaysFailing 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i8ia4 s_i8ia5) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_IF] :: forall (s_i7X93 :: [T]) (out_i7X7O :: [T]). () => Instr s_i7X93 out_i7X7O -> Instr s_i7X93 out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TBool s_i7X93) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_IF] :: forall (s_i8i9J :: [T]) (out_i8i8u :: [T]). () => Instr s_i8i9J out_i8i8u -> Instr s_i8i9J out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TBool s_i8i9J) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_IF_CONS] :: forall (a_i7X8B :: T) (s_i7X8C :: [T]) (out_i7X7O :: [T]). () => Instr ('(:) a_i7X8B ('(:) ('TList a_i7X8B) s_i7X8C)) out_i7X7O -> Instr s_i7X8C out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TList a_i7X8B) s_i7X8C) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_IF_CONS] :: forall (a_i8i9h :: T) (s_i8i9i :: [T]) (out_i8i8u :: [T]). () => Instr ('(:) a_i8i9h ('(:) ('TList a_i8i9h) s_i8i9i)) out_i8i8u -> Instr s_i8i9i out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TList a_i8i9h) s_i8i9i) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_IF_LEFT] :: forall (a_i7X8v :: T) (s_i7X8w :: [T]) (out_i7X7O :: [T]) (b_i7X8x :: T). () => Instr ('(:) a_i7X8v s_i7X8w) out_i7X7O -> Instr ('(:) b_i7X8x s_i7X8w) out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOr a_i7X8v b_i7X8x) s_i7X8w) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_IF_LEFT] :: forall (a_i8i9b :: T) (s_i8i9c :: [T]) (out_i8i8u :: [T]) (b_i8i9d :: T). () => Instr ('(:) a_i8i9b s_i8i9c) out_i8i8u -> Instr ('(:) b_i8i9d s_i8i9c) out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOr a_i8i9b b_i8i9d) s_i8i9c) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_IF_NONE] :: forall (s_i7X8d :: [T]) (out_i7X7O :: [T]) (a_i7X8e :: T). () => Instr s_i7X8d out_i7X7O -> Instr ('(:) a_i7X8e s_i7X8d) out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOption a_i7X8e) s_i7X8d) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_IF_NONE] :: forall (s_i8i8T :: [T]) (out_i8i8u :: [T]) (a_i8i8U :: T). () => Instr s_i8i8T out_i8i8u -> Instr ('(:) a_i8i8U s_i8i8T) out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOption a_i8i8U) s_i8i8T) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_ITER] :: forall (c_i7X8N :: T) (out_i7X7O :: [T]). IterOp c_i7X8N => Instr ('(:) (IterOpEl c_i7X8N) out_i7X7O) out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) c_i7X8N out_i7X7O) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_ITER] :: forall (c_i8i9t :: T) (out_i8i8u :: [T]). IterOp c_i8i9t => Instr ('(:) (IterOpEl c_i8i9t) out_i8i8u) out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) c_i8i9t out_i8i8u) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_LOOP] :: forall (out_i7X7O :: [T]). () => Instr out_i7X7O ('(:) 'TBool out_i7X7O) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TBool out_i7X7O) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_LOOP] :: forall (out_i8i8u :: [T]). () => Instr out_i8i8u ('(:) 'TBool out_i8i8u) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TBool out_i8i8u) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_LOOP_LEFT] :: forall (a_i7X94 :: T) (s_i7X95 :: [T]) (b_i7X96 :: T). () => Instr ('(:) a_i7X94 s_i7X95) ('(:) ('TOr a_i7X94 b_i7X96) s_i7X95) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOr a_i7X94 b_i7X96) s_i7X95) ('(:) b_i7X96 s_i7X95)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_LOOP_LEFT] :: forall (a_i8i9K :: T) (s_i8i9L :: [T]) (b_i8i9M :: T). () => Instr ('(:) a_i8i9K s_i8i9L) ('(:) ('TOr a_i8i9K b_i8i9M) s_i8i9L) -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) ('TOr a_i8i9K b_i8i9M) s_i8i9L) ('(:) b_i8i9M s_i8i9L)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Meta] :: forall (inp_i7X7N :: [T]) (out_i7X7O :: [T]). () => SomeMeta -> Instr inp_i7X7N out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Meta] :: forall (inp_i8i8t :: [T]) (out_i8i8u :: [T]). () => SomeMeta -> Instr inp_i8i8t out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_NEVER] :: forall (s_i7XaU :: [T]) (out_i7X7O :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'AlwaysFailing 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TNever s_i7XaU) out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_NEVER] :: forall (s_i8ibA :: [T]) (out_i8i8u :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'AlwaysFailing 'FromMichelson 'DoesNotHaveAnns) ('(:) 'TNever s_i8ibA) out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Nested] :: forall (inp_i7X7N :: [T]) (out_i7X7O :: [T]). () => Instr inp_i7X7N out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Structural 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Nested] :: forall (inp_i8i8t :: [T]) (out_i8i8u :: [T]). () => Instr inp_i8i8t out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Structural 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Nop] :: forall (inp_i7X7N :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'Additional 'DoesNotHaveAnns) inp_i7X7N inp_i7X7N
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Nop] :: forall (inp_i8i8t :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'Additional 'DoesNotHaveAnns) inp_i8i8t inp_i8i8t
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_SWAP] :: forall (a_i7X82 :: T) (b_i7X83 :: T) (s_i7X84 :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i7X82 ('(:) b_i7X83 s_i7X84)) ('(:) b_i7X83 ('(:) a_i7X82 s_i7X84))
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_SWAP] :: forall (a_i8i8I :: T) (b_i8i8J :: T) (s_i8i8K :: [T]). () => ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) a_i8i8I ('(:) b_i8i8J s_i8i8K)) ('(:) b_i8i8J ('(:) a_i8i8I s_i8i8K))
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Seq] :: forall (inp_i7X7N :: [T]) (b_i7X7P :: [T]) (out_i7X7O :: [T]). () => Instr inp_i7X7N b_i7X7P -> Instr b_i7X7P out_i7X7O -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'Structural 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_Seq] :: forall (inp_i8i8t :: [T]) (b_i8i8v :: [T]) (out_i8i8u :: [T]). () => Instr inp_i8i8t b_i8i8v -> Instr b_i8i8v out_i8i8u -> ClassifiedInstr ('InstrClass 'TwoChildren 'FailingNormal 'Structural 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_UNPAIRN] :: forall (n_i7X8m :: Peano) (pair_i7X8n :: T) (s_i7X8o :: [T]). ConstraintUnpairN n_i7X8m pair_i7X8n => PeanoNatural n_i7X8m -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) pair_i7X8n s_i7X8o) ((++) (UnpairN n_i7X8m pair_i7X8n) s_i7X8o)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_UNPAIRN] :: forall (n_i8i92 :: Peano) (pair_i8i93 :: T) (s_i8i94 :: [T]). ConstraintUnpairN n_i8i92 pair_i8i93 => PeanoNatural n_i8i92 -> ClassifiedInstr ('InstrClass 'NoChildren 'FailingNormal 'FromMichelson 'DoesNotHaveAnns) ('(:) pair_i8i93 s_i8i94) ((++) (UnpairN n_i8i92 pair_i8i93) s_i8i94)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_WithLoc] :: forall (inp_i7X7N :: [T]) (out_i7X7O :: [T]). () => ErrorSrcPos -> Instr inp_i7X7N out_i7X7O -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i7X7N out_i7X7O
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: [C_WithLoc] :: forall (inp_i8i8t :: [T]) (out_i8i8u :: [T]). () => ErrorSrcPos -> Instr inp_i8i8t out_i8i8u -> ClassifiedInstr ('InstrClass 'OneChild 'FailingNormal 'Phantom 'DoesNotHaveAnns) inp_i8i8t out_i8i8u
- Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: classifyInstr :: Instr inp_a86S9 out_a86Sa -> WellClassifiedInstr inp_a86S9 out_a86Sa
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.MainImpl: classifyInstr :: Instr inp_a8rXQ out_a8rXR -> WellClassifiedInstr inp_a8rXQ out_a8rXR
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [InstrClassSym0KindInference] :: SameKind (Apply InstrClassSym0 arg_a1yzh) (InstrClassSym1 arg_a1yzh) => InstrClassSym0 a6989586621679381004
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [InstrClassSym0KindInference] :: SameKind (Apply InstrClassSym0 arg_a1Am6) (InstrClassSym1 arg_a1Am6) => InstrClassSym0 a6989586621679387875
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [InstrClassSym1KindInference] :: SameKind (Apply (InstrClassSym1 a6989586621679381004) arg_a1yzh) (InstrClassSym2 a6989586621679381004 arg_a1yzh) => InstrClassSym1 a6989586621679381004 a6989586621679381005
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [InstrClassSym1KindInference] :: SameKind (Apply (InstrClassSym1 a6989586621679387875) arg_a1Am6) (InstrClassSym2 a6989586621679387875 arg_a1Am6) => InstrClassSym1 a6989586621679387875 a6989586621679387876
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [InstrClassSym2KindInference] :: SameKind (Apply (InstrClassSym2 a6989586621679381004 a6989586621679381005) arg_a1yzh) (InstrClassSym3 a6989586621679381004 a6989586621679381005 arg_a1yzh) => InstrClassSym2 a6989586621679381004 a6989586621679381005 a6989586621679381006
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [InstrClassSym2KindInference] :: SameKind (Apply (InstrClassSym2 a6989586621679387875 a6989586621679387876) arg_a1Am6) (InstrClassSym3 a6989586621679387875 a6989586621679387876 arg_a1Am6) => InstrClassSym2 a6989586621679387875 a6989586621679387876 a6989586621679387877
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [InstrClassSym3KindInference] :: SameKind (Apply (InstrClassSym3 a6989586621679381004 a6989586621679381005 a6989586621679381006) arg_a1yzh) (InstrClassSym4 a6989586621679381004 a6989586621679381005 a6989586621679381006 arg_a1yzh) => InstrClassSym3 a6989586621679381004 a6989586621679381005 a6989586621679381006 a6989586621679381007
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [InstrClassSym3KindInference] :: SameKind (Apply (InstrClassSym3 a6989586621679387875 a6989586621679387876 a6989586621679387877) arg_a1Am6) (InstrClassSym4 a6989586621679387875 a6989586621679387876 a6989586621679387877 arg_a1Am6) => InstrClassSym3 a6989586621679387875 a6989586621679387876 a6989586621679387877 a6989586621679387878
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [SInstrClass] :: forall (n_a1yzm :: NumChildren) (n_a1yzn :: FailureType) (n_a1yzo :: IsMichelson) (n_a1yzp :: HasAnns). () => Sing n_a1yzm -> Sing n_a1yzn -> Sing n_a1yzo -> Sing n_a1yzp -> SingInstrClass ('InstrClass n_a1yzm n_a1yzn n_a1yzo n_a1yzp :: InstrClass)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: [SInstrClass] :: forall (n_a1Amb :: NumChildren) (n_a1Amc :: FailureType) (n_a1Amd :: IsMichelson) (n_a1Ame :: HasAnns). () => Sing n_a1Amb -> Sing n_a1Amc -> Sing n_a1Amd -> Sing n_a1Ame -> SingInstrClass ('InstrClass n_a1Amb n_a1Amc n_a1Amd n_a1Ame :: InstrClass)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: data InstrClassSym1 (a6989586621679381004 :: NumChildren) :: (~>) FailureType ((~>) IsMichelson ((~>) HasAnns InstrClass))
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: data InstrClassSym1 (a6989586621679387875 :: NumChildren) :: (~>) FailureType ((~>) IsMichelson ((~>) HasAnns InstrClass))
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: data InstrClassSym2 (a6989586621679381004 :: NumChildren) (a6989586621679381005 :: FailureType) :: (~>) IsMichelson ((~>) HasAnns InstrClass)
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: data InstrClassSym2 (a6989586621679387875 :: NumChildren) (a6989586621679387876 :: FailureType) :: (~>) IsMichelson ((~>) HasAnns InstrClass)
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: data InstrClassSym3 (a6989586621679381004 :: NumChildren) (a6989586621679381005 :: FailureType) (a6989586621679381006 :: IsMichelson) :: (~>) HasAnns InstrClass
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: data InstrClassSym3 (a6989586621679387875 :: NumChildren) (a6989586621679387876 :: FailureType) (a6989586621679387877 :: IsMichelson) :: (~>) HasAnns InstrClass
- Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: type family InstrClassSym4 (a6989586621679381004 :: NumChildren) (a6989586621679381005 :: FailureType) (a6989586621679381006 :: IsMichelson) (a6989586621679381007 :: HasAnns) :: InstrClass
+ Morley.Michelson.Typed.ClassifiedInstr.Internal.Types: type family InstrClassSym4 (a6989586621679387875 :: NumChildren) (a6989586621679387876 :: FailureType) (a6989586621679387877 :: IsMichelson) (a6989586621679387878 :: HasAnns) :: InstrClass
- Morley.Michelson.Typed.Convert: untypeValue :: HasNoOp t => Value' Instr t -> Value
+ Morley.Michelson.Typed.Convert: untypeValue :: ForbidOp t => Value' Instr t -> Value
- Morley.Michelson.Typed.Convert: untypeValueHashable :: HasNoOp t => Value' Instr t -> Value
+ Morley.Michelson.Typed.Convert: untypeValueHashable :: ForbidOp t => Value' Instr t -> Value
- Morley.Michelson.Typed.Convert: untypeValueOptimized :: HasNoOp t => Value' Instr t -> Value
+ Morley.Michelson.Typed.Convert: untypeValueOptimized :: ForbidOp t => Value' Instr t -> Value
- Morley.Michelson.Typed.Haskell: crDescriptionL :: forall a_a9136. Lens' (ConstructorRep a_a9136) (Maybe Text)
+ Morley.Michelson.Typed.Haskell: crDescriptionL :: forall a_a9H8N. Lens' (ConstructorRep a_a9H8N) (Maybe Text)
- Morley.Michelson.Typed.Haskell: crFieldsL :: forall a_a9136 a_a914k. Lens (ConstructorRep a_a9136) (ConstructorRep a_a914k) [FieldRep a_a9136] [FieldRep a_a914k]
+ Morley.Michelson.Typed.Haskell: crFieldsL :: forall a_a9H8N a_a9Ha1. Lens (ConstructorRep a_a9H8N) (ConstructorRep a_a9Ha1) [FieldRep a_a9H8N] [FieldRep a_a9Ha1]
- Morley.Michelson.Typed.Haskell: crNameL :: forall a_a9136. Lens' (ConstructorRep a_a9136) Text
+ Morley.Michelson.Typed.Haskell: crNameL :: forall a_a9H8N. Lens' (ConstructorRep a_a9H8N) Text
- Morley.Michelson.Typed.Haskell: frDescriptionL :: forall a_a9135. Lens' (FieldRep a_a9135) (Maybe Text)
+ Morley.Michelson.Typed.Haskell: frDescriptionL :: forall a_a9H8M. Lens' (FieldRep a_a9H8M) (Maybe Text)
- Morley.Michelson.Typed.Haskell: frNameL :: forall a_a9135. Lens' (FieldRep a_a9135) (Maybe Text)
+ Morley.Michelson.Typed.Haskell: frNameL :: forall a_a9H8M. Lens' (FieldRep a_a9H8M) (Maybe Text)
- Morley.Michelson.Typed.Haskell: frTypeRepL :: forall a_a9135 a_a916d. Lens (FieldRep a_a9135) (FieldRep a_a916d) a_a9135 a_a916d
+ Morley.Michelson.Typed.Haskell: frTypeRepL :: forall a_a9H8M a_a9HbU. Lens (FieldRep a_a9H8M) (FieldRep a_a9HbU) a_a9H8M a_a9HbU
- Morley.Michelson.Typed.Haskell: type HasNoOpToT a = (IsoValue a, HasNoOp (ToT a))
+ Morley.Michelson.Typed.Haskell: type HasNoOpToT a = (IsoValue a, ForbidOp (ToT a))
- Morley.Michelson.Typed.Haskell: typeDocBuiltMichelsonRep :: TypeHasDoc a => Proxy a -> Builder
+ Morley.Michelson.Typed.Haskell: typeDocBuiltMichelsonRep :: TypeHasDoc a => Proxy a -> Doc
- Morley.Michelson.Typed.Haskell.Doc: crDescriptionL :: forall a_a9136. Lens' (ConstructorRep a_a9136) (Maybe Text)
+ Morley.Michelson.Typed.Haskell.Doc: crDescriptionL :: forall a_a9H8N. Lens' (ConstructorRep a_a9H8N) (Maybe Text)
- Morley.Michelson.Typed.Haskell.Doc: crFieldsL :: forall a_a9136 a_a914k. Lens (ConstructorRep a_a9136) (ConstructorRep a_a914k) [FieldRep a_a9136] [FieldRep a_a914k]
+ Morley.Michelson.Typed.Haskell.Doc: crFieldsL :: forall a_a9H8N a_a9Ha1. Lens (ConstructorRep a_a9H8N) (ConstructorRep a_a9Ha1) [FieldRep a_a9H8N] [FieldRep a_a9Ha1]
- Morley.Michelson.Typed.Haskell.Doc: crNameL :: forall a_a9136. Lens' (ConstructorRep a_a9136) Text
+ Morley.Michelson.Typed.Haskell.Doc: crNameL :: forall a_a9H8N. Lens' (ConstructorRep a_a9H8N) Text
- Morley.Michelson.Typed.Haskell.Doc: frDescriptionL :: forall a_a9135. Lens' (FieldRep a_a9135) (Maybe Text)
+ Morley.Michelson.Typed.Haskell.Doc: frDescriptionL :: forall a_a9H8M. Lens' (FieldRep a_a9H8M) (Maybe Text)
- Morley.Michelson.Typed.Haskell.Doc: frNameL :: forall a_a9135. Lens' (FieldRep a_a9135) (Maybe Text)
+ Morley.Michelson.Typed.Haskell.Doc: frNameL :: forall a_a9H8M. Lens' (FieldRep a_a9H8M) (Maybe Text)
- Morley.Michelson.Typed.Haskell.Doc: frTypeRepL :: forall a_a9135 a_a916d. Lens (FieldRep a_a9135) (FieldRep a_a916d) a_a9135 a_a916d
+ Morley.Michelson.Typed.Haskell.Doc: frTypeRepL :: forall a_a9H8M a_a9HbU. Lens (FieldRep a_a9H8M) (FieldRep a_a9HbU) a_a9H8M a_a9HbU
- Morley.Michelson.Typed.Haskell.Doc: typeDocBuiltMichelsonRep :: TypeHasDoc a => Proxy a -> Builder
+ Morley.Michelson.Typed.Haskell.Doc: typeDocBuiltMichelsonRep :: TypeHasDoc a => Proxy a -> Doc
- Morley.Michelson.Typed.Haskell.Value: type HasNoOpToT a = (IsoValue a, HasNoOp (ToT a))
+ Morley.Michelson.Typed.Haskell.Value: type HasNoOpToT a = (IsoValue a, ForbidOp (ToT a))
- Morley.Michelson.Typed.Instr: [AnnCOMPARE] :: (Comparable n, SingI n) => AnnVar -> Instr (n : (n : s)) ('TInt : s)
+ Morley.Michelson.Typed.Instr: [AnnCOMPARE] :: Comparable n => AnnVar -> Instr (n : (n : s)) ('TInt : s)
- Morley.Michelson.Typed.Instr: [AnnEMPTY_BIG_MAP] :: (SingI a, SingI b, Comparable a, HasNoBigMap b) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TBigMap a b : s)
+ Morley.Michelson.Typed.Instr: [AnnEMPTY_BIG_MAP] :: (SingI b, Comparable a, ForbidBigMap b) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TBigMap a b : s)
- Morley.Michelson.Typed.Instr: [AnnEMPTY_MAP] :: (SingI a, SingI b, Comparable a) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TMap a b : s)
+ Morley.Michelson.Typed.Instr: [AnnEMPTY_MAP] :: (SingI b, Comparable a) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TMap a b : s)
- Morley.Michelson.Typed.Instr: [AnnEMPTY_SET] :: (SingI e, Comparable e) => Anns '[TypeAnn, VarAnn, Notes e] -> Instr s ('TSet e : s)
+ Morley.Michelson.Typed.Instr: [AnnEMPTY_SET] :: Comparable e => Anns '[TypeAnn, VarAnn, Notes e] -> Instr s ('TSet e : s)
- Morley.Michelson.Typed.Instr: pattern CREATE_CONTRACT :: forall {inp_a7wXL} {out_a7wXM}. () => forall (p_X0 :: T) (g_X1 :: T) (s_X2 :: [T]). (inp_a7wXL ~ '(:) ('TOption 'TKeyHash) ('(:) 'TMutez ('(:) g_X1 s_X2)), out_a7wXM ~ '(:) 'TOperation ('(:) 'TAddress s_X2), ParameterScope p_X0, StorageScope g_X1, IsNotInView) => Contract' Instr p_X0 g_X1 -> Instr inp_a7wXL out_a7wXM
+ Morley.Michelson.Typed.Instr: pattern CREATE_CONTRACT :: forall {inp_a7REs} {out_a7REt}. () => forall (p_X0 :: T) (g_X1 :: T) (s_X2 :: [T]). (inp_a7REs ~ '(:) ('TOption 'TKeyHash) ('(:) 'TMutez ('(:) g_X1 s_X2)), out_a7REt ~ '(:) 'TOperation ('(:) 'TAddress s_X2), ParameterScope p_X0, StorageScope g_X1, IsNotInView) => Contract' Instr p_X0 g_X1 -> Instr inp_a7REs out_a7REt
- Morley.Michelson.Typed.Instr: pattern CONTRACT :: forall {inp_a7wXE} {out_a7wXF}. () => forall (p_X0 :: T) (s_X1 :: [T]). (inp_a7wXE ~ '(:) 'TAddress s_X1, out_a7wXF ~ '(:) ('TOption ('TContract p_X0)) s_X1, ParameterScope p_X0) => EpName -> Instr inp_a7wXE out_a7wXF
+ Morley.Michelson.Typed.Instr: pattern CONTRACT :: forall {inp_a7REl} {out_a7REm}. () => forall (p_X0 :: T) (s_X1 :: [T]). (inp_a7REl ~ '(:) 'TAddress s_X1, out_a7REm ~ '(:) ('TOption ('TContract p_X0)) s_X1, ParameterScope p_X0) => EpName -> Instr inp_a7REl out_a7REm
- Morley.Michelson.Typed.Instr: pattern EMIT :: forall {inp_a7wYM} {out_a7wYN}. () => forall (t_X0 :: T) (s_X1 :: [T]). (inp_a7wYM ~ '(:) t_X0 s_X1, out_a7wYN ~ '(:) 'TOperation s_X1, PackedValScope t_X0) => FieldAnn -> Maybe (Notes t_X0) -> Instr inp_a7wYM out_a7wYN
+ Morley.Michelson.Typed.Instr: pattern EMIT :: forall {inp_a7RFt} {out_a7RFu}. () => forall (t_X0 :: T) (s_X1 :: [T]). (inp_a7RFt ~ '(:) t_X0 s_X1, out_a7RFu ~ '(:) 'TOperation s_X1, PackedValScope t_X0) => FieldAnn -> Maybe (Notes t_X0) -> Instr inp_a7RFt out_a7RFu
- Morley.Michelson.Typed.Instr: pattern NAT :: forall {inp_a7wXv} {out_a7wXw}. () => forall (s_X0 :: [T]). (inp_a7wXv ~ '(:) 'TBytes s_X0, out_a7wXw ~ '(:) 'TNat s_X0) => Instr inp_a7wXv out_a7wXw
+ Morley.Michelson.Typed.Instr: pattern NAT :: forall {inp_a7REc} {out_a7REd}. () => forall (s_X0 :: [T]). (inp_a7REc ~ '(:) 'TBytes s_X0, out_a7REd ~ '(:) 'TNat s_X0) => Instr inp_a7REc out_a7REd
- Morley.Michelson.Typed.Instr: pattern UPDATEN :: forall {inp_a7wWp} {out_a7wWq}. () => forall (ix_X0 :: Peano) (val_X1 :: T) (pair_X2 :: T) (s_X3 :: [T]). (inp_a7wWp ~ '(:) val_X1 ('(:) pair_X2 s_X3), out_a7wWq ~ '(:) (UpdateN ix_X0 val_X1 pair_X2) s_X3, ConstraintUpdateN ix_X0 pair_X2) => PeanoNatural ix_X0 -> Instr inp_a7wWp out_a7wWq
+ Morley.Michelson.Typed.Instr: pattern UPDATEN :: forall {inp_a7RD6} {out_a7RD7}. () => forall (ix_X0 :: Peano) (val_X1 :: T) (pair_X2 :: T) (s_X3 :: [T]). (inp_a7RD6 ~ '(:) val_X1 ('(:) pair_X2 s_X3), out_a7RD7 ~ '(:) (UpdateN ix_X0 val_X1 pair_X2) s_X3, ConstraintUpdateN ix_X0 pair_X2) => PeanoNatural ix_X0 -> Instr inp_a7RD6 out_a7RD7
- Morley.Michelson.Typed.Instr: pattern SAPLING_EMPTY_STATE :: forall {inp_a7wYE} {out_a7wYF}. () => forall (n_X0 :: Peano) (s_a7rVL :: [T]). (inp_a7wYE ~ s_a7rVL, out_a7wYF ~ '(:) ('TSaplingState n_X0) s_a7rVL) => Sing n_X0 -> Instr inp_a7wYE out_a7wYF
+ Morley.Michelson.Typed.Instr: pattern SAPLING_EMPTY_STATE :: forall {inp_a7RFl} {out_a7RFm}. () => forall (n_X0 :: Peano) (s_a7Mxe :: [T]). (inp_a7RFl ~ s_a7Mxe, out_a7RFm ~ '(:) ('TSaplingState n_X0) s_a7Mxe) => Sing n_X0 -> Instr inp_a7RFl out_a7RFm
- Morley.Michelson.Typed.Instr: pattern SELF :: forall {inp_a7wXB} {out_a7wXC}. () => forall (arg_X0 :: T) (s_a7rV3 :: [T]). (inp_a7wXB ~ s_a7rV3, out_a7wXC ~ '(:) ('TContract arg_X0) s_a7rV3, ParameterScope arg_X0, IsNotInView) => SomeEntrypointCallT arg_X0 -> Instr inp_a7wXB out_a7wXC
+ Morley.Michelson.Typed.Instr: pattern SELF :: forall {inp_a7REi} {out_a7REj}. () => forall (arg_X0 :: T) (s_a7Mww :: [T]). (inp_a7REi ~ s_a7Mww, out_a7REj ~ '(:) ('TContract arg_X0) s_a7Mww, ParameterScope arg_X0, IsNotInView) => SomeEntrypointCallT arg_X0 -> Instr inp_a7REi out_a7REj
- Morley.Michelson.Typed.Instr: pattern PUSH :: forall {inp_a7wVH} {out_a7wVI}. () => forall (t_X0 :: T) (s_a7rSk :: [T]). (inp_a7wVH ~ s_a7rSk, out_a7wVI ~ '(:) t_X0 s_a7rSk, ConstantScope t_X0) => Value' Instr t_X0 -> Instr inp_a7wVH out_a7wVI
+ Morley.Michelson.Typed.Instr: pattern PUSH :: forall {inp_a7RCo} {out_a7RCp}. () => forall (t_X0 :: T) (s_a7MtN :: [T]). (inp_a7RCo ~ s_a7MtN, out_a7RCp ~ '(:) t_X0 s_a7MtN, ConstantScope t_X0) => Value' Instr t_X0 -> Instr inp_a7RCo out_a7RCp
- Morley.Michelson.Typed.Instr: pattern VIEW :: forall {inp_a7wXy} {out_a7wXz}. () => forall (arg_X0 :: T) (ret_X1 :: T) (s_X2 :: [T]). (inp_a7wXy ~ '(:) arg_X0 ('(:) 'TAddress s_X2), out_a7wXz ~ '(:) ('TOption ret_X1) s_X2, SingI arg_X0, ViewableScope ret_X1) => ViewName -> Instr inp_a7wXy out_a7wXz
+ Morley.Michelson.Typed.Instr: pattern VIEW :: forall {inp_a7REf} {out_a7REg}. () => forall (arg_X0 :: T) (ret_X1 :: T) (s_X2 :: [T]). (inp_a7REf ~ '(:) arg_X0 ('(:) 'TAddress s_X2), out_a7REg ~ '(:) ('TOption ret_X1) s_X2, SingI arg_X0, ViewableScope ret_X1) => ViewName -> Instr inp_a7REf out_a7REg
- Morley.Michelson.Typed.Scope: [CanBeCompared] :: Comparable t => Comparability t
+ Morley.Michelson.Typed.Scope: [CanBeCompared] :: (Comparable t, ComparabilityImplies t) => Comparability t
- Morley.Michelson.Typed.Scope: [CannotBeCompared] :: IsComparable t ~ 'False => Comparability t
+ Morley.Michelson.Typed.Scope: [CannotBeCompared] :: ContainsT 'PSNonComparable t ~ 'True => Comparability t
- Morley.Michelson.Typed.Scope: bigMapAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoBigMap t)
+ Morley.Michelson.Typed.Scope: bigMapAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidBigMap t)
- Morley.Michelson.Typed.Scope: checkBigMapPresence :: Sing (ty :: T) -> BigMapPresence ty
+ Morley.Michelson.Typed.Scope: checkBigMapPresence :: Sing (ty :: T) -> TPresence 'PSBigMap ty
- Morley.Michelson.Typed.Scope: checkContractTypePresence :: Sing (ty :: T) -> ContractPresence ty
+ Morley.Michelson.Typed.Scope: checkContractTypePresence :: Sing (ty :: T) -> TPresence 'PSContract ty
- Morley.Michelson.Typed.Scope: checkNestedBigMapsPresence :: Sing (ty :: T) -> NestedBigMapsPresence ty
+ Morley.Michelson.Typed.Scope: checkNestedBigMapsPresence :: Sing (ty :: T) -> TPresence 'PSNestedBigMaps ty
- Morley.Michelson.Typed.Scope: checkOpPresence :: Sing (ty :: T) -> OpPresence ty
+ Morley.Michelson.Typed.Scope: checkOpPresence :: Sing (ty :: T) -> TPresence 'PSOp ty
- Morley.Michelson.Typed.Scope: checkTicketPresence :: Sing (ty :: T) -> TicketPresence ty
+ Morley.Michelson.Typed.Scope: checkTicketPresence :: Sing (ty :: T) -> TPresence 'PSTicket ty
- Morley.Michelson.Typed.Scope: class (SingI t, Comparable t) => ComparabilityScope t
+ Morley.Michelson.Typed.Scope: class ComparabilityScopeC (ComparabilityScope t) t => ComparabilityScope t
- Morley.Michelson.Typed.Scope: class (IsComparable t ~ 'True, SingI t, ComparableSuperC t) => Comparable t where {
+ Morley.Michelson.Typed.Scope: class (SingI t, RecSuperC Comparable t, ForbidNonComparable t) => Comparable t
- Morley.Michelson.Typed.Scope: class (SingI t, WellTyped t, HasNoOp t, HasNoBigMap t, HasNoContract t, HasNoTicket t, HasNoSaplingState t) => ConstantScope t
+ Morley.Michelson.Typed.Scope: class ConstantScopeC (ConstantScope t) t => ConstantScope t
- Morley.Michelson.Typed.Scope: class (SingI t, HasNoTicket t) => DupableScope t
+ Morley.Michelson.Typed.Scope: class DupableScopeC (DupableScope t) t => DupableScope t
- Morley.Michelson.Typed.Scope: class (SingI t, WellTyped t, HasNoOp t, HasNoBigMap t, HasNoTicket t, HasNoSaplingState t) => PackedValScope t
+ Morley.Michelson.Typed.Scope: class PackedValScopeC (PackedValScope t) t => PackedValScope t
- Morley.Michelson.Typed.Scope: class (SingI t, WellTyped t, HasNoOp t, HasNoNestedBigMaps t) => ParameterScope t
+ Morley.Michelson.Typed.Scope: class ParameterScopeC (ParameterScope t) t => ParameterScope t
- Morley.Michelson.Typed.Scope: class (SingI t, WellTyped t, HasNoOp t, HasNoNestedBigMaps t, HasNoContract t) => StorageScope t
+ Morley.Michelson.Typed.Scope: class StorageScopeC (StorageScope t) t => StorageScope t
- Morley.Michelson.Typed.Scope: class (WellTyped t, PackedValScope t, ConstantScope t) => UnpackedValScope t
+ Morley.Michelson.Typed.Scope: class UnpackedValScopeC (UnpackedValScope t) t => UnpackedValScope t
- Morley.Michelson.Typed.Scope: class (SingI t, HasNoOp t, HasNoBigMap t, HasNoTicket t) => ViewableScope t
+ Morley.Michelson.Typed.Scope: class ViewableScopeC (ViewableScope t) t => ViewableScope t
- Morley.Michelson.Typed.Scope: class (SingI t, WellTypedSuperC t) => WellTyped (t :: T) where {
+ Morley.Michelson.Typed.Scope: class (SingI t, RecSuperC WellTyped t, WellTypedConstraints t) => WellTyped t
- Morley.Michelson.Typed.Scope: contractTypeAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoContract t)
+ Morley.Michelson.Typed.Scope: contractTypeAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidContract t)
- Morley.Michelson.Typed.Scope: nestedBigMapsAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoNestedBigMaps t)
+ Morley.Michelson.Typed.Scope: nestedBigMapsAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidNestedBigMaps t)
- Morley.Michelson.Typed.Scope: opAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoOp t)
+ Morley.Michelson.Typed.Scope: opAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidOp t)
- Morley.Michelson.Typed.Scope: type ForbidBigMap t = FailWhen (ContainsBigMap t) ('Text "BigMaps are not allowed in this scope")
+ Morley.Michelson.Typed.Scope: type ForbidBigMap = ForbidT 'PSBigMap " Convenience synonym"
- Morley.Michelson.Typed.Scope: type ForbidContract t = FailWhen (ContainsContract t) ('Text "Type `contract` is not allowed in this scope")
+ Morley.Michelson.Typed.Scope: type ForbidContract = ForbidT 'PSContract " Convenience synonym"
- Morley.Michelson.Typed.Scope: type ForbidNestedBigMaps t = FailWhen (ContainsNestedBigMaps t) ('Text "Nested BigMaps are not allowed")
+ Morley.Michelson.Typed.Scope: type ForbidNestedBigMaps = ForbidT 'PSNestedBigMaps " Convenience synonym"
- Morley.Michelson.Typed.Scope: type ForbidNonComparable t = FailUnless (IsComparable t) ('Text "Only comparable types are allowed here")
+ Morley.Michelson.Typed.Scope: type ForbidNonComparable = ForbidT 'PSNonComparable " Convenience synonym"
- Morley.Michelson.Typed.Scope: type ForbidOp t = FailWhen (ContainsOp t) ('Text "Operations are not allowed in this scope")
+ Morley.Michelson.Typed.Scope: type ForbidOp = ForbidT 'PSOp " Convenience synonym"
- Morley.Michelson.Typed.Scope: type ForbidTicket t = FailWhen (ContainsTicket t) ('Text "Type `ticket` is not allowed in this scope")
+ Morley.Michelson.Typed.Scope: type ForbidTicket = ForbidT 'PSTicket " Convenience synonym"
- Morley.Michelson.Typed.Scope: type family IsComparable (t :: T) :: Bool
+ Morley.Michelson.Typed.Scope: type family ContainsT p t
- Morley.Michelson.Typed.Sing: [STBigMap] :: forall (n_a2ism :: T) (n_a2isn :: T). () => Sing n_a2ism -> Sing n_a2isn -> SingT ('TBigMap n_a2ism n_a2isn :: T)
+ Morley.Michelson.Typed.Sing: [STBigMap] :: forall (n_a2MK5 :: T) (n_a2MK6 :: T). () => Sing n_a2MK5 -> Sing n_a2MK6 -> SingT ('TBigMap n_a2MK5 n_a2MK6 :: T)
- Morley.Michelson.Typed.Sing: [STContract] :: forall (n_a2is2 :: T). () => Sing n_a2is2 -> SingT ('TContract n_a2is2 :: T)
+ Morley.Michelson.Typed.Sing: [STContract] :: forall (n_a2MJL :: T). () => Sing n_a2MJL -> SingT ('TContract n_a2MJL :: T)
- Morley.Michelson.Typed.Sing: [STLambda] :: forall (n_a2ise :: T) (n_a2isf :: T). () => Sing n_a2ise -> Sing n_a2isf -> SingT ('TLambda n_a2ise n_a2isf :: T)
+ Morley.Michelson.Typed.Sing: [STLambda] :: forall (n_a2MJX :: T) (n_a2MJY :: T). () => Sing n_a2MJX -> Sing n_a2MJY -> SingT ('TLambda n_a2MJX n_a2MJY :: T)
- Morley.Michelson.Typed.Sing: [STList] :: forall (n_a2irY :: T). () => Sing n_a2irY -> SingT ('TList n_a2irY :: T)
+ Morley.Michelson.Typed.Sing: [STList] :: forall (n_a2MJH :: T). () => Sing n_a2MJH -> SingT ('TList n_a2MJH :: T)
- Morley.Michelson.Typed.Sing: [STMap] :: forall (n_a2isi :: T) (n_a2isj :: T). () => Sing n_a2isi -> Sing n_a2isj -> SingT ('TMap n_a2isi n_a2isj :: T)
+ Morley.Michelson.Typed.Sing: [STMap] :: forall (n_a2MK1 :: T) (n_a2MK2 :: T). () => Sing n_a2MK1 -> Sing n_a2MK2 -> SingT ('TMap n_a2MK1 n_a2MK2 :: T)
- Morley.Michelson.Typed.Sing: [STOption] :: forall (n_a2irW :: T). () => Sing n_a2irW -> SingT ('TOption n_a2irW :: T)
+ Morley.Michelson.Typed.Sing: [STOption] :: forall (n_a2MJF :: T). () => Sing n_a2MJF -> SingT ('TOption n_a2MJF :: T)
- Morley.Michelson.Typed.Sing: [STOr] :: forall (n_a2isa :: T) (n_a2isb :: T). () => Sing n_a2isa -> Sing n_a2isb -> SingT ('TOr n_a2isa n_a2isb :: T)
+ Morley.Michelson.Typed.Sing: [STOr] :: forall (n_a2MJT :: T) (n_a2MJU :: T). () => Sing n_a2MJT -> Sing n_a2MJU -> SingT ('TOr n_a2MJT n_a2MJU :: T)
- Morley.Michelson.Typed.Sing: [STPair] :: forall (n_a2is6 :: T) (n_a2is7 :: T). () => Sing n_a2is6 -> Sing n_a2is7 -> SingT ('TPair n_a2is6 n_a2is7 :: T)
+ Morley.Michelson.Typed.Sing: [STPair] :: forall (n_a2MJP :: T) (n_a2MJQ :: T). () => Sing n_a2MJP -> Sing n_a2MJQ -> SingT ('TPair n_a2MJP n_a2MJQ :: T)
- Morley.Michelson.Typed.Sing: [STSaplingState] :: forall (n_a2isq :: Nat). () => Sing n_a2isq -> SingT ('TSaplingState n_a2isq :: T)
+ Morley.Michelson.Typed.Sing: [STSaplingState] :: forall (n_a2MK9 :: Nat). () => Sing n_a2MK9 -> SingT ('TSaplingState n_a2MK9 :: T)
- Morley.Michelson.Typed.Sing: [STSaplingTransaction] :: forall (n_a2iss :: Nat). () => Sing n_a2iss -> SingT ('TSaplingTransaction n_a2iss :: T)
+ Morley.Michelson.Typed.Sing: [STSaplingTransaction] :: forall (n_a2MKb :: Nat). () => Sing n_a2MKb -> SingT ('TSaplingTransaction n_a2MKb :: T)
- Morley.Michelson.Typed.Sing: [STSet] :: forall (n_a2is0 :: T). () => Sing n_a2is0 -> SingT ('TSet n_a2is0 :: T)
+ Morley.Michelson.Typed.Sing: [STSet] :: forall (n_a2MJJ :: T). () => Sing n_a2MJJ -> SingT ('TSet n_a2MJJ :: T)
- Morley.Michelson.Typed.Sing: [STTicket] :: forall (n_a2is4 :: T). () => Sing n_a2is4 -> SingT ('TTicket n_a2is4 :: T)
+ Morley.Michelson.Typed.Sing: [STTicket] :: forall (n_a2MJN :: T). () => Sing n_a2MJN -> SingT ('TTicket n_a2MJN :: T)
- Morley.Michelson.Typed.T: buildStack :: [T] -> Builder
+ Morley.Michelson.Typed.T: buildStack :: [T] -> Doc
- Morley.Michelson.Typed.Value: [CanBeCompared] :: Comparable t => Comparability t
+ Morley.Michelson.Typed.Value: [CanBeCompared] :: (Comparable t, ComparabilityImplies t) => Comparability t
- Morley.Michelson.Typed.Value: [CannotBeCompared] :: IsComparable t ~ 'False => Comparability t
+ Morley.Michelson.Typed.Value: [CannotBeCompared] :: ContainsT 'PSNonComparable t ~ 'True => Comparability t
- Morley.Michelson.Typed.Value: [VBigMap] :: forall k v instr. (SingI k, SingI v, Comparable k, HasNoBigMap v) => Maybe Natural -> Map (Value' instr k) (Value' instr v) -> Value' instr ('TBigMap k v)
+ Morley.Michelson.Typed.Value: [VBigMap] :: forall k v instr. (SingI v, Comparable k, ForbidBigMap v) => Maybe Natural -> Map (Value' instr k) (Value' instr v) -> Value' instr ('TBigMap k v)
- Morley.Michelson.Typed.Value: [VContract] :: forall arg instr. (SingI arg, HasNoOp arg) => Address -> SomeEntrypointCallT arg -> Value' instr ('TContract arg)
+ Morley.Michelson.Typed.Value: [VContract] :: forall arg instr. (SingI arg, ForbidOp arg) => Address -> SomeEntrypointCallT arg -> Value' instr ('TContract arg)
- Morley.Michelson.Typed.Value: [VLam] :: forall inp out instr. (SingI inp, SingI out, forall i o. Show (instr i o), forall i o. Eq (instr i o), forall i o. NFData (instr i o)) => LambdaCode' instr inp out -> Value' instr ('TLambda inp out)
+ Morley.Michelson.Typed.Value: [VLam] :: forall inp out instr. (SingI inp, SingI out) => LambdaCode' instr inp out -> Value' instr ('TLambda inp out)
- Morley.Michelson.Typed.Value: [VMap] :: forall k v instr. (SingI k, SingI v, Comparable k) => Map (Value' instr k) (Value' instr v) -> Value' instr ('TMap k v)
+ Morley.Michelson.Typed.Value: [VMap] :: forall k v instr. (SingI v, Comparable k) => Map (Value' instr k) (Value' instr v) -> Value' instr ('TMap k v)
- Morley.Michelson.Typed.Value: [VSet] :: forall t instr. (SingI t, Comparable t) => Set (Value' instr t) -> Value' instr ('TSet t)
+ Morley.Michelson.Typed.Value: [VSet] :: forall t instr. Comparable t => Set (Value' instr t) -> Value' instr ('TSet t)
- Morley.Michelson.Typed.Value: buildVContract :: Value' instr ('TContract arg) -> Builder
+ Morley.Michelson.Typed.Value: buildVContract :: Value' instr ('TContract arg) -> Doc
- Morley.Michelson.Untyped.Aliases: type ExpandedExtInstr = ExtInstrAbstract ExpandedOp
+ Morley.Michelson.Untyped.Aliases: type ExpandedExtInstr = ExtInstrAbstract [] ExpandedOp
- Morley.Michelson.Untyped.Aliases: type Value = Value' ExpandedOp
+ Morley.Michelson.Untyped.Aliases: type Value = Value' [] ExpandedOp
- Morley.Michelson.Untyped.Contract: CBCode :: [op] -> ContractBlock op
+ Morley.Michelson.Untyped.Contract: CBCode :: op -> ContractBlock op
- Morley.Michelson.Untyped.Contract: Contract :: ParameterType -> Storage -> [op] -> EntriesOrder -> ViewsSet op -> Contract' op
+ Morley.Michelson.Untyped.Contract: Contract :: ParameterType -> Storage -> op -> EntriesOrder -> ViewsSet op -> Contract' op
- Morley.Michelson.Untyped.Contract: View :: ViewName -> Ty -> Ty -> [op] -> View' op
+ Morley.Michelson.Untyped.Contract: View :: ViewName -> Ty -> Ty -> op -> View' op
- Morley.Michelson.Untyped.Contract: [contractCode] :: Contract' op -> [op]
+ Morley.Michelson.Untyped.Contract: [contractCode] :: Contract' op -> op
- Morley.Michelson.Untyped.Contract: [viewCode] :: View' op -> [op]
+ Morley.Michelson.Untyped.Contract: [viewCode] :: View' op -> op
- Morley.Michelson.Untyped.Contract: mapEntriesOrdered :: Contract' op -> (ParameterType -> a) -> (Storage -> a) -> ([op] -> a) -> (View' op -> a) -> [a]
+ Morley.Michelson.Untyped.Contract: mapEntriesOrdered :: Contract' op -> (ParameterType -> a) -> (Storage -> a) -> (op -> a) -> (View' op -> a) -> [a]
- Morley.Michelson.Untyped.Contract: orderContractBlock :: [ContractBlock op] -> Maybe (Contract' op)
+ Morley.Michelson.Untyped.Contract: orderContractBlock :: forall op. [ContractBlock op] -> Either (NonEmpty ContractBlockError) (Contract' op)
- Morley.Michelson.Untyped.Ext: STACKTYPE :: StackTypePattern -> ExtInstrAbstract op
+ Morley.Michelson.Untyped.Ext: STACKTYPE :: StackTypePattern -> ExtInstrAbstract f op
- Morley.Michelson.Untyped.Ext: TestAssert :: Text -> PrintComment -> [op] -> TestAssert op
+ Morley.Michelson.Untyped.Ext: TestAssert :: Text -> PrintComment -> f op -> TestAssert f (op :: Type)
- Morley.Michelson.Untyped.Ext: UCOMMENT :: Text -> ExtInstrAbstract op
+ Morley.Michelson.Untyped.Ext: UCOMMENT :: Text -> ExtInstrAbstract f op
- Morley.Michelson.Untyped.Ext: UPRINT :: PrintComment -> ExtInstrAbstract op
+ Morley.Michelson.Untyped.Ext: UPRINT :: PrintComment -> ExtInstrAbstract f op
- Morley.Michelson.Untyped.Ext: UTEST_ASSERT :: TestAssert op -> ExtInstrAbstract op
+ Morley.Michelson.Untyped.Ext: UTEST_ASSERT :: TestAssert f op -> ExtInstrAbstract f op
- Morley.Michelson.Untyped.Ext: [tassComment] :: TestAssert op -> PrintComment
+ Morley.Michelson.Untyped.Ext: [tassComment] :: TestAssert f (op :: Type) -> PrintComment
- Morley.Michelson.Untyped.Ext: [tassInstrs] :: TestAssert op -> [op]
+ Morley.Michelson.Untyped.Ext: [tassInstrs] :: TestAssert f (op :: Type) -> f op
- Morley.Michelson.Untyped.Ext: [tassName] :: TestAssert op -> Text
+ Morley.Michelson.Untyped.Ext: [tassName] :: TestAssert f (op :: Type) -> Text
- Morley.Michelson.Untyped.Ext: data ExtInstrAbstract op
+ Morley.Michelson.Untyped.Ext: data ExtInstrAbstract f op
- Morley.Michelson.Untyped.Ext: data TestAssert op
+ Morley.Michelson.Untyped.Ext: data TestAssert f (op :: Type)
- Morley.Michelson.Untyped.Instr: ABS :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: ABS :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: ADD :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: ADD :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: ADDRESS :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: ADDRESS :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: AMOUNT :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: AMOUNT :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: AND :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: AND :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: APPLY :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: APPLY :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: BALANCE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: BALANCE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: BLAKE2B :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: BLAKE2B :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: BYTES :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: BYTES :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: CAR :: VarAnn -> FieldAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: CAR :: VarAnn -> FieldAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: CAST :: VarAnn -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: CAST :: VarAnn -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: CDR :: VarAnn -> FieldAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: CDR :: VarAnn -> FieldAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: CHAIN_ID :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: CHAIN_ID :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: CHECK_SIGNATURE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: CHECK_SIGNATURE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: COMPARE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: COMPARE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: CONCAT :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: CONCAT :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: CONS :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: CONS :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: CONTRACT :: VarAnn -> FieldAnn -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: CONTRACT :: VarAnn -> FieldAnn -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: CREATE_CONTRACT :: VarAnn -> VarAnn -> Contract' op -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: CREATE_CONTRACT :: VarAnn -> VarAnn -> Contract' op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: DIG :: Word -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: DIG :: Word -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: DIP :: [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: DIP :: f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: DIPN :: Word -> [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: DIPN :: Word -> f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: DROP :: InstrAbstract op
+ Morley.Michelson.Untyped.Instr: DROP :: InstrAbstract f op
- Morley.Michelson.Untyped.Instr: DROPN :: Word -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: DROPN :: Word -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: DUG :: Word -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: DUG :: Word -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: DUP :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: DUP :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: DUPN :: VarAnn -> Word -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: DUPN :: VarAnn -> Word -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: EDIV :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: EDIV :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: EMIT :: VarAnn -> FieldAnn -> Maybe Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: EMIT :: VarAnn -> FieldAnn -> Maybe Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: EMPTY_BIG_MAP :: TypeAnn -> VarAnn -> Ty -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: EMPTY_BIG_MAP :: TypeAnn -> VarAnn -> Ty -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: EMPTY_MAP :: TypeAnn -> VarAnn -> Ty -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: EMPTY_MAP :: TypeAnn -> VarAnn -> Ty -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: EMPTY_SET :: TypeAnn -> VarAnn -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: EMPTY_SET :: TypeAnn -> VarAnn -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: EQ :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: EQ :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: EXEC :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: EXEC :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: EXT :: ExtInstrAbstract op -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: EXT :: ExtInstrAbstract f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: FAILWITH :: InstrAbstract op
+ Morley.Michelson.Untyped.Instr: FAILWITH :: InstrAbstract f op
- Morley.Michelson.Untyped.Instr: GE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: GE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: GET :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: GET :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: GETN :: VarAnn -> Word -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: GETN :: VarAnn -> Word -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: GET_AND_UPDATE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: GET_AND_UPDATE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: GT :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: GT :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: HASH_KEY :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: HASH_KEY :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: IF :: [op] -> [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: IF :: f op -> f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: IF_CONS :: [op] -> [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: IF_CONS :: f op -> f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: IF_LEFT :: [op] -> [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: IF_LEFT :: f op -> f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: IF_NONE :: [op] -> [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: IF_NONE :: f op -> f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: IMPLICIT_ACCOUNT :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: IMPLICIT_ACCOUNT :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: INT :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: INT :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: ISNAT :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: ISNAT :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: ITER :: [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: ITER :: f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: JOIN_TICKETS :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: JOIN_TICKETS :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: KECCAK :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: KECCAK :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LAMBDA :: VarAnn -> Ty -> Ty -> [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LAMBDA :: VarAnn -> Ty -> Ty -> f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LAMBDA_REC :: VarAnn -> Ty -> Ty -> [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LAMBDA_REC :: VarAnn -> Ty -> Ty -> f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LEFT :: TypeAnn -> VarAnn -> FieldAnn -> FieldAnn -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LEFT :: TypeAnn -> VarAnn -> FieldAnn -> FieldAnn -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LEVEL :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LEVEL :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LOOP :: [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LOOP :: f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LOOP_LEFT :: [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LOOP_LEFT :: f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LSL :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LSL :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LSR :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LSR :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: LT :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: LT :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: MAP :: VarAnn -> [op] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: MAP :: VarAnn -> f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: MEM :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: MEM :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: MIN_BLOCK_TIME :: [AnyAnn] -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: MIN_BLOCK_TIME :: [AnyAnn] -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: MUL :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: MUL :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: NAT :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: NAT :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: NEG :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: NEG :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: NEQ :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: NEQ :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: NEVER :: InstrAbstract op
+ Morley.Michelson.Untyped.Instr: NEVER :: InstrAbstract f op
- Morley.Michelson.Untyped.Instr: NIL :: TypeAnn -> VarAnn -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: NIL :: TypeAnn -> VarAnn -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: NONE :: TypeAnn -> VarAnn -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: NONE :: TypeAnn -> VarAnn -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: NOT :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: NOT :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: NOW :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: NOW :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: OPEN_CHEST :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: OPEN_CHEST :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: OR :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: OR :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: PACK :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: PACK :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: PAIR :: TypeAnn -> VarAnn -> FieldAnn -> FieldAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: PAIR :: TypeAnn -> VarAnn -> FieldAnn -> FieldAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: PAIRING_CHECK :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: PAIRING_CHECK :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: PAIRN :: VarAnn -> Word -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: PAIRN :: VarAnn -> Word -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: PUSH :: VarAnn -> Ty -> Value' op -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: PUSH :: VarAnn -> Ty -> Value' f op -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: READ_TICKET :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: READ_TICKET :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: RENAME :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: RENAME :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: RIGHT :: TypeAnn -> VarAnn -> FieldAnn -> FieldAnn -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: RIGHT :: TypeAnn -> VarAnn -> FieldAnn -> FieldAnn -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SAPLING_EMPTY_STATE :: VarAnn -> Natural -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SAPLING_EMPTY_STATE :: VarAnn -> Natural -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SAPLING_VERIFY_UPDATE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SAPLING_VERIFY_UPDATE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SELF :: VarAnn -> FieldAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SELF :: VarAnn -> FieldAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SELF_ADDRESS :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SELF_ADDRESS :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SENDER :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SENDER :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SET_DELEGATE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SET_DELEGATE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SHA256 :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SHA256 :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SHA3 :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SHA3 :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SHA512 :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SHA512 :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SIZE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SIZE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SLICE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SLICE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SOME :: TypeAnn -> VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SOME :: TypeAnn -> VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SOURCE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SOURCE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SPLIT_TICKET :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SPLIT_TICKET :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SUB :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SUB :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SUB_MUTEZ :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SUB_MUTEZ :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: SWAP :: InstrAbstract op
+ Morley.Michelson.Untyped.Instr: SWAP :: InstrAbstract f op
- Morley.Michelson.Untyped.Instr: TICKET :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: TICKET :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: TICKET_DEPRECATED :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: TICKET_DEPRECATED :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: TOTAL_VOTING_POWER :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: TOTAL_VOTING_POWER :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: TRANSFER_TOKENS :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: TRANSFER_TOKENS :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: UNIT :: TypeAnn -> VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: UNIT :: TypeAnn -> VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: UNPACK :: TypeAnn -> VarAnn -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: UNPACK :: TypeAnn -> VarAnn -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: UNPAIR :: VarAnn -> VarAnn -> FieldAnn -> FieldAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: UNPAIR :: VarAnn -> VarAnn -> FieldAnn -> FieldAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: UNPAIRN :: Word -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: UNPAIRN :: Word -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: UPDATE :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: UPDATE :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: UPDATEN :: VarAnn -> Word -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: UPDATEN :: VarAnn -> Word -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: VIEW :: VarAnn -> ViewName -> Ty -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: VIEW :: VarAnn -> ViewName -> Ty -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: VOTING_POWER :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: VOTING_POWER :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: XOR :: VarAnn -> InstrAbstract op
+ Morley.Michelson.Untyped.Instr: XOR :: VarAnn -> InstrAbstract f op
- Morley.Michelson.Untyped.Instr: data InstrAbstract op
+ Morley.Michelson.Untyped.Instr: data InstrAbstract f op
- Morley.Michelson.Untyped.Instr: type ExpandedInstr = InstrAbstract ExpandedOp
+ Morley.Michelson.Untyped.Instr: type ExpandedInstr = InstrAbstract [] ExpandedOp
- Morley.Michelson.Untyped.Type: renderType :: T -> Bool -> RenderContext -> AnnotationSet -> Doc
+ Morley.Michelson.Untyped.Type: renderType :: T -> RenderContext -> AnnotationSet -> Doc
- Morley.Michelson.Untyped.Value: Elt :: Value' op -> Value' op -> Elt op
+ Morley.Michelson.Untyped.Value: Elt :: Value' f op -> Value' f op -> Elt f op
- Morley.Michelson.Untyped.Value: ValueBytes :: InternalByteString -> Value' op
+ Morley.Michelson.Untyped.Value: ValueBytes :: InternalByteString -> Value' f op
- Morley.Michelson.Untyped.Value: ValueFalse :: Value' op
+ Morley.Michelson.Untyped.Value: ValueFalse :: Value' f op
- Morley.Michelson.Untyped.Value: ValueInt :: Integer -> Value' op
+ Morley.Michelson.Untyped.Value: ValueInt :: Integer -> Value' f op
- Morley.Michelson.Untyped.Value: ValueLamRec :: NonEmpty op -> Value' op
+ Morley.Michelson.Untyped.Value: ValueLamRec :: f op -> Value' f op
- Morley.Michelson.Untyped.Value: ValueLambda :: NonEmpty op -> Value' op
+ Morley.Michelson.Untyped.Value: ValueLambda :: f op -> Value' f op
- Morley.Michelson.Untyped.Value: ValueLeft :: Value' op -> Value' op
+ Morley.Michelson.Untyped.Value: ValueLeft :: Value' f op -> Value' f op
- Morley.Michelson.Untyped.Value: ValueMap :: (NonEmpty $ Elt op) -> Value' op
+ Morley.Michelson.Untyped.Value: ValueMap :: (NonEmpty $ Elt f op) -> Value' f op
- Morley.Michelson.Untyped.Value: ValueNil :: Value' op
+ Morley.Michelson.Untyped.Value: ValueNil :: Value' f op
- Morley.Michelson.Untyped.Value: ValueNone :: Value' op
+ Morley.Michelson.Untyped.Value: ValueNone :: Value' f op
- Morley.Michelson.Untyped.Value: ValuePair :: Value' op -> Value' op -> Value' op
+ Morley.Michelson.Untyped.Value: ValuePair :: Value' f op -> Value' f op -> Value' f op
- Morley.Michelson.Untyped.Value: ValueRight :: Value' op -> Value' op
+ Morley.Michelson.Untyped.Value: ValueRight :: Value' f op -> Value' f op
- Morley.Michelson.Untyped.Value: ValueSeq :: (NonEmpty $ Value' op) -> Value' op
+ Morley.Michelson.Untyped.Value: ValueSeq :: (NonEmpty $ Value' f op) -> Value' f op
- Morley.Michelson.Untyped.Value: ValueSome :: Value' op -> Value' op
+ Morley.Michelson.Untyped.Value: ValueSome :: Value' f op -> Value' f op
- Morley.Michelson.Untyped.Value: ValueString :: MText -> Value' op
+ Morley.Michelson.Untyped.Value: ValueString :: MText -> Value' f op
- Morley.Michelson.Untyped.Value: ValueTrue :: Value' op
+ Morley.Michelson.Untyped.Value: ValueTrue :: Value' f op
- Morley.Michelson.Untyped.Value: ValueUnit :: Value' op
+ Morley.Michelson.Untyped.Value: ValueUnit :: Value' f op
- Morley.Michelson.Untyped.Value: data Elt op
+ Morley.Michelson.Untyped.Value: data Elt f op
- Morley.Michelson.Untyped.Value: data Value' op
+ Morley.Michelson.Untyped.Value: data Value' f op
- Morley.Michelson.Untyped.View: View :: ViewName -> Ty -> Ty -> [op] -> View' op
+ Morley.Michelson.Untyped.View: View :: ViewName -> Ty -> Ty -> op -> View' op
- Morley.Michelson.Untyped.View: [viewCode] :: View' op -> [op]
+ Morley.Michelson.Untyped.View: [viewCode] :: View' op -> op
- Morley.Tezos.Address.Alias: aliasPrefix :: forall addressKind. (L1AddressKind addressKind, SingI addressKind) => Builder
+ Morley.Tezos.Address.Alias: aliasPrefix :: forall addressKind. (L1AddressKind addressKind, SingI addressKind) => Doc
- Morley.Tezos.Address.Alias: contractPrefix :: Builder
+ Morley.Tezos.Address.Alias: contractPrefix :: Doc
- Morley.Tezos.Address.Alias: implicitPrefix :: Builder
+ Morley.Tezos.Address.Alias: implicitPrefix :: Doc
- Morley.Tezos.Crypto: CryptoParseUnexpectedLength :: Builder -> Int -> CryptoParseError
+ Morley.Tezos.Crypto: CryptoParseUnexpectedLength :: LText -> Int -> CryptoParseError
- Morley.Tezos.Crypto: CryptoParseUnsupportedTag :: Builder -> ByteString -> CryptoParseError
+ Morley.Tezos.Crypto: CryptoParseUnsupportedTag :: LText -> ByteString -> CryptoParseError
- Morley.Tezos.Crypto.Util: CryptoParseUnexpectedLength :: Builder -> Int -> CryptoParseError
+ Morley.Tezos.Crypto.Util: CryptoParseUnexpectedLength :: LText -> Int -> CryptoParseError
- Morley.Tezos.Crypto.Util: CryptoParseUnsupportedTag :: Builder -> ByteString -> CryptoParseError
+ Morley.Tezos.Crypto.Util: CryptoParseUnsupportedTag :: LText -> ByteString -> CryptoParseError
- Morley.Util.Markdown: mdComment :: Builder -> Builder
+ Morley.Util.Markdown: mdComment :: Doc -> Doc
- Morley.Util.Markdown: type Markdown = Builder
+ Morley.Util.Markdown: type Markdown = Doc
- Morley.Util.Peano: [SS] :: forall (n_a20au :: Nat). () => !Sing n_a20au -> SingNat ('S n_a20au :: Nat)
+ Morley.Util.Peano: [SS] :: forall (n_a2uzn :: Nat). () => !Sing n_a2uzn -> SingNat ('S n_a2uzn :: Nat)
Files
- CHANGES.md +117/−0
- app/Main.hs +3/−301
- app/REPL.hs +0/−327
- morley.cabal +21/−19
- src/Morley/App/CLI.hs +303/−0
- src/Morley/App/REPL.hs +318/−0
- src/Morley/AsRPC.hs +395/−365
- src/Morley/Micheline/Binary.hs +3/−8
- src/Morley/Micheline/Class.hs +942/−1043
- src/Morley/Micheline/Expression.hs +41/−91
- src/Morley/Micheline/Expression/Internal/MichelinePrimitive.hs +127/−0
- src/Morley/Micheline/Expression/Internal/TH.hs +33/−0
- src/Morley/Michelson/Analyzer.hs +3/−4
- src/Morley/Michelson/Doc.hs +2/−2
- src/Morley/Michelson/ErrorPos.hs +3/−9
- src/Morley/Michelson/Internal/ViewName.hs +3/−3
- src/Morley/Michelson/Interpret.hs +349/−211
- src/Morley/Michelson/Macro.hs +117/−72
- src/Morley/Michelson/Optimizer.hs +3/−631
- src/Morley/Michelson/Optimizer/Internal/Rules.hs +526/−0
- src/Morley/Michelson/Optimizer/Internal/Ruleset.hs +78/−0
- src/Morley/Michelson/Optimizer/Utils.hs +107/−0
- src/Morley/Michelson/Parser.hs +98/−40
- src/Morley/Michelson/Parser/Instr.hs +50/−68
- src/Morley/Michelson/Parser/Macro.hs +110/−47
- src/Morley/Michelson/Parser/Value.hs +38/−42
- src/Morley/Michelson/Printer.hs +5/−7
- src/Morley/Michelson/Printer/Util.hs +52/−29
- src/Morley/Michelson/Runtime.hs +80/−53
- src/Morley/Michelson/Runtime/GState.hs +2/−1
- src/Morley/Michelson/Runtime/TxData.hs +6/−0
- src/Morley/Michelson/TypeCheck/Error.hs +114/−113
- src/Morley/Michelson/TypeCheck/Ext.hs +2/−2
- src/Morley/Michelson/TypeCheck/Helpers.hs +18/−18
- src/Morley/Michelson/TypeCheck/Instr.hs +46/−47
- src/Morley/Michelson/TypeCheck/TypeCheck.hs +6/−6
- src/Morley/Michelson/TypeCheck/TypeCheckedOp.hs +69/−23
- src/Morley/Michelson/TypeCheck/TypeCheckedSeq.hs +8/−5
- src/Morley/Michelson/TypeCheck/Types.hs +5/−10
- src/Morley/Michelson/TypeCheck/Value.hs +52/−38
- src/Morley/Michelson/Typed/Annotation.hs +1/−6
- src/Morley/Michelson/Typed/ClassifiedInstr/Internal/TH.hs +12/−10
- src/Morley/Michelson/Typed/ClassifiedInstr/Internal/Types.hs +6/−4
- src/Morley/Michelson/Typed/Contract.hs +1/−25
- src/Morley/Michelson/Typed/Convert.hs +126/−106
- src/Morley/Michelson/Typed/Entrypoints.hs +26/−39
- src/Morley/Michelson/Typed/Existential.hs +1/−1
- src/Morley/Michelson/Typed/Haskell/Doc.hs +16/−12
- src/Morley/Michelson/Typed/Haskell/Value.hs +3/−3
- src/Morley/Michelson/Typed/Instr.hs +12/−6
- src/Morley/Michelson/Typed/Operation.hs +150/−5
- src/Morley/Michelson/Typed/Polymorphic.hs +1/−1
- src/Morley/Michelson/Typed/Scope.hs +134/−1413
- src/Morley/Michelson/Typed/Scope/Internal/CheckScope.hs +102/−0
- src/Morley/Michelson/Typed/Scope/Internal/Comparable.hs +146/−0
- src/Morley/Michelson/Typed/Scope/Internal/Deprecated.hs +299/−0
- src/Morley/Michelson/Typed/Scope/Internal/ForbidT.hs +225/−0
- src/Morley/Michelson/Typed/Scope/Internal/Presence.hs +152/−0
- src/Morley/Michelson/Typed/Scope/Internal/Scopes.hs +244/−0
- src/Morley/Michelson/Typed/Scope/Internal/TH.hs +26/−0
- src/Morley/Michelson/Typed/Scope/Internal/WellTyped.hs +169/−0
- src/Morley/Michelson/Typed/Scope/Internal/WithDeMorganScope.hs +147/−0
- src/Morley/Michelson/Typed/Sing.hs +6/−6
- src/Morley/Michelson/Typed/T.hs +5/−14
- src/Morley/Michelson/Typed/Util.hs +7/−15
- src/Morley/Michelson/Typed/Value.hs +28/−16
- src/Morley/Michelson/Typed/View.hs +9/−4
- src/Morley/Michelson/Untyped/Aliases.hs +2/−2
- src/Morley/Michelson/Untyped/Annotation.hs +4/−10
- src/Morley/Michelson/Untyped/Contract.hs +71/−34
- src/Morley/Michelson/Untyped/Entrypoints.hs +4/−8
- src/Morley/Michelson/Untyped/Ext.hs +47/−17
- src/Morley/Michelson/Untyped/HoistInstr.hs +10/−0
- src/Morley/Michelson/Untyped/Instr.hs +166/−43
- src/Morley/Michelson/Untyped/Type.hs +16/−43
- src/Morley/Michelson/Untyped/Value.hs +62/−48
- src/Morley/Michelson/Untyped/View.hs +8/−3
- src/Morley/Tezos/Address.hs +18/−26
- src/Morley/Tezos/Address/Alias.hs +3/−3
- src/Morley/Tezos/Crypto.hs +1/−2
- src/Morley/Tezos/Crypto/BLS.hs +2/−2
- src/Morley/Tezos/Crypto/BLS12381.hs +7/−12
- src/Morley/Tezos/Crypto/Util.hs +10/−15
- src/Morley/Util/Instances.hs +0/−7
- src/Morley/Util/Interpolate.hs +7/−8
- src/Morley/Util/Interpolate/Internal.hs +3/−15
- src/Morley/Util/Markdown.hs +3/−3
- src/Morley/Util/MismatchError.hs +36/−41
- src/Morley/Util/Peano.hs +2/−15
- src/Morley/Util/PeanoNatural.hs +3/−3
- src/Morley/Util/StubbedProof.hs +1/−0
- src/Morley/Util/Type.hs +1/−94
CHANGES.md view
@@ -1,6 +1,123 @@ <!-- Unreleased: append new entries here --> +1.19.2+======+* [!1365](https://gitlab.com/morley-framework/morley/-/merge_requests/1365)+ Split optimizer module+ + More utilities for writing rules are now exported from+ `Morley.Michelson.Optimizer.Utils`;+ + Fixed a bug with missing pattern in the `Buildable OptimizationStage`+ instance.+* [!1352](https://gitlab.com/morley-framework/morley/-/merge_requests/1352)+ Clean-up Buildable ExecutorOp implementation+ + Add `Buildable` instances for `OriginationOperation`, `TransferOperation`,+ `SetDelegateOperation`, `EmitOperation`;+ + Rewrite `Buildable ExecutorOp` to delegate to these new instances.+* [!1357](https://gitlab.com/morley-framework/morley/-/merge_requests/1357)+ Better tests for `PACK`+ + Fix an issue when untyping `CREATE_CONTRACT` instruction -- morley would+ always use `Readable` representation for its contents;+ + Fix an issue in typechecking `CREATE_CONTRACT` instruction -- morley+ `SELF` inside `CREATE_CONTRACT` inside lambdas was rejected.+* [!1349](https://gitlab.com/morley-framework/morley/-/merge_requests/1349)+ Improve morley compilation time+ + `Forbid*` constraints are no longer carried as superclasses of `Comparable`.+ Match on `comparableImplies` to bring those into scope. In case of+ impossible patterns, empty `case` with `checkComparability` should do the+ trick.+* [!1351](https://gitlab.com/morley-framework/morley/-/merge_requests/1351)+ Fix and improve `Buildable MichelsonFailureWithStack`+* [!1346](https://gitlab.com/morley-framework/morley/-/merge_requests/1346)+ Use proper datatype for Micheline primitives, refactor some FromExp instances+ + Replace a list of strings with a proper datatype for Micheline primitives+ + Refactor `FromExp` instances to make pattern-matches (more) total and reduce+ redundancy+ + Make `FromExp` exceptions more structured+ + Other minor refactoring+* [!1342](https://gitlab.com/morley-framework/morley/-/merge_requests/1342)+ Replace fmt with prettyprinter+ + Introduce overlappable `Buildable` instance for anything `RenderDoc` to+ avoid proliferation of trivial instances+ + Deprecate `buildRenderDoc` and `buildRenderDocExtended`+ + Replace unnecessary `RenderDoc` instances with `Buildable` (this refers to+ various error types)+ + `printDoc`, `printDocB`, `printDocS` deprecated in favor of+ `printRenderDoc`+ + Redundant `forceSingleLine` parameter to `renderType` removed+ + Obsolete `Prettier` newtype deprecated+ + Improve `NotWellTyped` error formatting+ + Improve formatting for `Buildable ExecutorOp`+* [!1347](https://gitlab.com/morley-framework/morley/-/merge_requests/1347)+ Better errors for missing contract fields+ + Improve efficiency when constructing untyped contract from list of contract+ blocks+ + Rename `UnsafeViewsSet` to `ViewsSet`, as there's nothing inherently unsafe+ about this constructor any more (old name is left as a pattern synonym, but+ deprecated)+* [!1343](https://gitlab.com/morley-framework/morley/-/merge_requests/1343)+ Fix optimizer dipSwapDrop regression+ + Fixed a bug where `DIP n code` would be deoptimized into `DIP (n - 1) {+ SWAP; code }`+ + While at it, `DUP; DUG (m + 1); DROP` is now optimized to `DUG m`+* [!1344](https://gitlab.com/morley-framework/morley/-/merge_requests/1344)+ Typecheck recursive lambda values+* [!1323](https://gitlab.com/morley-framework/morley/-/merge_requests/1323)+ Trace called contracts on error+ + Trace operations in the Morley emulator+* [!1310](https://gitlab.com/morley-framework/morley/-/merge_requests/1310)+ Various parser fixes+ + Make parser stricter wrt braces around code blocks. Now things like `DIP+ DROP` are rejected (as per reference), but `DIP FAIL` are allowed (as `FAIL`+ is a macro)+ + Properly handle braced code blocks in typechecker's verbose error messages+ + Use optimized untyped contract representation in `toExpression`+ + Fix macro expansion rules to match reference; add macro expansion tests+ against reference+* [!1341](https://gitlab.com/morley-framework/morley/-/merge_requests/1341)+ Refactor scope constraints+ + Unified all `check*Presence` functions into `checkTPresence`+ + Unified all `*Absense` (sic) and `check*Presence` into `tAbsence` and+ `tPresence`+ + Unified all `Contains*` type families, plus `IsComparable` into `ContainsT`+ + All now-redundant synonyms are deprecated+ + Deprecate `HasNo*` and `Proper*BetterErrors` in favor of `Forbid*` and+ `*Scope` respectively.+ + Simplify `WithDeMorganScope`+ + Avoid unnecessary singleton traversals using `checkTPresence`, remove where+ possible, use de Morgan laws otherwise.+ + Improve `Forbid*` error messages+ + Improve `*Scope` error messages with the suggestion to add the corresponding+ scope constraint+ + Improve error messages on stuck type families with `Forbid*` and `*Scope`+ + Drop redundant uses of `(:-)` implication in `AsRPC`, use constraints+ explicitly+* [!1293](https://gitlab.com/morley-framework/morley/-/merge_requests/1293)+ Add extensible metadata field to StkEl+* [!1335](https://gitlab.com/morley-framework/morley/-/merge_requests/1335)+ Include morley CLI commands with morley-client+ + Moved morley CLI parser and REPL to library under `Morley.App`+* [!1333](https://gitlab.com/morley-framework/morley/-/merge_requests/1333)+ Improve typechecker error rendering+ + Switched to `prettyprinter` from `wl-pprint-text`+ + Introduced `Morley.Michelson.Printer.Compat` as a thin compatibility layer+* [!1336](https://gitlab.com/morley-framework/morley/-/merge_requests/1336)+ Improve non-recursive `deriveRPC` errors+ + Print human-readable error messages when required `HasRPCRepr` instances are+ missing in non-recursive mode (i.e. `droRecursive=False`)+* [!1340](https://gitlab.com/morley-framework/morley/-/merge_requests/1340)+ Remove deprecated types and functions+ + `haskellRepStripFieldPrefix`+ + `Morley.Michelson.Typed.Contract.mapEntriesOrdered`+ + `Morley.Michelson.Untyped.Contract.mapContractCode`+ + `linearizeRightCombValuePair`+ + `expandList`+ + `(|-)`+ + `MockableConstraint` and `unsafeProvideConstraint`+ + `failUnlessEvi`+ + `failWhenEvi`+ + `ConcatListOfTypesAssociativity` and `listOfTypesConcatAssociativityAxiom`+ 1.19.1 ====== * [!1325](https://gitlab.com/morley-framework/morley/-/merge_requests/1325)
app/Main.hs view
@@ -5,312 +5,14 @@ ( main ) where -import Data.Default (def)-import Data.Singletons (demote)-import Data.Text.Lazy.IO.Utf8 qualified as Utf8 (writeFile) import Data.Version (showVersion)-import Fmt (pretty, unlinesF)-import Named (paramF) import Options.Applicative- (execParser, footerDoc, fullDesc, header, help, helper, info, infoOption, long, progDesc, short,- subparser, switch)-import Options.Applicative qualified as Opt+ (execParser, footerDoc, fullDesc, header, help, helper, info, infoOption, long, progDesc) import Options.Applicative.Help.Pretty (Doc, linebreak) import Paths_morley (version)-import Text.Hex (encodeHex) -import Morley.CLI-import Morley.Michelson.Analyzer (analyze)-import Morley.Michelson.Interpret (RemainingSteps(..))-import Morley.Michelson.Optimizer (OptimizerConf(..), optimizeVerboseWithConf)-import Morley.Michelson.Printer (printSomeContract, printTypedContract, printUntypedContract)-import Morley.Michelson.Runtime-import Morley.Michelson.Runtime.GState (genesisAddress)-import Morley.Michelson.TypeCheck (tcVerbose, typeCheckContract, typeCheckValue, typeCheckingWith)-import Morley.Michelson.TypeCheck qualified as TypeCheck-import Morley.Michelson.Typed (Contract'(..), SomeContract(..), unContractCode)-import Morley.Michelson.Typed qualified as T-import Morley.Michelson.Typed.Contract (mapContractCodeM)-import Morley.Tezos.Address-import Morley.Tezos.Address.Alias-import Morley.Tezos.Core (Mutez, tz)-import Morley.Tezos.Crypto.Timelock (chestBytes, chestKeyBytes, createChestAndChestKey)-import Morley.Util.CLI (mkCLOptionParser, mkCommandParser, outputOption)-import Morley.Util.Main (wrapMain)-import Morley.Util.Named-import REPL--data DryRunOrWrite = DryRun | Write--mkCommandParser' :: String -> String -> Opt.Parser a -> Opt.Mod Opt.CommandFields a-mkCommandParser' = flip . mkCommandParser--argParser :: Opt.Parser (IO ())-argParser = subparser $ mconcat- [ printSubCmd- , typecheckSubCmd- , emulateSubCmd- , optimizeSubCmd- , analyzeSubCmd- , createChestSubCmd- , replSubCmd- ]------------------------------------------------------------------------------------- Subcommands------------------------------------------------------------------------------------- NB: in case this looks mysterious, in IOCmd functions, outer 'do' is--- Opt.Parser using ApplicativeDo, which then returns an IO action, i.e. inner--- 'do' is 'IO ()'. -- @lierdakil--type IOCmd = Opt.Mod Opt.CommandFields (IO ())--typecheckSubCmd :: IOCmd-typecheckSubCmd = mkCommandParser' "typecheck" "Typecheck passed contract." do- contractFile <- optional contractFileOption- tcOptions <- typeCheckOptionsOption- pure do- morleyContract <- prepareContract contractFile- -- At the moment of writing, 'tcStrict' option does not change anything- -- because it affects only values parsing; but this may change- contract <- either throwM pure . typeCheckingWith tcOptions- $ typeCheckContract morleyContract- when (TypeCheck.tcVerbose tcOptions) $- putStrLn $ printSomeContract False contract- putTextLn "Contract is well-typed"--printSubCmd :: IOCmd-printSubCmd = mkCommandParser' "print"- "Parse a Morley contract and print corresponding Michelson \- \contract that can be parsed by the OCaml reference client: octez-client."- do- mInputFile <- optional contractFileOption- mOutputFile <- outputOption- forceSingleLine <- onelineOption- pure do- contract <- prepareContract mInputFile- let write = maybe putStrLn Utf8.writeFile mOutputFile- write $ printUntypedContract forceSingleLine contract--emulateSubCmd :: IOCmd-emulateSubCmd = mkCommandParser' "emulate" "Set of commands to run in an emulated environment." $- subparser $ mconcat- [ runSubCmd- , originateSubCmd- , transferSubCmd- , transferTicketSubCmd- , runViewSubCmd- ]--runSubCmd :: IOCmd-runSubCmd = mkCommandParser' "run"- "Run passed contract. It's originated first and then a transaction is sent to it." do- txData <- txDataOption- contract <- contractSimpleOriginationDataOption- cro <- commonRunOptions Write- pure do- michelsonContract <- traverse prepareContract contract- void $ runContract cro michelsonContract txData--runViewSubCmd :: IOCmd-runViewSubCmd = mkCommandParser' "view"- "Run some view on a contract either supplied directly or identified \- \by an address. It's originated first if supplied directly." do- cro <- commonRunOptions Write- addressOrContract <-- ContractSpecAddressOrAlias <$> addressOrAliasOption Nothing- ! #name "contract-addr"- ! #help "Contract address to call view on."- <|> ContractSpecOrigination <$> contractSimpleOriginationDataOption- viewName <- mkCLOptionParser Nothing- ! #name "name"- ! #help "View name."- sender <- someAddressOrAliasOption- (Just $ SAOAKindSpecified $ AddressResolved genesisAddress)- ! #name "sender"- ! #help "Sender address."- viewArg <- TxUntypedParam <$> valueOption Nothing- ! #name "arg"- ! #help "View call argument."- pure do- contractSpec <- (traverse . traverse) prepareContract addressOrContract- void $ runView cro contractSpec viewName sender viewArg--replSubCmd :: IOCmd-replSubCmd = mkCommandParser' "repl" "Start a Morley REPL." $ pure runRepl--originateSubCmd :: IOCmd-originateSubCmd = mkCommandParser' "originate" "Originate passed contract. Add it to passed DB." do- simpleOriginationData <- contractSimpleOriginationDataOption- dbPath <- dbPathOption- tcOptions <- typeCheckOptionsOption- verbose <- verboseFlag- originator <- addressOption (Just genesisAddress)- ! #name "originator"- ! #help "Contract's originator."- alias <- optional (aliasOption "alias")- delegate <- optional $ keyHashOption Nothing- ! #name "delegate"- ! #help "Contract's optional delegate."- pure do- michelsonContract <- traverse prepareContract simpleOriginationData- addr <-- originateContract- ! #dbPath dbPath- ! #tcOpts tcOptions- ! #originator originator- ! paramF #alias alias- ! paramF #delegate delegate- ! #csod michelsonContract- ! #verbose verbose- putTextLn $ "Originated contract " <> pretty addr--transferSubCmd :: IOCmd-transferSubCmd = mkCommandParser' "transfer" "Transfer tokens to given address." do- destination <- someAddressOrAliasOption Nothing- ! #name "to"- ! #help "Address or alias of the transfer's destination."- txData <- txDataOption- cro <- commonRunOptions DryRun- pure $ transfer cro destination txData--transferTicketSubCmd :: IOCmd-transferTicketSubCmd = mkCommandParser' "transfer-ticket" "Transfer ticket to given address." do- destination <- someAddressOrAliasOption Nothing- ! #name "to"- ! #help "Address or alias of the transfer's destination."- tdSenderAddress :: L1Address <- Constrained <$> addressOption (Just genesisAddress)- ! #name "sender" ! #help "Sender address"- ticketer <- mkCLOptionParser @Address Nothing- ! #name "ticketer" ! #help "Ticketer"- value <- valueOption Nothing- ! #name "value" ! #help "Ticket value"- ty <- mkCLOptionParser Nothing- ! #name "type" ! #help "Ticket argument type"- tAmount <- mkCLOptionParser @Natural Nothing- ! #name "amount" ! #help "Amount of tickets"- tdAmount <- mutezOption (Just minBound)- ! #name "mutez" ! #help "Mutez amount additionally sent by a transaction. \- \Note that on network, as of Mumbai, implicit accounts can't send tickets \- \and mutez in the same operation, however the Morley emulator allows it."- tdEntrypoint <- entrypointOption- ! #name "entrypoint" ! #help "Entrypoint to call"- cro <- commonRunOptions DryRun- pure $ T.withUType ty \(_ :: T.Notes t) -> do- tValue <- either throwM pure . typeCheckingWith (croTCOpts cro) $- typeCheckValue @t value- T.Dict <- either (throwM . TypeCheck.UnsupportedTypeForScope (demote @t)) pure $- T.checkScope @(T.ParameterScope t, T.Comparable t)- let tdParameter = TxTypedParam $ T.VTicket ticketer tValue tAmount- transfer cro destination TxData{..}--optimizeSubCmd :: IOCmd-optimizeSubCmd = mkCommandParser' "optimize" "Optimize the contract." do- contractFile <- optional contractFileOption- output <- outputOption- singleLine <- onelineOption- maxStageIterations <- mkCLOptionParser (Just $ ocMaxIterations def)- ! #name "max-stage-iterations"- ! #help "Maximum number of iterations per optimizer stage. \- \The default is usually adequate, but you want to try raising it \- \to see if it affects the result."- verbose <- verboseFlag- pure do- untypedContract <- prepareContract contractFile- SomeContract checkedContract <-- either throwM pure . typeCheckingWith laxTcOptions $- typeCheckContract untypedContract- let (logs, optimizedContract) =- mapContractCodeM (optimizeVerboseWithConf conf) checkedContract- conf = def { ocMaxIterations = maxStageIterations }- maybe putStrLn Utf8.writeFile output $ printTypedContract singleLine optimizedContract- when verbose $ hPutStrLn stderr $ pretty @_ @Text $ unlinesF logs--analyzeSubCmd :: IOCmd-analyzeSubCmd = mkCommandParser' "analyze" "Analyze the contract." do- contractFile <- optional contractFileOption- pure do- untypedContract <- prepareContract contractFile- SomeContract contract <-- either throwM pure . typeCheckingWith laxTcOptions $- typeCheckContract untypedContract- putTextLn $ pretty $ analyze (unContractCode $ cCode contract)--createChestSubCmd :: IOCmd-createChestSubCmd = mkCommandParser' "create_chest" "Create a timelocked chest and key." do- payload <- payloadOption- time <- timeOption- pure do- (chest, key) <- createChestAndChestKey payload time- putStrLn $ "Chest: 0x" <> encodeHex (chestBytes chest)- putStrLn $ "Key: 0x" <> encodeHex (chestKeyBytes key)------------------------------------------------------------------------------------- Parsers-----------------------------------------------------------------------------------verboseFlag :: Opt.Parser Bool-verboseFlag = switch $- short 'v' <>- long "verbose" <>- help "Whether output should be verbose."--typeCheckOptionsOption :: Opt.Parser TypeCheck.TypeCheckOptions-typeCheckOptionsOption = do- tcVerbose <- verboseFlag- tcStrict <- fmap not . switch $- long "typecheck-lax" <>- help "Whether actions permitted in `octez-client run` but forbidden in \- \e.g. `octez-client originate` should be allowed here."- return TypeCheck.TypeCheckOptions{..}--commonRunOptions :: DryRunOrWrite -> Opt.Parser CommonRunOptions-commonRunOptions defaultDryRun = do- croNow <- nowOption- croLevel <- fromMaybe (croLevel def) <$> levelOption- croMinBlockTime <- fromMaybe (croMinBlockTime def) <$> minBlockTimeOption- croMaxSteps <- RemainingSteps <$> maxStepsOption- croDBPath <- dbPathOption- croTCOpts <- typeCheckOptionsOption- croVerbose <- verboseFlag- croDryRun <- case defaultDryRun of- Write -> fmap not . switch $- long "write" <>- help "Write updated DB to the DB file."- DryRun -> switch $- long "dry-run" <>- help "Do not write updated DB to the DB file."- pure CommonRunOptions{..}--contractSimpleOriginationDataOption :: Opt.Parser (ContractSimpleOriginationData (Maybe FilePath))-contractSimpleOriginationDataOption = do- csodStorage <- valueOption Nothing- ! #name "storage"- ! #help "Initial storage of the contract."- csodContract <- optional contractFileOption- csodBalance <- mutezOption (Just defaultBalance)- ! #name "balance"- ! #help "Initial balance of the contract."- pure ContractSimpleOriginationData{..}------------------------------------------------------------------------------------- Constants-----------------------------------------------------------------------------------defaultBalance :: Mutez-defaultBalance = [tz|4|]---- | Most permitting options, when we don't care much about typechecking.-laxTcOptions :: TypeCheck.TypeCheckOptions-laxTcOptions = TypeCheck.TypeCheckOptions- { TypeCheck.tcVerbose = False- , TypeCheck.tcStrict = False- }------------------------------------------------------------------------------------- Actual main---------------------------------------------------------------------------------+import Morley.App.CLI+import Morley.Util.Main main :: IO () main = wrapMain $ join $ execParser programInfo
− app/REPL.hs
@@ -1,327 +0,0 @@--- SPDX-FileCopyrightText: 2021 Oxhead Alpha--- SPDX-License-Identifier: LicenseRef-MIT-OA-{-|-Implements an REPL that can execute Morley instructions. REPL starts with an-empty stack. At each instruction entered, the modified stack, or an error is-printed. Multiple instructions separated by semicolons should work as expected.-Available meta commads are:-- ':help', displays this help\n ':stack', prints the current stack- ':loadstack filename', loads the stack from a file- ':dumpstack filename', dumps the stack to a file- ':clear', clears the current stack. Ctrl-D or ':quit' to end REPL."--}-module REPL- ( runRepl- ) where--import Control.Exception (IOException)-import Control.Monad.Random (randomIO)-import Data.Aeson qualified as Aeson-import Data.ByteString.Base58 qualified as Base58-import Data.ByteString.Lazy qualified as BSL-import Data.List (stripPrefix)-import Data.Singletons (fromSing)-import Data.Text as T (length, replicate, strip)-import Data.Text qualified as T (stripPrefix)-import Data.Vinyl (Rec(..))-import Fmt (fmt, pretty)-import System.Console.Haskeline- (InputT, Interrupt(..), defaultSettings, getInputLine, runInputT, withInterrupt)-import Text.Megaparsec (parse)--import Morley.Michelson.Interpret (interpretInstr)-import Morley.Michelson.Macro (ParsedOp, expand)-import Morley.Michelson.Parser (errorBundlePretty, ops, parseExpandValue, parseNoEnv, type_)-import Morley.Michelson.Parser.Types (MichelsonSource(..))-import Morley.Michelson.Printer (printDoc, printTypedValue)-import Morley.Michelson.Printer.Util (buildRenderDoc, doesntNeedParens)-import Morley.Michelson.Runtime.Dummy-import Morley.Michelson.Runtime.Import (readValue)-import Morley.Michelson.TypeCheck- (SomeTcInstr(..), SomeTcInstrOut(..), TypeCheckOptions(..), runTypeCheckIsolated,- typeCheckingWith)-import Morley.Michelson.TypeCheck.Instr (typeCheckList, typeCheckParameter)-import Morley.Michelson.TypeCheck.Types (HST(..))-import Morley.Michelson.Typed qualified as T-import Morley.Michelson.Untyped qualified as U-import Morley.Tezos.Crypto-import Morley.Util.Sing (castSing)-import Text.Hex (decodeHex, encodeHex)--data SomeStack = forall t. T.SingI t => SomeStack- { stValues :: (Rec T.Value t)- , stTypes :: HST t- }--type ReplM = InputT (StateT SomeStack IO)--runRepl :: IO ()-runRepl = evalStateT (runInputT defaultSettings repl) emptyStack---- | Prints an error message to stderr-printErr :: (MonadIO m) => Text -> m ()-printErr m = liftIO $ hPutStrLn stderr m---- | Read commands or instructions from stdin and executes them.--- If user presses Ctrl-c during execution of an instruction, it will be--- caught and handled here itself. This ensures that REPL does not crash as--- a result of user pressing Ctrl-c in an attempt to end a loop.-repl :: ReplM ()-repl = do- printHelp- repl_--repl_ :: ReplM ()-repl_ = do- minput <- getInputLine "Morley>>> "- case strStrip <$> minput of- Nothing -> pass -- Ctrl D- Just ":quit" -> pass- Just input -> do- case input of- "" -> pass- ":clear" -> lift $ put emptyStack- ":stack" -> printStack- ":help" -> printHelp- (stripPrefixNonEmpty ":dumpstack" -> Just filename) ->- dumpStackToFile $ toString $ strip $ toText filename- (stripPrefixNonEmpty ":loadstack" -> Just filename) ->- loadStackFromFile $ toString $ strip $ toText filename- (stripPrefixNonEmpty ":parse" -> Just parseInput) ->- tryParse $ strip $ toText parseInput- (stripPrefixNonEmpty ":base58encode" -> Just parseInput) ->- base58Encode $ strip $ toText parseInput- (stripPrefix ":genkeys" -> Just mseed) -> do- seed <- case mseed of- "" -> show <$> (liftIO (randomIO @Word64))- seed -> pure seed- let sk = detSecretKey (encodeUtf8 seed)- let pk = toPublic sk- let pkh = hashKey pk- printResult "Secret Key" (formatSecretKey sk)- printResult "Public Key" (formatPublicKey pk)- printResult "Public Key hash" (formatHash pkh)- (stripPrefixNonEmpty ":" -> Just cmd) ->- printErr $ "Unknown command or argument missing in `:"<> (toText cmd) <> "`. Use :help to see a list of commands"- _ -> flip catch (\Interrupt -> putTextLn "Cancelled") $ withInterrupt $ runCode (toText input)- repl_- where- strStrip = toString . strip . toText- stripPrefixNonEmpty p i = case stripPrefix p i of- Just "" -> Nothing- x -> x--base58Encode :: Text -> ReplM ()-base58Encode inp = case decodeHex $ fromMaybe inp $ (T.stripPrefix "0x" inp) of- Just b -> do- printResult "Base58encode" $ decodeUtf8 $ Base58.encodeBase58 Base58.bitcoinAlphabet b- printResult "Base58encode with checksum" $ encodeBase58Check b- Nothing -> putTextLn "Can't parse input as hex-encoded bytes"--tryParseMichelsonValue :: forall (t :: T.T). (T.SingI t, T.HasNoOp t) => Text -> Text -> ReplM ()-tryParseMichelsonValue msg parseInput =- case readValue @t MSStdin parseInput of- Right s -> printResult msg $ (fmt . buildRenderDoc) s- Left _ -> pass--underlined :: MonadIO m => Text -> m ()-underlined x = liftIO do- putTextLn x- putTextLn $ T.replicate (T.length x) "-"--printResult :: MonadIO m => Text -> Text -> m ()-printResult heading result = do- underlined heading- putTextLn result- putTextLn ""--tryParse :: Text -> ReplM ()-tryParse parseInput = do- tryParseMichelsonValue @'T.TKey "Michelson Key" parseInput- tryParseMichelsonValue @'T.TUnit "Michelson Unit" parseInput- tryParseMichelsonValue @'T.TSignature "Michelson Signature" parseInput- tryParseMichelsonValue @'T.TChainId "Michelson ChainId" parseInput- tryParseMichelsonValue @'T.TTimestamp "Michelson Timestamp" parseInput- tryParseMichelsonValue @'T.TAddress "Michelson Address" parseInput- tryParseMichelsonValue @'T.TString "Michelson String" parseInput- tryParseMichelsonValue @'T.TInt "Michelson Int" parseInput- tryParseMichelsonValue @'T.TNat "Michelson Nat" parseInput- tryParseMichelsonValue @'T.TBytes "Michelson Bytes" parseInput- tryParseMichelsonValue @'T.TMutez "Michelson Mutez" parseInput- tryParseMichelsonValue @'T.TKeyHash "Michelson KeyHash" parseInput- tryParseMichelsonValue @'T.TBls12381Fr "Michelson Bls12381Fr" parseInput- tryParseMichelsonValue @'T.TBls12381G1 "Michelson Bls12381G1" parseInput- tryParseMichelsonValue @'T.TBls12381G2 "Michelson Bls12381G2" parseInput- tryParseMichelsonValue @'T.TBool "Michelson Bool" parseInput-- case parsePublicKey parseInput of- Right p -> do- printResult "Public Key" $ formatPublicKey p- Left _ -> pass- case parseSignature parseInput of- Right p -> do- printResult "Signature" $ formatSignature p- Left _ -> pass- case parseSecretKey parseInput of- Right p -> do- printResult "Secret Key" $ formatSecretKey p- Left _ -> pass- case parseHash @'HashKindPublicKey parseInput of- Right p -> do- printResult "KeyHash" $ formatHash p- Left _ -> pass- case Base58.decodeBase58 Base58.bitcoinAlphabet (encodeUtf8 parseInput) of- Just p -> do- printResult "Base58 Encoded Bytes" $ "0x" <> (encodeHex p)- Nothing -> pass- case decodeBase58Check parseInput of- Just p -> do- printResult "Base58Check Encoded Bytes" $ "0x" <> (encodeHex p)- Nothing -> pass---- | Try to execute the given input string as a Morley instruction.-runCode :: Text -> ReplM ()-runCode code = do- case parseInstructions code of- Left err -> printErr err- Right [] -> pass- Right parsedOps -> do- let expandedOps = expand <$> parsedOps- lift get >>= \case- SomeStack {..} -> case castSing stTypes of- Just hstInp -> case typeCheckingWith tcOptions . runTypeCheckIsolated $- typeCheckList expandedOps hstInp of- Right someInstr -> do- case someInstr of- _ :/ (instr ::: hstOut)-> case interpretInstr dummyContractEnv instr stValues of- Right recOut -> do- lift $ put (SomeStack recOut hstOut)- printStack- Left michelsonFail -> putTextLn (pretty michelsonFail)- _ :/ (AnyOutInstr _) -> putTextLn "Encountered a FAILWITH instruction"- Left err -> printErr $ pretty err- Nothing -> printErr "Casting stack failed"--printHelp :: ReplM ()-printHelp = putTextLn "REPL starts with an empty stack. At each instruction entered,\- \ the modified stack, or an error is printed. Multiple instructions separated by semicolons should work\- \ as expected. Available meta commads are:\n\- \ ':help', displays this help\n ':stack', prints the current stack\n\- \ ':parse <input>', tries to parse the given string using known formats\n\- \ ':base58encode <input>', prints the base58 encoding of a bytestring\n\- \ ':genkeys <seed>', generates a key pair with hash using the seed string \n\- \ ':loadstack <filename>', loads the stack from a file\n\- \ ':dumpstack <filename>', dumps the stack to a file \n\- \ ':clear', clears the current stack. Ctrl-D or ':quit' to end REPL."--printStack :: ReplM ()-printStack = lift get >>= \case- SomeStack stk hst -> do- putTextLn "--"- putTextLn $ showStack stk hst--emptyStack :: SomeStack-emptyStack = SomeStack RNil SNil--parseInstructions :: Text -> Either Text [ParsedOp]-parseInstructions src =- case parseNoEnv ops MSUnspecified src of- Right p -> Right p- Left err -> Left (toText $ errorBundlePretty err)--tcOptions :: TypeCheckOptions-tcOptions = TypeCheckOptions- { tcVerbose = False- , tcStrict = False- }---- helpers--addValueToHST- :: forall t xs. T.SingI xs- => T.Value t- -> HST xs- -> Either Text (T.Dict (T.SingI (t ': xs)), HST (t ': xs))-addValueToHST v hstIn = case T.valueTypeSanity v of- T.Dict -> case T.getWTP @t of- Right wtpDict -> Right (T.Dict, (T.sing @t, wtpDict) ::& hstIn)- Left (T.NotWellTyped t cause) -> let- U.Ty t' tann = T.toUType t- in Left $ "Value of type '" <> (renderT t' (U.fullAnnSet [tann] [] []))- <> "' is not well typed in the provided Value because it "- <> pretty cause <> "."--renderType :: T.SingT t -> Text-renderType notes = let- U.Ty t tann = T.toUType (fromSing notes)- in renderT t (U.fullAnnSet [tann] [] [])--renderT :: U.T -> U.AnnotationSet -> Text-renderT t annSet = toText $ printDoc True $ U.renderType t True doesntNeedParens annSet--dumpStackToFile :: FilePath -> ReplM ()-dumpStackToFile fname =- lift get >>= \case- SomeStack stk hst -> case dumpStack stk hst of- Right stkd -> liftIO $ Prelude.catch (BSL.writeFile fname $ Aeson.encode stkd) handler- Left err -> printErr err- where- handler :: IOException -> IO ()- handler e = printErr $ toText $ displayException e--loadStackFromFile :: FilePath -> ReplM ()-loadStackFromFile fname = do- mStack <- liftIO $ flip Prelude.catch handler $ do- stackTxt <- BSL.readFile fname- case Aeson.decode @[(Text, Text)] stackTxt of- Just s -> pure $ loadStack s- Nothing -> pure $ Left "Decoding error when parsing stack data from file"- case mStack of- Right stk -> lift $ put stk- Left err -> printErr err- where- handler :: IOException -> IO (Either Text a)- handler e = pure $ Left $ toText $ displayException e---- | Dump stack as a lit of tuples that represent (value, type) pairs.-dumpStack :: forall t. Rec T.Value t -> HST t -> Either Text [(Text, Text)]-dumpStack RNil _ = Right []-dumpStack ((v :: T.Value a) :& rst) ((notes, _) ::& rHst) = case T.valueTypeSanity v of- T.Dict -> case T.checkOpPresence (T.sing @a) of- T.OpAbsent -> case dumpStack rst rHst of- Right t -> Right ((toText $ printTypedValue True v, renderType notes) : t)- Left e -> Left e- T.OpPresent -> Left "Cannot dump stack with operations"---- | Overwrite the current stack with a stack loaded from a list of tuples--- representing (value/type) pairs.-loadStack :: [(Text, Text)] -> Either Text SomeStack-loadStack = foldl' buildStack (Right emptyStack) . reverse- where- buildStack :: Either Text SomeStack -> (Text, Text) -> Either Text SomeStack- buildStack (Left err) _ = Left err- buildStack (Right (SomeStack stk hst)) (txVal, txTyp) = case- (parseExpandValue "stack" txVal, parse type_ "" txTyp) of- (Right val, Right typ) ->- case typeCheckingWith tcOptions $ typeCheckParameter mempty typ val of- Right (T.SomeValue tVal) ->- case addValueToHST tVal hst of- Right (T.Dict, newHst) -> Right $ SomeStack (tVal :& stk) newHst- Left err -> Left err- Left tcError -> Left $ pretty tcError- (Left err, _) -> Left $ pretty err- (_, Left err) -> Left $ toText $ errorBundlePretty err--showStack :: forall t. Rec T.Value t -> HST t -> Text-showStack RNil _ = "--"-showStack ((v :: T.Value a) :& rst) ((notes, _) ::& rHst) = case T.valueTypeSanity v of- T.Dict -> case T.checkOpPresence (T.sing @a) of- T.OpAbsent -> -- print nice if value has no operations- addSuffix (toText $ printTypedValue True v)- _ -> -- else just call show, and indicate value has operation inside- case (v, T.sing @a) of- (T.VList [], T.STList T.STOperation) -> "{ } :: list operation\n" <> showStack rst rHst- _ -> addSuffix $ "(operations container:" <> pretty v <> ")"- where- addSuffix val = val <>" :: " <> renderType notes <> "\n" <> showStack rst rHst
morley.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: morley-version: 1.19.1+version: 1.19.2 synopsis: Developer tools for the Michelson Language description: A library to make writing smart contracts in Michelson — the smart contract language of the Tezos blockchain — pleasant and effective. category: Language@@ -32,6 +32,8 @@ library exposed-modules:+ Morley.App.CLI+ Morley.App.REPL Morley.AsRPC Morley.CLI Morley.Micheline@@ -39,6 +41,8 @@ Morley.Micheline.Binary.Internal Morley.Micheline.Class Morley.Micheline.Expression+ Morley.Micheline.Expression.Internal.MichelinePrimitive+ Morley.Micheline.Expression.Internal.TH Morley.Micheline.Expression.WithMeta Morley.Micheline.Json Morley.Michelson.Analyzer@@ -54,6 +58,9 @@ Morley.Michelson.Macro Morley.Michelson.Optimizer Morley.Michelson.Optimizer.Internal.Proofs+ Morley.Michelson.Optimizer.Internal.Rules+ Morley.Michelson.Optimizer.Internal.Ruleset+ Morley.Michelson.Optimizer.Utils Morley.Michelson.Parser Morley.Michelson.Parser.Annotations Morley.Michelson.Parser.Common@@ -122,6 +129,15 @@ Morley.Michelson.Typed.Operation Morley.Michelson.Typed.Polymorphic Morley.Michelson.Typed.Scope+ Morley.Michelson.Typed.Scope.Internal.CheckScope+ Morley.Michelson.Typed.Scope.Internal.Comparable+ Morley.Michelson.Typed.Scope.Internal.Deprecated+ Morley.Michelson.Typed.Scope.Internal.ForbidT+ Morley.Michelson.Typed.Scope.Internal.Presence+ Morley.Michelson.Typed.Scope.Internal.Scopes+ Morley.Michelson.Typed.Scope.Internal.TH+ Morley.Michelson.Typed.Scope.Internal.WellTyped+ Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope Morley.Michelson.Typed.Sing Morley.Michelson.Typed.T Morley.Michelson.Typed.TypeLevel@@ -134,6 +150,7 @@ Morley.Michelson.Untyped.Contract Morley.Michelson.Untyped.Entrypoints Morley.Michelson.Untyped.Ext+ Morley.Michelson.Untyped.HoistInstr Morley.Michelson.Untyped.Instr Morley.Michelson.Untyped.Type Morley.Michelson.Untyped.Value@@ -263,10 +280,10 @@ , dependent-sum-template , elliptic-curve , first-class-families >=0.5.0.0- , fmt >=0.6.3.0 , galois-field , generic-deriving , gitrev+ , haskeline , hex-text , hsblst , lens@@ -278,6 +295,7 @@ , optparse-applicative , pairing , parser-combinators >=1.0.0+ , prettyprinter , scientific , semigroups >=0.19.1 , show-type@@ -298,13 +316,11 @@ , vector , vinyl >=0.13.1 , with-utf8- , wl-pprint-text default-language: Haskell2010 executable morley main-is: Main.hs other-modules:- REPL Paths_morley autogen-modules: Paths_morley@@ -363,22 +379,8 @@ ViewPatterns ghc-options: -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-implicit-prelude -Wno-prepositive-qualified-module -Wno-missing-safe-haskell-mode build-depends:- MonadRandom- , aeson- , base-noprelude >=4.7 && <5- , base58-bytestring- , bytestring- , data-default- , fmt- , haskeline- , hex-text- , megaparsec >=7.0.0+ base-noprelude >=4.7 && <5 , morley , morley-prelude- , named , optparse-applicative- , singletons- , text- , vinyl- , with-utf8 default-language: Haskell2010
+ src/Morley/App/CLI.hs view
@@ -0,0 +1,303 @@+-- SPDX-FileCopyrightText: 2021 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++module Morley.App.CLI+ ( argParser+ ) where++import Data.Default (def)+import Data.Singletons (demote)+import Data.Text.Lazy.IO.Utf8 qualified as Utf8 (writeFile)+import Fmt (pretty, prettyText, unlinesF)+import Named (paramF)+import Options.Applicative (help, long, short, subparser, switch)+import Options.Applicative qualified as Opt+import Text.Hex (encodeHex)++import Morley.App.REPL+import Morley.CLI+import Morley.Michelson.Analyzer (analyze)+import Morley.Michelson.Interpret (RemainingSteps(..))+import Morley.Michelson.Optimizer (OptimizerConf(..), optimizeVerboseWithConf)+import Morley.Michelson.Printer (printSomeContract, printTypedContract, printUntypedContract)+import Morley.Michelson.Runtime+import Morley.Michelson.Runtime.GState (genesisAddress)+import Morley.Michelson.TypeCheck (tcVerbose, typeCheckContract, typeCheckValue, typeCheckingWith)+import Morley.Michelson.TypeCheck qualified as TypeCheck+import Morley.Michelson.Typed (Contract'(..), SomeContract(..), unContractCode)+import Morley.Michelson.Typed qualified as T+import Morley.Michelson.Typed.Contract (mapContractCodeM)+import Morley.Tezos.Address+import Morley.Tezos.Address.Alias+import Morley.Tezos.Core (Mutez, tz)+import Morley.Tezos.Crypto.Timelock (chestBytes, chestKeyBytes, createChestAndChestKey)+import Morley.Util.CLI (mkCLOptionParser, mkCommandParser, outputOption)+import Morley.Util.Named++data DryRunOrWrite = DryRun | Write++mkCommandParser' :: String -> String -> Opt.Parser a -> Opt.Mod Opt.CommandFields a+mkCommandParser' = flip . mkCommandParser++argParser :: Opt.Parser (IO ())+argParser = subparser $ mconcat+ [ printSubCmd+ , typecheckSubCmd+ , emulateSubCmd+ , optimizeSubCmd+ , analyzeSubCmd+ , createChestSubCmd+ , replSubCmd+ ]++--------------------------------------------------------------------------------+-- Subcommands+--------------------------------------------------------------------------------++-- NB: in case this looks mysterious, in IOCmd functions, outer 'do' is+-- Opt.Parser using ApplicativeDo, which then returns an IO action, i.e. inner+-- 'do' is 'IO ()'. -- @lierdakil++type IOCmd = Opt.Mod Opt.CommandFields (IO ())++typecheckSubCmd :: IOCmd+typecheckSubCmd = mkCommandParser' "typecheck" "Typecheck passed contract." do+ contractFile <- optional contractFileOption+ tcOptions <- typeCheckOptionsOption+ pure do+ morleyContract <- prepareContract contractFile+ -- At the moment of writing, 'tcStrict' option does not change anything+ -- because it affects only values parsing; but this may change+ contract <- either throwM pure . typeCheckingWith tcOptions+ $ typeCheckContract morleyContract+ when (TypeCheck.tcVerbose tcOptions) $+ putStrLn $ printSomeContract False contract+ putTextLn "Contract is well-typed"++printSubCmd :: IOCmd+printSubCmd = mkCommandParser' "print"+ "Parse a Morley contract and print corresponding Michelson \+ \contract that can be parsed by the OCaml reference client: octez-client."+ do+ mInputFile <- optional contractFileOption+ mOutputFile <- outputOption+ forceSingleLine <- onelineOption+ pure do+ contract <- prepareContract mInputFile+ let write = maybe putStrLn Utf8.writeFile mOutputFile+ write $ printUntypedContract forceSingleLine contract++emulateSubCmd :: IOCmd+emulateSubCmd = mkCommandParser' "emulate" "Set of commands to run in an emulated environment." $+ subparser $ mconcat+ [ runSubCmd+ , originateSubCmd+ , transferSubCmd+ , transferTicketSubCmd+ , runViewSubCmd+ ]++runSubCmd :: IOCmd+runSubCmd = mkCommandParser' "run"+ "Run passed contract. It's originated first and then a transaction is sent to it." do+ txData <- txDataOption+ contract <- contractSimpleOriginationDataOption+ cro <- commonRunOptions Write+ pure do+ michelsonContract <- traverse prepareContract contract+ void $ runContract cro michelsonContract txData++runViewSubCmd :: IOCmd+runViewSubCmd = mkCommandParser' "view"+ "Run some view on a contract either supplied directly or identified \+ \by an address. It's originated first if supplied directly." do+ cro <- commonRunOptions Write+ addressOrContract <-+ ContractSpecAddressOrAlias <$> addressOrAliasOption Nothing+ ! #name "contract-addr"+ ! #help "Contract address to call view on."+ <|> ContractSpecOrigination <$> contractSimpleOriginationDataOption+ viewName <- mkCLOptionParser Nothing+ ! #name "name"+ ! #help "View name."+ sender <- someAddressOrAliasOption+ (Just $ SAOAKindSpecified $ AddressResolved genesisAddress)+ ! #name "sender"+ ! #help "Sender address."+ viewArg <- TxUntypedParam <$> valueOption Nothing+ ! #name "arg"+ ! #help "View call argument."+ pure do+ contractSpec <- (traverse . traverse) prepareContract addressOrContract+ void $ runView cro contractSpec viewName sender viewArg++replSubCmd :: IOCmd+replSubCmd = mkCommandParser' "repl" "Start a Morley REPL." $ pure runRepl++originateSubCmd :: IOCmd+originateSubCmd = mkCommandParser' "originate" "Originate passed contract. Add it to passed DB." do+ simpleOriginationData <- contractSimpleOriginationDataOption+ dbPath <- dbPathOption+ tcOptions <- typeCheckOptionsOption+ verbose <- verboseFlag+ originator <- addressOption (Just genesisAddress)+ ! #name "originator"+ ! #help "Contract's originator."+ alias <- optional (aliasOption "alias")+ delegate <- optional $ keyHashOption Nothing+ ! #name "delegate"+ ! #help "Contract's optional delegate."+ pure do+ michelsonContract <- traverse prepareContract simpleOriginationData+ addr <-+ originateContract+ ! #dbPath dbPath+ ! #tcOpts tcOptions+ ! #originator originator+ ! paramF #alias alias+ ! paramF #delegate delegate+ ! #csod michelsonContract+ ! #verbose verbose+ putTextLn $ "Originated contract " <> pretty addr++transferSubCmd :: IOCmd+transferSubCmd = mkCommandParser' "transfer" "Transfer tokens to given address." do+ destination <- someAddressOrAliasOption Nothing+ ! #name "to"+ ! #help "Address or alias of the transfer's destination."+ txData <- txDataOption+ cro <- commonRunOptions DryRun+ pure $ transfer cro destination txData++transferTicketSubCmd :: IOCmd+transferTicketSubCmd = mkCommandParser' "transfer-ticket" "Transfer ticket to given address." do+ destination <- someAddressOrAliasOption Nothing+ ! #name "to"+ ! #help "Address or alias of the transfer's destination."+ tdSenderAddress :: L1Address <- Constrained <$> addressOption (Just genesisAddress)+ ! #name "sender" ! #help "Sender address"+ ticketer <- mkCLOptionParser @Address Nothing+ ! #name "ticketer" ! #help "Ticketer"+ value <- valueOption Nothing+ ! #name "value" ! #help "Ticket value"+ ty <- mkCLOptionParser Nothing+ ! #name "type" ! #help "Ticket argument type"+ tAmount <- mkCLOptionParser @Natural Nothing+ ! #name "amount" ! #help "Amount of tickets"+ tdAmount <- mutezOption (Just minBound)+ ! #name "mutez" ! #help "Mutez amount additionally sent by a transaction. \+ \Note that on network, as of Mumbai, implicit accounts can't send tickets \+ \and mutez in the same operation, however the Morley emulator allows it."+ tdEntrypoint <- entrypointOption+ ! #name "entrypoint" ! #help "Entrypoint to call"+ cro <- commonRunOptions DryRun+ pure $ T.withUType ty \(_ :: T.Notes t) -> do+ tValue <- either throwM pure . typeCheckingWith (croTCOpts cro) $+ typeCheckValue @t value+ T.Dict <- either (throwM . TypeCheck.UnsupportedTypeForScope (demote @t)) pure $+ T.checkScope @(T.ParameterScope t, T.Comparable t)+ let tdParameter = TxTypedParam $ T.VTicket ticketer tValue tAmount+ transfer cro destination TxData{..}++optimizeSubCmd :: IOCmd+optimizeSubCmd = mkCommandParser' "optimize" "Optimize the contract." do+ contractFile <- optional contractFileOption+ output <- outputOption+ singleLine <- onelineOption+ maxStageIterations <- mkCLOptionParser (Just $ ocMaxIterations def)+ ! #name "max-stage-iterations"+ ! #help "Maximum number of iterations per optimizer stage. \+ \The default is usually adequate, but you want to try raising it \+ \to see if it affects the result."+ verbose <- verboseFlag+ pure do+ untypedContract <- prepareContract contractFile+ SomeContract checkedContract <-+ either throwM pure . typeCheckingWith laxTcOptions $+ typeCheckContract untypedContract+ let (logs, optimizedContract) =+ mapContractCodeM (optimizeVerboseWithConf conf) checkedContract+ conf = def { ocMaxIterations = maxStageIterations }+ maybe putStrLn Utf8.writeFile output $ printTypedContract singleLine optimizedContract+ when verbose $ hPutStrLn stderr $ prettyText $ unlinesF logs++analyzeSubCmd :: IOCmd+analyzeSubCmd = mkCommandParser' "analyze" "Analyze the contract." do+ contractFile <- optional contractFileOption+ pure do+ untypedContract <- prepareContract contractFile+ SomeContract contract <-+ either throwM pure . typeCheckingWith laxTcOptions $+ typeCheckContract untypedContract+ putTextLn $ pretty $ analyze (unContractCode $ cCode contract)++createChestSubCmd :: IOCmd+createChestSubCmd = mkCommandParser' "create_chest" "Create a timelocked chest and key." do+ payload <- payloadOption+ time <- timeOption+ pure do+ (chest, key) <- createChestAndChestKey payload time+ putStrLn $ "Chest: 0x" <> encodeHex (chestBytes chest)+ putStrLn $ "Key: 0x" <> encodeHex (chestKeyBytes key)++--------------------------------------------------------------------------------+-- Parsers+--------------------------------------------------------------------------------++verboseFlag :: Opt.Parser Bool+verboseFlag = switch $+ short 'v' <>+ long "verbose" <>+ help "Whether output should be verbose."++typeCheckOptionsOption :: Opt.Parser TypeCheck.TypeCheckOptions+typeCheckOptionsOption = do+ tcVerbose <- verboseFlag+ tcStrict <- fmap not . switch $+ long "typecheck-lax" <>+ help "Whether actions permitted in `octez-client run` but forbidden in \+ \e.g. `octez-client originate` should be allowed here."+ return TypeCheck.TypeCheckOptions{..}++commonRunOptions :: DryRunOrWrite -> Opt.Parser CommonRunOptions+commonRunOptions defaultDryRun = do+ croNow <- nowOption+ croLevel <- fromMaybe (croLevel def) <$> levelOption+ croMinBlockTime <- fromMaybe (croMinBlockTime def) <$> minBlockTimeOption+ croMaxSteps <- RemainingSteps <$> maxStepsOption+ croDBPath <- dbPathOption+ croTCOpts <- typeCheckOptionsOption+ croVerbose <- verboseFlag+ croDryRun <- case defaultDryRun of+ Write -> fmap not . switch $+ long "write" <>+ help "Write updated DB to the DB file."+ DryRun -> switch $+ long "dry-run" <>+ help "Do not write updated DB to the DB file."+ pure CommonRunOptions{..}++contractSimpleOriginationDataOption :: Opt.Parser (ContractSimpleOriginationData (Maybe FilePath))+contractSimpleOriginationDataOption = do+ csodStorage <- valueOption Nothing+ ! #name "storage"+ ! #help "Initial storage of the contract."+ csodContract <- optional contractFileOption+ csodBalance <- mutezOption (Just defaultBalance)+ ! #name "balance"+ ! #help "Initial balance of the contract."+ pure ContractSimpleOriginationData{..}++--------------------------------------------------------------------------------+-- Constants+--------------------------------------------------------------------------------++defaultBalance :: Mutez+defaultBalance = [tz|4|]++-- | Most permitting options, when we don't care much about typechecking.+laxTcOptions :: TypeCheck.TypeCheckOptions+laxTcOptions = TypeCheck.TypeCheckOptions+ { TypeCheck.tcVerbose = False+ , TypeCheck.tcStrict = False+ }
+ src/Morley/App/REPL.hs view
@@ -0,0 +1,318 @@+-- SPDX-FileCopyrightText: 2021 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA+{-|+Implements an REPL that can execute Morley instructions. REPL starts with an+empty stack. At each instruction entered, the modified stack, or an error is+printed. Multiple instructions separated by semicolons should work as expected.+Available meta commads are:++ ':help', displays this help\n ':stack', prints the current stack+ ':loadstack filename', loads the stack from a file+ ':dumpstack filename', dumps the stack to a file+ ':clear', clears the current stack. Ctrl-D or ':quit' to end REPL."+-}+module Morley.App.REPL+ ( runRepl+ ) where++import Prelude hiding (group)++import Control.Exception (IOException)+import Control.Monad.Random (randomIO)+import Data.Aeson qualified as Aeson+import Data.ByteString.Base58 qualified as Base58+import Data.ByteString.Lazy qualified as BSL+import Data.List (stripPrefix)+import Data.Singletons (fromSing)+import Data.Text as T (length, replicate, strip)+import Data.Text qualified as T (stripPrefix)+import Data.Vinyl (Rec(..))+import Fmt (Doc, build, pretty)+import Prettyprinter (align, group, line, nest)+import System.Console.Haskeline+ (InputT, Interrupt(..), defaultSettings, getInputLine, runInputT, withInterrupt)+import Text.Megaparsec (parse)++import Morley.Michelson.Interpret (interpretInstr)+import Morley.Michelson.Macro (ParsedOp, expand)+import Morley.Michelson.Parser+ (errorBundlePretty, parseExpandValue, parseNoEnv, rawOpsSequence, type_)+import Morley.Michelson.Parser.Types (MichelsonSource(..))+import Morley.Michelson.Printer.Util (printRenderDoc)+import Morley.Michelson.Runtime.Dummy+import Morley.Michelson.Runtime.Import (readValue)+import Morley.Michelson.TypeCheck+ (SomeTcInstr(..), SomeTcInstrOut(..), TypeCheckOptions(..), runTypeCheckIsolated,+ typeCheckingWith)+import Morley.Michelson.TypeCheck.Instr (typeCheckList, typeCheckParameter)+import Morley.Michelson.TypeCheck.Types (HST(..))+import Morley.Michelson.Typed qualified as T+import Morley.Tezos.Crypto+import Morley.Util.Sing (castSing)+import Text.Hex (decodeHex, encodeHex)++data SomeStack = forall t. T.SingI t => SomeStack+ { stValues :: (Rec T.Value t)+ , stTypes :: HST t+ }++type ReplM = InputT (StateT SomeStack IO)++runRepl :: IO ()+runRepl = evalStateT (runInputT defaultSettings repl) emptyStack++-- | Prints an error message to stderr+printErr :: (MonadIO m) => Text -> m ()+printErr m = liftIO $ hPutStrLn stderr m++-- | Read commands or instructions from stdin and executes them.+-- If user presses Ctrl-c during execution of an instruction, it will be+-- caught and handled here itself. This ensures that REPL does not crash as+-- a result of user pressing Ctrl-c in an attempt to end a loop.+repl :: ReplM ()+repl = do+ printHelp+ repl_++repl_ :: ReplM ()+repl_ = do+ minput <- getInputLine "Morley>>> "+ case strStrip <$> minput of+ Nothing -> pass -- Ctrl D+ Just ":quit" -> pass+ Just input -> do+ case input of+ "" -> pass+ ":clear" -> lift $ put emptyStack+ ":stack" -> printStack+ ":help" -> printHelp+ (stripPrefixNonEmpty ":dumpstack" -> Just filename) ->+ dumpStackToFile $ toString $ strip $ toText filename+ (stripPrefixNonEmpty ":loadstack" -> Just filename) ->+ loadStackFromFile $ toString $ strip $ toText filename+ (stripPrefixNonEmpty ":parse" -> Just parseInput) ->+ tryParse $ strip $ toText parseInput+ (stripPrefixNonEmpty ":base58encode" -> Just parseInput) ->+ base58Encode $ strip $ toText parseInput+ (stripPrefix ":genkeys" -> Just mseed) -> do+ seed <- case mseed of+ "" -> show <$> (liftIO (randomIO @Word64))+ seed -> pure seed+ let sk = detSecretKey (encodeUtf8 seed)+ let pk = toPublic sk+ let pkh = hashKey pk+ printResult "Secret Key" (formatSecretKey sk)+ printResult "Public Key" (formatPublicKey pk)+ printResult "Public Key hash" (formatHash pkh)+ (stripPrefixNonEmpty ":" -> Just cmd) ->+ printErr $ "Unknown command or argument missing in `:"<> (toText cmd) <> "`. Use :help to see a list of commands"+ _ -> flip catch (\Interrupt -> putTextLn "Cancelled") $ withInterrupt $ runCode (toText input)+ repl_+ where+ strStrip = toString . strip . toText+ stripPrefixNonEmpty p i = case stripPrefix p i of+ Just "" -> Nothing+ x -> x++base58Encode :: Text -> ReplM ()+base58Encode inp = case decodeHex $ fromMaybe inp $ (T.stripPrefix "0x" inp) of+ Just b -> do+ printResult "Base58encode" $ decodeUtf8 $ Base58.encodeBase58 Base58.bitcoinAlphabet b+ printResult "Base58encode with checksum" $ encodeBase58Check b+ Nothing -> putTextLn "Can't parse input as hex-encoded bytes"++tryParseMichelsonValue :: forall (t :: T.T). (T.SingI t) => Text -> Text -> ReplM ()+tryParseMichelsonValue msg parseInput =+ case readValue @t MSStdin parseInput of+ Right s -> printResult msg $ pretty s+ Left _ -> pass++underlined :: MonadIO m => Text -> m ()+underlined x = liftIO do+ putTextLn x+ putTextLn $ T.replicate (T.length x) "-"++printResult :: MonadIO m => Text -> Text -> m ()+printResult heading result = do+ underlined heading+ putTextLn result+ putTextLn ""++tryParse :: Text -> ReplM ()+tryParse parseInput = do+ tryParseMichelsonValue @'T.TKey "Michelson Key" parseInput+ tryParseMichelsonValue @'T.TUnit "Michelson Unit" parseInput+ tryParseMichelsonValue @'T.TSignature "Michelson Signature" parseInput+ tryParseMichelsonValue @'T.TChainId "Michelson ChainId" parseInput+ tryParseMichelsonValue @'T.TTimestamp "Michelson Timestamp" parseInput+ tryParseMichelsonValue @'T.TAddress "Michelson Address" parseInput+ tryParseMichelsonValue @'T.TString "Michelson String" parseInput+ tryParseMichelsonValue @'T.TInt "Michelson Int" parseInput+ tryParseMichelsonValue @'T.TNat "Michelson Nat" parseInput+ tryParseMichelsonValue @'T.TBytes "Michelson Bytes" parseInput+ tryParseMichelsonValue @'T.TMutez "Michelson Mutez" parseInput+ tryParseMichelsonValue @'T.TKeyHash "Michelson KeyHash" parseInput+ tryParseMichelsonValue @'T.TBls12381Fr "Michelson Bls12381Fr" parseInput+ tryParseMichelsonValue @'T.TBls12381G1 "Michelson Bls12381G1" parseInput+ tryParseMichelsonValue @'T.TBls12381G2 "Michelson Bls12381G2" parseInput+ tryParseMichelsonValue @'T.TBool "Michelson Bool" parseInput++ case parsePublicKey parseInput of+ Right p -> do+ printResult "Public Key" $ formatPublicKey p+ Left _ -> pass+ case parseSignature parseInput of+ Right p -> do+ printResult "Signature" $ formatSignature p+ Left _ -> pass+ case parseSecretKey parseInput of+ Right p -> do+ printResult "Secret Key" $ formatSecretKey p+ Left _ -> pass+ case parseHash @'HashKindPublicKey parseInput of+ Right p -> do+ printResult "KeyHash" $ formatHash p+ Left _ -> pass+ case Base58.decodeBase58 Base58.bitcoinAlphabet (encodeUtf8 parseInput) of+ Just p -> do+ printResult "Base58 Encoded Bytes" $ "0x" <> (encodeHex p)+ Nothing -> pass+ case decodeBase58Check parseInput of+ Just p -> do+ printResult "Base58Check Encoded Bytes" $ "0x" <> (encodeHex p)+ Nothing -> pass++-- | Try to execute the given input string as a Morley instruction.+runCode :: Text -> ReplM ()+runCode code = do+ case parseInstructions code of+ Left err -> printErr err+ Right [] -> pass+ Right parsedOps -> do+ let expandedOps = expand <$> parsedOps+ lift get >>= \case+ SomeStack {..} -> case castSing stTypes of+ Just hstInp -> case typeCheckingWith tcOptions . runTypeCheckIsolated $+ typeCheckList expandedOps hstInp of+ Right someInstr -> do+ case someInstr of+ _ :/ (instr ::: hstOut)-> case interpretInstr dummyContractEnv instr stValues of+ Right recOut -> do+ lift $ put (SomeStack recOut hstOut)+ printStack+ Left michelsonFail -> putTextLn (pretty michelsonFail)+ _ :/ (AnyOutInstr _) -> putTextLn "Encountered a FAILWITH instruction"+ Left err -> printErr $ pretty err+ Nothing -> printErr "Casting stack failed"++printHelp :: ReplM ()+printHelp = putTextLn "REPL starts with an empty stack. At each instruction entered,\+ \ the modified stack, or an error is printed. Multiple instructions separated by semicolons should work\+ \ as expected. Available meta commads are:\n\+ \ ':help', displays this help\n ':stack', prints the current stack\n\+ \ ':parse <input>', tries to parse the given string using known formats\n\+ \ ':base58encode <input>', prints the base58 encoding of a bytestring\n\+ \ ':genkeys <seed>', generates a key pair with hash using the seed string \n\+ \ ':loadstack <filename>', loads the stack from a file\n\+ \ ':dumpstack <filename>', dumps the stack to a file \n\+ \ ':clear', clears the current stack. Ctrl-D or ':quit' to end REPL."++printStack :: ReplM ()+printStack = lift get >>= \case+ SomeStack stk hst -> do+ putTextLn "--"+ putTextLn $ pretty $ showStack stk hst++emptyStack :: SomeStack+emptyStack = SomeStack RNil SNil++parseInstructions :: Text -> Either Text [ParsedOp]+parseInstructions src =+ case parseNoEnv (rawOpsSequence $ pure ()) MSUnspecified src of+ Right p -> Right p+ Left err -> Left (toText $ errorBundlePretty err)++tcOptions :: TypeCheckOptions+tcOptions = TypeCheckOptions+ { tcVerbose = False+ , tcStrict = False+ }++-- helpers++addValueToHST+ :: forall t xs. T.SingI xs+ => T.Value t+ -> HST xs+ -> Either Text (T.Dict (T.SingI (t ': xs)), HST (t ': xs))+addValueToHST v hstIn = case T.valueTypeSanity v of+ T.Dict -> case T.getWTP @t of+ Right wtpDict -> Right (T.Dict, (T.sing @t, wtpDict) ::& hstIn)+ Left e -> Left $ pretty e++dumpStackToFile :: FilePath -> ReplM ()+dumpStackToFile fname =+ lift get >>= \case+ SomeStack stk hst -> case dumpStack stk hst of+ Right stkd -> liftIO $ Prelude.catch (BSL.writeFile fname $ Aeson.encode stkd) handler+ Left err -> printErr err+ where+ handler :: IOException -> IO ()+ handler e = printErr $ toText $ displayException e++loadStackFromFile :: FilePath -> ReplM ()+loadStackFromFile fname = do+ mStack <- liftIO $ flip Prelude.catch handler $ do+ stackTxt <- BSL.readFile fname+ case Aeson.decode @[(Text, Text)] stackTxt of+ Just s -> pure $ loadStack s+ Nothing -> pure $ Left "Decoding error when parsing stack data from file"+ case mStack of+ Right stk -> lift $ put stk+ Left err -> printErr err+ where+ handler :: IOException -> IO (Either Text a)+ handler e = pure $ Left $ toText $ displayException e++-- | Dump stack as a list of tuples that represent (value, type) pairs.+dumpStack :: forall t. Rec T.Value t -> HST t -> Either Text [(Text, Text)]+dumpStack RNil _ = Right []+dumpStack ((v :: T.Value a) :& rst) ((notes, _) ::& rHst) = case T.valueTypeSanity v of+ T.Dict -> case T.checkTPresence T.SPSOp (T.sing @a) of+ T.TAbsent -> case dumpStack rst rHst of+ Right t -> Right $ (printRenderDoc True v, printRenderDoc True (fromSing notes)) : t+ Left e -> Left e+ T.TPresent -> Left "Cannot dump stack with operations"++-- | Overwrite the current stack with a stack loaded from a list of tuples+-- representing (value/type) pairs.+loadStack :: [(Text, Text)] -> Either Text SomeStack+loadStack = foldl' buildStack (Right emptyStack) . reverse+ where+ buildStack :: Either Text SomeStack -> (Text, Text) -> Either Text SomeStack+ buildStack (Left err) _ = Left err+ buildStack (Right (SomeStack stk hst)) (txVal, txTyp) = case+ (parseExpandValue "stack" txVal, parse type_ "" txTyp) of+ (Right val, Right typ) ->+ case typeCheckingWith tcOptions $ typeCheckParameter mempty typ val of+ Right (T.SomeValue tVal) ->+ case addValueToHST tVal hst of+ Right (T.Dict, newHst) -> Right $ SomeStack (tVal :& stk) newHst+ Left err -> Left err+ Left tcError -> Left $ pretty tcError+ (Left err, _) -> Left $ pretty err+ (_, Left err) -> Left $ toText $ errorBundlePretty err++showStack :: forall t. Rec T.Value t -> HST t -> Doc+showStack RNil _ = "--"+showStack ((v :: T.Value a) :& rst) ((notes, _) ::& rHst) = case T.valueTypeSanity v of+ T.Dict -> case T.checkTPresence T.SPSOp (T.sing @a) of+ T.TAbsent -> -- print nice if value has no operations+ addSuffix (build v)+ T.TPresent -> -- else just call show, and indicate value has operation inside+ case (v, T.sing @a) of+ (T.VList [], T.STList T.STOperation) -> "{ } :: list operation\n" <> showStack rst rHst+ _ -> addSuffix $ "(operations container:" <> pretty v <> ")"+ where+ addSuffix val =+ nest 2 (group $ val <> line <> ":: " <> align (pretty notes)) <> line <> showStack rst rHst
src/Morley/AsRPC.hs view
@@ -26,29 +26,26 @@ import Prelude qualified import Control.Lens.Plated (universe)-import Data.Constraint (Dict(..), (***), (:-)(Sub), (\\))+import Data.Constraint ((\\)) import Data.Default (Default(..))-import Data.Generics (everything, mkQ)+import Data.Generics (everything, everywhere, mkQ, mkT) import Data.List qualified as List ((\\)) import Data.Map qualified as Map import Data.Singletons (Sing, withSingI) import Data.Text qualified as T+import Data.Type.Equality ((:~:)(Refl)) import GHC.Generics qualified as G import Language.Haskell.TH- (Con(InfixC, NormalC, RecC), Cxt, Dec(DataD, NewtypeD, TySynD, TySynInstD),- DerivStrategy(AnyclassStrategy), Info(TyConI), Kind, Loc(loc_module), Name, Q, TyLit(StrTyLit),- TySynEqn(..), TyVarBndr(..), Type(..), conT, cxt, instanceD, location, lookupTypeName, mkName,- nameBase, normalB, ppr, reify, reifyInstances, standaloneDerivWithStrategyD, valD, varE, varP)+ (Con(InfixC, NormalC, RecC), Cxt, Dec(DataD, NewtypeD, TySynD, TySynInstD), Info(TyConI), Kind,+ Loc(loc_module), Name, Q, TyLit(StrTyLit), TySynEqn(..), TyVarBndr(..), Type(..), conT, cxt,+ instanceD, location, lookupTypeName, mkName, nameBase, normalB, ppr, reify, reifyInstances, valD,+ varE, varP) import Language.Haskell.TH qualified as TH import Language.Haskell.TH.ReifyMany (reifyManyTyCons)-import Language.Haskell.TH.ReifyMany.Internal (decConcreteNames)+import Language.Haskell.TH.ReifyMany.Internal (decConcreteNames, unAppsT, unSigT) import Morley.Michelson.Text (MText) import Morley.Michelson.Typed- (BigMap, BigMapId, ContractPresence(ContractAbsent), ContractRef, EpAddress, HasNoBigMap,- HasNoContract, HasNoNestedBigMaps, HasNoOp, IsoValue, Notes(..), OpPresence(..), Operation,- SingI(sing), SingT(..), StorageScope, T(..), ToT, Value, Value'(..), WellTyped,- checkContractTypePresence, checkOpPresence, withDict) import Morley.Tezos.Address (Address) import Morley.Tezos.Core (ChainId, Mutez, Timestamp) import Morley.Tezos.Crypto@@ -57,14 +54,25 @@ mangleGenericStrategyConstructors, mangleGenericStrategyFields, reifyDataType) import Morley.Util.Interpolate (itu) import Morley.Util.Named hiding (Name)+import Morley.Util.StubbedProof (stubProof) import Morley.Util.TH (isTypeAlias, lookupTypeNameOrFail) {-# ANN module ("HLint: ignore Avoid lambda using `infix`" :: Text) #-} --- $setup--- >>> import Morley.Michelson.Typed--- >>> import Morley.Michelson.Text (MText)+{- $setup+>>> import Morley.Michelson.Typed+>>> import Morley.Michelson.Text (MText)+>>> import Data.Default (def)+>>> :{+-- mock definitions for doctests, mirroring those in Lorentz.+data FollowEntrypointFlag = FollowEntrypoint | NotFollowEntrypoint+class HasAnnotation a where+ getAnnotation :: FollowEntrypointFlag -> Notes (ToT a)+ annOptions :: ()+:}+-} + ---------------------------------------------------------------------------- -- TAsRPC ----------------------------------------------------------------------------@@ -300,38 +308,58 @@ {- | Derive an RPC representation for a type, as well as instances for 'Generic', 'IsoValue', 'HasRPCRepr' and optionally @HasAnnotation@. -> data ExampleStorage a b = ExampleStorage-> { esField1 :: Integer-> , esField2 :: [BigMap Integer MText]-> , esField3 :: a-> }-> deriving stock Generic-> deriving anyclass IsoValue->-> deriveRPC "ExampleStorage"+>>> :{+data ExampleStorage a b = ExampleStorage+ { esField1 :: Integer+ , esField2 :: [BigMap Integer MText]+ , esField3 :: a+ }+ deriving stock Generic+ deriving anyclass IsoValue+--+deriveRPC "ExampleStorage"+:} Will generate: -> data ExampleStorageRPC a b = ExampleStorageRPC-> { esField1RPC :: AsRPC Integer-> , esField2RPC :: AsRPC [BigMap Integer MText]-> , esField3RPC :: AsRPC a-> }->-> instance HasRPCRepr a => HasRPCRepr (ExampleStorage a b) where-> type AsRPC (ExampleStorage a b) = ExampleStorageRPC a b-> deriving anyclass instance (IsoValue (AsRPC a), IsoValue (AsRPC b)) => IsoValue (ExampleStorageRPC a b)-> instance Generic (ExampleStorageRPC a b) where-> ...+>>> :i ExampleStorageRPC+...+data ExampleStorageRPC a b+ = ExampleStorageRPC {esField1RPC :: !(AsRPC Integer),+ esField2RPC :: !(AsRPC [BigMap Integer MText]),+ esField3RPC :: !(AsRPC a)}+...+instance forall a k (b :: k).+ IsoValue (AsRPC a) =>+ IsoValue (ExampleStorageRPC a b)+...+instance forall a k (b :: k). Generic (ExampleStorageRPC a b)+... -When 'droHasAnnotation' is @True@, it will also generate a @HasAnnotation@ (from-@Lorentz@) instance like:+>>> :i HasRPCRepr+...+instance forall a k (b :: k).+ HasRPCRepr a =>+ HasRPCRepr (ExampleStorage a b)+... -> instance With [HasAnnotation, HasRPCRepr] ExampleStorage-> => HasAnnotation ExampleStorageRPC where-> getAnnotation = notesAsRPC . getAnnotation @ExampleStorage-> annOptions = annOptions @ExampleStorage+>>> :i AsRPC+...+type instance forall k a (b :: k). AsRPC (ExampleStorage a b)+ = ExampleStorageRPC a b+... ++When 'droHasAnnotation' is @True@ (the default), it will also generate a+@HasAnnotation@ (from @Lorentz@) instance like:++>>> :i HasAnnotation+...+instance forall a k (b :: k).+ With '[HasAnnotation, HasRPCRepr] (ExampleStorage a b) =>+ HasAnnotation (ExampleStorageRPC a b)+...+ Note that if the type doesn't contain type variables or only contains phantom type variables, 'HasRPCRepr' constraint is omitted, as it would be redundant. @@ -339,16 +367,26 @@ Void types will generate a type synonym instead, e.g. -> data MyVoidType-> deriving stock Generic-> deriving anyclass IsoValue+>>> :{+data MyVoidType+ deriving stock Generic+ deriving anyclass IsoValue+--+deriveRPC "MyVoidType"+:} will produce -> instance HasRPCRepr MyVoidType where-> type AsRPC MyVoidType = MyVoidTypeRPC-> type MyVoidTypeRPC = MyVoidType+>>> :i AsRPC+...+type instance AsRPC MyVoidType = MyVoidTypeRPC+... +>>> :i MyVoidTypeRPC+...+type MyVoidTypeRPC = MyVoidType+...+ When 'droRecursive' is @True@, recursively enumerate @data@, @newtype@ and @type@ declarations, and derive an RPC representation for each type that doesn't yet have one. This will however silently skip over void types that do not have@@ -360,17 +398,69 @@ types somewhere. The algorithm isn't smart enough to figure out those don't need RPC representation and will try to derive it anyway. -In this example, this will generate an RPC representation for @A@ and @B@, but-not for @C@ (because we explicitly said we don't want one) or @D@ (because it-already has one).+>>> :{+data B = B deriving (Generic, IsoValue)+data C = C deriving (Generic, IsoValue)+data D = D deriving (Generic, IsoValue)+data E a = E deriving (Generic, IsoValue)+--+instance HasRPCRepr D where type AsRPC D = ()+--+data A = A B (E C) D deriving (Generic, IsoValue)+deriveRPCWithOptions "A" def{droRecursive=True, droRecursiveSkipTypes=["C"]}+:} -> data B = B-> data C = C-> data D = D-> deriveRPC "D"->-> data A = A B C D-> deriveRPCWithOptions "A" def{droRecursive=True, droRecursiveSkipTypes=["C"]}+In this example, this will generate an RPC representation for @A@ and @B@,++>>> :i ARPC+...+data ARPC = ...+...+>>> :i BRPC+...+data BRPC = ...+...++but not for @C@ (because we explicitly said we don't want one) or @D@ (because+it already has one).++>>> :i CRPC+...+... Not in scope: ...+...+>>> :i DRPC+...+... Not in scope: ...+...++When using with @droRecursive = False@, if some types do not have 'HasRPCRepr',+'IsoValue' or 'Generic' instances, but need to, an error will be raised:++>>> :{+data B = B deriving (Generic, IsoValue)+data A = A B deriving (Generic, IsoValue)+--+deriveRPCWithOptions "A" def{droRecursive = False}+:}+...+... error:+... Type ... must implement 'HasRPCRepr'.++>>> :{+data B = B deriving (Generic, IsoValue)+data A = A B deriving (Generic, IsoValue)+--+deriveRPCWithOptions "B" def{droRecursive = False}+deriveRPCWithOptions "A" def{droRecursive = False}+:}++>>> :i AsRPC+...+type instance AsRPC B = BRPC ...+type instance AsRPC A = ARPC ...+...++This check isn't very smart, so it might miss some corner cases. -} deriveRPCWithOptions :: String -> DeriveRPCOptions -> Q [Dec] deriveRPCWithOptions typeStr opts@DeriveRPCOptions{droRecursive}@@ -448,10 +538,9 @@ , pure $ TySynD typeNameRPC [] $ ConT typeName ] else do- -- TODO [#722]: use `reifyInstances` to check that 'AsRPC' exists for `fieldType`- -- Print user-friendly error msg if it doesn't. constructorsRPC <- traverse convertConstructor constructors fieldTypes <- getFieldTypes constructors+ forM_ fieldTypes checkInstanceForFieldTy fieldTypesRPC <- getFieldTypes constructorsRPC -- Note: we can't use `makeRep0Inline` to derive a `Rep` instance for `derivedTypeRPC`@@ -484,6 +573,37 @@ ] where+ checkInstanceForFieldTy fieldTy =+ reifyInstances ''HasRPCRepr [fieldTy] >>= \case+ [] | droRecursive -> pass+ | otherwise+ -> fail $ "Type '" <> show (ppr fieldTy) <> "' must implement 'HasRPCRepr'."+ [TH.InstanceD _ cs (ConT n' `AppT` ty) _] | n' == ''HasRPCRepr -> do+ let tyMap = Map.fromList $ filter isVarMapping $+ zip (unSigT <$> unAppsT ty) (unSigT <$> unAppsT fieldTy)+ isVarMapping = \case+ (VarT{}, _) -> True+ _ -> False+ instantiatedConstraints =+ map (everywhere (mkT substVar)) . concatMap getHasRPCReprTys $+ everywhere (mkT unSigT) cs+ getHasRPCReprTys = \case+ ConT n `AppT` x | n == ''HasRPCRepr -> [x]+ ConT n `AppT` (PromotedConsT `AppT` ConT n2 `AppT` PromotedNilT) `AppT` xs+ | n == ''Each, n2 == ''HasRPCRepr -> flip unfoldr xs \case+ PromotedNilT -> Nothing+ PromotedConsT `AppT` x `AppT` xs' -> Just (x, xs')+ _ -> Nothing+ _ -> [] -- we could error here and above, but for safety we don't+ substVar = \case+ v@VarT{} | Just s <- Map.lookup v tyMap -> s+ x -> x+ forM_ instantiatedConstraints checkInstanceForFieldTy+ [d] -> fail $ "Unexpected instance for " <> show (ppr fieldTy) <> ": " <> show (ppr d)+ -- most likely fieldTy is a tyvar, if not, GHC will complain about+ -- duplicate instances anyway+ (_:_:_) -> pass+ -- Given the field type @FieldType a b@, returns @AsRPC (FieldType a b)@. convertFieldType :: Type -> Type convertFieldType tp = ConT ''AsRPC `AppT` tp@@ -583,13 +703,13 @@ -- Given the type @Foo a b = Foo (Bar a)@, generate an 'IsoValue' instance like: --- -- > deriving anyclass instance IsoValue (AsRPC (Bar a)) => IsoValue (FooRPC a b)+ -- > instance IsoValue (AsRPC (Bar a)) => IsoValue (FooRPC a b) -- -- Note that if a type variable @t@ is a phantom type variable, then no @IsoValue (AsRPC t)@ -- constraint is generated for it. mkIsoValueInstance :: [Type] -> Type -> Q [Dec] mkIsoValueInstance fieldTypes tp =- one <$> standaloneDerivWithStrategyD (Just AnyclassStrategy) constraints [t|IsoValue $(pure tp)|]+ one <$> instanceD constraints [t|IsoValue $(pure tp)|] [] where constraints :: Q Cxt constraints =@@ -676,52 +796,45 @@ -- -- Throws an error if it finds a big_map without an ID. valueAsRPC :: HasCallStack => Value t -> Value (TAsRPC t)-valueAsRPC v =- case v of- VKey {} -> v- VUnit {} -> v- VSignature {} -> v- VChainId {} -> v- VChest {} -> v- VChestKey {} -> v- VOption (vMaybe :: Maybe (Value elem)) ->- withDict (rpcSingIEvi @elem) $- VOption $ valueAsRPC <$> vMaybe- VList (vList :: [Value elem]) ->- withDict (rpcSingIEvi @elem) $- VList $ valueAsRPC <$> vList- VSet {} -> v- VOp {} -> v- VContract {} -> v- VTicket {} -> v- VPair (x, y) -> VPair (valueAsRPC x, valueAsRPC y)- VOr (vEither :: Either (Value l) (Value r)) ->- withDict (rpcSingIEvi @l *** rpcSingIEvi @r) $- case vEither of- Right r -> VOr (Right (valueAsRPC r))- Left l -> VOr (Left (valueAsRPC l))- VLam {} -> v- VMap (vMap :: Map (Value k) (Value v)) ->- withDict (rpcSingIEvi @v) $- VMap $ valueAsRPC <$> vMap- VBigMap (Just bmId) _ -> VNat bmId- VBigMap Nothing _ ->- error $ unlines- [ "Expected all big_maps to have an ID, but at least one big_map didn't."- , "This is most likely a bug."- ]- VInt {} -> v- VNat {} -> v- VString {} -> v- VBytes {} -> v- VMutez {} -> v- VBool {} -> v- VKeyHash {} -> v- VTimestamp {} -> v- VAddress {} -> v- VBls12381Fr {} -> v- VBls12381G1 {} -> v- VBls12381G2 {} -> v+valueAsRPC v = case v of+ VKey {} -> v+ VUnit {} -> v+ VSignature {} -> v+ VChainId {} -> v+ VChest {} -> v+ VChestKey {} -> v+ VOption (vMaybe :: Maybe (Value elem)) ->+ VOption (valueAsRPC <$> vMaybe) \\ rpcSingIEvi @elem+ VList (vList :: [Value elem]) ->+ VList (valueAsRPC <$> vList) \\ rpcSingIEvi @elem+ VSet {} -> v+ VOp {} -> v+ VContract {} -> v+ VTicket {} -> v+ VPair (x, y) -> VPair (valueAsRPC x, valueAsRPC y)+ VOr (vEither :: Either (Value l) (Value r)) ->+ VOr (bimap valueAsRPC valueAsRPC vEither) \\ rpcSingIEvi @l \\ rpcSingIEvi @r+ VLam {} -> v+ VMap (vMap :: Map (Value k) (Value v)) ->+ VMap (valueAsRPC <$> vMap) \\ rpcSingIEvi @v+ VBigMap (Just bmId) _ -> VNat bmId+ VBigMap Nothing _ ->+ error $ unlines+ [ "Expected all big_maps to have an ID, but at least one big_map didn't."+ , "This is most likely a bug."+ ]+ VInt {} -> v+ VNat {} -> v+ VString {} -> v+ VBytes {} -> v+ VMutez {} -> v+ VBool {} -> v+ VKeyHash {} -> v+ VTimestamp {} -> v+ VAddress {} -> v+ VBls12381Fr {} -> v+ VBls12381G1 {} -> v+ VBls12381G2 {} -> v -- | Replaces all bigmap IDs with their corresponding bigmap values. -- This is the inverse of `valueAsRPC`.@@ -778,42 +891,41 @@ -- | Replace all @big_map@ annotations in a value with @nat@ annotations. notesAsRPC :: Notes t -> Notes (TAsRPC t)-notesAsRPC notes =- case notes of- NTKey {} -> notes- NTUnit {} -> notes- NTSignature {} -> notes- NTChainId {} -> notes- NTChest {} -> notes- NTChestKey {} -> notes- NTOption typeAnn elemNotes -> NTOption typeAnn $ notesAsRPC elemNotes- NTList typeAnn elemNotes -> NTList typeAnn $ notesAsRPC elemNotes- NTSet {} -> notes- NTOperation {} -> notes- NTContract {} -> notes- NTTicket {} -> notes- NTPair typeAnn fieldAnn1 fieldAnn2 varAnn1 varAnn2 notes1 notes2 ->- NTPair typeAnn fieldAnn1 fieldAnn2 varAnn1 varAnn2 (notesAsRPC notes1) (notesAsRPC notes2)- NTOr typeAnn fieldAnn1 fieldAnn2 notes1 notes2 ->- NTOr typeAnn fieldAnn1 fieldAnn2 (notesAsRPC notes1) (notesAsRPC notes2)- NTLambda {} -> notes- NTMap typeAnn keyAnns valueNotes -> NTMap typeAnn keyAnns (notesAsRPC valueNotes)- NTBigMap typeAnn _ _ -> NTNat typeAnn- NTInt {} -> notes- NTNat {} -> notes- NTString {} -> notes- NTBytes {} -> notes- NTMutez {} -> notes- NTBool {} -> notes- NTKeyHash {} -> notes- NTTimestamp {} -> notes- NTAddress {} -> notes- NTBls12381Fr {} -> notes- NTBls12381G1 {} -> notes- NTBls12381G2 {} -> notes- NTNever {} -> notes- NTSaplingState {} -> notes- NTSaplingTransaction {} -> notes+notesAsRPC notes = case notes of+ NTKey {} -> notes+ NTUnit {} -> notes+ NTSignature {} -> notes+ NTChainId {} -> notes+ NTChest {} -> notes+ NTChestKey {} -> notes+ NTOption typeAnn elemNotes -> NTOption typeAnn $ notesAsRPC elemNotes+ NTList typeAnn elemNotes -> NTList typeAnn $ notesAsRPC elemNotes+ NTSet {} -> notes+ NTOperation {} -> notes+ NTContract {} -> notes+ NTTicket {} -> notes+ NTPair typeAnn fieldAnn1 fieldAnn2 varAnn1 varAnn2 notes1 notes2 ->+ NTPair typeAnn fieldAnn1 fieldAnn2 varAnn1 varAnn2 (notesAsRPC notes1) (notesAsRPC notes2)+ NTOr typeAnn fieldAnn1 fieldAnn2 notes1 notes2 ->+ NTOr typeAnn fieldAnn1 fieldAnn2 (notesAsRPC notes1) (notesAsRPC notes2)+ NTLambda {} -> notes+ NTMap typeAnn keyAnns valueNotes -> NTMap typeAnn keyAnns (notesAsRPC valueNotes)+ NTBigMap typeAnn _ _ -> NTNat typeAnn+ NTInt {} -> notes+ NTNat {} -> notes+ NTString {} -> notes+ NTBytes {} -> notes+ NTMutez {} -> notes+ NTBool {} -> notes+ NTKeyHash {} -> notes+ NTTimestamp {} -> notes+ NTAddress {} -> notes+ NTBls12381Fr {} -> notes+ NTBls12381G1 {} -> notes+ NTBls12381G2 {} -> notes+ NTNever {} -> notes+ NTSaplingState {} -> notes+ NTSaplingTransaction {} -> notes ---------------------------------------------------------------------------- -- Entailments@@ -821,58 +933,50 @@ -- | A proof that if a singleton exists for @t@, -- then so it does for @TAsRPC t@.-rpcSingIEvi :: forall (t :: T). SingI t :- SingI (TAsRPC t)-rpcSingIEvi =- Sub $- case sing @t of- STKey -> Dict- STUnit {} -> Dict- STSignature {} -> Dict- STChainId {} -> Dict- STChest {} -> Dict- STChestKey {} -> Dict- STOption (s :: Sing elem) -> withSingI s $ Dict \\ rpcSingIEvi @elem- STList (s :: Sing elem) -> withSingI s $ Dict \\ rpcSingIEvi @elem- STSet (s :: Sing elem) -> withSingI s $ Dict \\ rpcSingIEvi @elem- STOperation {} -> Dict- STContract {} -> Dict- STTicket {} -> Dict- STPair (sa :: Sing a) (sb :: Sing b) ->- withSingI sa $ withSingI sb $- Dict \\ rpcSingIEvi @a \\ rpcSingIEvi @b- STOr (sl :: Sing l) (sr :: Sing r) ->- withSingI sl $ withSingI sr $- Dict \\ rpcSingIEvi @l \\ rpcSingIEvi @r- STLambda {} -> Dict- STMap (sk :: Sing k) (sv :: Sing v) ->- withSingI sk $ withSingI sv $- Dict \\ rpcSingIEvi @k \\ rpcSingIEvi @v- STBigMap {} -> Dict- STInt {} -> Dict- STNat {} -> Dict- STString {} -> Dict- STBytes {} -> Dict- STMutez {} -> Dict- STBool {} -> Dict- STKeyHash {} -> Dict- STBls12381Fr {} -> Dict- STBls12381G1 {} -> Dict- STBls12381G2 {} -> Dict- STTimestamp {} -> Dict- STAddress {} -> Dict- STNever {} -> Dict- STSaplingState _ -> Dict- STSaplingTransaction _ -> Dict+rpcSingIEvi :: forall t. SingI t => Dict (SingI (TAsRPC t))+rpcSingIEvi = withSingI (rpcSing $ sing @t) Dict +rpcSing :: Sing t -> Sing (TAsRPC t)+rpcSing st = case st of+ STKey -> st+ STUnit {} -> st+ STSignature {} -> st+ STChainId {} -> st+ STChest {} -> st+ STChestKey {} -> st+ STOption s -> STOption $ rpcSing s+ STList s -> STList $ rpcSing s+ STSet{} -> st+ STOperation {} -> st+ STContract {} -> st+ STTicket {} -> st+ STPair sa sb -> STPair (rpcSing sa) (rpcSing sb)+ STOr sl sr -> STOr (rpcSing sl) (rpcSing sr)+ STLambda {} -> st+ STMap sk sv -> STMap sk (rpcSing sv)+ STBigMap {} -> STNat+ STInt {} -> st+ STNat {} -> st+ STString {} -> st+ STBytes {} -> st+ STMutez {} -> st+ STBool {} -> st+ STKeyHash {} -> st+ STBls12381Fr {} -> st+ STBls12381G1 {} -> st+ STBls12381G2 {} -> st+ STTimestamp {} -> st+ STAddress {} -> st+ STNever {} -> st+ STSaplingState _ -> st+ STSaplingTransaction _ -> st+ -- | A proof that if @t@ is well-typed, then @TAsRPC t@ is also well-typed.-rpcWellTypedEvi :: forall (t :: T). WellTyped t => WellTyped t :- WellTyped (TAsRPC t)-rpcWellTypedEvi = rpcWellTypedEvi' sing+rpcWellTypedEvi :: forall t. WellTyped t => Dict (WellTyped (TAsRPC t))+rpcWellTypedEvi = rpcWellTypedEvi' $ sing @t -rpcWellTypedEvi'- :: WellTyped t- => Sing t- -> WellTyped t :- WellTyped (TAsRPC t)-rpcWellTypedEvi' sng = Sub $ case sng of+rpcWellTypedEvi' :: WellTyped t => Sing t -> Dict (WellTyped (TAsRPC t))+rpcWellTypedEvi' sng = case sng of STKey -> Dict STUnit {} -> Dict STSignature {} -> Dict@@ -907,187 +1011,113 @@ STSaplingTransaction _ -> Dict -- | A proof that if @t@ does not contain any operations, then neither does @TAsRPC t@.-rpcHasNoOpEvi :: forall (t :: T). (SingI t, HasNoOp t) => HasNoOp t :- HasNoOp (TAsRPC t)-rpcHasNoOpEvi = rpcHasNoOpEvi' sing--rpcHasNoOpEvi'- :: HasNoOp t- => Sing t- -> HasNoOp t :- HasNoOp (TAsRPC t)-rpcHasNoOpEvi' sng = Sub $ case sng of- STKey -> Dict- STUnit {} -> Dict- STSignature {} -> Dict- STChainId {} -> Dict- STChest {} -> Dict- STChestKey {} -> Dict- STOption s -> Dict \\ rpcHasNoOpEvi' s- STList s -> Dict \\ rpcHasNoOpEvi' s- STSet s -> Dict \\ rpcHasNoOpEvi' s- STContract {} -> Dict- STTicket {} -> Dict- STPair sa sb -> case checkOpPresence sa of- OpAbsent -> Dict \\ rpcHasNoOpEvi' sa \\ rpcHasNoOpEvi' sb- STOr sl sr -> case checkOpPresence sl of- OpAbsent -> Dict \\ rpcHasNoOpEvi' sl \\ rpcHasNoOpEvi' sr- STLambda {} -> Dict- STMap _ sv -> case checkOpPresence sv of- OpAbsent -> Dict \\ rpcHasNoOpEvi' sv- STBigMap {} -> Dict- STInt {} -> Dict- STNat {} -> Dict- STString {} -> Dict- STBytes {} -> Dict- STMutez {} -> Dict- STBool {} -> Dict- STKeyHash {} -> Dict- STBls12381Fr {} -> Dict- STBls12381G1 {} -> Dict- STBls12381G2 {} -> Dict- STTimestamp {} -> Dict- STAddress {} -> Dict- STNever {} -> Dict- STSaplingState {} -> Dict- STSaplingTransaction {} -> Dict+rpcHasNoOpEvi :: forall (t :: T). (SingI t, ForbidOp t) => Dict (ForbidOp (TAsRPC t))+rpcHasNoOpEvi = Dict \\ rpcHasNoTEvi @t SPSOp -- | A proof that @AsRPC (Value t)@ does not contain big_maps.-rpcHasNoBigMapEvi :: forall (t :: T). SingI t => Dict (HasNoBigMap (TAsRPC t))-rpcHasNoBigMapEvi = rpcHasNoBigMapEvi' (sing @t)--rpcHasNoBigMapEvi' :: Sing t -> Dict (HasNoBigMap (TAsRPC t))-rpcHasNoBigMapEvi' = \case- STKey -> Dict- STUnit {} -> Dict- STSignature {} -> Dict- STChainId {} -> Dict- STChest {} -> Dict- STChestKey {} -> Dict- STOption s -> Dict \\ rpcHasNoBigMapEvi' s- STList s -> Dict \\ rpcHasNoBigMapEvi' s- STSet s -> Dict \\ rpcHasNoBigMapEvi' s- STOperation {} -> Dict- STContract {} -> Dict- STTicket {} -> Dict- STPair sa sb -> Dict \\ rpcHasNoBigMapEvi' sa \\ rpcHasNoBigMapEvi' sb- STOr sl sr -> Dict \\ rpcHasNoBigMapEvi' sl \\ rpcHasNoBigMapEvi' sr- STLambda {} -> Dict- STMap sk sv -> Dict \\ rpcHasNoBigMapEvi' sk \\ rpcHasNoBigMapEvi' sv- STBigMap {} -> Dict- STInt {} -> Dict- STNat {} -> Dict- STString {} -> Dict- STBytes {} -> Dict- STMutez {} -> Dict- STBool {} -> Dict- STKeyHash {} -> Dict- STBls12381Fr {} -> Dict- STBls12381G1 {} -> Dict- STBls12381G2 {} -> Dict- STTimestamp {} -> Dict- STAddress {} -> Dict- STNever {} -> Dict- STSaplingState {} -> Dict- STSaplingTransaction {} -> Dict+rpcHasNoBigMapEvi :: forall (t :: T). (SingI t, ForbidBigMap t) => Dict (ForbidBigMap (TAsRPC t))+rpcHasNoBigMapEvi = Dict \\ rpcHasNoTEvi @t SPSBigMap --- | A proof that @AsRPC (Value t)@ does not contain big_maps.+-- | A proof that @AsRPC (Value t)@ does not contain nested big_maps. rpcHasNoNestedBigMapsEvi- :: forall (t :: T).- SingI t- => Dict (HasNoNestedBigMaps (TAsRPC t))-rpcHasNoNestedBigMapsEvi = rpcHasNoNestedBigMapsEvi' (sing @t)+ :: forall (t :: T). (SingI t, ForbidNestedBigMaps t) => Dict (ForbidNestedBigMaps (TAsRPC t))+rpcHasNoNestedBigMapsEvi = Dict \\ rpcHasNoTEvi @t SPSNestedBigMaps -rpcHasNoNestedBigMapsEvi' :: Sing t -> Dict (HasNoNestedBigMaps (TAsRPC t))-rpcHasNoNestedBigMapsEvi' = \case- STKey -> Dict- STUnit {} -> Dict- STSignature {} -> Dict- STChainId {} -> Dict- STChest {} -> Dict- STChestKey {} -> Dict- STOption s -> Dict \\ rpcHasNoNestedBigMapsEvi' s- STList s -> Dict \\ rpcHasNoNestedBigMapsEvi' s- STSet s -> Dict \\ rpcHasNoNestedBigMapsEvi' s- STOperation {} -> Dict- STContract {} -> Dict- STTicket {} -> Dict- STPair sa sb ->- Dict \\ rpcHasNoNestedBigMapsEvi' sa \\ rpcHasNoNestedBigMapsEvi' sb- STOr sl sr ->- Dict \\ rpcHasNoNestedBigMapsEvi' sl \\ rpcHasNoNestedBigMapsEvi' sr- STLambda {} -> Dict- STMap sk sv ->- Dict \\ rpcHasNoNestedBigMapsEvi' sk \\ rpcHasNoNestedBigMapsEvi' sv- STBigMap {} -> Dict- STInt {} -> Dict- STNat {} -> Dict- STString {} -> Dict- STBytes {} -> Dict- STMutez {} -> Dict- STBool {} -> Dict- STKeyHash {} -> Dict- STBls12381Fr {} -> Dict- STBls12381G1 {} -> Dict- STBls12381G2 {} -> Dict- STTimestamp {} -> Dict- STAddress {} -> Dict- STNever {} -> Dict- STSaplingState {} -> Dict- STSaplingTransaction {} -> Dict+-- | A proof that @AsRPC (Value t)@ does not contain some type defined by a predicate.+rpcHasNoTEvi+ :: forall (t :: T) p.+ (SingI t, ContainsT p t ~ 'False)+ => Sing p -> (ContainsT p (TAsRPC t) :~: 'False)+rpcHasNoTEvi sp = rpcHasNoTEvi' sp (sing @t) +rpcHasNoTEvi'+ :: forall t p. (ContainsT p t ~ 'False)+ => Sing p -> Sing t -> ContainsT p (TAsRPC t) :~: 'False+rpcHasNoTEvi' ps ts = stubProof case ts of+ STKey -> Refl+ STUnit {} -> Refl+ STSignature {} -> Refl+ STChainId {} -> Refl+ STChest {} -> Refl+ STChestKey {} -> Refl+ STOption s -> Refl \\ go s+ STList s -> case ps of+ SPSOp -> Refl \\ go s+ SPSContract -> Refl \\ go s+ SPSTicket -> Refl \\ go s+ SPSBigMap -> Refl \\ go s+ SPSNestedBigMaps -> Refl \\ go s+ SPSSaplingState -> Refl \\ go s+ STSet _ -> case ps of+ SPSOp -> Refl+ SPSContract -> Refl+ SPSTicket -> Refl+ SPSBigMap -> Refl+ SPSNestedBigMaps -> Refl+ SPSSaplingState -> Refl+ STOperation {} -> case ps of+ SPSContract -> Refl+ SPSTicket -> Refl+ SPSBigMap -> Refl+ SPSNestedBigMaps -> Refl+ SPSSaplingState -> Refl+ STContract {} -> case ps of+ SPSOp -> Refl+ SPSTicket -> Refl+ SPSBigMap -> Refl+ SPSNestedBigMaps -> Refl+ SPSSaplingState -> Refl+ STTicket _ -> case ps of+ SPSOp -> Refl+ SPSContract -> Refl+ SPSBigMap -> Refl+ SPSNestedBigMaps -> Refl+ SPSSaplingState -> Refl+ STPair sa sb -> deMorganForbidT ps sa sb $ Refl \\ go sa \\ go sb+ STOr sl sr -> deMorganForbidT ps sl sr $ Refl \\ go sl \\ go sr+ STLambda {} -> Refl+ STMap sk sv -> case ps of+ SPSOp -> deMorganForbidT ps sk sv $ Refl \\ go sv+ SPSContract -> deMorganForbidT ps sk sv $ Refl \\ go sv+ SPSTicket -> deMorganForbidT ps sk sv $ Refl \\ go sv+ SPSBigMap -> deMorganForbidT ps sk sv $ Refl \\ go sv+ SPSNestedBigMaps -> deMorganForbidT ps sk sv $ Refl \\ go sv+ SPSSaplingState -> deMorganForbidT ps sk sv $ Refl \\ go sv+ STBigMap {} -> Refl+ STInt {} -> Refl+ STNat {} -> Refl+ STString {} -> Refl+ STBytes {} -> Refl+ STMutez {} -> Refl+ STBool {} -> Refl+ STKeyHash {} -> Refl+ STBls12381Fr {} -> Refl+ STBls12381G1 {} -> Refl+ STBls12381G2 {} -> Refl+ STTimestamp {} -> Refl+ STAddress {} -> Refl+ STNever {} -> Refl+ STSaplingState {} -> case ps of+ SPSOp -> Refl+ SPSTicket -> Refl+ SPSContract -> Refl+ SPSBigMap -> Refl+ SPSNestedBigMaps -> Refl+ STSaplingTransaction {} -> Refl+ where+ go :: (ContainsT p t' ~ 'False) => Sing t' -> ContainsT p (TAsRPC t') :~: 'False+ go = rpcHasNoTEvi' ps+ -- | A proof that if @t@ does not contain any contract values, then neither does @TAsRPC t@. rpcHasNoContractEvi- :: forall (t :: T).- (SingI t, HasNoContract t)- => HasNoContract t :- HasNoContract (TAsRPC t)-rpcHasNoContractEvi = rpcHasNoContractEvi' sing--rpcHasNoContractEvi'- :: HasNoContract t- => Sing t- -> HasNoContract t :- HasNoContract (TAsRPC t)-rpcHasNoContractEvi' sng = Sub $ case sng of- STKey -> Dict- STUnit {} -> Dict- STSignature {} -> Dict- STChainId {} -> Dict- STChest {} -> Dict- STChestKey {} -> Dict- STOption s -> Dict \\ rpcHasNoContractEvi' s- STList s -> Dict \\ rpcHasNoContractEvi' s- STSet _ -> Dict- STOperation {} -> Dict- STTicket {} -> Dict- STPair sa sb -> case checkContractTypePresence sa of- ContractAbsent ->- Dict \\ rpcHasNoContractEvi' sa \\ rpcHasNoContractEvi' sb- STOr sl sr -> case checkContractTypePresence sl of- ContractAbsent ->- Dict \\ rpcHasNoContractEvi' sl \\ rpcHasNoContractEvi' sr- STLambda {} -> Dict- STMap _ sv -> Dict \\ rpcHasNoContractEvi' sv- STBigMap {} -> Dict- STInt {} -> Dict- STNat {} -> Dict- STString {} -> Dict- STBytes {} -> Dict- STMutez {} -> Dict- STBool {} -> Dict- STKeyHash {} -> Dict- STBls12381Fr {} -> Dict- STBls12381G1 {} -> Dict- STBls12381G2 {} -> Dict- STTimestamp {} -> Dict- STAddress {} -> Dict- STNever {} -> Dict- STSaplingState {} -> Dict- STSaplingTransaction {} -> Dict+ :: forall (t :: T). (SingI t, ForbidContract t) => Dict (ForbidContract (TAsRPC t))+rpcHasNoContractEvi = Dict \\ rpcHasNoTEvi @t SPSContract -- | A proof that if @t@ is a valid storage type, then so is @TAsRPC t@.-rpcStorageScopeEvi :: forall (t :: T). StorageScope t :- StorageScope (TAsRPC t)-rpcStorageScopeEvi =- Sub $ Dict- \\ rpcSingIEvi @t- \\ rpcHasNoOpEvi @t- \\ rpcHasNoNestedBigMapsEvi @t- \\ rpcHasNoContractEvi @t- \\ rpcWellTypedEvi @t+rpcStorageScopeEvi :: forall (t :: T). StorageScope t => Dict (StorageScope (TAsRPC t))+rpcStorageScopeEvi = Dict+ \\ rpcSingIEvi @t+ \\ rpcHasNoOpEvi @t+ \\ rpcHasNoNestedBigMapsEvi @t+ \\ rpcHasNoContractEvi @t+ \\ rpcWellTypedEvi @t
src/Morley/Micheline/Binary.hs view
@@ -16,7 +16,6 @@ import Data.Binary.Get qualified as Bi import Data.ByteString qualified as BS import Data.ByteString.Lazy qualified as LBS-import Data.Sequence qualified as Seq import Unsafe qualified (fromIntegral) import Morley.Micheline.Binary.Internal@@ -54,9 +53,7 @@ buildList = foldMap buildExpr buildPrim :: MichelinePrimitive -> Bi.Builder-buildPrim (MichelinePrimitive p) = case Seq.elemIndexL p michelsonPrimitive of- Nothing -> error $ "unknown Michelson/Micheline primitive: " <> p- Just ix -> buildWord8 (Unsafe.fromIntegral @Int @Word8 ix)+buildPrim = buildWord8 . Unsafe.fromIntegral @Int @Word8 . fromEnum buildAnnotationList :: [Annotation] -> Bi.Builder buildAnnotationList listAnn = buildDynamic buildText (DynamicSize $ unwords . fmap annotToText $ listAnn)@@ -92,10 +89,8 @@ getList = many getExpr getPrim :: Bi.Get MichelinePrimitive-getPrim =- Bi.getWord8 >>= \ix -> case Seq.lookup (fromIntegral ix) michelsonPrimitive of- Nothing -> fail "unknown Michelson/Micheline opcode"- Just str -> pure $ MichelinePrimitive str+getPrim = maybe (fail "unknown Michelson/Micheline opcode") pure . toEnumSafe . fromIntegral+ =<< Bi.getWord8 getAnnotationList :: Bi.Get [Annotation] getAnnotationList = mapM annotFromText . words . unDynamicSize =<< (getDynamic getText)
src/Morley/Micheline/Class.hs view
@@ -14,1046 +14,945 @@ import Control.Lens ((<>~)) import Data.Bits (Bits)-import Data.Singletons (SingI(..), demote)-import Fmt (Buildable(..), indentF, pretty, unlinesF)--import Morley.Micheline.Expression-import Morley.Michelson.Text (mkMText, unMText)-import Morley.Michelson.TypeCheck (TypeCheckOptions(..), typeCheckingWith)-import Morley.Michelson.TypeCheck.Instr (typeCheckValue)-import Morley.Michelson.Typed- (Contract, HasNoOp, Instr, LambdaCode'(..), Notes(..), T(..), Value, Value'(..), fromUType,- mkUType, rfAnyInstr, toUType)-import Morley.Michelson.Typed.Convert (convertContract, instrToOpsOptimized, untypeValueOptimized)-import Morley.Michelson.Untyped qualified as Untyped-import Morley.Michelson.Untyped.Annotation- (AnnotationSet(..), FieldAnn, FieldTag, RootAnn, TypeAnn, TypeTag, VarAnn, VarTag, annsCount,- emptyAnnSet, firstAnn, noAnn, secondAnn)-import Morley.Michelson.Untyped.Contract (ContractBlock(..), orderContractBlock)-import Morley.Michelson.Untyped.Instr (ExpandedInstr, ExpandedOp(..), InstrAbstract(..))-import Morley.Michelson.Untyped.Type (Ty(..))-import Morley.Michelson.Untyped.View---- ToExpression--------------------------------------------------------------------------------- | Type class that provides an ability to convert--- something to Micheline Expression.-class ToExpression a where- toExpression :: a -> Expression--instance (HasNoOp t) => ToExpression (Value t) where- toExpression = toExpression . untypeValueOptimized--instance ToExpression Untyped.Value where- toExpression = \case- Untyped.ValueInt v -> expressionInt v- Untyped.ValueString s -> expressionString $ unMText s- Untyped.ValueBytes (Untyped.InternalByteString bs) -> expressionBytes bs- Untyped.ValueUnit -> expressionPrim' "Unit" [] []- Untyped.ValueTrue -> expressionPrim' "True" [] []- Untyped.ValueFalse -> expressionPrim' "False" [] []- Untyped.ValuePair l r ->- expressionPrim' "Pair" [toExpression l, toExpression r] []- Untyped.ValueLeft v -> expressionPrim' "Left" [toExpression v] []- Untyped.ValueRight v -> expressionPrim' "Right" [toExpression v] []- Untyped.ValueSome v -> expressionPrim' "Some" [toExpression v] []- Untyped.ValueNone -> expressionPrim' "None" [] []- Untyped.ValueNil -> expressionSeq []- Untyped.ValueSeq vs -> toExpression vs- Untyped.ValueMap elts -> toExpression $ eltToExpr <$> elts- Untyped.ValueLambda ops -> toExpression ops- Untyped.ValueLamRec ops -> expressionPrim' "Lambda_rec" [toExpression ops] []- where- eltToExpr :: Untyped.Elt ExpandedOp -> Expression- eltToExpr (Untyped.Elt l r) = expressionPrim' "Elt"- [toExpression l, toExpression r] []---instance ToExpression (Instr inp out) where- toExpression = toExpression . instrToOpsOptimized--instance ToExpression T where- toExpression = toExpression . toUType--instance ToExpression (Notes t) where- toExpression = toExpression . mkUType--instance ToExpression Untyped.T where- toExpression = \case- Untyped.TKey -> expressionPrim' "key" [] []- Untyped.TUnit -> expressionPrim' "unit" [] []- Untyped.TSignature -> expressionPrim' "signature" [] []- Untyped.TChainId -> expressionPrim' "chain_id" [] []- Untyped.TOption arg -> expressionPrim' "option" [toExpression arg] []- Untyped.TList arg -> expressionPrim' "list" [toExpression arg] []- Untyped.TSet arg -> expressionPrim' "set" [toExpression arg] []- Untyped.TOperation -> expressionPrim' "operation" [] []- Untyped.TContract arg -> expressionPrim' "contract" [toExpression arg] []- Untyped.TTicket arg -> expressionPrim' "ticket" [toExpression arg] []- t@Untyped.TPair{} -> expressionPrim' "pair" (rightCombedPairToList t) []- Untyped.TOr fa1 fa2 l r ->- let exprL = addTrimmedAnns (toExpression l) [] [fa1] []- exprR = addTrimmedAnns (toExpression r) [] [fa2] []- in expressionPrim' "or" [exprL, exprR] []- Untyped.TLambda inp out ->- expressionPrim' "lambda" [toExpression inp, toExpression out] []- Untyped.TMap k v ->- expressionPrim' "map" [toExpression k, toExpression v] []- Untyped.TBigMap k v ->- expressionPrim' "big_map" [toExpression k, toExpression v] []- Untyped.TInt -> expressionPrim' "int" [] []- Untyped.TNat -> expressionPrim' "nat" [] []- Untyped.TString -> expressionPrim' "string" [] []- Untyped.TBytes -> expressionPrim' "bytes" [] []- Untyped.TMutez -> expressionPrim' "mutez" [] []- Untyped.TBool -> expressionPrim' "bool" [] []- Untyped.TKeyHash -> expressionPrim' "key_hash" [] []- Untyped.TBls12381Fr -> expressionPrim' "bls12_381_fr" [] []- Untyped.TBls12381G1 -> expressionPrim' "bls12_381_g1" [] []- Untyped.TBls12381G2 -> expressionPrim' "bls12_381_g2" [] []- Untyped.TTimestamp -> expressionPrim' "timestamp" [] []- Untyped.TAddress -> expressionPrim' "address" [] []- Untyped.TChest -> expressionPrim' "chest" [] []- Untyped.TChestKey -> expressionPrim' "chest_key" [] []- Untyped.TNever -> expressionPrim' "never" [] []- Untyped.TSaplingState n -> expressionPrim' "sapling_state" [integralToExpr n] []- Untyped.TSaplingTransaction n -> expressionPrim' "sapling_transaction" [integralToExpr n] []-- where- addAnns :: Expression -> [Annotation] -> Expression- addAnns e anns =- e & _ExpressionPrim . mpaAnnotsL <>~ anns-- rightCombedPairToList :: Untyped.T -> [Expression]- rightCombedPairToList t =- let go ty (fa, va)- | Ty (Untyped.TPair faL faR vaL vaR l r) ta <- ty- , ta == noAnn, fa == noAnn, va == noAnn- = toExpression l `addAnns` mkAnns [] [faL] [vaL] : go r (faR, vaR)- | otherwise- = one $ toExpression ty `addAnns` mkAnns [] [fa] [va]- in go (Ty t noAnn) (noAnn, noAnn)--instance ToExpression Ty where- toExpression (Ty t ta) = addTrimmedAnns (toExpression t) [ta] [] []--instance (ToExpression a) => ToExpression [a] where- toExpression xs = expressionSeq $ toExpression <$> xs--instance (ToExpression a) => ToExpression (NonEmpty a) where- toExpression = toExpression . toList--instance ToExpression Expression where- toExpression = id--instance ToExpression ExpandedOp where- toExpression = \case- PrimEx instr -> toExpression instr- SeqEx s -> expressionSeq $ toExpression <$> s- WithSrcEx _ op -> toExpression op--instance ToExpression ViewName where- toExpression (ViewName s) = expressionString s---- Note: On adding new expressions here, you must also add the symmetric (reading) case--- to FromExp x (InstrAbstract op) as well.-instance ToExpression ExpandedInstr where- toExpression = \case- PUSH va ty v -> expressionPrim' "PUSH" [toExpression ty, toExpression v] $- mkAnns [] [] [va]- DROP -> expressionPrim' "DROP" [] []- DROPN n -> expressionPrim' "DROP" [integralToExpr n] []- DUP va -> expressionPrim' "DUP" [] $ mkAnns [] [] [va]- DUPN va n -> expressionPrim' "DUP" [integralToExpr n] $ mkAnns [] [] [va]- SWAP -> expressionPrim' "SWAP" [] []- DIG n -> expressionPrim' "DIG" [integralToExpr n] []- DUG n -> expressionPrim' "DUG" [integralToExpr n] []- SOME ta va ->- expressionPrim' "SOME" [] $ mkAnns [ta] [] [va]- NONE ta va ty -> expressionPrim' "NONE" [toExpression ty] $ mkAnns [ta] [] [va]- UNIT ta va -> expressionPrim' "UNIT" [] $ mkAnns [ta] [] [va]- IF_NONE ops1 ops2 ->- expressionPrim' "IF_NONE" [toExpression ops1, toExpression ops2] []- PAIR ta va fa1 fa2 -> expressionPrim' "PAIR" [] $ mkAnns [ta] [fa1, fa2] [va]- UNPAIR va1 va2 fa1 fa2 -> expressionPrim' "UNPAIR" [] $- mkAnns [] [fa1, fa2] [va1, va2]- PAIRN va n -> expressionPrim' "PAIR" [integralToExpr n] $ mkAnns [] [] [va]- UNPAIRN n -> expressionPrim' "UNPAIR" [integralToExpr n] []- CAR va fa -> expressionPrim' "CAR" [] $ mkAnns [] [fa] [va]- CDR va fa -> expressionPrim' "CDR" [] $ mkAnns [] [fa] [va]- LEFT ta va fa1 fa2 ty -> expressionPrim' "LEFT" [toExpression ty] $- mkAnns [ta] [fa1, fa2] [va]- RIGHT ta va fa1 fa2 ty -> expressionPrim' "RIGHT" [toExpression ty] $- mkAnns [ta] [fa1, fa2] [va]- IF_LEFT ops1 ops2 ->- expressionPrim' "IF_LEFT" [toExpression ops1, toExpression ops2] []- NIL ta va ty -> expressionPrim' "NIL" [toExpression ty] $- mkAnns [ta] [] [va]- CONS va -> expressionPrim' "CONS" [] $ mkAnns [] [] [va]- IF_CONS ops1 ops2 ->- expressionPrim' "IF_CONS" [toExpression ops1, toExpression ops2] []- SIZE va -> expressionPrim' "SIZE" [] $ mkAnns [] [] [va]- EMPTY_SET ta va ty -> expressionPrim' "EMPTY_SET" [toExpression ty] $- mkAnns [ta] [] [va]- EMPTY_MAP ta va kty vty ->- expressionPrim' "EMPTY_MAP" [toExpression kty, toExpression vty] $- mkAnns [ta] [] [va]- EMPTY_BIG_MAP ta va kty vty ->- expressionPrim' "EMPTY_BIG_MAP" [toExpression kty, toExpression vty] $- mkAnns [ta] [] [va]- MAP va ops -> expressionPrim' "MAP" [toExpression ops] $ mkAnns [] [] [va]- ITER ops -> expressionPrim' "ITER" [toExpression ops] []- MEM va -> expressionPrim' "MEM" [] $ mkAnns [] [] [va]- GET va -> expressionPrim' "GET" [] $ mkAnns [] [] [va]- GETN va n -> expressionPrim' "GET" [integralToExpr n] $ mkAnns [] [] [va]- UPDATE va -> expressionPrim' "UPDATE" [] $ mkAnns [] [] [va]- UPDATEN va n -> expressionPrim' "UPDATE" [integralToExpr n] $ mkAnns [] [] [va]- GET_AND_UPDATE va -> expressionPrim' "GET_AND_UPDATE" [] $ mkAnns [] [] [va]- IF ops1 ops2 ->- expressionPrim' "IF" [toExpression ops1, toExpression ops2] []- LOOP ops -> expressionPrim' "LOOP" [toExpression ops] []- LOOP_LEFT ops -> expressionPrim' "LOOP_LEFT" [toExpression ops] []- LAMBDA va tyin tyout ops ->- expressionPrim' "LAMBDA" [ toExpression tyin- , toExpression tyout- , toExpression ops- ] $ mkAnns [] [] [va]- LAMBDA_REC va tyin tyout ops ->- expressionPrim' "LAMBDA_REC" [ toExpression tyin- , toExpression tyout- , toExpression ops- ] $ mkAnns [] [] [va]- EXEC va -> expressionPrim' "EXEC" [] $ mkAnns [] [] [va]- APPLY va -> expressionPrim' "APPLY" [] $ mkAnns [] [] [va]- DIP ops -> expressionPrim' "DIP" [toExpression ops] []- DIPN n ops -> expressionPrim' "DIP" [integralToExpr n, toExpression ops] []- FAILWITH -> expressionPrim' "FAILWITH" [] []- CAST va ty -> expressionPrim' "CAST" [toExpression ty] $ mkAnns [] [] [va]- RENAME va -> expressionPrim' "RENAME" [] $ mkAnns [] [] [va]- PACK va -> expressionPrim' "PACK" [] $ mkAnns [] [] [va]- UNPACK ta va ty -> expressionPrim' "UNPACK" [toExpression ty] $- mkAnns [ta] [] [va]- CONCAT va -> expressionPrim' "CONCAT" [] $ mkAnns [] [] [va]- SLICE va -> expressionPrim' "SLICE" [] $ mkAnns [] [] [va]- ISNAT va -> expressionPrim' "ISNAT" [] $ mkAnns [] [] [va]- ADD va -> expressionPrim' "ADD" [] $ mkAnns [] [] [va]- SUB va -> expressionPrim' "SUB" [] $ mkAnns [] [] [va]- SUB_MUTEZ va -> expressionPrim' "SUB_MUTEZ" [] $ mkAnns [] [] [va]- MUL va -> expressionPrim' "MUL" [] $ mkAnns [] [] [va]- EDIV va -> expressionPrim' "EDIV" [] $ mkAnns [] [] [va]- ABS va -> expressionPrim' "ABS" [] $ mkAnns [] [] [va]- NEG va -> expressionPrim' "NEG" [] $ mkAnns [] [] [va]- LSL va -> expressionPrim' "LSL" [] $ mkAnns [] [] [va]- LSR va -> expressionPrim' "LSR" [] $ mkAnns [] [] [va]- OR va -> expressionPrim' "OR" [] $ mkAnns [] [] [va]- AND va -> expressionPrim' "AND" [] $ mkAnns [] [] [va]- XOR va -> expressionPrim' "XOR" [] $ mkAnns [] [] [va]- NOT va -> expressionPrim' "NOT" [] $ mkAnns [] [] [va]- COMPARE va -> expressionPrim' "COMPARE" [] $ mkAnns [] [] [va]- Untyped.EQ va -> expressionPrim' "EQ" [] $ mkAnns [] [] [va]- NEQ va -> expressionPrim' "NEQ" [] $ mkAnns [] [] [va]- Untyped.LT va -> expressionPrim' "LT" [] $ mkAnns [] [] [va]- Untyped.GT va -> expressionPrim' "GT" [] $ mkAnns [] [] [va]- LE va -> expressionPrim' "LE" [] $ mkAnns [] [] [va]- GE va -> expressionPrim' "GE" [] $ mkAnns [] [] [va]- INT va -> expressionPrim' "INT" [] $ mkAnns [] [] [va]- NAT va -> expressionPrim' "NAT" [] $ mkAnns [] [] [va]- BYTES va -> expressionPrim' "BYTES" [] $ mkAnns [] [] [va]- VIEW va n t -> expressionPrim' "VIEW" [toExpression n, toExpression t] $- mkAnns [] [] [va]- SELF va fa -> expressionPrim' "SELF" [] $ mkAnns [] [fa] [va]- CONTRACT va fa ty -> expressionPrim' "CONTRACT" [toExpression ty] $- mkAnns [] [fa] [va]- TRANSFER_TOKENS va -> expressionPrim' "TRANSFER_TOKENS" [] $ mkAnns [] [] [va]- SET_DELEGATE va -> expressionPrim' "SET_DELEGATE" [] $ mkAnns [] [] [va]- CREATE_CONTRACT va1 va2 c ->- expressionPrim' "CREATE_CONTRACT" [toExpression c] $- mkAnns [] [] [va1, va2]- IMPLICIT_ACCOUNT va -> expressionPrim' "IMPLICIT_ACCOUNT" [] $- mkAnns [] [] [va]- NOW va -> expressionPrim' "NOW" [] $ mkAnns [] [] [va]- AMOUNT va -> expressionPrim' "AMOUNT" [] $ mkAnns [] [] [va]- BALANCE va -> expressionPrim' "BALANCE" [] $ mkAnns [] [] [va]- VOTING_POWER va -> expressionPrim' "VOTING_POWER" [] $ mkAnns [] [] [va]- TOTAL_VOTING_POWER va -> expressionPrim' "TOTAL_VOTING_POWER" [] $- mkAnns [] [] [va]- CHECK_SIGNATURE va -> expressionPrim' "CHECK_SIGNATURE" [] $ mkAnns [] [] [va]- SHA256 va -> expressionPrim' "SHA256" [] $ mkAnns [] [] [va]- SHA512 va -> expressionPrim' "SHA512" [] $ mkAnns [] [] [va]- BLAKE2B va -> expressionPrim' "BLAKE2B" [] $ mkAnns [] [] [va]- SHA3 va -> expressionPrim' "SHA3" [] $ mkAnns [] [] [va]- KECCAK va -> expressionPrim' "KECCAK" [] $ mkAnns [] [] [va]- HASH_KEY va -> expressionPrim' "HASH_KEY" [] $ mkAnns [] [] [va]- PAIRING_CHECK va -> expressionPrim' "PAIRING_CHECK" [] $ mkAnns [] [] [va]- SOURCE va -> expressionPrim' "SOURCE" [] $ mkAnns [] [] [va]- SENDER va -> expressionPrim' "SENDER" [] $ mkAnns [] [] [va]- ADDRESS va -> expressionPrim' "ADDRESS" [] $ mkAnns [] [] [va]- CHAIN_ID va -> expressionPrim' "CHAIN_ID" [] $ mkAnns [] [] [va]- LEVEL va -> expressionPrim' "LEVEL" [] $ mkAnns [] [] [va]- SELF_ADDRESS va -> expressionPrim' "SELF_ADDRESS" [] $ mkAnns [] [] [va]- TICKET va -> expressionPrim' "TICKET" [] $ mkAnns [] [] [va]- TICKET_DEPRECATED va -> expressionPrim' "TICKET_DEPRECATED" [] $ mkAnns [] [] [va]- READ_TICKET va -> expressionPrim' "READ_TICKET" [] $ mkAnns [] [] [va]- SPLIT_TICKET va -> expressionPrim' "SPLIT_TICKET" [] $ mkAnns [] [] [va]- JOIN_TICKETS va -> expressionPrim' "JOIN_TICKETS" [] $ mkAnns [] [] [va]- OPEN_CHEST va -> expressionPrim' "OPEN_CHEST" [] $ mkAnns [] [] [va]- NEVER -> expressionPrim' "NEVER" [] []- EXT _ -> expressionSeq []- SAPLING_EMPTY_STATE va n -> expressionPrim' "SAPLING_EMPTY_STATE" [integralToExpr n] $ mkAnns [] [] [va]- SAPLING_VERIFY_UPDATE va -> expressionPrim' "SAPLING_VERIFY_UPDATE" [] $ mkAnns [] [] [va]- MIN_BLOCK_TIME va -> expressionPrim' "MIN_BLOCK_TIME" [] $ mkAnnsFromAny va- EMIT va tag ty -> expressionPrim' "EMIT" (toExpression <$> maybeToList ty) $ mkAnns [] [tag] [va]--instance ToExpression Untyped.Contract where- toExpression contract- = expressionSeq $ Untyped.mapEntriesOrdered contract- (\(Untyped.ParameterType ty rootAnn) -> expressionPrim' "parameter"- [insertRootAnn (toExpression ty) rootAnn] [])- (\storage -> expressionPrim' "storage" [toExpression storage] [])- (\code -> expressionPrim' "code" [toExpression code] [])- (\Untyped.View{..} -> expressionPrim' "view"- [toExpression viewName, toExpression viewArgument, toExpression viewReturn, toExpression viewCode] []- )--instance ToExpression (Contract cp st) where- toExpression = toExpression . convertContract---- FromExpression--------------------------------------------------------------------------------- | Errors that can happen when we convert an 'Exp' to our--- data type.-data FromExpError x = FromExpError (Exp x) Text--deriving stock instance Show (Exp x) => Show (FromExpError x)-deriving stock instance Eq (Exp x) => Eq (FromExpError x)---- | Error in case of vanilla expression.-type FromExpressionError = FromExpError RegularExp--instance Buildable FromExpressionError where- build (FromExpError expr err) =- unlinesF- [ "Failed to convert expression:"- , indentF 2 $ build expr- , ""- , "Error:"- , indentF 2 $ build err- ]--instance Exception FromExpressionError where- displayException = pretty---- | Type class that provides the ability to convert--- something from a Micheline Expression.-class FromExp x a where- fromExp :: Exp x -> Either (FromExpError x) a--type FromExpression = FromExp RegularExp---- | Parse vanilla expression to something.-fromExpression- :: FromExp RegularExp a- => Expression -> Either FromExpressionError a-fromExpression = fromExp--instance (FromExp x Untyped.Value, SingI t) => FromExp x (Value t) where- fromExp expr =- case fromExp @_ @Untyped.Value expr of- Right uv -> case typeCheck uv of- Left tcErr -> Left $ FromExpError expr $- pretty $ unlinesF- [ "Failed to typecheck expression as a value of type:"- , indentF 2 $ build $ demote @t- , ""- , "Typechecker error:"- , indentF 2 $ build tcErr- ]- Right tv -> Right tv- Left e -> Left e- where- typeCheck uv = typeCheckingWith (TypeCheckOptions False False) $- typeCheckValue uv--instance FromExp x op => FromExp x (Untyped.Value' op) where- fromExp e = case e of- ExpInt _ v -> pure $ Untyped.ValueInt v- ExpString _ s -> first (FromExpError e)- (Untyped.ValueString <$> mkMText s)- ExpBytes _ bs -> pure $ Untyped.ValueBytes $ Untyped.InternalByteString bs- ExpPrim' _ "Unit" [] [] -> pure Untyped.ValueUnit- ExpPrim' _ "True" [] [] -> pure Untyped.ValueTrue- ExpPrim' _ "False" [] [] -> pure Untyped.ValueFalse- ExpPrim' _ "Pair" args [] ->- case nonEmpty args >>= forbidSingletonList of- Nothing -> Left $ FromExpError e- "Expected a pair with at least 2 arguments"- Just args' -> do- tys <- mapM fromExp args'- return $ foldr1 Untyped.ValuePair tys- ExpPrim' _ "Left" [arg] [] -> do- arg' <- fromExp arg- pure $ Untyped.ValueLeft arg'- ExpPrim' _ "Right" [arg] [] -> do- arg' <- fromExp arg- pure $ Untyped.ValueRight arg'- ExpPrim' _ "Some" [arg] [] -> do- arg' <- fromExp arg- pure $ Untyped.ValueSome arg'- ExpPrim' _ "None" [] [] -> pure Untyped.ValueNone- ExpPrim' _ "Lambda_rec" [args] [] -> fmap Untyped.ValueLamRec $- fromExp args >>= maybeToRight (FromExpError e "Expected at least one instruction") . nonEmpty- ExpSeq _ [] -> pure Untyped.ValueNil- ExpSeq _ (h : t) ->- case fromExp @x @op h of- Right op -> do- ops <- traverse (fromExp @x @op) t- pure . Untyped.ValueLambda $ op :| ops- Left _ -> case exprToElt h of- Right elt -> do- elts <- traverse exprToElt t- pure . Untyped.ValueMap $ elt :| elts- Left _ -> case fromExp h of- Left (FromExpError err _) -> Left $ FromExpError err- "Value, instruction or 'Elt' expression expected"- Right h' -> do- t' <- traverse fromExp t- pure . Untyped.ValueSeq $ h' :| t'- _ -> Left $ FromExpError e "Expected a value"- where- exprToElt :: Exp x -> Either (FromExpError x) (Untyped.Elt op)- exprToElt ex = case ex of- ExpPrim' _ "Elt" [l, r] [] -> do- l' <- fromExp l- r' <- fromExp r- pure $ Untyped.Elt l' r'- ExpPrim' _ "Elt" _ [] -> Left $ FromExpError ex- "Expected 'Elt' expression with exactly 2 elements"- ExpPrim' _ "Elt" _ _ -> Left $ FromExpError ex- "Expected 'Elt' expression without annotations"- _ -> Left $ FromExpError ex "Expected 'Elt' expression"--instance FromExp x a => FromExp x [a] where- fromExp = \case- ExpSeq _ exprs -> traverse fromExp exprs- e -> Left $ FromExpError e "'ExpressionSeq' expected"--instance FromExp RegularExp ExpandedOp where- fromExp = \case- ExpSeq _ s -> SeqEx <$> traverse fromExp s- e -> PrimEx <$> fromExp e---- Note: On adding new expressions here, you must also add the symmetric (writing) case--- to ToExpression as well.-instance FromExp x op =>- FromExp x (InstrAbstract op) where- fromExp e = let annSet = getAnnSet e in case e of- ExpPrim' _ "DROP" [n] [] -> do- n' <- integralFromExpr n- pure $ DROPN n'- ExpPrim' _ "DROP" [] _ -> pure $ DROP- ExpPrim' _ "DUP" [n] _ -> do- checkAnnsCount e annSet (0, 0, 1)- let va = firstAnn @VarTag annSet- n' <- integralFromExpr n- pure $ DUPN va n'- ExpPrim' _ "DUP" [] _ ->- let va = firstAnn @VarTag annSet- in checkAnnsCount e annSet (0, 0, 1) $> DUP va- ExpPrim' _ "SWAP" [] [] -> pure $ SWAP- ExpPrim' _ "DIG" [n] [] -> do- n' <- integralFromExpr n- pure $ DIG $ n'- ExpPrim' _ "DUG" [n] [] -> do- n' <- integralFromExpr n- pure $ DUG n'- ExpPrim' _ "PUSH" [t, v] _ -> do- checkAnnsCount e annSet (0, 0, 1)- let va = firstAnn @VarTag annSet- t' <- fromExp @x @Ty t- v' <- fromExp @x @(Untyped.Value' op) v- pure $ PUSH va t' v'- ExpPrim' _ "SOME" [] _ ->- let ta = firstAnn @TypeTag annSet- va = firstAnn @VarTag annSet- in checkAnnsCount e annSet (1, 0, 1) $> SOME ta va- ExpPrim' _ "NONE" [t] _ -> do- checkAnnsCount e annSet (1, 0, 1)- let ta = firstAnn @TypeTag annSet- let va = firstAnn @VarTag annSet- t' <- fromExp @x @Ty t- pure $ NONE ta va t'- ExpPrim' _ "UNIT" [] _ ->- let ta = firstAnn @TypeTag annSet- va = firstAnn @VarTag annSet- in checkAnnsCount e annSet (1, 0, 1) $> UNIT ta va- ExpPrim' _ "IF_NONE" [ops1, ops2] [] -> do- ops1' <- fromExp @x @[op] ops1- ops2' <- fromExp @x @[op] ops2- pure $ IF_NONE ops1' ops2'- ExpPrim' _ "PAIR" [] _ ->- let ta = firstAnn @TypeTag annSet- va = firstAnn @VarTag annSet- fa1 = firstAnn @FieldTag annSet- fa2 = secondAnn @FieldTag annSet- in (checkAnnsCount e annSet (1, 2, 1)) $> PAIR ta va fa1 fa2- ExpPrim' _ "UNPAIR" [] _ ->- let va1 = firstAnn @VarTag annSet- va2 = secondAnn @VarTag annSet- fa1 = firstAnn @FieldTag annSet- fa2 = secondAnn @FieldTag annSet- in checkAnnsCount e annSet (0, 2, 2) $> UNPAIR va1 va2 fa1 fa2- ExpPrim' _ "PAIR" [n] _ -> do- checkAnnsCount e annSet (0, 0, 1)- n' <- integralFromExpr n- let va = firstAnn @VarTag annSet- pure $ PAIRN va n'- ExpPrim' _ "UNPAIR" [n] [] -> do- n' <- integralFromExpr n- pure $ UNPAIRN n'- ExpPrim' _ "CAR" [] _ ->- let va = firstAnn @VarTag annSet- fa = firstAnn @FieldTag annSet- in checkAnnsCount e annSet (0, 1, 1) $> CAR va fa- ExpPrim' _ "CDR" [] _ ->- let va = firstAnn @VarTag annSet- fa = firstAnn @FieldTag annSet- in checkAnnsCount e annSet (0, 1, 1) $> CDR va fa- ExpPrim' _ "LEFT" [t] _ -> do- checkAnnsCount e annSet (1, 2, 1)- t' <- fromExp @x @Ty t- let ta = firstAnn @TypeTag annSet- let va = firstAnn @VarTag annSet- let fa1 = firstAnn @FieldTag annSet- let fa2 = secondAnn @FieldTag annSet- pure $ LEFT ta va fa1 fa2 t'- ExpPrim' _ "RIGHT" [t] _ -> do- checkAnnsCount e annSet (1, 2, 1)- t' <- fromExp @x @Ty t- let ta = firstAnn @TypeTag annSet- let va = firstAnn @VarTag annSet- let fa1 = firstAnn @FieldTag annSet- let fa2 = secondAnn @FieldTag annSet- pure $ RIGHT ta va fa1 fa2 t'- ExpPrim' _ "IF_LEFT" [ops1, ops2] [] -> do- ops1' <- fromExp @x @[op] ops1- ops2' <- fromExp @x @[op] ops2- pure $ IF_LEFT ops1' ops2'- ExpPrim' _ "NIL" [t] _ -> do- checkAnnsCount e annSet (1, 0, 1)- t' <- fromExp @x @Ty t- let va = firstAnn @VarTag annSet- let ta = firstAnn @TypeTag annSet- pure $ NIL ta va t'- ExpPrim' _ "CONS" [] anns -> mkInstrWithVarAnn CONS anns- ExpPrim' _ "IF_CONS" [ops1, ops2] [] -> do- ops1' <- fromExp @x @[op] ops1- ops2' <- fromExp @x @[op] ops2- pure $ IF_CONS ops1' ops2'- ExpPrim' _ "SIZE" [] anns -> mkInstrWithVarAnn SIZE anns- ExpPrim' _ "EMPTY_SET" [t] _ -> do- checkAnnsCount e annSet (1, 0, 1)- t' <- fromExp @x @Ty t- let va = firstAnn @VarTag annSet- let ta = firstAnn @TypeTag annSet- pure $ EMPTY_SET ta va t'- ExpPrim' _ "EMPTY_MAP" [kt, vt] _ -> do- checkAnnsCount e annSet (1, 0, 1)- kt' <- fromExp @x @Ty kt- vt' <- fromExp @x @Ty vt- let va = firstAnn @VarTag annSet- let ta = firstAnn @TypeTag annSet- pure $ EMPTY_MAP ta va kt' vt'- ExpPrim' _ "EMPTY_BIG_MAP" [kt, vt] _ -> do- checkAnnsCount e annSet (1, 0, 1)- kt' <- fromExp @x @Ty kt- vt' <- fromExp @x @Ty vt- let va = firstAnn @VarTag annSet- let ta = firstAnn @TypeTag annSet- pure $ EMPTY_BIG_MAP ta va kt' vt'- ExpPrim' _ "MAP" [ops] _ -> do- checkAnnsCount e annSet (0, 0, 1)- ops' <- fromExp @x @[op] ops- let va = firstAnn @VarTag annSet- pure $ MAP va ops'- ExpPrim' _ "ITER" [ops] [] -> do- ops' <- fromExp @x @[op] ops- pure $ ITER ops'- ExpPrim' _ "MEM" [] anns -> mkInstrWithVarAnn MEM anns- ExpPrim' _ "GET" [] anns -> mkInstrWithVarAnn GET anns- ExpPrim' _ "GET" [n] _ -> do- checkAnnsCount e annSet (0, 0, 1)- n' <- integralFromExpr n- let va = firstAnn @VarTag annSet- pure $ GETN va n'- ExpPrim' _ "UPDATE" [] anns -> mkInstrWithVarAnn UPDATE anns- ExpPrim' _ "UPDATE" [n] _ -> do- checkAnnsCount e annSet (0, 0, 1)- n' <- integralFromExpr n- let va = firstAnn @VarTag annSet- pure $ UPDATEN va n'- ExpPrim' _ "GET_AND_UPDATE" [] anns ->- mkInstrWithVarAnn GET_AND_UPDATE anns- ExpPrim' _ "IF" [ops1, ops2] [] -> do- ops1' <- fromExp @x @[op] ops1- ops2' <- fromExp @x @[op] ops2- pure $ IF ops1' ops2'- ExpPrim' _ "LOOP" [ops] [] -> do- ops' <- fromExp @x @[op] ops- pure $ LOOP ops'- ExpPrim' _ "LOOP_LEFT" [ops] [] -> do- ops' <- fromExp @x @[op] ops- pure $ LOOP_LEFT ops'- ExpPrim' _ "LAMBDA" [inp, out, ops] _ -> do- checkAnnsCount e annSet (0, 0, 1)- inp' <- fromExp @x @Ty inp- out' <- fromExp @x @Ty out- ops' <- fromExp @x @[op] ops- let va = firstAnn @VarTag annSet- pure $ LAMBDA va inp' out' ops'- ExpPrim' _ "LAMBDA_REC" [inp, out, ops] _ -> do- checkAnnsCount e annSet (0, 0, 1)- inp' <- fromExp @x @Ty inp- out' <- fromExp @x @Ty out- ops' <- fromExp @x @[op] ops- let va = firstAnn @VarTag annSet- pure $ LAMBDA_REC va inp' out' ops'- ExpPrim' _ "EXEC" [] anns -> mkInstrWithVarAnn EXEC anns- ExpPrim' _ "APPLY" [] anns -> mkInstrWithVarAnn APPLY anns- ExpPrim' _ "DIP" [ops] [] -> do- ops' <- fromExp @x @[op] ops- pure $ DIP ops'- ExpPrim' _ "DIP" [n, ops] [] -> do- n' <- integralFromExpr n- ops' <- fromExp @x @[op] ops- pure $ DIPN n' ops'- ExpPrim' _ "FAILWITH" [] [] -> pure FAILWITH- ExpPrim' _ "CAST" [t] _ -> do- checkAnnsCount e annSet (0, 0, 1)- t' <- fromExp @x @Ty t- let va = firstAnn @VarTag annSet- pure $ CAST va t'- ExpPrim' _ "RENAME" [] anns -> mkInstrWithVarAnn RENAME anns- ExpPrim' _ "PACK" [] anns -> mkInstrWithVarAnn PACK anns- ExpPrim' _ "UNPACK" [t] _ -> do- checkAnnsCount e annSet (1, 0, 1)- t' <- fromExp @x @Ty t- let ta = firstAnn @TypeTag annSet- let va = firstAnn @VarTag annSet- pure $ UNPACK ta va t'- ExpPrim' _ "CONCAT" [] anns -> mkInstrWithVarAnn CONCAT anns- ExpPrim' _ "SLICE" [] anns -> mkInstrWithVarAnn SLICE anns- ExpPrim' _ "ISNAT" [] anns -> mkInstrWithVarAnn ISNAT anns- ExpPrim' _ "ADD" [] anns -> mkInstrWithVarAnn ADD anns- ExpPrim' _ "SUB" [] anns -> mkInstrWithVarAnn SUB anns- ExpPrim' _ "SUB_MUTEZ" [] anns -> mkInstrWithVarAnn SUB_MUTEZ anns- ExpPrim' _ "MUL" [] anns -> mkInstrWithVarAnn MUL anns- ExpPrim' _ "EDIV" [] anns -> mkInstrWithVarAnn EDIV anns- ExpPrim' _ "ABS" [] anns -> mkInstrWithVarAnn ABS anns- ExpPrim' _ "NEG" [] anns -> mkInstrWithVarAnn NEG anns- ExpPrim' _ "LSL" [] anns -> mkInstrWithVarAnn LSL anns- ExpPrim' _ "LSR" [] anns -> mkInstrWithVarAnn LSR anns- ExpPrim' _ "OR" [] anns -> mkInstrWithVarAnn OR anns- ExpPrim' _ "AND" [] anns -> mkInstrWithVarAnn AND anns- ExpPrim' _ "XOR" [] anns -> mkInstrWithVarAnn XOR anns- ExpPrim' _ "NOT" [] anns -> mkInstrWithVarAnn NOT anns- ExpPrim' _ "COMPARE" [] anns -> mkInstrWithVarAnn COMPARE anns- ExpPrim' _ "EQ" [] anns -> mkInstrWithVarAnn Untyped.EQ anns- ExpPrim' _ "NEQ" [] anns -> mkInstrWithVarAnn NEQ anns- ExpPrim' _ "LT" [] anns -> mkInstrWithVarAnn Untyped.LT anns- ExpPrim' _ "GT" [] anns -> mkInstrWithVarAnn Untyped.GT anns- ExpPrim' _ "LE" [] anns -> mkInstrWithVarAnn LE anns- ExpPrim' _ "GE" [] anns -> mkInstrWithVarAnn GE anns- ExpPrim' _ "INT" [] anns -> mkInstrWithVarAnn INT anns- ExpPrim' _ "NAT" [] anns -> mkInstrWithVarAnn NAT anns- ExpPrim' _ "BYTES" [] anns -> mkInstrWithVarAnn BYTES anns- ExpPrim' _ "VIEW" [name, t] _ -> do- let va = firstAnn @VarTag annSet- name' <- fromExp @x @ViewName name- t' <- fromExp @x @Ty t- checkAnnsCount e annSet (0, 0, 1) $> VIEW va name' t'- ExpPrim' _ "SELF" [] _ ->- let fa = firstAnn @FieldTag annSet- va = firstAnn @VarTag annSet- in checkAnnsCount e annSet (0, 1, 1) $> SELF va fa- ExpPrim' _ "CONTRACT" [t] _ -> do- checkAnnsCount e annSet (0, 1, 1)- t' <- fromExp @x @Ty t- let va = firstAnn @VarTag annSet- let fa = firstAnn @FieldTag annSet- pure $ CONTRACT va fa t'- ExpPrim' _ "TRANSFER_TOKENS" [] anns ->- mkInstrWithVarAnn TRANSFER_TOKENS anns- ExpPrim' _ "SET_DELEGATE" [] anns ->- mkInstrWithVarAnn SET_DELEGATE anns- ExpPrim' _ "CREATE_CONTRACT" [c] _ -> do- checkAnnsCount e annSet (0, 0, 2)- c' <- fromExp @x @(Untyped.Contract' op) c- let va1 = firstAnn @VarTag annSet- let va2 = secondAnn @VarTag annSet- pure $ CREATE_CONTRACT va1 va2 c'- ExpPrim' _ "IMPLICIT_ACCOUNT" [] anns ->- mkInstrWithVarAnn IMPLICIT_ACCOUNT anns- ExpPrim' _ "NOW" [] anns -> mkInstrWithVarAnn NOW anns- ExpPrim' _ "AMOUNT" [] anns -> mkInstrWithVarAnn AMOUNT anns- ExpPrim' _ "BALANCE" [] anns -> mkInstrWithVarAnn BALANCE anns- ExpPrim' _ "VOTING_POWER" [] anns ->- mkInstrWithVarAnn VOTING_POWER anns- ExpPrim' _ "TOTAL_VOTING_POWER" [] anns ->- mkInstrWithVarAnn TOTAL_VOTING_POWER anns- ExpPrim' _ "CHECK_SIGNATURE" [] anns ->- mkInstrWithVarAnn CHECK_SIGNATURE anns- ExpPrim' _ "SHA256" [] anns -> mkInstrWithVarAnn SHA256 anns- ExpPrim' _ "SHA512" [] anns -> mkInstrWithVarAnn SHA512 anns- ExpPrim' _ "BLAKE2B" [] anns -> mkInstrWithVarAnn BLAKE2B anns- ExpPrim' _ "SHA3" [] anns -> mkInstrWithVarAnn SHA3 anns- ExpPrim' _ "KECCAK" [] anns -> mkInstrWithVarAnn KECCAK anns- ExpPrim' _ "HASH_KEY" [] anns -> mkInstrWithVarAnn HASH_KEY anns- ExpPrim' _ "PAIRING_CHECK" [] anns ->- mkInstrWithVarAnn PAIRING_CHECK anns- ExpPrim' _ "SOURCE" [] anns -> mkInstrWithVarAnn SOURCE anns- ExpPrim' _ "SENDER" [] anns -> mkInstrWithVarAnn SENDER anns- ExpPrim' _ "ADDRESS" [] anns -> mkInstrWithVarAnn ADDRESS anns- ExpPrim' _ "CHAIN_ID" [] anns -> mkInstrWithVarAnn CHAIN_ID anns- ExpPrim' _ "LEVEL" [] anns -> mkInstrWithVarAnn LEVEL anns- ExpPrim' _ "SELF_ADDRESS" [] anns ->- mkInstrWithVarAnn SELF_ADDRESS anns- ExpPrim' _ "NEVER" [] [] -> pure NEVER- ExpPrim' _ "TICKET_DEPRECATED" [] anns ->- mkInstrWithVarAnn TICKET_DEPRECATED anns- ExpPrim' _ "TICKET" [] anns ->- mkInstrWithVarAnn TICKET anns- ExpPrim' _ "READ_TICKET" [] anns ->- mkInstrWithVarAnn READ_TICKET anns- ExpPrim' _ "SPLIT_TICKET" [] anns ->- mkInstrWithVarAnn SPLIT_TICKET anns- ExpPrim' _ "JOIN_TICKETS" [] anns ->- mkInstrWithVarAnn JOIN_TICKETS anns- ExpPrim' _ "OPEN_CHEST" [] anns ->- mkInstrWithVarAnn OPEN_CHEST anns- ExpPrim' _ "SAPLING_EMPTY_STATE" [n] _ -> do- checkAnnsCount e annSet (0, 0, 1)- n' <- integralFromExpr n- let va = firstAnn @VarTag annSet- pure $ SAPLING_EMPTY_STATE va n'- ExpPrim' _ "SAPLING_VERIFY_UPDATE" [] anns ->- mkInstrWithVarAnn SAPLING_VERIFY_UPDATE anns- ExpPrim' _ "MIN_BLOCK_TIME" [] anns -> pure $ mkInstrWithAnyAnns MIN_BLOCK_TIME anns- ExpPrim' _ "EMIT" mty _ -> do- checkAnnsCount e annSet (0, 1, 1)- let tag = firstAnn @FieldTag annSet- va = firstAnn @VarTag annSet- ty' <- maybe (pure Nothing) (fmap Just . fromExp @x @Ty) $ listToMaybe mty- pure $ EMIT va tag ty'- _ -> Left $ FromExpError e "Expected an instruction"-- where- mkInstrWithVarAnn- :: (VarAnn -> InstrAbstract op)- -> [Annotation]- -> Either (FromExpError x) (InstrAbstract op)- mkInstrWithVarAnn ctor anns =- let annSet = toAnnSet anns- va = firstAnn @VarTag annSet- in checkAnnsCount e annSet (0, 0, 1) $> ctor va-- mkInstrWithAnyAnns- :: ([Untyped.AnyAnn] -> InstrAbstract op)- -> [Annotation]- -> InstrAbstract op- mkInstrWithAnyAnns ctor anns = ctor $ anns <&> \case- AnnotationType x -> Untyped.AnyAnnType x- AnnotationField x -> Untyped.AnyAnnField x- AnnotationVariable x -> Untyped.AnyAnnVar x-- getAnnSet :: Exp d -> AnnotationSet- getAnnSet = \case- ExpPrim' _ _ _ anns -> toAnnSet anns- _ -> emptyAnnSet--instance (FromExp x op) => FromExp x (Untyped.Contract' op) where- fromExp blocks = case blocks of- ExpSeq _ bs -> do- bs' <- mapM exprToCB bs- maybeToRight (FromExpError blocks "Something's wrong with top-level contract blocks")- (orderContractBlock bs')- expr -> Left $ FromExpError expr "Failed to parse contract, expected sequence"- where- exprToCB- :: Exp x- -> Either (FromExpError x) (ContractBlock op)- exprToCB e = case e of- ExpPrim' _ "parameter" args anns -> mkCbParam e args anns- ExpPrim' _ "storage" args anns -> mkCBStorage e args anns- ExpPrim' _ "code" args anns -> mkCBCode e args anns- ExpPrim' _ "view" args anns -> mkCBView e args anns- _ ->- Left $ FromExpError e "Unexpected primitive at contract top-level"-- mkCbParam- :: Exp x- -> [Exp x]- -> [Annotation]- -> Either (FromExpError x) (ContractBlock op)- mkCbParam e args anns = case (args, anns) of- ([p], []) -> do- let annSet = toAnnSet (p ^. _ExpPrim . _2 . mpaAnnotsL)- let rootAnn = firstAnn @FieldTag annSet- unless (secondAnn @FieldTag annSet == noAnn) $- Left $ FromExpError p- "Expected parameter with at most 1 root annotation"- p' <- fromExp @x @Ty- (p & _ExpPrim . _2 . mpaAnnotsL %~ filter (not . isAnnotationField))- pure $ CBParam $ Untyped.ParameterType p' rootAnn- _ -> Left $ FromExpError e- "Expected 'parameter' block without annotations and exactly 1 argument"-- mkCBStorage- :: Exp x- -> [Exp x]- -> [Annotation]- -> Either (FromExpError x) (ContractBlock op)- mkCBStorage e args anns = case (args, anns) of- ([s], []) -> do- s' <- fromExp @x @Ty s- pure $ CBStorage s'- _ -> Left $ FromExpError e- "Expected 'storage' block without annotations and exactly 1 argument"-- mkCBCode- :: Exp x- -> [Exp x]- -> [Annotation]- -> Either (FromExpError x) (ContractBlock op)- mkCBCode e args anns = case (args, anns) of- ([ops], []) -> do- ops' <- fromExp @x @[op] ops- pure $ CBCode ops'- _ -> Left $ FromExpError e- "Expected 'code' block without annotations"-- mkCBView- :: Exp x- -> [Exp x]- -> [Annotation]- -> Either (FromExpError x) (ContractBlock op)- mkCBView e args anns = case (args, anns) of- ([name, arg, ret, ops], []) -> do- name' <- fromExp name- arg' <- fromExp arg- ret' <- fromExp ret- ops' <- fromExp @x @[op] ops- pure $ CBView $ Untyped.View name' arg' ret' ops'- (_, _ : _) ->- Left $ FromExpError e- "Expected 'view' block without annotations"- (_, []) ->- Left $ FromExpError e- "Invalid 'view' block, expected 4 expressions in it"--instance FromExp x Untyped.T where- fromExp e = case e of- ExpPrim' _ "key" [] [] -> pure Untyped.TKey- ExpPrim' _ "unit" [] [] -> pure Untyped.TUnit- ExpPrim' _ "signature" [] [] -> pure Untyped.TSignature- ExpPrim' _ "chain_id" [] [] -> pure Untyped.TChainId- ExpPrim' _ "option" [arg] [] -> do- arg' <- fromExp arg- pure $ Untyped.TOption arg'- ExpPrim' _ "list" [arg] [] -> do- arg' <- fromExp arg- pure $ Untyped.TList arg'- ExpPrim' _ "set" [arg] [] -> do- arg' <- fromExp arg- pure $ Untyped.TSet arg'- ExpPrim' _ "operation" [] [] -> pure Untyped.TOperation- ExpPrim' _ "contract" [arg] [] -> do- arg' <- fromExp arg- pure $ Untyped.TContract arg'- ExpPrim' _ "ticket" [arg] [] -> do- arg' <- fromExp arg- pure $ Untyped.TTicket arg'- ExpPrim' _ "or" [arg1, arg2] [] -> do- let as1 = toAnnSet $ arg1 ^. _ExpPrim . _2 . mpaAnnotsL- let as2 = toAnnSet $ arg2 ^. _ExpPrim . _2 . mpaAnnotsL- checkAnnsCount e as1 (1, 1, 0)- checkAnnsCount e as2 (1, 1, 0)- let fa1 = firstAnn @FieldTag as1- let fa2 = firstAnn @FieldTag as2- l <- fromExp $ removeAnns arg1 isAnnotationField- r <- fromExp $ removeAnns arg2 isAnnotationField- pure $ Untyped.TOr fa1 fa2 l r- ExpPrim' _ "pair" args [] -> do- args2 <- case nonEmpty args >>= forbidSingletonList of- Nothing -> Left $ FromExpError e- "Expected a pair with at least 2 arguments"- Just as -> pure as- -- Check and extract annotations info- tyInfos <- forM args2 \arg -> do- let as = toAnnSet $ arg ^. _ExpPrim . _2 . mpaAnnotsL- checkAnnsCount e as (1, 1, 1)- let fa = firstAnn @FieldTag as- let va = firstAnn @VarTag as- ty <- fromExp $ removeAnns arg- (isAnnotationField || isAnnotationVariable)- return (ty, fa, va)- -- Make a right-comb pairs tree- let combiner (ty1, fa1, va1) (ty2, fa2, va2) =- ( Ty (Untyped.TPair fa1 fa2 va1 va2 ty1 ty2) noAnn- , noAnn- , noAnn- )- let (Ty tRes _, _, _) = foldr1 combiner tyInfos- return tRes- ExpPrim' _ "lambda" args [] -> mkDoubleParamType Untyped.TLambda args e- "Expected a lambda with input and output types"- ExpPrim' _ "map" args [] -> mkDoubleParamType Untyped.TMap args e- "Expected a map with key and value types"- ExpPrim' _ "big_map" args [] -> mkDoubleParamType Untyped.TBigMap args e- "Expected a big_map with key and value types"- ExpPrim' _ "int" [] [] -> pure Untyped.TInt- ExpPrim' _ "nat" [] [] -> pure Untyped.TNat- ExpPrim' _ "string" [] [] -> pure Untyped.TString- ExpPrim' _ "bytes" [] [] -> pure Untyped.TBytes- ExpPrim' _ "mutez" [] [] -> pure Untyped.TMutez- ExpPrim' _ "bool" [] [] -> pure Untyped.TBool- ExpPrim' _ "key_hash" [] [] -> pure Untyped.TKeyHash- ExpPrim' _ "bls12_381_fr" [] [] -> pure Untyped.TBls12381Fr- ExpPrim' _ "bls12_381_g1" [] [] -> pure Untyped.TBls12381G1- ExpPrim' _ "bls12_381_g2" [] [] -> pure Untyped.TBls12381G2- ExpPrim' _ "timestamp" [] [] -> pure Untyped.TTimestamp- ExpPrim' _ "address" [] [] -> pure Untyped.TAddress- ExpPrim' _ "chest" [] [] -> pure Untyped.TChest- ExpPrim' _ "chest_key" [] [] -> pure Untyped.TChestKey- ExpPrim' _ "tx_rollup_l2_address" [] [] ->- Left $ FromExpError e "Transaction rollups are not supported"- ExpPrim' _ "never" [] [] -> pure Untyped.TNever- ExpPrim' _ "sapling_state" [n] [] -> do- n' <- integralFromExpr n- pure $ Untyped.TSaplingState n'- ExpPrim' _ "sapling_transaction" [n] [] -> do- n' <- integralFromExpr n- pure $ Untyped.TSaplingTransaction n'- ExpPrim' _ "sapling_transaction_deprecated" _ _ -> do- Left $ FromExpError e "Use of deprecated type: sapling_transaction_deprecated"- _ -> Left $ FromExpError e "Expected a type"- where- mkDoubleParamType- :: (Ty -> Ty -> Untyped.T)- -> [Exp x]- -> Exp x- -> Text- -> Either (FromExpError x) Untyped.T- mkDoubleParamType ctor args expr msg = do- case args of- [arg1, arg2] -> do- arg1' <- fromExp arg1- arg2' <- fromExp arg2- pure $ ctor arg1' arg2'- _ -> Left $ FromExpError expr msg-- removeAnns :: Exp x -> (Annotation -> Bool) -> Exp x- removeAnns expr p =- expr & _ExpPrim . _2 . mpaAnnotsL %~ filter (not . p)--instance FromExp x Ty where- fromExp e = case e of- ExpPrim' ex primName args anns -> do- let annSet = toAnnSet anns- let ta = firstAnn @TypeTag annSet- when (secondAnn @TypeTag annSet /= noAnn) $- Left $ FromExpError e- "Expected expression with at most 1 type annotation"- t <- fromExp @x @Untyped.T $ ExpPrim' ex primName args $ filter- (not . isAnnotationType) anns- pure $ Ty t ta- _ -> Left $ FromExpError e "Expected a type"--instance FromExp x T where- fromExp =- second fromUType . fromExp @x @Untyped.Ty---- Note: we should generalize this to work for any instruction,--- not just lambdas (i.e. instructions with one input and one output).-instance (SingI inp, SingI out) => FromExp RegularExp (Instr '[inp] '[out]) where- fromExp expr =- fromExpression @(Value ('TLambda inp out)) expr >>= \case- VLam (LambdaCode instr) -> pure $ rfAnyInstr instr- VLam LambdaCodeRec{} -> Left $ FromExpError expr- "Expected block of code, found Lambda_rec"--instance FromExp x ViewName where- fromExp e = case e of- ExpString _ s ->- first (FromExpError e . pretty) $ mkViewName s- _ -> Left $ FromExpError e "Expected view name"--------------------------------------------------------------------------------- Helpers--------------------------------------------------------------------------------- | Adds annotations to the expression, after removing empty annotations--- at the end of each list.-addTrimmedAnns- :: Exp x- -> [TypeAnn]- -> [FieldAnn]- -> [VarAnn]- -> Exp x-addTrimmedAnns e tas fas vas =- e & _ExpPrim . _2 . mpaAnnotsL <>~ mkAnns tas fas vas---- | Inserts the root annotation into the contract parameter.-insertRootAnn :: HasCallStack => Expression -> RootAnn -> Expression-insertRootAnn expr rootAnn = case expr of- ExpPrim () p- -- The order of annotations is important iff there are- -- multiple annotations of the same kind or there are- -- other kinds of annotations in the list.- -- Prepending root field annotation is okay because- -- there can not be more than one root annotation.- | rootAnn /= noAnn -> expressionPrim p- { mpaAnnots = AnnotationField rootAnn : mpaAnnots p- }- | otherwise -> expr- -- Currently this error can't happen because parameter type- -- must be a Micheline primitive. If it ever changes, we- -- would like to notice it ASAP and update this place.- _ -> error $ "parameter is not a primitive: " <> pretty expr---- | Checks for a given expression that the number of annotations--- of each type in it doesn't exceed the specified threshold.-checkAnnsCount- :: Exp x- -> AnnotationSet- -> (Int, Int, Int)- -> Either (FromExpError x) ()-checkAnnsCount e annSet maxCount@(maxTas, maxFas, maxVas) =- let actualCount@(tasCnt, fasCnt, vasCnt) = annsCount annSet- in unless (actualCount <= maxCount) $- Left $ FromExpError e $ pretty $ unlinesF- [ "Expected at most"- , indentF 2 $ build maxTas <> " type annotations,"- , indentF 2 $ build maxFas <> " field annotations,"- , indentF 2 $ build maxVas <> " variable annotations"- , "but found:"- , indentF 2 $ build tasCnt <> " type annotations,"- , indentF 2 $ build fasCnt <> " field annotations,"- , indentF 2 $ build vasCnt <> " variable annotations."- ]--forbidSingletonList :: NonEmpty a -> Maybe (NonEmpty a)-forbidSingletonList = \case- _ :| [] -> Nothing- x -> Just x--integralToExpr :: Integral i => i -> Expression-integralToExpr = expressionInt . toInteger--integralFromExpr :: (Integral i, Bits i) => Exp x -> Either (FromExpError x) i-integralFromExpr e = case e of- ExpInt _ v ->- maybeToRight (FromExpError e "Value is out of bounds")- (fromIntegralMaybe @Integer v)- _ -> Left $ FromExpError e "Expected a number here"+import Data.Singletons (SingI(..), demote, fromSing)+import Fmt (Buildable(..), fillSepF, indentF, nameF, pretty, punctuateF, unlinesF, (++|), (|++))++import Morley.Micheline.Expression+import Morley.Michelson.Text (mkMText, unMText)+import Morley.Michelson.TypeCheck (TcError, TypeCheckOptions(..), typeCheckingWith)+import Morley.Michelson.TypeCheck.Instr (typeCheckValue)+import Morley.Michelson.Typed+ (Contract, ForbidOp, Instr, LambdaCode'(..), Notes(..), T(..), Value, Value'(..), fromUType,+ mkUType, rfAnyInstr, toUType)+import Morley.Michelson.Typed.Convert+ (convertContractOptimized, instrToOpsOptimized, untypeValueOptimized)+import Morley.Michelson.Untyped qualified as Untyped+import Morley.Michelson.Untyped.Annotation+ (AnnotationSet(..), FieldAnn, FieldTag, RootAnn, TypeAnn, TypeTag, VarAnn, VarTag, annsCount,+ firstAnn, noAnn, secondAnn)+import Morley.Michelson.Untyped.Contract (ContractBlock(..), ContractBlockError, orderContractBlock)+import Morley.Michelson.Untyped.Instr (ExpandedInstr, ExpandedOp(..), InstrAbstract(..))+import Morley.Michelson.Untyped.Type (Ty(..))+import Morley.Michelson.Untyped.View+import Morley.Util.MismatchError++-- ToExpression+----------------------------------------------------------------------------++-- | Type class that provides an ability to convert+-- something to Micheline Expression.+class ToExpression a where+ toExpression :: a -> Expression++instance ForbidOp t => ToExpression (Value t) where+ toExpression = toExpression . untypeValueOptimized++instance ToExpression Untyped.Value where+ toExpression = \case+ Untyped.ValueInt v -> expressionInt v+ Untyped.ValueString s -> expressionString $ unMText s+ Untyped.ValueBytes (Untyped.InternalByteString bs) -> expressionBytes bs+ Untyped.ValueUnit -> expressionPrim' Prim_Unit [] []+ Untyped.ValueTrue -> expressionPrim' Prim_True [] []+ Untyped.ValueFalse -> expressionPrim' Prim_False [] []+ Untyped.ValuePair l r ->+ expressionPrim' Prim_Pair [toExpression l, toExpression r] []+ Untyped.ValueLeft v -> expressionPrim' Prim_Left [toExpression v] []+ Untyped.ValueRight v -> expressionPrim' Prim_Right [toExpression v] []+ Untyped.ValueSome v -> expressionPrim' Prim_Some [toExpression v] []+ Untyped.ValueNone -> expressionPrim' Prim_None [] []+ Untyped.ValueNil -> expressionSeq []+ Untyped.ValueSeq vs -> toExpression vs+ Untyped.ValueMap elts -> toExpression $ eltToExpr <$> elts+ Untyped.ValueLambda ops -> toExpression ops+ Untyped.ValueLamRec ops -> expressionPrim' Prim_Lambda_rec [toExpression ops] []+ where+ eltToExpr :: Untyped.Elt [] ExpandedOp -> Expression+ eltToExpr (Untyped.Elt l r) = expressionPrim' Prim_Elt+ [toExpression l, toExpression r] []+++instance ToExpression (Instr inp out) where+ toExpression = toExpression . instrToOpsOptimized++instance ToExpression T where+ toExpression = toExpression . toUType++instance ToExpression (Notes t) where+ toExpression = toExpression . mkUType++instance ToExpression Untyped.T where+ toExpression = \case+ Untyped.TKey -> expressionPrim' Prim_key [] []+ Untyped.TUnit -> expressionPrim' Prim_unit [] []+ Untyped.TSignature -> expressionPrim' Prim_signature [] []+ Untyped.TChainId -> expressionPrim' Prim_chain_id [] []+ Untyped.TOption arg -> expressionPrim' Prim_option [toExpression arg] []+ Untyped.TList arg -> expressionPrim' Prim_list [toExpression arg] []+ Untyped.TSet arg -> expressionPrim' Prim_set [toExpression arg] []+ Untyped.TOperation -> expressionPrim' Prim_operation [] []+ Untyped.TContract arg -> expressionPrim' Prim_contract [toExpression arg] []+ Untyped.TTicket arg -> expressionPrim' Prim_ticket [toExpression arg] []+ t@Untyped.TPair{} -> expressionPrim' Prim_pair (rightCombedPairToList t) []+ Untyped.TOr fa1 fa2 l r ->+ let exprL = addTrimmedAnns (toExpression l) [] [fa1] []+ exprR = addTrimmedAnns (toExpression r) [] [fa2] []+ in expressionPrim' Prim_or [exprL, exprR] []+ Untyped.TLambda inp out ->+ expressionPrim' Prim_lambda [toExpression inp, toExpression out] []+ Untyped.TMap k v ->+ expressionPrim' Prim_map [toExpression k, toExpression v] []+ Untyped.TBigMap k v ->+ expressionPrim' Prim_big_map [toExpression k, toExpression v] []+ Untyped.TInt -> expressionPrim' Prim_int [] []+ Untyped.TNat -> expressionPrim' Prim_nat [] []+ Untyped.TString -> expressionPrim' Prim_string [] []+ Untyped.TBytes -> expressionPrim' Prim_bytes [] []+ Untyped.TMutez -> expressionPrim' Prim_mutez [] []+ Untyped.TBool -> expressionPrim' Prim_bool [] []+ Untyped.TKeyHash -> expressionPrim' Prim_key_hash [] []+ Untyped.TBls12381Fr -> expressionPrim' Prim_bls12_381_fr [] []+ Untyped.TBls12381G1 -> expressionPrim' Prim_bls12_381_g1 [] []+ Untyped.TBls12381G2 -> expressionPrim' Prim_bls12_381_g2 [] []+ Untyped.TTimestamp -> expressionPrim' Prim_timestamp [] []+ Untyped.TAddress -> expressionPrim' Prim_address [] []+ Untyped.TChest -> expressionPrim' Prim_chest [] []+ Untyped.TChestKey -> expressionPrim' Prim_chest_key [] []+ Untyped.TNever -> expressionPrim' Prim_never [] []+ Untyped.TSaplingState n -> expressionPrim' Prim_sapling_state [integralToExpr n] []+ Untyped.TSaplingTransaction n -> expressionPrim' Prim_sapling_transaction [integralToExpr n] []++ where+ addAnns :: Expression -> [Annotation] -> Expression+ addAnns e anns =+ e & _ExpressionPrim . mpaAnnotsL <>~ anns++ rightCombedPairToList :: Untyped.T -> [Expression]+ rightCombedPairToList t =+ let go ty (fa, va)+ | Ty (Untyped.TPair faL faR vaL vaR l r) ta <- ty+ , ta == noAnn, fa == noAnn, va == noAnn+ = toExpression l `addAnns` mkAnns [] [faL] [vaL] : go r (faR, vaR)+ | otherwise+ = one $ toExpression ty `addAnns` mkAnns [] [fa] [va]+ in go (Ty t noAnn) (noAnn, noAnn)++instance ToExpression Ty where+ toExpression (Ty t ta) = addTrimmedAnns (toExpression t) [ta] [] []++instance (ToExpression a) => ToExpression [a] where+ toExpression xs = expressionSeq $ toExpression <$> xs++instance (ToExpression a) => ToExpression (NonEmpty a) where+ toExpression = toExpression . toList++instance ToExpression Expression where+ toExpression = id++instance ToExpression ExpandedOp where+ toExpression = \case+ PrimEx instr -> toExpression instr+ SeqEx s -> expressionSeq $ toExpression <$> s+ WithSrcEx _ op -> toExpression op++instance ToExpression ViewName where+ toExpression (ViewName s) = expressionString s++-- Note: On adding new expressions here, you must also add the symmetric (reading) case+-- to FromExp x (InstrAbstract [] op) as well.+instance ToExpression ExpandedInstr where+ toExpression = \case+ PUSH va ty v -> expressionPrim' Prim_PUSH [toExpression ty, toExpression v] $+ mkAnns [] [] [va]+ DROP -> expressionPrim' Prim_DROP [] []+ DROPN n -> expressionPrim' Prim_DROP [integralToExpr n] []+ DUP va -> expressionPrim' Prim_DUP [] $ mkAnns [] [] [va]+ DUPN va n -> expressionPrim' Prim_DUP [integralToExpr n] $ mkAnns [] [] [va]+ SWAP -> expressionPrim' Prim_SWAP [] []+ DIG n -> expressionPrim' Prim_DIG [integralToExpr n] []+ DUG n -> expressionPrim' Prim_DUG [integralToExpr n] []+ SOME ta va ->+ expressionPrim' Prim_SOME [] $ mkAnns [ta] [] [va]+ NONE ta va ty -> expressionPrim' Prim_NONE [toExpression ty] $ mkAnns [ta] [] [va]+ UNIT ta va -> expressionPrim' Prim_UNIT [] $ mkAnns [ta] [] [va]+ IF_NONE ops1 ops2 ->+ expressionPrim' Prim_IF_NONE [toExpression ops1, toExpression ops2] []+ PAIR ta va fa1 fa2 -> expressionPrim' Prim_PAIR [] $ mkAnns [ta] [fa1, fa2] [va]+ UNPAIR va1 va2 fa1 fa2 -> expressionPrim' Prim_UNPAIR [] $+ mkAnns [] [fa1, fa2] [va1, va2]+ PAIRN va n -> expressionPrim' Prim_PAIR [integralToExpr n] $ mkAnns [] [] [va]+ UNPAIRN n -> expressionPrim' Prim_UNPAIR [integralToExpr n] []+ CAR va fa -> expressionPrim' Prim_CAR [] $ mkAnns [] [fa] [va]+ CDR va fa -> expressionPrim' Prim_CDR [] $ mkAnns [] [fa] [va]+ LEFT ta va fa1 fa2 ty -> expressionPrim' Prim_LEFT [toExpression ty] $+ mkAnns [ta] [fa1, fa2] [va]+ RIGHT ta va fa1 fa2 ty -> expressionPrim' Prim_RIGHT [toExpression ty] $+ mkAnns [ta] [fa1, fa2] [va]+ IF_LEFT ops1 ops2 ->+ expressionPrim' Prim_IF_LEFT [toExpression ops1, toExpression ops2] []+ NIL ta va ty -> expressionPrim' Prim_NIL [toExpression ty] $+ mkAnns [ta] [] [va]+ CONS va -> expressionPrim' Prim_CONS [] $ mkAnns [] [] [va]+ IF_CONS ops1 ops2 ->+ expressionPrim' Prim_IF_CONS [toExpression ops1, toExpression ops2] []+ SIZE va -> expressionPrim' Prim_SIZE [] $ mkAnns [] [] [va]+ EMPTY_SET ta va ty -> expressionPrim' Prim_EMPTY_SET [toExpression ty] $+ mkAnns [ta] [] [va]+ EMPTY_MAP ta va kty vty ->+ expressionPrim' Prim_EMPTY_MAP [toExpression kty, toExpression vty] $+ mkAnns [ta] [] [va]+ EMPTY_BIG_MAP ta va kty vty ->+ expressionPrim' Prim_EMPTY_BIG_MAP [toExpression kty, toExpression vty] $+ mkAnns [ta] [] [va]+ MAP va ops -> expressionPrim' Prim_MAP [toExpression ops] $ mkAnns [] [] [va]+ ITER ops -> expressionPrim' Prim_ITER [toExpression ops] []+ MEM va -> expressionPrim' Prim_MEM [] $ mkAnns [] [] [va]+ GET va -> expressionPrim' Prim_GET [] $ mkAnns [] [] [va]+ GETN va n -> expressionPrim' Prim_GET [integralToExpr n] $ mkAnns [] [] [va]+ UPDATE va -> expressionPrim' Prim_UPDATE [] $ mkAnns [] [] [va]+ UPDATEN va n -> expressionPrim' Prim_UPDATE [integralToExpr n] $ mkAnns [] [] [va]+ GET_AND_UPDATE va -> expressionPrim' Prim_GET_AND_UPDATE [] $ mkAnns [] [] [va]+ IF ops1 ops2 ->+ expressionPrim' Prim_IF [toExpression ops1, toExpression ops2] []+ LOOP ops -> expressionPrim' Prim_LOOP [toExpression ops] []+ LOOP_LEFT ops -> expressionPrim' Prim_LOOP_LEFT [toExpression ops] []+ LAMBDA va tyin tyout ops ->+ expressionPrim' Prim_LAMBDA [ toExpression tyin+ , toExpression tyout+ , toExpression ops+ ] $ mkAnns [] [] [va]+ LAMBDA_REC va tyin tyout ops ->+ expressionPrim' Prim_LAMBDA_REC [ toExpression tyin+ , toExpression tyout+ , toExpression ops+ ] $ mkAnns [] [] [va]+ EXEC va -> expressionPrim' Prim_EXEC [] $ mkAnns [] [] [va]+ APPLY va -> expressionPrim' Prim_APPLY [] $ mkAnns [] [] [va]+ DIP ops -> expressionPrim' Prim_DIP [toExpression ops] []+ DIPN n ops -> expressionPrim' Prim_DIP [integralToExpr n, toExpression ops] []+ FAILWITH -> expressionPrim' Prim_FAILWITH [] []+ CAST va ty -> expressionPrim' Prim_CAST [toExpression ty] $ mkAnns [] [] [va]+ RENAME va -> expressionPrim' Prim_RENAME [] $ mkAnns [] [] [va]+ PACK va -> expressionPrim' Prim_PACK [] $ mkAnns [] [] [va]+ UNPACK ta va ty -> expressionPrim' Prim_UNPACK [toExpression ty] $+ mkAnns [ta] [] [va]+ CONCAT va -> expressionPrim' Prim_CONCAT [] $ mkAnns [] [] [va]+ SLICE va -> expressionPrim' Prim_SLICE [] $ mkAnns [] [] [va]+ ISNAT va -> expressionPrim' Prim_ISNAT [] $ mkAnns [] [] [va]+ ADD va -> expressionPrim' Prim_ADD [] $ mkAnns [] [] [va]+ SUB va -> expressionPrim' Prim_SUB [] $ mkAnns [] [] [va]+ SUB_MUTEZ va -> expressionPrim' Prim_SUB_MUTEZ [] $ mkAnns [] [] [va]+ MUL va -> expressionPrim' Prim_MUL [] $ mkAnns [] [] [va]+ EDIV va -> expressionPrim' Prim_EDIV [] $ mkAnns [] [] [va]+ ABS va -> expressionPrim' Prim_ABS [] $ mkAnns [] [] [va]+ NEG va -> expressionPrim' Prim_NEG [] $ mkAnns [] [] [va]+ LSL va -> expressionPrim' Prim_LSL [] $ mkAnns [] [] [va]+ LSR va -> expressionPrim' Prim_LSR [] $ mkAnns [] [] [va]+ OR va -> expressionPrim' Prim_OR [] $ mkAnns [] [] [va]+ AND va -> expressionPrim' Prim_AND [] $ mkAnns [] [] [va]+ XOR va -> expressionPrim' Prim_XOR [] $ mkAnns [] [] [va]+ NOT va -> expressionPrim' Prim_NOT [] $ mkAnns [] [] [va]+ COMPARE va -> expressionPrim' Prim_COMPARE [] $ mkAnns [] [] [va]+ Untyped.EQ va -> expressionPrim' Prim_EQ [] $ mkAnns [] [] [va]+ NEQ va -> expressionPrim' Prim_NEQ [] $ mkAnns [] [] [va]+ Untyped.LT va -> expressionPrim' Prim_LT [] $ mkAnns [] [] [va]+ Untyped.GT va -> expressionPrim' Prim_GT [] $ mkAnns [] [] [va]+ LE va -> expressionPrim' Prim_LE [] $ mkAnns [] [] [va]+ GE va -> expressionPrim' Prim_GE [] $ mkAnns [] [] [va]+ INT va -> expressionPrim' Prim_INT [] $ mkAnns [] [] [va]+ NAT va -> expressionPrim' Prim_NAT [] $ mkAnns [] [] [va]+ BYTES va -> expressionPrim' Prim_BYTES [] $ mkAnns [] [] [va]+ VIEW va n t -> expressionPrim' Prim_VIEW [toExpression n, toExpression t] $+ mkAnns [] [] [va]+ SELF va fa -> expressionPrim' Prim_SELF [] $ mkAnns [] [fa] [va]+ CONTRACT va fa ty -> expressionPrim' Prim_CONTRACT [toExpression ty] $+ mkAnns [] [fa] [va]+ TRANSFER_TOKENS va -> expressionPrim' Prim_TRANSFER_TOKENS [] $ mkAnns [] [] [va]+ SET_DELEGATE va -> expressionPrim' Prim_SET_DELEGATE [] $ mkAnns [] [] [va]+ CREATE_CONTRACT va1 va2 c ->+ expressionPrim' Prim_CREATE_CONTRACT [toExpression c] $+ mkAnns [] [] [va1, va2]+ IMPLICIT_ACCOUNT va -> expressionPrim' Prim_IMPLICIT_ACCOUNT [] $+ mkAnns [] [] [va]+ NOW va -> expressionPrim' Prim_NOW [] $ mkAnns [] [] [va]+ AMOUNT va -> expressionPrim' Prim_AMOUNT [] $ mkAnns [] [] [va]+ BALANCE va -> expressionPrim' Prim_BALANCE [] $ mkAnns [] [] [va]+ VOTING_POWER va -> expressionPrim' Prim_VOTING_POWER [] $ mkAnns [] [] [va]+ TOTAL_VOTING_POWER va -> expressionPrim' Prim_TOTAL_VOTING_POWER [] $+ mkAnns [] [] [va]+ CHECK_SIGNATURE va -> expressionPrim' Prim_CHECK_SIGNATURE [] $ mkAnns [] [] [va]+ SHA256 va -> expressionPrim' Prim_SHA256 [] $ mkAnns [] [] [va]+ SHA512 va -> expressionPrim' Prim_SHA512 [] $ mkAnns [] [] [va]+ BLAKE2B va -> expressionPrim' Prim_BLAKE2B [] $ mkAnns [] [] [va]+ SHA3 va -> expressionPrim' Prim_SHA3 [] $ mkAnns [] [] [va]+ KECCAK va -> expressionPrim' Prim_KECCAK [] $ mkAnns [] [] [va]+ HASH_KEY va -> expressionPrim' Prim_HASH_KEY [] $ mkAnns [] [] [va]+ PAIRING_CHECK va -> expressionPrim' Prim_PAIRING_CHECK [] $ mkAnns [] [] [va]+ SOURCE va -> expressionPrim' Prim_SOURCE [] $ mkAnns [] [] [va]+ SENDER va -> expressionPrim' Prim_SENDER [] $ mkAnns [] [] [va]+ ADDRESS va -> expressionPrim' Prim_ADDRESS [] $ mkAnns [] [] [va]+ CHAIN_ID va -> expressionPrim' Prim_CHAIN_ID [] $ mkAnns [] [] [va]+ LEVEL va -> expressionPrim' Prim_LEVEL [] $ mkAnns [] [] [va]+ SELF_ADDRESS va -> expressionPrim' Prim_SELF_ADDRESS [] $ mkAnns [] [] [va]+ TICKET va -> expressionPrim' Prim_TICKET [] $ mkAnns [] [] [va]+ TICKET_DEPRECATED va -> expressionPrim' Prim_TICKET_DEPRECATED [] $ mkAnns [] [] [va]+ READ_TICKET va -> expressionPrim' Prim_READ_TICKET [] $ mkAnns [] [] [va]+ SPLIT_TICKET va -> expressionPrim' Prim_SPLIT_TICKET [] $ mkAnns [] [] [va]+ JOIN_TICKETS va -> expressionPrim' Prim_JOIN_TICKETS [] $ mkAnns [] [] [va]+ OPEN_CHEST va -> expressionPrim' Prim_OPEN_CHEST [] $ mkAnns [] [] [va]+ NEVER -> expressionPrim' Prim_NEVER [] []+ EXT _ -> expressionSeq []+ SAPLING_EMPTY_STATE va n -> expressionPrim' Prim_SAPLING_EMPTY_STATE [integralToExpr n] $ mkAnns [] [] [va]+ SAPLING_VERIFY_UPDATE va -> expressionPrim' Prim_SAPLING_VERIFY_UPDATE [] $ mkAnns [] [] [va]+ MIN_BLOCK_TIME va -> expressionPrim' Prim_MIN_BLOCK_TIME [] $ mkAnnsFromAny va+ EMIT va tag ty -> expressionPrim' Prim_EMIT (toExpression <$> maybeToList ty) $ mkAnns [] [tag] [va]++instance ToExpression Untyped.Contract where+ toExpression contract+ = expressionSeq $ Untyped.mapEntriesOrdered contract+ (\(Untyped.ParameterType ty rootAnn) -> expressionPrim' Prim_parameter+ [insertRootAnn (toExpression ty) rootAnn] [])+ (\storage -> expressionPrim' Prim_storage [toExpression storage] [])+ (\code -> expressionPrim' Prim_code [toExpression code] [])+ (\Untyped.View{..} -> expressionPrim' Prim_view+ [toExpression viewName, toExpression viewArgument, toExpression viewReturn, toExpression viewCode] []+ )++instance ToExpression (Contract cp st) where+ toExpression = toExpression . convertContractOptimized++-- FromExpression+----------------------------------------------------------------------------++-- | Errors that can happen when we convert an 'Exp' to our+-- data type.+data FromExpError x = FromExpError (Exp x) FromExpErrorReason++deriving stock instance Show (Exp x) => Show (FromExpError x)+deriving stock instance Eq (Exp x) => Eq (FromExpError x)++data FromExpErrorReason+ = FEERMTextDecodingFailure Text+ | FEERTcError T TcError+ | FEERNotEnoughArguments Word Int+ | FEERUnexpectedPrim (Maybe MichelinePrimitive) MichelinePrimitive+ | FEERUnexpectedPrimClass MichelinePrimitiveTag MichelinePrimitiveTag+ | FEERArgumentCountMismatch (NonEmpty Word) Int+ | FEERUnexpectedAnnotations+ | FEERExpectedPrim (NonEmpty MichelinePrimitiveTag)+ | FEERExpectedSeq+ | FEERUnsupported+ | FEERDeprecated+ | FEERTooManyAnns (Maybe Int, Maybe Int, Maybe Int) (Int, Int, Int)+ | FEEROutOfBounds+ | FEERExpectedNumber+ | FEERExpectedString+ | FEERViewNameError BadViewNameError+ | FEERBadContractBlocks (NonEmpty ContractBlockError)+ deriving stock (Show, Eq)++instance Buildable FromExpErrorReason where+ build = \case+ FEERMTextDecodingFailure msg -> nameF "Text decoding failure" $ build msg+ FEERTcError ty err -> unlinesF+ [ nameF "Failed to typecheck expression as a value of type" $ build ty+ , mempty+ , nameF "Typechecker error" $ build err+ ]+ FEERNotEnoughArguments minArgs numArgs ->+ "Expected at least" ++| minArgs |++ "arguments, but got" ++| numArgs |++ ""+ FEERUnexpectedPrim expected got ->+ nameF "Unexpected primitive" $ case expected of+ Nothing -> build got+ Just e -> build MkMismatchError { meExpected = e, meActual = got }+ FEERUnexpectedPrimClass expected got ->+ nameF "Unexpected primitive class" $ build $ MkMismatchError+ { meExpected = expected, meActual = got }+ FEERArgumentCountMismatch expected got ->+ fillSepF+ $ "Expected exactly"+ : punctuateF "," " or" expected <>+ [ "arguments, but got"+ , build got+ ]+ FEERUnexpectedAnnotations -> "Unexpected annotations"+ FEERExpectedPrim prims -> fillSepF+ $ "Expected primitive"+ : punctuateF "," " or" prims+ FEERExpectedSeq -> "Expected sequence"+ FEERTooManyAnns (maxTas, maxFas, maxVas) (tasCnt, fasCnt, vasCnt) -> unlinesF+ [ nameF "Expected at most" $ unlinesF $ catMaybes+ [ (<> " type annotations") . build <$> maxTas+ , (<> " field annotations") . build <$> maxFas+ , (<> " variable annotations") . build <$> maxVas+ ]+ , nameF "but found" $ unlinesF $ catMaybes+ [ (<> " type annotations") . build <$> (maxTas $> tasCnt)+ , (<> " field annotations") . build <$> (maxFas $> fasCnt)+ , (<> " variable annotations") . build <$> (maxVas $> vasCnt)+ ]+ ]+ FEEROutOfBounds -> "Value is out of bounds"+ FEERBadContractBlocks cbes -> unlinesF $ build <$> cbes+ FEERUnsupported -> "Unsupported"+ FEERDeprecated -> "Deprecated primitive"+ FEERExpectedNumber -> "Expected number"+ FEERExpectedString -> "Expected string"+ FEERViewNameError err -> nameF "View name error" $ build err++-- | Error in case of vanilla expression.+type FromExpressionError = FromExpError RegularExp++instance Buildable FromExpressionError where+ build (FromExpError expr err) =+ unlinesF+ [ "Failed to convert expression:"+ , indentF 2 $ build expr+ , ""+ , "Error:"+ , indentF 2 $ build err+ ]++instance Exception FromExpressionError where+ displayException = pretty++-- | Type class that provides the ability to convert+-- something from a Micheline Expression.+class FromExp x a where+ fromExp :: Exp x -> Either (FromExpError x) a++type FromExpression = FromExp RegularExp++-- | Parse vanilla expression to something.+fromExpression+ :: FromExp RegularExp a+ => Expression -> Either FromExpressionError a+fromExpression = fromExp++instance (FromExp x Untyped.Value, SingI t) => FromExp x (Value t) where+ fromExp expr =+ case fromExp @_ @Untyped.Value expr of+ Right uv -> case typeCheck uv of+ Left tcErr -> Left $ FromExpError expr $ FEERTcError (demote @t) tcErr+ Right tv -> Right tv+ Left e -> Left e+ where+ typeCheck uv = typeCheckingWith (TypeCheckOptions False False) $+ typeCheckValue uv++instance FromExp x op => FromExp x (Untyped.Value' [] op) where+ fromExp e = case e of+ ExpInt _ v -> pure $ Untyped.ValueInt v+ ExpString _ s ->+ first (FromExpError e . FEERMTextDecodingFailure)+ (Untyped.ValueString <$> mkMText s)+ ExpBytes _ bs -> pure $ Untyped.ValueBytes $ Untyped.InternalByteString bs+ ExpPrim _ (MichelinePrimAp prim args _) -> withClassifiedPrim prim \case+ SMPTValue -> \case+ C_Prim_Unit -> withArgs Untyped.ValueUnit+ C_Prim_True -> withArgs Untyped.ValueTrue+ C_Prim_False -> withArgs Untyped.ValueFalse+ C_Prim_Pair ->+ case nonEmpty args >>= forbidSingletonList of+ Nothing -> Left $ FromExpError e $ FEERNotEnoughArguments 2 (length args)+ Just args' -> do+ tys <- mapM fromExp args'+ return $ foldr1 Untyped.ValuePair tys+ C_Prim_Left -> withArgs Untyped.ValueLeft+ C_Prim_Right -> withArgs Untyped.ValueRight+ C_Prim_Some -> withArgs Untyped.ValueSome+ C_Prim_None -> withArgs Untyped.ValueNone+ C_Prim_Lambda_rec -> withArgs Untyped.ValueLamRec+ C_Prim_Elt -> Left $ FromExpError e $ FEERUnexpectedPrim Nothing Prim_Elt+ s -> const $ Left $ FromExpError e $ FEERUnexpectedPrimClass MPTValue (fromSing s)+ where+ withArgs :: WithArgsRec x a r => a -> Either (FromExpError x) r+ withArgs = withArgsRec e args+ ExpSeq _ [] -> pure Untyped.ValueNil+ ExpSeq _ (h : t) ->+ case fromExp @x @op h of+ Right op -> do+ ops <- traverse (fromExp @x @op) t+ pure . Untyped.ValueLambda $ op : ops+ Left _ -> case exprToElt h of+ Right elt -> do+ elts <- traverse exprToElt t+ pure . Untyped.ValueMap $ elt :| elts+ Left _ -> case fromExp h of+ Left (FromExpError err _) -> Left $ FromExpError err $+ FEERExpectedPrim (MPTValue :| [MPTInstr])+ Right h' -> do+ t' <- traverse fromExp t+ pure . Untyped.ValueSeq $ h' :| t'+ ExpX _ -> Left $ FromExpError e $ FEERExpectedPrim (one MPTValue)+ where+ exprToElt :: Exp x -> Either (FromExpError x) (Untyped.Elt [] op)+ exprToElt ex = case ex of+ ExpPrim' _ Prim_Elt [l, r] [] -> do+ l' <- fromExp l+ r' <- fromExp r+ pure $ Untyped.Elt l' r'+ ExpPrim' _ Prim_Elt args' [] -> Left $ FromExpError ex $+ FEERArgumentCountMismatch (one 2) (length args')+ ExpPrim' _ Prim_Elt _ _ -> Left $ FromExpError ex FEERUnexpectedAnnotations+ ExpPrim' _ prim _ _ -> Left $ FromExpError ex $ FEERUnexpectedPrim (Just Prim_Elt) prim+ _ -> Left $ FromExpError ex $ FEERExpectedPrim $ one MPTValue++instance FromExp x a => FromExp x [a] where+ fromExp = \case+ ExpSeq _ exprs -> traverse fromExp exprs+ e -> Left $ FromExpError e FEERExpectedSeq++instance FromExp RegularExp ExpandedOp where+ fromExp = \case+ ExpSeq _ s -> SeqEx <$> traverse fromExp s+ e -> PrimEx <$> fromExp e++instance FromExp x Word where+ fromExp = integralFromExpr++instance FromExp x Natural where+ fromExp = integralFromExpr++-- | Used to improve type inference with 'WithArgsRec'.+type family EndResult a where+ EndResult (_ -> b) = EndResult b+ EndResult b = b++-- | Recursive typeclass that unpacks a list of constructor arguments and+-- applies a function to them.+class (EndResult a ~ r, CountArgs a r) => WithArgsRec x a r where+ -- | Given the 'Exp' itself (used for error reporting), its arguments, and a+ -- function constructing the result form the arguments, produce the result or+ -- an error if the argument count is mismatched.+ withArgsRec' :: FromExpError x -> [Exp x] -> a -> Either (FromExpError x) r++instance (FromExp x a, WithArgsRec x b r) => WithArgsRec x (a -> b) r where+ withArgsRec' ee (e:es) f = fromExp @x e >>= withArgsRec' ee es . f+ withArgsRec' ee [] _ = Left ee++instance (EndResult r ~ r) => WithArgsRec x r r where+ withArgsRec' _ [] x = pure x+ withArgsRec' ee _ _ = Left ee++class CountArgs a r where countArgs :: Word+instance CountArgs r r where countArgs = 0+instance CountArgs b r => CountArgs (a -> b) r where countArgs = succ $ countArgs @b @r++withArgsRec+ :: forall x a r. WithArgsRec x a r+ => Exp x -> [Exp x] -> a -> Either (FromExpError x) r+withArgsRec e args = withArgsRec'+ (FromExpError e $ FEERArgumentCountMismatch (one $ countArgs @a @r) (length args))+ args++-- Note: On adding new expressions here, you must also add the symmetric (writing) case+-- to ToExpression as well.+instance FromExp x op =>+ FromExp x (InstrAbstract [] op) where+ fromExp e@(ExpPrim' _ prim args anns) = withClassifiedPrim prim \case+ SMPTInstr -> \case+ C_Prim_DROP -> nilAnns *> case args of+ [] -> pure DROP+ [n] -> DROPN <$> integralFromExpr n+ _ -> invalidNumArgs $ 0 :| [1]+ C_Prim_DUP -> annsCnt (0, 0, 1) *> case args of+ [n] -> DUPN va <$> integralFromExpr n+ [] -> pure $ DUP va+ _ -> invalidNumArgs $ 0 :| [1]+ C_Prim_SWAP -> withArgsAnns nil SWAP+ C_Prim_DIG -> withArgsAnns nil DIG+ C_Prim_DUG -> withArgsAnns nil DUG+ C_Prim_PUSH -> withArgsAnns (0, 0, 1) $ PUSH va+ C_Prim_SOME -> withArgsAnns (1, 0, 1) $ SOME ta va+ C_Prim_NONE -> withArgsAnns (1, 0, 1) $ NONE ta va+ C_Prim_UNIT -> withArgsAnns (1, 0, 1) $ UNIT ta va+ C_Prim_IF_NONE -> withArgsAnns nil IF_NONE+ C_Prim_PAIR -> case args of+ [] -> annsCnt (1, 2, 1) $> PAIR ta va fa1 fa2+ [n] -> annsCnt (0, 0, 1) $> PAIRN va <*> integralFromExpr n+ _ -> invalidNumArgs $ 0 :| [1]+ C_Prim_UNPAIR -> case args of+ [] -> annsCnt (0, 2, 2) $> UNPAIR va1 va2 fa1 fa2+ [n] -> nilAnns $> UNPAIRN <*> integralFromExpr n+ _ -> invalidNumArgs $ 0 :| [1]+ C_Prim_CAR -> withArgsAnns (0, 1, 1) $ CAR va fa+ C_Prim_CDR -> withArgsAnns (0, 1, 1) $ CDR va fa+ C_Prim_LEFT -> withArgsAnns (1, 2, 1) $ LEFT ta va fa1 fa2+ C_Prim_RIGHT -> withArgsAnns (1, 2, 1) $ RIGHT ta va fa1 fa2+ C_Prim_IF_LEFT -> withArgsAnns nil IF_LEFT+ C_Prim_NIL -> withArgsAnns (1, 0, 1) $ NIL ta va+ C_Prim_CONS -> mkInstrWithVarAnn CONS+ C_Prim_IF_CONS -> withArgsAnns nil IF_CONS+ C_Prim_SIZE -> mkInstrWithVarAnn SIZE+ C_Prim_EMPTY_SET -> withArgsAnns (1, 0, 1) $ EMPTY_SET ta va+ C_Prim_EMPTY_MAP -> withArgsAnns (1, 0, 1) $ EMPTY_MAP ta va+ C_Prim_EMPTY_BIG_MAP -> withArgsAnns (1, 0, 1) $ EMPTY_BIG_MAP ta va+ C_Prim_MAP -> withArgsAnns (0, 0, 1) $ MAP va+ C_Prim_ITER -> withArgsAnns nil ITER+ C_Prim_MEM -> mkInstrWithVarAnn MEM+ C_Prim_GET -> case args of+ [] -> mkInstrWithVarAnn GET+ [n] -> annsCnt (0, 0, 1) $> GETN va <*> integralFromExpr n+ _ -> invalidNumArgs $ 0 :| [1]+ C_Prim_UPDATE -> case args of+ [] -> mkInstrWithVarAnn UPDATE+ [n] -> annsCnt (0, 0, 1) $> UPDATEN va <*> integralFromExpr n+ _ -> invalidNumArgs $ 0 :| [1]+ C_Prim_GET_AND_UPDATE -> mkInstrWithVarAnn GET_AND_UPDATE+ C_Prim_IF -> withArgsAnns nil IF+ C_Prim_LOOP -> withArgsAnns nil LOOP+ C_Prim_LOOP_LEFT -> withArgsAnns nil LOOP_LEFT+ C_Prim_LAMBDA -> withArgsAnns (0, 0, 1) $ LAMBDA va+ C_Prim_LAMBDA_REC -> withArgsAnns (0, 0, 1) $ LAMBDA_REC va+ C_Prim_EXEC -> mkInstrWithVarAnn EXEC+ C_Prim_APPLY -> mkInstrWithVarAnn APPLY+ C_Prim_DIP -> nilAnns *> case args of+ [ops] -> DIP <$> fromExp ops+ [n, ops] -> DIPN <$> fromExp n <*> fromExp ops+ _ -> invalidNumArgs $ 1 :| [2]+ C_Prim_FAILWITH -> withArgsAnns nil FAILWITH+ C_Prim_CAST -> withArgsAnns (0, 0, 1) $ CAST va+ C_Prim_RENAME -> mkInstrWithVarAnn RENAME+ C_Prim_PACK -> mkInstrWithVarAnn PACK+ C_Prim_UNPACK -> withArgsAnns (1, 0, 1) $ UNPACK ta va+ C_Prim_CONCAT -> mkInstrWithVarAnn CONCAT+ C_Prim_SLICE -> mkInstrWithVarAnn SLICE+ C_Prim_ISNAT -> mkInstrWithVarAnn ISNAT+ C_Prim_ADD -> mkInstrWithVarAnn ADD+ C_Prim_SUB -> mkInstrWithVarAnn SUB+ C_Prim_SUB_MUTEZ -> mkInstrWithVarAnn SUB_MUTEZ+ C_Prim_MUL -> mkInstrWithVarAnn MUL+ C_Prim_EDIV -> mkInstrWithVarAnn EDIV+ C_Prim_ABS -> mkInstrWithVarAnn ABS+ C_Prim_NEG -> mkInstrWithVarAnn NEG+ C_Prim_LSL -> mkInstrWithVarAnn LSL+ C_Prim_LSR -> mkInstrWithVarAnn LSR+ C_Prim_OR -> mkInstrWithVarAnn OR+ C_Prim_AND -> mkInstrWithVarAnn AND+ C_Prim_XOR -> mkInstrWithVarAnn XOR+ C_Prim_NOT -> mkInstrWithVarAnn NOT+ C_Prim_COMPARE -> mkInstrWithVarAnn COMPARE+ C_Prim_EQ -> mkInstrWithVarAnn Untyped.EQ+ C_Prim_NEQ -> mkInstrWithVarAnn NEQ+ C_Prim_LT -> mkInstrWithVarAnn Untyped.LT+ C_Prim_GT -> mkInstrWithVarAnn Untyped.GT+ C_Prim_LE -> mkInstrWithVarAnn LE+ C_Prim_GE -> mkInstrWithVarAnn GE+ C_Prim_INT -> mkInstrWithVarAnn INT+ C_Prim_NAT -> mkInstrWithVarAnn NAT+ C_Prim_BYTES -> mkInstrWithVarAnn BYTES+ C_Prim_VIEW -> withArgsAnns (0, 0, 1) $ VIEW va+ C_Prim_SELF -> withArgsAnns (0, 1, 1) $ SELF va fa+ C_Prim_CONTRACT -> withArgsAnns (0, 1, 1) $ CONTRACT va fa+ C_Prim_TRANSFER_TOKENS -> mkInstrWithVarAnn TRANSFER_TOKENS+ C_Prim_SET_DELEGATE -> mkInstrWithVarAnn SET_DELEGATE+ C_Prim_CREATE_CONTRACT -> withArgsAnns (0, 0, 2) $ CREATE_CONTRACT va1 va2+ C_Prim_IMPLICIT_ACCOUNT -> mkInstrWithVarAnn IMPLICIT_ACCOUNT+ C_Prim_NOW -> mkInstrWithVarAnn NOW+ C_Prim_AMOUNT -> mkInstrWithVarAnn AMOUNT+ C_Prim_BALANCE -> mkInstrWithVarAnn BALANCE+ C_Prim_VOTING_POWER -> mkInstrWithVarAnn VOTING_POWER+ C_Prim_TOTAL_VOTING_POWER -> mkInstrWithVarAnn TOTAL_VOTING_POWER+ C_Prim_CHECK_SIGNATURE -> mkInstrWithVarAnn CHECK_SIGNATURE+ C_Prim_SHA256 -> mkInstrWithVarAnn SHA256+ C_Prim_SHA512 -> mkInstrWithVarAnn SHA512+ C_Prim_BLAKE2B -> mkInstrWithVarAnn BLAKE2B+ C_Prim_SHA3 -> mkInstrWithVarAnn SHA3+ C_Prim_KECCAK -> mkInstrWithVarAnn KECCAK+ C_Prim_HASH_KEY -> mkInstrWithVarAnn HASH_KEY+ C_Prim_PAIRING_CHECK -> mkInstrWithVarAnn PAIRING_CHECK+ C_Prim_SOURCE -> mkInstrWithVarAnn SOURCE+ C_Prim_SENDER -> mkInstrWithVarAnn SENDER+ C_Prim_ADDRESS -> mkInstrWithVarAnn ADDRESS+ C_Prim_CHAIN_ID -> mkInstrWithVarAnn CHAIN_ID+ C_Prim_LEVEL -> mkInstrWithVarAnn LEVEL+ C_Prim_SELF_ADDRESS -> mkInstrWithVarAnn SELF_ADDRESS+ C_Prim_NEVER -> withArgsAnns nil NEVER+ C_Prim_TICKET_DEPRECATED -> mkInstrWithVarAnn TICKET_DEPRECATED+ C_Prim_TICKET -> mkInstrWithVarAnn TICKET+ C_Prim_READ_TICKET -> mkInstrWithVarAnn READ_TICKET+ C_Prim_SPLIT_TICKET -> mkInstrWithVarAnn SPLIT_TICKET+ C_Prim_JOIN_TICKETS -> mkInstrWithVarAnn JOIN_TICKETS+ C_Prim_OPEN_CHEST -> mkInstrWithVarAnn OPEN_CHEST+ C_Prim_SAPLING_EMPTY_STATE -> withArgsAnns (0, 0, 1) $ SAPLING_EMPTY_STATE va+ C_Prim_SAPLING_VERIFY_UPDATE -> mkInstrWithVarAnn SAPLING_VERIFY_UPDATE+ C_Prim_MIN_BLOCK_TIME -> withArgsRec e args $ mkInstrWithAnyAnns MIN_BLOCK_TIME+ C_Prim_EMIT -> annsCnt (0, 1, 1) $> EMIT va fa <*> case args of+ [] -> pure Nothing+ [ty] -> Just <$> fromExp ty+ _ -> invalidNumArgs (0 :| [1])+ s -> const $ Left $ FromExpError e $ FEERUnexpectedPrimClass MPTInstr (fromSing s)++ where+ annSet = toAnnSet anns+ va = firstAnn @VarTag annSet+ ta = firstAnn @TypeTag annSet+ fa = firstAnn @FieldTag annSet+ fa1 = fa+ fa2 = secondAnn @FieldTag annSet+ va1 = va+ va2 = secondAnn @VarTag annSet++ withArgsAnns+ :: WithArgsRec x a (InstrAbstract [] op)+ => (Int, Int, Int) -> a -> Either (FromExpError x) (InstrAbstract [] op)+ withArgsAnns n f = annsCnt n *> withArgsRec e args f++ invalidNumArgs :: NonEmpty Word -> Either (FromExpError x) b+ invalidNumArgs expected = Left $ FromExpError e $+ FEERArgumentCountMismatch expected (length args)++ annsCnt = checkAnnsCount e annSet++ nil = (0, 0, 0)++ nilAnns = annsCnt nil++ mkInstrWithVarAnn+ :: WithArgsRec x a (InstrAbstract [] op)+ => (Untyped.Annotation VarTag -> a)+ -> Either (FromExpError x) (InstrAbstract [] op)+ mkInstrWithVarAnn ctor = withArgsAnns (0, 0, 1) $ ctor va++ mkInstrWithAnyAnns :: ([Untyped.AnyAnn] -> t) -> t+ mkInstrWithAnyAnns ctor = ctor $ anns <&> \case+ AnnotationType x -> Untyped.AnyAnnType x+ AnnotationField x -> Untyped.AnyAnnField x+ AnnotationVariable x -> Untyped.AnyAnnVar x++ fromExp e = Left $ FromExpError e $ FEERExpectedPrim (one MPTInstr)++instance (FromExp x op) => FromExp x (Untyped.Contract' op) where+ fromExp blocks = case blocks of+ ExpSeq _ bs -> do+ bs' <- mapM exprToCB bs+ first (FromExpError blocks . FEERBadContractBlocks) $ orderContractBlock bs'+ expr -> Left $ FromExpError expr FEERExpectedSeq+ where+ exprToCB+ :: Exp x+ -> Either (FromExpError x) (ContractBlock op)+ exprToCB e@(ExpPrim' _ prim args anns) = withClassifiedPrim prim \case+ SMPTKeyword -> \case+ C_Prim_parameter -> mkCbParam e args anns+ C_Prim_storage -> mkCBStorage e args anns+ C_Prim_code -> mkCBCode e args anns+ C_Prim_view -> mkCBView e args anns+ s -> const $ Left $ FromExpError e $ FEERUnexpectedPrimClass MPTKeyword (fromSing s)+ exprToCB e = Left $ FromExpError e $ FEERExpectedPrim $ one MPTKeyword++ mkCbParam+ :: Exp x+ -> [Exp x]+ -> [Annotation]+ -> Either (FromExpError x) (ContractBlock op)+ mkCbParam e args anns = checkAnnsCount e (toAnnSet anns) (0, 0, 0) *> case args of+ [p] -> do+ let annSet = toAnnSet (p ^. _ExpPrim . _2 . mpaAnnotsL)+ annCnt = annsCount annSet+ let rootAnn = firstAnn @FieldTag annSet+ unless (secondAnn @FieldTag annSet == noAnn) $+ Left $ FromExpError p $ FEERTooManyAnns (Nothing, Just 1, Nothing) annCnt+ p' <- fromExp @x @Ty+ (p & _ExpPrim . _2 . mpaAnnotsL %~ filter (not . isAnnotationField))+ pure $ CBParam $ Untyped.ParameterType p' rootAnn+ _ -> Left $ FromExpError e $ FEERArgumentCountMismatch (one 1) (length args)++ mkCBStorage+ :: Exp x+ -> [Exp x]+ -> [Annotation]+ -> Either (FromExpError x) (ContractBlock op)+ mkCBStorage e args anns = checkAnnsCount e (toAnnSet anns) (0, 0, 0) *>+ withArgsRec e args CBStorage++ mkCBCode+ :: Exp x+ -> [Exp x]+ -> [Annotation]+ -> Either (FromExpError x) (ContractBlock op)+ mkCBCode e args anns = checkAnnsCount e (toAnnSet anns) (0, 0, 0) *>+ withArgsRec e args CBCode++ mkCBView+ :: Exp x+ -> [Exp x]+ -> [Annotation]+ -> Either (FromExpError x) (ContractBlock op)+ mkCBView e args anns = checkAnnsCount e (toAnnSet anns) (0, 0, 0) *>+ withArgsRec e args (CBView ... Untyped.View)++instance FromExp x Untyped.T where+ fromExp e@(ExpPrim' _ prim args anns) = assertNoAnns *> withClassifiedPrim prim \case+ SMPTType -> \case+ C_Prim_key -> withArgs Untyped.TKey+ C_Prim_unit -> withArgs Untyped.TUnit+ C_Prim_signature -> withArgs Untyped.TSignature+ C_Prim_chain_id -> withArgs Untyped.TChainId+ C_Prim_option -> withArgs Untyped.TOption+ C_Prim_list -> withArgs Untyped.TList+ C_Prim_set -> withArgs Untyped.TSet+ C_Prim_operation -> withArgs Untyped.TOperation+ C_Prim_contract -> withArgs Untyped.TContract+ C_Prim_ticket -> withArgs Untyped.TTicket+ C_Prim_or+ | [arg1, arg2] <- args -> do+ let as1 = toAnnSet $ arg1 ^. _ExpPrim . _2 . mpaAnnotsL+ let as2 = toAnnSet $ arg2 ^. _ExpPrim . _2 . mpaAnnotsL+ checkAnnsCount e as1 (1, 1, 0)+ checkAnnsCount e as2 (1, 1, 0)+ let fa1 = firstAnn @FieldTag as1+ let fa2 = firstAnn @FieldTag as2+ l <- fromExp $ removeAnns arg1 isAnnotationField+ r <- fromExp $ removeAnns arg2 isAnnotationField+ pure $ Untyped.TOr fa1 fa2 l r+ | otherwise -> Left $ FromExpError e $+ FEERArgumentCountMismatch (one 2) (length args)+ C_Prim_pair -> do+ args2 <- case nonEmpty args >>= forbidSingletonList of+ Nothing -> Left $ FromExpError e $ FEERNotEnoughArguments 2 (length args)+ Just as -> pure as+ -- Check and extract annotations info+ tyInfos <- forM args2 \arg -> do+ let as = toAnnSet $ arg ^. _ExpPrim . _2 . mpaAnnotsL+ checkAnnsCount e as (1, 1, 1)+ let fa = firstAnn @FieldTag as+ let va = firstAnn @VarTag as+ ty <- fromExp $ removeAnns arg+ (isAnnotationField || isAnnotationVariable)+ return (ty, fa, va)+ -- Make a right-comb pairs tree+ let combiner (ty1, fa1, va1) (ty2, fa2, va2) =+ ( Ty (Untyped.TPair fa1 fa2 va1 va2 ty1 ty2) noAnn+ , noAnn+ , noAnn+ )+ let (Ty tRes _, _, _) = foldr1 combiner tyInfos+ return tRes+ C_Prim_lambda -> withArgs Untyped.TLambda+ C_Prim_map -> withArgs Untyped.TMap+ C_Prim_big_map -> withArgs Untyped.TBigMap+ C_Prim_int -> withArgs Untyped.TInt+ C_Prim_nat -> withArgs Untyped.TNat+ C_Prim_string -> withArgs Untyped.TString+ C_Prim_bytes -> withArgs Untyped.TBytes+ C_Prim_mutez -> withArgs Untyped.TMutez+ C_Prim_bool -> withArgs Untyped.TBool+ C_Prim_key_hash -> withArgs Untyped.TKeyHash+ C_Prim_bls12_381_fr -> withArgs Untyped.TBls12381Fr+ C_Prim_bls12_381_g1 -> withArgs Untyped.TBls12381G1+ C_Prim_bls12_381_g2 -> withArgs Untyped.TBls12381G2+ C_Prim_timestamp -> withArgs Untyped.TTimestamp+ C_Prim_address -> withArgs Untyped.TAddress+ C_Prim_chest -> withArgs Untyped.TChest+ C_Prim_chest_key -> withArgs Untyped.TChestKey+ C_Prim_tx_rollup_l2_address ->+ Left $ FromExpError e FEERUnsupported+ C_Prim_never -> withArgs Untyped.TNever+ C_Prim_sapling_state -> withArgs Untyped.TSaplingState+ C_Prim_sapling_transaction -> withArgs Untyped.TSaplingTransaction+ C_Prim_sapling_transaction_deprecated ->+ Left $ FromExpError e FEERDeprecated+ s -> const $ Left $ FromExpError e $ FEERUnexpectedPrimClass MPTType (fromSing s)+ where+ assertNoAnns = unless (null anns) $ Left $ FromExpError e FEERUnexpectedAnnotations+ withArgs :: WithArgsRec x a Untyped.T => a -> Either (FromExpError x) Untyped.T+ withArgs = withArgsRec e args++ removeAnns :: Exp x -> (Annotation -> Bool) -> Exp x+ removeAnns expr p =+ expr & _ExpPrim . _2 . mpaAnnotsL %~ filter (not . p)+ fromExp e = Left $ FromExpError e $ FEERExpectedPrim $ one MPTType++instance FromExp x Ty where+ fromExp e = case e of+ ExpPrim' ex primName args anns -> do+ let annSet = toAnnSet anns+ annCnt = annsCount annSet+ let ta = firstAnn @TypeTag annSet+ when (secondAnn @TypeTag annSet /= noAnn) $+ Left $ FromExpError e $ FEERTooManyAnns (Just 1, Nothing, Nothing) annCnt+ t <- fromExp @x @Untyped.T $ ExpPrim' ex primName args $ filter+ (not . isAnnotationType) anns+ pure $ Ty t ta+ _ -> Left $ FromExpError e $ FEERExpectedPrim (one MPTType)++instance FromExp x T where+ fromExp =+ second fromUType . fromExp @x @Untyped.Ty++-- Note: we should generalize this to work for any instruction,+-- not just lambdas (i.e. instructions with one input and one output).+instance (SingI inp, SingI out) => FromExp RegularExp (Instr '[inp] '[out]) where+ fromExp expr =+ fromExpression @(Value ('TLambda inp out)) expr >>= \case+ VLam (LambdaCode instr) -> pure $ rfAnyInstr instr+ VLam LambdaCodeRec{} -> Left $ FromExpError expr $+ FEERUnexpectedPrim Nothing Prim_Lambda_rec++instance FromExp x ViewName where+ fromExp e = case e of+ ExpString _ s ->+ first (FromExpError e . FEERViewNameError) $ mkViewName s+ _ -> Left $ FromExpError e FEERExpectedString++----------------------------------------------------------------------------+-- Helpers+----------------------------------------------------------------------------++-- | Adds annotations to the expression, after removing empty annotations+-- at the end of each list.+addTrimmedAnns+ :: Exp x+ -> [TypeAnn]+ -> [FieldAnn]+ -> [VarAnn]+ -> Exp x+addTrimmedAnns e tas fas vas =+ e & _ExpPrim . _2 . mpaAnnotsL <>~ mkAnns tas fas vas++-- | Inserts the root annotation into the contract parameter.+insertRootAnn :: HasCallStack => Expression -> RootAnn -> Expression+insertRootAnn expr rootAnn = case expr of+ ExpPrim () p+ -- The order of annotations is important iff there are+ -- multiple annotations of the same kind or there are+ -- other kinds of annotations in the list.+ -- Prepending root field annotation is okay because+ -- there can not be more than one root annotation.+ | rootAnn /= noAnn -> expressionPrim p+ { mpaAnnots = AnnotationField rootAnn : mpaAnnots p+ }+ | otherwise -> expr+ -- Currently this error can't happen because parameter type+ -- must be a Micheline primitive. If it ever changes, we+ -- would like to notice it ASAP and update this place.+ _ -> error $ "parameter is not a primitive: " <> pretty expr++-- | Checks for a given expression that the number of annotations+-- of each type in it doesn't exceed the specified threshold.+checkAnnsCount+ :: Exp x+ -> AnnotationSet+ -> (Int, Int, Int)+ -> Either (FromExpError x) ()+checkAnnsCount e annSet maxCount@(maxTas, maxFas, maxVas) = do+ let actualCount = annsCount annSet+ unless (actualCount <= maxCount) $+ Left $ FromExpError e $ FEERTooManyAnns (Just maxTas, Just maxFas, Just maxVas) actualCount++forbidSingletonList :: NonEmpty a -> Maybe (NonEmpty a)+forbidSingletonList = \case+ _ :| [] -> Nothing+ x -> Just x++integralToExpr :: Integral i => i -> Expression+integralToExpr = expressionInt . toInteger++integralFromExpr :: (Integral i, Bits i) => Exp x -> Either (FromExpError x) i+integralFromExpr e = case e of+ ExpInt _ v ->+ maybeToRight (FromExpError e FEEROutOfBounds)+ (fromIntegralMaybe @Integer v)+ _ -> Left $ FromExpError e FEERExpectedNumber
src/Morley/Micheline/Expression.hs view
@@ -8,10 +8,7 @@ -- | Module that defines Expression type, its related types -- and its JSON instance. module Morley.Micheline.Expression- ( Exp- ( ..- , ExpPrim'- )+ ( Exp(.., ExpPrim') , expressionInt , expressionString , expressionBytes@@ -20,9 +17,12 @@ , expressionPrim' , RegularExp , Expression- , MichelinePrimAp(..)- , MichelinePrimitive(..)- , michelsonPrimitive+ , MichelinePrimAp (..)+ , MichelinePrimitive (..)+ , MichelinePrimitiveTag (..)+ , SingMichelinePrimitiveTag (..)+ , ClassifiedMichelinePrimitive (..)+ , withClassifiedPrim , ExpExtensionDescriptorKind , ExpExtensionDescriptor (..) @@ -64,7 +64,7 @@ , mpaAnnotsL ) where -import Control.Lens (Iso', Plated, Prism', iso, prism')+import Control.Lens (Iso', Plated, Prism', iso) import Control.Lens.TH (makeLensesWith, makePrisms) import Data.Aeson@@ -74,12 +74,16 @@ import Data.Aeson.KeyMap qualified as KeyMap import Data.Aeson.Types qualified as Aeson import Data.Data (Data)-import Data.Sequence qualified as Seq-import Data.Text qualified as T (uncons)-import Fmt (Buildable(..), pretty, (+|), (|+))+import Data.Singletons (Sing, sing)+import Data.Text qualified as T+import Fmt (Buildable(..), listF, pretty, tupleF, unwordsF)+import Language.Haskell.TH (Dec(..), caseE, conE, conP, conT, gadtC, match, normalB) import Language.Haskell.TH.Syntax (Lift)+import Morley.Micheline.Expression.Internal.MichelinePrimitive+import Morley.Micheline.Expression.Internal.TH import Morley.Micheline.Json (StringEncode(StringEncode, unStringEncode))+import Morley.Michelson.Typed.ClassifiedInstr.Internal.TH (promote) import Morley.Michelson.Untyped qualified as U import Morley.Michelson.Untyped.Annotation (AnnotationSet(..), FieldAnn, FieldTag, KnownAnnTag(..), TypeAnn, TypeTag, VarAnn, VarTag,@@ -88,53 +92,26 @@ import Morley.Util.ByteString (HexJSONByteString(..)) import Morley.Util.Lens (postfixLFields) -newtype MichelinePrimitive = MichelinePrimitive Text- deriving newtype (Eq, Ord, IsString, ToJSON, FromJSON)- deriving stock (Show, Data, Lift)+-- | GADT that has the same shape as 'MichelinePrimitive', but each constructor+-- carries a 'MichelinePrimitiveTag' tag with classification.+do+ [DataD cxt' name tvb mk _ ders] <-+ [d|data ClassifiedMichelinePrimitive (tag :: MichelinePrimitiveTag) where|]+ cons <- withMichelinePrimitiveCons \nm classifiedName ->+ gadtC [classifiedName] [] [t|$(conT name) $(promote $ primClassification $ primFromName nm)|]+ pure [DataD cxt' name tvb mk cons ders] -michelsonPrimitive :: Seq Text-michelsonPrimitive = Seq.fromList [- -- NOTE: The order of this list *matters*!- --- -- The position of each item in the list determines which binary code it gets packed to.- -- E.g.- -- * "parameter" is at index 0 on the list, so it gets packed to `0x0300`- -- * "storage" is at index 1, so it gets packed to `0x0301`- --- -- You can ask `octez-client` which code corresponds to a given instruction/type/constructor.- --- -- > octez-client convert data 'storage' from michelson to binary- -- > 0x0301- --- -- Whenever new instructions/types/constructors are added to the protocol,- -- we can regenerate this list using this script:- --- -- > ./scripts/get-micheline-exprs.sh- --- -- or find the full primitives list in the <https://gitlab.com/tezos/tezos/blob/master/src/proto_alpha/lib_protocol/michelson_v1_primitives.ml | sources>,- -- see "prim_encoding" variable.- --- "parameter", "storage", "code", "False", "Elt", "Left", "None", "Pair",- "Right", "Some", "True", "Unit", "PACK", "UNPACK", "BLAKE2B", "SHA256",- "SHA512", "ABS", "ADD", "AMOUNT", "AND", "BALANCE", "CAR", "CDR",- "CHECK_SIGNATURE", "COMPARE", "CONCAT", "CONS", "CREATE_ACCOUNT", "CREATE_CONTRACT", "IMPLICIT_ACCOUNT", "DIP",- "DROP", "DUP", "EDIV", "EMPTY_MAP", "EMPTY_SET", "EQ", "EXEC", "FAILWITH",- "GE", "GET", "GT", "HASH_KEY", "IF", "IF_CONS", "IF_LEFT", "IF_NONE",- "INT", "LAMBDA", "LE", "LEFT", "LOOP", "LSL", "LSR", "LT",- "MAP", "MEM", "MUL", "NEG", "NEQ", "NIL", "NONE", "NOT",- "NOW", "OR", "PAIR", "PUSH", "RIGHT", "SIZE", "SOME", "SOURCE",- "SENDER", "SELF", "STEPS_TO_QUOTA", "SUB", "SWAP", "TRANSFER_TOKENS", "SET_DELEGATE", "UNIT",- "UPDATE", "XOR", "ITER", "LOOP_LEFT", "ADDRESS", "CONTRACT", "ISNAT", "CAST",- "RENAME", "bool", "contract", "int", "key", "key_hash", "lambda", "list",- "map", "big_map", "nat", "option", "or", "pair", "set", "signature",- "string", "bytes", "mutez", "timestamp", "unit", "operation", "address", "SLICE",- "DIG", "DUG", "EMPTY_BIG_MAP", "APPLY", "chain_id", "CHAIN_ID", "LEVEL", "SELF_ADDRESS",- "never", "NEVER", "UNPAIR", "VOTING_POWER", "TOTAL_VOTING_POWER", "KECCAK", "SHA3", "PAIRING_CHECK",- "bls12_381_g1", "bls12_381_g2", "bls12_381_fr", "sapling_state", "sapling_transaction_deprecated", "SAPLING_EMPTY_STATE", "SAPLING_VERIFY_UPDATE", "ticket",- "TICKET_DEPRECATED", "READ_TICKET", "SPLIT_TICKET", "JOIN_TICKETS", "GET_AND_UPDATE", "chest", "chest_key", "OPEN_CHEST",- "VIEW", "view", "constant", "SUB_MUTEZ", "tx_rollup_l2_address", "MIN_BLOCK_TIME", "sapling_transaction", "EMIT",- "Lambda_rec", "LAMBDA_REC", "TICKET", "BYTES", "NAT"- ]+-- | Classify a 'MichelinePrimitive'. Intended to be used with @LambdaCase@,+-- similar to @withClassifiedInstr@.+withClassifiedPrim+ :: MichelinePrimitive+ -> (forall tag. Sing tag -> ClassifiedMichelinePrimitive tag -> r)+ -> r+withClassifiedPrim prim f = $(do+ matches <- withMichelinePrimitiveCons \nm classifiedName ->+ match (conP nm []) (normalB [|f sing $(conE classifiedName)|]) []+ caseE [|prim|] $ pure <$> matches+ ) -- | Type for Micheline Expression with extension points. --@@ -264,9 +241,9 @@ expressionPrim :: MichelinePrimAp RegularExp -> Expression expressionPrim a = ExpPrim () a -expressionPrim' :: Text -> [Expression] -> [Annotation] -> Expression-expressionPrim' primName args anns =- ExpPrim () (MichelinePrimAp (MichelinePrimitive primName) args anns)+expressionPrim' :: MichelinePrimitive -> [Expression] -> [Annotation] -> Expression+expressionPrim' prim args anns =+ ExpPrim () (MichelinePrimAp prim args anns) -- | Default instance that uses @uniplate@ as implementation. --@@ -284,13 +261,9 @@ ExpString () s -> build s ExpBytes () b -> build $ encodeBase58Check b- ExpSeq () s -> "(" +| buildList build s |+ ")"- ExpPrim () (MichelinePrimAp (MichelinePrimitive text) s annots) ->- text <> " " |+ "(" +|- buildList build s +| ") " +|- buildList (build . annotToText) annots- where- buildList buildElem = mconcat . intersperse ", " . map buildElem+ ExpSeq () s -> listF s+ ExpPrim () (MichelinePrimAp prim s annots) ->+ unwordsF [build prim, listF s, tupleF $ annotToText <$> annots] data Annotation = AnnotationType TypeAnn@@ -416,30 +389,7 @@ -- Optics -------------------------------------------------------------------------------- -_ExpInt :: Prism' (Exp d) (XExpInt d, Integer)-_ExpInt = prism' (uncurry ExpInt) \case- ExpInt x a -> Just (x, a)- _ -> Nothing--_ExpString :: Prism' (Exp d) (XExpString d, Text)-_ExpString = prism' (uncurry ExpString) \case- ExpString x a -> Just (x, a)- _ -> Nothing--_ExpBytes :: Prism' (Exp d) (XExpBytes d, ByteString)-_ExpBytes = prism' (uncurry ExpBytes) \case- ExpBytes x a -> Just (x, a)- _ -> Nothing--_ExpSeq :: Prism' (Exp d) (XExpSeq d, [Exp d])-_ExpSeq = prism' (uncurry ExpSeq) \case- ExpSeq x a -> Just (x, a)- _ -> Nothing--_ExpPrim :: Prism' (Exp d) (XExpPrim d, MichelinePrimAp d)-_ExpPrim = prism' (uncurry ExpPrim) \case- ExpPrim x a -> Just (x, a)- _ -> Nothing+makePrisms ''Exp neglecting :: Iso' ((), a) a neglecting = iso snd pure
+ src/Morley/Micheline/Expression/Internal/MichelinePrimitive.hs view
@@ -0,0 +1,127 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}+{-# LANGUAGE DeriveLift #-}++-- | Micheline primitive datatype+module Morley.Micheline.Expression.Internal.MichelinePrimitive+ ( module Morley.Micheline.Expression.Internal.MichelinePrimitive+ ) where++import Data.Aeson qualified as Aeson+import Data.Char (isDigit, isLower, isUpper)+import Data.Data (Data)+import Data.Text qualified as T+import Fmt (Buildable(..), pretty)+import Language.Haskell.TH.Syntax (Lift)++import Morley.Util.Sing (genSingletonsType)++data MichelinePrimitive+ -- NOTE: The order of constructors in this datatype *matters*!+ --+ -- The position of each constructor determines which binary code it gets+ -- packed to. E.g.+ -- * "parameter" is at index 0 on the list, so it gets packed to `0x0300`+ -- * "storage" is at index 1, so it gets packed to `0x0301`+ --+ -- You can ask `octez-client` which code corresponds to a given+ -- instruction/type/constructor.+ --+ -- > octez-client convert data 'storage' from michelson to binary+ -- > 0x0301+ --+ -- Whenever new instructions/types/constructors are added to the protocol, we+ -- can regenerate this list using this script:+ --+ -- > ./scripts/get-micheline-exprs.sh+ --+ -- or find the full primitives list in the sources, see "prim_encoding"+ -- variable.+ -- https://gitlab.com/tezos/tezos/blob/master/src/proto_alpha/lib_protocol/michelson_v1_primitives.ml+ --+ -- Invariant: each constructor starts with `Prim_`+ = Prim_parameter | Prim_storage | Prim_code | Prim_False | Prim_Elt | Prim_Left+ | Prim_None | Prim_Pair | Prim_Right | Prim_Some | Prim_True | Prim_Unit+ | Prim_PACK | Prim_UNPACK | Prim_BLAKE2B | Prim_SHA256 | Prim_SHA512 | Prim_ABS+ | Prim_ADD | Prim_AMOUNT | Prim_AND | Prim_BALANCE | Prim_CAR | Prim_CDR+ | Prim_CHECK_SIGNATURE | Prim_COMPARE | Prim_CONCAT | Prim_CONS+ | Prim_CREATE_ACCOUNT | Prim_CREATE_CONTRACT | Prim_IMPLICIT_ACCOUNT | Prim_DIP+ | Prim_DROP | Prim_DUP | Prim_EDIV | Prim_EMPTY_MAP | Prim_EMPTY_SET | Prim_EQ+ | Prim_EXEC | Prim_FAILWITH | Prim_GE | Prim_GET | Prim_GT | Prim_HASH_KEY+ | Prim_IF | Prim_IF_CONS | Prim_IF_LEFT | Prim_IF_NONE | Prim_INT | Prim_LAMBDA+ | Prim_LE | Prim_LEFT | Prim_LOOP | Prim_LSL | Prim_LSR | Prim_LT | Prim_MAP+ | Prim_MEM | Prim_MUL | Prim_NEG | Prim_NEQ | Prim_NIL | Prim_NONE | Prim_NOT+ | Prim_NOW | Prim_OR | Prim_PAIR | Prim_PUSH | Prim_RIGHT | Prim_SIZE+ | Prim_SOME | Prim_SOURCE | Prim_SENDER | Prim_SELF | Prim_STEPS_TO_QUOTA+ | Prim_SUB | Prim_SWAP | Prim_TRANSFER_TOKENS | Prim_SET_DELEGATE | Prim_UNIT+ | Prim_UPDATE | Prim_XOR | Prim_ITER | Prim_LOOP_LEFT | Prim_ADDRESS+ | Prim_CONTRACT | Prim_ISNAT | Prim_CAST | Prim_RENAME | Prim_bool+ | Prim_contract | Prim_int | Prim_key | Prim_key_hash | Prim_lambda | Prim_list+ | Prim_map | Prim_big_map | Prim_nat | Prim_option | Prim_or | Prim_pair+ | Prim_set | Prim_signature | Prim_string | Prim_bytes | Prim_mutez+ | Prim_timestamp | Prim_unit | Prim_operation | Prim_address | Prim_SLICE+ | Prim_DIG | Prim_DUG | Prim_EMPTY_BIG_MAP | Prim_APPLY | Prim_chain_id+ | Prim_CHAIN_ID | Prim_LEVEL | Prim_SELF_ADDRESS | Prim_never | Prim_NEVER+ | Prim_UNPAIR | Prim_VOTING_POWER | Prim_TOTAL_VOTING_POWER | Prim_KECCAK+ | Prim_SHA3 | Prim_PAIRING_CHECK | Prim_bls12_381_g1 | Prim_bls12_381_g2+ | Prim_bls12_381_fr | Prim_sapling_state | Prim_sapling_transaction_deprecated+ | Prim_SAPLING_EMPTY_STATE | Prim_SAPLING_VERIFY_UPDATE | Prim_ticket+ | Prim_TICKET_DEPRECATED | Prim_READ_TICKET | Prim_SPLIT_TICKET+ | Prim_JOIN_TICKETS | Prim_GET_AND_UPDATE | Prim_chest | Prim_chest_key+ | Prim_OPEN_CHEST | Prim_VIEW | Prim_view | Prim_constant | Prim_SUB_MUTEZ+ | Prim_tx_rollup_l2_address | Prim_MIN_BLOCK_TIME | Prim_sapling_transaction+ | Prim_EMIT | Prim_Lambda_rec | Prim_LAMBDA_REC | Prim_TICKET | Prim_BYTES+ | Prim_NAT+ deriving stock (Eq, Ord, Enum, Bounded, Show, Read, Data, Lift)++type instance PrettyShow MichelinePrimitive = ()++instance Buildable MichelinePrimitive where+ build = build . T.drop 5 . show++instance Aeson.ToJSON MichelinePrimitive where+ toJSON = Aeson.String . pretty++instance Aeson.FromJSON MichelinePrimitive where+ parseJSON = Aeson.withText "MichelinePrimitive" \t ->+ either (fail . toString) pure $ readEither ("Prim_" <> t)++-- | Simple classification datakind for 'MichelinePrimitive'.+data MichelinePrimitiveTag+ = MPTKeyword -- ^ Keywords, like @parameter@, @code@, @storage@, @view@+ | MPTInstr -- ^ Instructions, e.g. @UNIT@, @DIP@, etc+ | MPTValue -- ^ Value constructors like @Left@, @Lambda_rec@, etc+ | MPTType -- ^ Types, like @unit@, @list@, etc+ | MPTRemoved -- ^ Removed primitives: @CREATE_ACCOUNT@, @STEPS_TO_QUOTA@+ | MPTConstant -- ^ Keyword @constant@ for global constants+ deriving stock (Show, Eq, Enum, Bounded, Lift)++instance Buildable MichelinePrimitiveTag where+ build = \case+ MPTKeyword -> "keyword"+ MPTInstr -> "instruction"+ MPTValue -> "value"+ MPTType -> "type"+ MPTRemoved -> "removed"+ MPTConstant -> "constant"++genSingletonsType ''MichelinePrimitiveTag++-- | Classify 'MichelinePrimitive'. This function uses heuristics to avoid+-- writing a giant case match, which means it's potentially partial. This should+-- be fine as it's used with TemplateHaskell, hence if some cases are not+-- covered, the build will fail.+primClassification :: MichelinePrimitive -> MichelinePrimitiveTag+primClassification cs+ | cs `elem` [Prim_CREATE_ACCOUNT, Prim_STEPS_TO_QUOTA] = MPTRemoved+ | cs `elem` [Prim_code, Prim_parameter, Prim_storage, Prim_view] = MPTKeyword+ | cs == Prim_constant = MPTConstant+ | all (isUpper || (== '_') || isDigit) str = MPTInstr+ | all (isLower || (== '_') || isDigit) str = MPTType+ | Just (c, rest) <- T.uncons str+ , all (isLower || (== '_') || isDigit) rest+ , isUpper c = MPTValue+ | otherwise = error $ "Unknown primitive class: " <> str+ where str = pretty cs :: Text
+ src/Morley/Micheline/Expression/Internal/TH.hs view
@@ -0,0 +1,33 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++-- | @TemplateHaskell@ helpers+module Morley.Micheline.Expression.Internal.TH+ ( module Morley.Micheline.Expression.Internal.TH+ ) where++import Prelude hiding (Type, lift)++import Language.Haskell.TH+ (Con(..), Dec(..), Info(..), Lit(..), Name, Q, mkName, nameBase, ppr, reify)+import Language.Haskell.TH.Lib (caseE, conE, litP, match, normalB)++import Morley.Micheline.Expression.Internal.MichelinePrimitive++withMichelinePrimitiveCons :: (Name -> Name -> Q r) -> Q [r]+withMichelinePrimitiveCons subs = do+ TyConI (DataD _ _ _ _ cons _) <- reify ''MichelinePrimitive+ forM cons \case+ NormalC nm _ -> subs nm $ mkName $ "C_" <> nameBase nm+ c -> error $ "unsupported " <> show (ppr c)++-- | Construct 'MichelinePrimitive' from its constructor name. NB: partial function!+primFromName :: Name -> MichelinePrimitive+primFromName inputName = $(do+ TyConI (DataD _ _ _ _ cons _) <- reify ''MichelinePrimitive+ caseE [|nameBase inputName|] $ cons <&> \case+ NormalC nm _ -> match (litP $ StringL $ nameBase nm) (normalB $ conE nm) []+ c -> error $ "unsupported " <> show (ppr c)+ )
src/Morley/Michelson/Analyzer.hs view
@@ -11,8 +11,7 @@ import Data.Default (def) import Data.HashMap.Strict qualified as HM import Data.List.NonEmpty qualified as NE-import Fmt (Buildable(..), Builder, blockMapF', hexF, nameF, (+|))-import Unsafe qualified (fromIntegral)+import Fmt (Buildable(..), Doc, blockMapF', hexF, nameF, (+|)) import Morley.Michelson.FailPattern import Morley.Michelson.Text (MText)@@ -66,7 +65,7 @@ longest :: Container x =>- Builder -> [(x, Word)] -> ([(x, Word)] -> Builder) -> Builder+ Doc -> [(x, Word)] -> ([(x, Word)] -> Doc) -> Doc longest name items builder | length items > 6 = nameF ("Longest " <> name) $ builder $ take 4 $ sortByLength items@@ -100,7 +99,7 @@ countItems :: (Ord i, Hashable i) => [i] -> HashMap i Word countItems = HM.fromList . map f . NE.group . sort where- f ne = (head ne, Unsafe.fromIntegral @Int @Word $ length ne)+ f ne = (head ne, length @Word ne) analyzeConstants :: forall i o. Instr i o -> AnalyzerRes analyzeConstants = \case
src/Morley/Michelson/Doc.hs view
@@ -68,7 +68,7 @@ import Data.Text.Lazy qualified as LT import Data.Typeable (cast, typeRep) import Development.GitRev (gitCommitDate, gitHash)-import Fmt (Buildable, build, fmt, (+|), (|+))+import Fmt (Buildable, build, fmt, isEmpty, (+|), (|+)) import Language.Haskell.TH qualified as TH import Language.Haskell.TH.Syntax qualified as TH import System.Environment (lookupEnv)@@ -804,7 +804,7 @@ attachToc :: ContainsUpdateableDoc a => DToc -> a -> WithFinalizedDoc a attachToc toc = finalizedAsIs ... modifyDoc $ \case- DToc "" -> Just toc+ DToc d | isEmpty d -> Just toc _ -> Nothing -- | Attach common information that is available only in the end.
src/Morley/Michelson/ErrorPos.hs view
@@ -14,9 +14,7 @@ import Data.Aeson.TH (deriveJSON) import Data.Data (Data(..)) import Data.Default (Default(..))-import Fmt (Buildable(..))-import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDocExtended, renderAnyBuildable)-import Text.PrettyPrint.Leijen.Text ((<+>))+import Fmt (Buildable(..), (<+>)) import Morley.Util.Aeson @@ -50,13 +48,9 @@ deriving newtype (Default) deriving anyclass (NFData) -instance RenderDoc ErrorSrcPos where- renderDoc _ ErrorSrcPos{unErrorSrcPos = SrcPos (Pos row) (Pos col)} =- "Error occurred on line" <+> (renderAnyBuildable (row + 1)) <+> "char" <+> (renderAnyBuildable (col + 1))- <> "."- instance Buildable ErrorSrcPos where- build = buildRenderDocExtended+ build ErrorSrcPos{unErrorSrcPos = SrcPos (Pos row) (Pos col)} =+ "Error occurred on line" <+> build (row + 1) <+> "char" <+> build (col + 1) <> "." instance Default Pos where def = Pos 0
src/Morley/Michelson/Internal/ViewName.hs view
@@ -14,8 +14,8 @@ import Data.Aeson.Types qualified as AesonTypes import Data.Data (Data) import Data.Text qualified as Text-import Fmt (Buildable(..), pretty, (+|), (|+))-import Text.PrettyPrint.Leijen.Text (Doc, dquotes, textStrict)+import Fmt (Buildable(..), Doc, pretty, (+|), (|+))+import Prettyprinter (dquotes) import Morley.Michelson.Printer.Util import Morley.Michelson.Text@@ -84,7 +84,7 @@ return (UnsafeViewName txt) renderViewName :: ViewName -> Doc-renderViewName = dquotes . textStrict . unViewName+renderViewName = dquotes . build . unViewName instance RenderDoc ViewName where renderDoc _ = renderViewName
src/Morley/Michelson/Interpret.hs view
@@ -29,8 +29,12 @@ , ContractResult , extractValOps , EvalM+ , EvalM' , InterpreterStateMonad (..)- , StkEl (..)+ , StkEl (.., StkEl)+ , NoStkElMeta(..)+ , seValueL+ , seMetaL , InstrRunner , runInstr , runInstrNoGas@@ -48,8 +52,16 @@ , runEvalOp , runInstrImpl , assignBigMapIds+ , mapToStkEl+ , mapToValue+ , mkStkEl+ , mkDuplicateStkEl+ , runEvalOpT+ , interpret' , interpretView'- , EvalOp (..)+ , StkElMeta(..)+ , EvalOpT (..)+ , EvalOp -- * Prisms , _MorleyLogs@@ -57,21 +69,23 @@ import Prelude hiding (EQ, GT, LT) -import Control.Lens (makeLensesFor, makePrisms, traverseOf, (<<+=))+import Control.Lens (makeLensesFor, makePrisms, (<<+=)) import Control.Monad.Except (MonadError, liftEither, throwError)-import Control.Monad.RWS.Strict (RWS, RWST, runRWS)+import Control.Monad.RWS.Strict (RWST, runRWST) import Control.Monad.Writer (MonadWriter, WriterT, tell) import Data.Default (Default(..))+import Data.GADT.Compare (GEq(..)) import Data.Map qualified as Map import Data.Set qualified as Set import Data.Singletons (demote) import Data.Singletons.Decide (decideEquality) import Data.Vinyl (Rec(..), (<+>))-import Data.Vinyl.Recursive (rmap)-import Fmt (Buildable(build), blockListF, pretty, prettyLn, (+|), (|+))+import Data.Vinyl.Recursive (rmap, rtraverse)+import Fmt+ (Buildable(build), blockListF, nameF, pretty, quoteOrIndentF, (++|), (+|), (|+), (|++), (|++^)) import Unsafe qualified (fromIntegral) -import Morley.Michelson.ErrorPos (ErrorSrcPos(..))+import Morley.Michelson.ErrorPos import Morley.Michelson.Interpret.Pack (packValue') import Morley.Michelson.Interpret.Unpack (UnpackError, unpackValue') import Morley.Michelson.Runtime.GState@@ -88,12 +102,19 @@ (KeyHash, OpeningResult(..), blake2b, checkSignature, hashKey, keccak, mkTLTime, openChest, sha256, sha3, sha512) import Morley.Tezos.Crypto.BLS12381 (checkPairing)+import Morley.Util.Lens import Morley.Util.MismatchError import Morley.Util.Peano (LongerThan, Peano) import Morley.Util.PeanoNatural (PeanoNatural(..)) import Morley.Util.Sing (eqParamSing) import Morley.Util.Typeable +{- $setup+>>> import Morley.Michelson.ErrorPos+>>> import Morley.Michelson.Typed+>>> import Fmt (pretty)+-}+ -- | Morley logs appearing as interpreter result. newtype MorleyLogs = MorleyLogs { unMorleyLogs :: [Text] } deriving stock (Show, Eq, Generic)@@ -136,15 +157,85 @@ makePrisms ''MorleyLogs -newtype StkEl t = StkEl- { seValue :: Value t+-- | Represents a value on the stack. Aside from the value itself, it contains+-- arbitrary user-defined metadata. The metadata in question is defined by+-- 'StkElMeta' type class, the interpreter doesn't know anything about it.+--+-- The metadata should not be copied between different stack elements, the only+-- case where it can be copied is when the stack element is copied in its+-- entirety, i.e. when running instructions like @DUP@.+--+-- To create a new t'StkEl' from a value, 'mkStkEl' should always be used. For+-- duplicated stack elements, 'mkDuplicateStkEl' should be used instead, to+-- still give the user an option to override metadata for the duplicated+-- element.+--+-- The data constructor should almost never be used by itself.+data StkEl meta t = MkStkEl+ { seMeta :: meta t+ , seValue :: Value t } deriving stock (Eq, Show) -makeLensesFor- [ ("seValue", "seValueL")- ]- ''StkEl+makeLensesWith postfixLFields ''StkEl +instance (forall t. Eq (meta t)) => GEq (StkEl meta) where+ geq se1 se2+ | Just Refl <- geq (seValue se1) (seValue se2)+ , seMeta se1 == seMeta se2+ = Just Refl+ | otherwise = Nothing++-- | Arbitrary stack element metadata that can be constructed in a particular+-- monad. Interpreter doesn't know anything about metadata, and doesn't try to+-- do anything with it. 'mkStkElMeta' describes how to construct metadata for+-- new stack elements based on its value. When a stack element is duplicated,+-- specifically with instructions like @DUP@, old metadata is passed to+-- 'mkStkElMeta' to provide an opportunity to modify it. Implementation is free+-- to either copy it verbatim or ignore the old and generate new.+--+-- See t'StkEl' documentation for an overview of the motivation and design.+type StkElMeta :: (T -> Type) -> (Type -> Type) -> Constraint+class (forall t. Eq (meta t), forall t. Show (meta t)) => StkElMeta meta m where+ -- | How to construct new metadata.+ mkStkElMeta+ :: Maybe (meta t)+ -- ^ For instructions duplicating the value, this @Just meta@ from the+ -- original instruction, @Nothing@ otherwise+ -> Value t+ -- ^ The value for the new stack element.+ -> m (meta t)++-- | Default metadata that does nothing.+data NoStkElMeta t = NoStkElMeta+ deriving stock (Eq, Show)++instance Applicative m => StkElMeta NoStkElMeta m where+ mkStkElMeta _ _ = pure NoStkElMeta++-- | Make an entirely new t'StkEl' from a value.+mkStkEl :: forall meta t m. (Applicative m, StkElMeta meta m) => Value t -> m (StkEl meta t)+mkStkEl val = flip MkStkEl val <$> mkStkElMeta Nothing val++-- | Make a duplicate t'StkEl', constructing metadata via 'mkStkElMeta'.+mkDuplicateStkEl+ :: forall meta t m. (Applicative m, StkElMeta meta m)+ => StkEl meta t -> m (StkEl meta t)+mkDuplicateStkEl MkStkEl{..} = flip MkStkEl seValue <$> mkStkElMeta (Just seMeta) seValue++pattern StkEl :: Value t -> StkEl meta t+pattern StkEl x <- MkStkEl _ x+{-# COMPLETE StkEl #-}++-- | Helper function to convert a record of @Value@ to @StkEl@.+mapToStkEl+ :: forall meta inp m. (Applicative m, StkElMeta meta m)+ => Rec Value inp -> m (Rec (StkEl meta) inp)+mapToStkEl = rtraverse $ mkStkEl++-- | Helper function to convert a record of @StkEl@ to @Value@.+mapToValue :: Rec (StkEl meta) inp -> Rec Value inp+mapToValue = rmap seValue+ type ContractEnv :: Type type ContractEnv = ContractEnv' EvalOp @@ -223,7 +314,7 @@ build = \case MichelsonFailedWith v ->- "Reached FAILWITH instruction with " +| v |+ ""+ "Reached FAILWITH instruction with" ++| quoteOrIndentF v |++^ "" MichelsonArithError v -> build v MichelsonGasExhaustion -> "Gas limit exceeded on contract execution"@@ -238,8 +329,33 @@ , mfwsErrorSrcPos :: ErrorSrcPos } deriving stock (Show, Generic, Eq) +{- | Pretty-printer for 'MichelsonFailureWithStack'.++>>> let pos = ErrorSrcPos $ SrcPos (Pos 123) (Pos 456)+>>> let largeValue = VList $ replicate 10 VUnit++>>> pretty $ MichelsonFailureWithStack @Void MichelsonGasExhaustion pos+Gas limit exceeded on contract execution at line 124 char 457.++>>> pretty $ MichelsonFailureWithStack @Void (MichelsonFailedWith VUnit) pos+Reached FAILWITH instruction with 'Unit' at line 124 char 457.++>>> pretty $ MichelsonFailureWithStack @Void (MichelsonFailedWith largeValue) pos+Reached FAILWITH instruction with+ { Unit; Unit; Unit; Unit; Unit; Unit; Unit; Unit; Unit; Unit }+at line 124 char 457.++>>> pretty $ MichelsonFailureWithStack @Void (MichelsonFailedWith $ VPair (largeValue, largeValue)) pos+Reached FAILWITH instruction with+ Pair+ { Unit; Unit; Unit; Unit; Unit; Unit; Unit; Unit; Unit; Unit }+ { Unit; Unit; Unit; Unit; Unit; Unit; Unit; Unit; Unit; Unit }+at line 124 char 457.+-} instance Buildable ext => Buildable (MichelsonFailureWithStack ext) where- build (MichelsonFailureWithStack err loc) = build err <> " at " <> build loc+ build (MichelsonFailureWithStack err loc)+ | SrcPos (Pos row) (Pos col) <- unErrorSrcPos loc+ = "" ++| err |++ "at line" ++| build (row + 1) |++ "char" ++| build (col + 1) <> "." |++ "" data InterpretError ext = InterpretError { ieLogs :: MorleyLogs@@ -249,7 +365,7 @@ deriving stock instance Show ext => Show (InterpretError ext) instance Buildable ext => Buildable (InterpretError ext) where- build InterpretError{..} = prettyLn ieFailure+ build InterpretError{..} = pretty ieFailure data ResultStateLogs res = ResultStateLogs { rslResult :: res@@ -283,7 +399,7 @@ handleReturn rsl@ResultStateLogs{..} = first (InterpretError rslLogs) . sequence $ rsl -- | Reset 'ceMetaWrapper` after it is used with an instr.-withMetaWrapper :: forall ext m. EvalM' ext m => InstrRunner m -> InstrRunner m+withMetaWrapper :: forall ext meta m. EvalM' ext m => InstrRunner meta m -> InstrRunner meta m withMetaWrapper runner instr s = do ContractEnv{ceMetaWrapper} <- ask local (\env -> env {ceMetaWrapper = id}) $@@ -293,38 +409,28 @@ extractValOps :: Value (ContractOut1 st) -> ([Operation], Value st) extractValOps (VPair x) = first fromVal x --- | Helper function to convert a record of @Value@ to @StkEl@. These will be--- created with @starNotes@.-mapToStkEl :: Rec Value inp -> Rec StkEl inp-mapToStkEl = rmap StkEl---- | Helper function to convert a record of @StkEl@ to @Value@. Any present--- notes will be discarded.-mapToValue :: Rec StkEl inp -> Rec Value inp-mapToValue = rmap seValue- interpret'- :: forall cp st arg.- Contract cp st+ :: forall cp st arg m. (Monad m)+ => Contract cp st -> EntrypointCallT cp arg -> Value arg -> Value st- -> ContractEnv+ -> ContractEnv' (EvalOpT m) -> InterpreterState- -> ContractReturn st-interpret' Contract{..} epc param initSt env ist = (fmap . fmap) (\(StkEl val :& RNil) -> val) $- runEvalOp- (runInstr (unContractCode cCode) $ mkInitStack (liftCallArg epc param) initSt)+ -> m (ContractReturn st)+interpret' Contract{..} epc param initSt env ist = (fmap . fmap) (\(StkEl val :& RNil) -> val) <$>+ runEvalOpT+ (runInstr (unContractCode cCode) =<< mapToStkEl @NoStkElMeta initStack) env ist+ where+ initStack = mkInitStack (liftCallArg epc param) initSt mkInitStack :: Value param -> Value st- -> Rec StkEl (ContractInp param st)-mkInitStack param st = StkEl- (VPair (param, st))- :& RNil+ -> Rec Value (ContractInp param st)+mkInitStack param st = VPair (param, st) :& RNil interpret :: Contract cp st@@ -335,7 +441,7 @@ -> BigMapCounter -> ContractEnv -> ContractReturn st-interpret contract epc param initSt globalCounter bmCounter env =+interpret contract epc param initSt globalCounter bmCounter env = runIdentity $ interpret' contract epc param initSt env (initInterpreterState globalCounter bmCounter env) initInterpreterState :: GlobalCounter -> BigMapCounter -> ContractEnv -> InterpreterState@@ -361,11 +467,11 @@ :: ContractEnv -> Instr inp out -> Rec Value inp- -> Either (MichelsonFailureWithStack Void) (Rec StkEl out)+ -> Either (MichelsonFailureWithStack Void) (Rec (StkEl NoStkElMeta) out) interpretInstrAnnotated env instr inpSt = rslResult $ runEvalOp- (runInstr instr $ mapToStkEl inpSt)+ (runInstr instr =<< mapToStkEl @NoStkElMeta inpSt) env InterpreterState { isRemainingSteps = 9999999999@@ -373,35 +479,52 @@ , isGlobalCounter = 0 } -data SomeItStack where- SomeItStack :: ExtInstr inp -> Rec StkEl inp -> SomeItStack+data SomeItStack meta where+ SomeItStack :: ExtInstr inp -> Rec (StkEl meta) inp -> SomeItStack meta --- | The main interpreter monad. Downstream consumers which use 'runInstrImpl'--- directly may define their own monad similar to this one.+-- | The main interpreter monad, used by the higher-level functions like+-- 'interpret' and 'interpretView'. --+-- Downstream consumers which use 'runInstrImpl' directly may define their own+-- monad similar to this one, or alternatively use 'EvalOpT' with the slightly+-- lower-level functions, e.g. `interpret'` and `interpretView'`.+type EvalOp = EvalOpT Identity++-- | The main interpreter monad transformer. Provides a more convenient way of+-- enriching the interpreter monad without redefining it entirely.+-- -- This is a newtype and not a type synonym due to the reader environment, i.e.--- t'ContractEnv', being parameterized by this monad.-newtype EvalOp a = EvalOp- (ExceptT (MichelsonFailureWithStack Void) (RWS ContractEnv MorleyLogsBuilder InterpreterState) a)+-- t'ContractEnv', being parameterized by the interpreter monad.+newtype EvalOpT m a = EvalOpT+ (ExceptT (MichelsonFailureWithStack Void)+ (RWST (ContractEnv' (EvalOpT m)) MorleyLogsBuilder InterpreterState m) a) deriving newtype ( MonadError (MichelsonFailureWithStack Void) , MonadState InterpreterState , InterpreterStateMonad , MonadWriter MorleyLogsBuilder- , MonadReader ContractEnv+ , MonadReader (ContractEnv' (EvalOpT m)) , Monad , Applicative , Functor+ , MonadIO ) -runEvalOp- :: EvalOp a- -> ContractEnv+instance MonadTrans EvalOpT where+ lift = EvalOpT . lift . lift++runEvalOp :: EvalOp a -> ContractEnv -> InterpreterState -> RunEvalOpReturn a+runEvalOp = runIdentity ... runEvalOpT++runEvalOpT+ :: Monad m+ => EvalOpT m a+ -> ContractEnv' (EvalOpT m) -> InterpreterState- -> RunEvalOpReturn a-runEvalOp (EvalOp act) env initSt =- let (rslResult, rslState, buildMorleyLogs -> rslLogs) = runRWS (runExceptT act) env initSt- in ResultStateLogs{..}+ -> m (RunEvalOpReturn a)+runEvalOpT (EvalOpT act) env initSt = do+ (rslResult, rslState, buildMorleyLogs -> rslLogs) <- runRWST (runExceptT act) env initSt+ pure ResultStateLogs{..} class Monad m => InterpreterStateMonad m where getInterpreterState :: m InterpreterState@@ -445,17 +568,17 @@ type EvalM m = EvalM' Void m -type InstrRunner m =+type InstrRunner meta m = forall inp out. Instr inp out- -> Rec StkEl inp- -> m (Rec StkEl out)+ -> Rec (StkEl meta) inp+ -> m (Rec (StkEl meta) out) throwMichelson :: EvalM' ext m => MichelsonFailed ext -> m a throwMichelson mf = asks ceErrorSrcPos >>= throwError . MichelsonFailureWithStack mf -- | Function to change amount of remaining steps stored in State monad.-runInstr :: EvalM' ext m => InstrRunner m+runInstr :: forall ext meta m. (StkElMeta meta m, EvalM' ext m) => InstrRunner meta m runInstr i@(Seq _i1 _i2) r = runInstrImpl runInstr i r runInstr i@(WithLoc _ _) r = runInstrImpl runInstr i r runInstr i@(Meta _ _i1) r = runInstrImpl runInstr i r@@ -470,14 +593,20 @@ modifyInterpreterState (\s -> s {isRemainingSteps = rs - 1}) runInstrImpl runInstr i r -runInstrNoGas :: EvalM m => InstrRunner m+runInstrNoGas :: EvalM m => InstrRunner NoStkElMeta m runInstrNoGas = runInstrImpl runInstrNoGas +(<:&>) :: Functor f => f (a r) -> Rec a rs -> f (Rec a (r : rs))+m <:&> r = fmap (:& r) m+infixr 7 <:&>+ -- | Function to interpret Michelson instruction(s) against given stack. -- The @ext@ type variable specifies additional exceptions that can be thrown from the inner -- runner function (via 'MichelsonExt'). In Morley, it's set to 'Void', but downstream consumers -- may use other type here.-runInstrImpl :: forall ext m. EvalM' ext m => InstrRunner m -> InstrRunner m+runInstrImpl+ :: forall ext meta m. (EvalM' ext m, StkElMeta meta m)+ => InstrRunner meta m -> InstrRunner meta m runInstrImpl runner (Seq i1 i2) r = runner i1 r >>= \r' -> runner i2 r' runInstrImpl runner (WithLoc ics i) r = do -- Add wrapper which will be used later on in loop-like instr.@@ -508,15 +637,15 @@ -- by a natural number like 'DIPN'. runInstrImpl _ AnnDUP{} (stkEl :& r) = do -- If we're duplicating a big_map, or a value containing big_map(s), we need to generate new big_map ID(s).- duplicateStkEl <- traverseOf seValueL assignBigMapIds' stkEl+ duplicateStkEl <- seValueL assignBigMapIds' =<< mkDuplicateStkEl stkEl pure $ duplicateStkEl :& stkEl :& r runInstrImpl _ (AnnDUPN _ s) stack = go s stack where go :: forall (n :: Peano) inp out a. ConstraintDUPN n inp out a- => PeanoNatural n -> Rec StkEl inp -> m (Rec StkEl out)+ => PeanoNatural n -> Rec (StkEl meta) inp -> m (Rec (StkEl meta) out) go (Succ Zero) stk@(stkEl :& _) = do -- If we're duplicating a big_map, or a value containing big_map(s), we need to generate new big_map ID(s).- duplicateStkEl <- traverseOf seValueL assignBigMapIds' stkEl+ duplicateStkEl <- seValueL assignBigMapIds' =<< mkDuplicateStkEl stkEl pure $ duplicateStkEl :& stk go (Succ n@(Succ _)) (b :& r) = go n r <&> \case@@ -526,7 +655,7 @@ pure $ go s input0 where go :: forall (n :: Peano) inp out a. ConstraintDIG n inp out a- => PeanoNatural n -> Rec StkEl inp -> Rec StkEl out+ => PeanoNatural n -> Rec (StkEl meta) inp -> Rec (StkEl meta) out go Zero stack = stack go (Succ n') (b :& r) = case go n' r of@@ -535,94 +664,102 @@ pure $ go s input0 where go :: forall (n :: Peano) inp out a. ConstraintDUG n inp out a- => PeanoNatural n -> Rec StkEl inp -> Rec StkEl out+ => PeanoNatural n -> Rec (StkEl meta) inp -> Rec (StkEl meta) out go Zero stack = stack go (Succ n') (a :& b :& r) = b :& go n' (a :& r) runInstrImpl _ AnnSOME{} ((seValue -> a) :& r) = withValueTypeSanity a $- pure $ StkEl (VOption (Just a)) :& r-runInstrImpl _ (AnnPUSH _ v) r = pure $ StkEl v :& r-runInstrImpl _ AnnNONE{} r = pure $ StkEl (VOption Nothing) :& r-runInstrImpl _ AnnUNIT{} r = pure $ StkEl VUnit :& r+ mkStkEl (VOption (Just a)) <:&> r+runInstrImpl _ (AnnPUSH _ v) r = mkStkEl v <:&> r+runInstrImpl _ AnnNONE{} r = mkStkEl (VOption Nothing) <:&> r+runInstrImpl _ AnnUNIT{} r = mkStkEl VUnit <:&> r runInstrImpl runner (IF_NONE _bNone bJust) (StkEl (VOption (Just a)) :& r) =- runner bJust (StkEl a :& r)+ runner bJust =<< mkStkEl a <:&> r runInstrImpl runner (IF_NONE bNone _bJust) (StkEl (VOption Nothing) :& r) = runner bNone r runInstrImpl _ NEVER inp = case inp of {} runInstrImpl _ (AnnPAIR{}) ((StkEl a) :& (StkEl b) :& r) =- pure $ StkEl (VPair (a, b)) :& r-runInstrImpl _ (AnnUNPAIR{}) ((StkEl (VPair (a, b))) :& r) =- pure $ StkEl a :& StkEl b :& r-runInstrImpl _ (AnnPAIRN _ s) stack = pure $ go s stack+ mkStkEl (VPair (a, b)) <:&> r+runInstrImpl _ (AnnUNPAIR{}) ((StkEl (VPair (a, b))) :& r) = do+ el1 <- mkStkEl a+ el2 <- mkStkEl b+ pure $ el1 :& el2 :& r+runInstrImpl _ (AnnPAIRN _ s) stack = go s stack where- go :: forall n inp. ConstraintPairN n inp => PeanoNatural n -> Rec StkEl inp -> Rec StkEl (PairN n inp)+ go :: forall n inp. ConstraintPairN n inp+ => PeanoNatural n+ -> Rec (StkEl meta) inp+ -> m (Rec (StkEl meta) (PairN n inp)) go (Succ (Succ Zero)) (StkEl a :& StkEl b :& r) = -- if n=2- StkEl (VPair (a, b)) :& r+ mkStkEl (VPair (a, b)) <:&> r go (Succ n@(Succ (Succ _))) (StkEl a :& r@(_ :& _ :& _)) = -- if n>2- case go n r of+ go n r >>= \case StkEl combed :& r' ->- StkEl (VPair (a, combed)) :& r'+ mkStkEl (VPair (a, combed)) <:&> r' runInstrImpl _ (UNPAIRN s) (StkEl pair0 :& r) = do- pure $ go s pair0 <+> r+ r' <- go s pair0+ pure $ r' <+> r where go :: forall n pair. ConstraintUnpairN n pair => PeanoNatural n -> Value pair- -> Rec StkEl (UnpairN n pair)+ -> m (Rec (StkEl meta) (UnpairN n pair)) go n pair = case (n, pair) of -- if n=2- (Succ (Succ Zero), VPair (a, b)) ->- StkEl a- :& StkEl b- :& RNil+ (Succ (Succ Zero), VPair (a, b)) -> do+ el1 <- mkStkEl a+ el2 <- mkStkEl b+ pure $ el1 :& el2 :& RNil -- if n>2 (Succ n'@(Succ (Succ _)), VPair (a, b@(VPair _))) ->- StkEl a- :& go n' b-runInstrImpl _ AnnCAR{} (StkEl (VPair (a, _b)) :& r) = pure $ StkEl a :& r-runInstrImpl _ AnnCDR{} (StkEl (VPair (_a, b)) :& r) = pure $ StkEl b :& r+ liftA2 (:&) (mkStkEl a) (go n' b)+runInstrImpl _ AnnCAR{} (StkEl (VPair (a, _b)) :& r) = mkStkEl a <:&> r+runInstrImpl _ AnnCDR{} (StkEl (VPair (_a, b)) :& r) = mkStkEl b <:&> r runInstrImpl _ AnnLEFT{} ((StkEl a) :& r) = withValueTypeSanity a $- pure $ StkEl (VOr $ Left a) :& r+ mkStkEl (VOr $ Left a) <:&> r runInstrImpl _ AnnRIGHT{} ((StkEl b) :& r) = withValueTypeSanity b $- pure $ StkEl (VOr $ Right b) :& r+ mkStkEl (VOr $ Right b) <:&> r runInstrImpl runner (IF_LEFT bLeft _) (StkEl (VOr (Left a)) :& r) =- runner bLeft (StkEl a :& r)+ runner bLeft =<< mkStkEl a <:&> r runInstrImpl runner (IF_LEFT _ bRight) (StkEl (VOr (Right a)) :& r) =- runner bRight (StkEl a :& r)-runInstrImpl _ AnnNIL{} r = pure $ StkEl (VList []) :& r-runInstrImpl _ AnnCONS{} (a :& StkEl (VList l) :& r) = pure $ StkEl (VList (seValue a : l)) :& r+ runner bRight =<< mkStkEl a <:&> r+runInstrImpl _ AnnNIL{} r = mkStkEl (VList []) <:&> r+runInstrImpl _ AnnCONS{} (a :& StkEl (VList l) :& r) = mkStkEl (VList (seValue a : l)) <:&> r runInstrImpl runner (IF_CONS _ bNil) (StkEl (VList []) :& r) = runner bNil r-runInstrImpl runner (IF_CONS bCons _) (StkEl (VList (lh : lr)) :& r) =- runner bCons (StkEl lh :& StkEl (VList lr) :& r)-runInstrImpl _ AnnSIZE{} (a :& r) = pure $ StkEl (VNat $ Unsafe.fromIntegral @Int @Natural $ evalSize $ seValue a) :& r-runInstrImpl _ AnnEMPTY_SET{} r = pure $ StkEl (VSet Set.empty) :& r-runInstrImpl _ AnnEMPTY_MAP{} r = pure $ StkEl (VMap Map.empty) :& r+runInstrImpl runner (IF_CONS bCons _) (StkEl (VList (lh : lr)) :& r) = do+ el1 <- mkStkEl lh+ el2 <- mkStkEl (VList lr)+ runner bCons $ el1 :& el2 :& r+runInstrImpl _ AnnSIZE{} (a :& r) =+ mkStkEl (VNat $ Unsafe.fromIntegral @Int @Natural $ evalSize $ seValue a) <:&> r+runInstrImpl _ AnnEMPTY_SET{} r = mkStkEl (VSet Set.empty) <:&> r+runInstrImpl _ AnnEMPTY_MAP{} r = mkStkEl (VMap Map.empty) <:&> r runInstrImpl _ AnnEMPTY_BIG_MAP{} r = do bigMap <- assignBigMapIds' $ VBigMap Nothing Map.empty- pure $ StkEl bigMap :& r+ mkStkEl bigMap <:&> r runInstrImpl runner (AnnMAP _ (code :: Instr (MapOpInp c ': s) (b ': s))) (StkEl a :& r) = do -- Evaluation must preserve all stack modifications that @MAP@'s does.- (newStack, newList) <- foldlM (\(curStack, curList) (val :: StkEl (MapOpInp c)) -> do+ (newStack, newList) <- foldlM (\(curStack, curList) (val :: StkEl meta (MapOpInp c)) -> do res <- runner code (val :& curStack) case res of ((seValue -> nextVal :: Value b) :& nextStack) -> pure (nextStack, nextVal : curList))- (r, []) ((\el -> StkEl el) <$> mapOpToList @c a)- pure $ StkEl (mapOpFromList a (reverse newList)) :& newStack+ (r, []) =<< traverse mkStkEl (mapOpToList @c a)+ mkStkEl (mapOpFromList a (reverse newList)) <:&> newStack runInstrImpl runner (ITER (code :: Instr (IterOpEl c ': s) s)) (StkEl a :& r) = case iterOpDetachOne @c a of (Just x, xs) -> do- res <- runner code (StkEl x :& r)- withMetaWrapper runner (ITER code) (StkEl xs :& res)+ res <- runner code =<< mkStkEl x <:&> r+ withMetaWrapper runner (ITER code) =<< mkStkEl xs <:&> res (Nothing, _) -> pure r-runInstrImpl _ AnnMEM{} (a :& b :& r) = pure $ StkEl (VBool (evalMem (seValue a) (seValue b))) :& r-runInstrImpl _ AnnGET{} (a :& b :& r) = pure $ StkEl (VOption (evalGet (seValue a) (seValue b))) :& r+runInstrImpl _ AnnMEM{} (a :& b :& r) = mkStkEl (VBool (evalMem (seValue a) (seValue b))) <:&> r+runInstrImpl _ AnnGET{} (a :& b :& r) = mkStkEl (VOption (evalGet (seValue a) (seValue b))) <:&> r runInstrImpl _ (AnnGETN _ s) (StkEl pair :& r) = do- pure $ StkEl (go s pair) :& r+ mkStkEl (go s pair) <:&> r where go :: forall ix a. ConstraintGetN ix a@@ -632,9 +769,9 @@ go (Succ Zero) (VPair (left, _)) = left go (Succ (Succ n')) (VPair (_, right)) = go n' right runInstrImpl _ AnnUPDATE{} (a :& b :& StkEl c :& r) =- pure $ StkEl (evalUpd (seValue a) (seValue b) c) :& r+ mkStkEl (evalUpd (seValue a) (seValue b) c) <:&> r runInstrImpl _ (AnnUPDATEN _ s) (StkEl (val :: Value val) :& StkEl pair :& r) = do- pure $ StkEl (go s pair) :& r+ mkStkEl (go s pair) <:&> r where go :: forall ix pair. ConstraintUpdateN ix pair@@ -642,23 +779,22 @@ go Zero _ = val go (Succ Zero) (VPair (_, right)) = VPair (val, right) go (Succ (Succ n')) (VPair (left, right)) = VPair (left, go n' right)-runInstrImpl _ AnnGET_AND_UPDATE{} (StkEl key :& StkEl valMb :& StkEl collection :& r) =- pure $- StkEl (VOption (evalGet key collection))- :& StkEl (evalUpd key valMb collection)- :& r+runInstrImpl _ AnnGET_AND_UPDATE{} (StkEl key :& StkEl valMb :& StkEl collection :& r) = do+ el1 <- mkStkEl (VOption (evalGet key collection))+ el2 <- mkStkEl (evalUpd key valMb collection)+ pure $ el1 :& el2 :& r runInstrImpl runner (IF bTrue _) (StkEl (VBool True) :& r) = runner bTrue r runInstrImpl runner (IF _ bFalse) (StkEl (VBool False) :& r) = runner bFalse r runInstrImpl _ (LOOP _) (StkEl (VBool False) :& r) = pure r runInstrImpl runner (LOOP ops) (StkEl (VBool True) :& r) = do res <- runner ops r withMetaWrapper runner (LOOP ops) res-runInstrImpl _ (LOOP_LEFT _) (StkEl (VOr (Right a)) :& r) = pure $ StkEl a :& r+runInstrImpl _ (LOOP_LEFT _) (StkEl (VOr (Right a)) :& r) = mkStkEl a <:&> r runInstrImpl runner (LOOP_LEFT ops) (StkEl (VOr (Left a)) :& r) = do- res <- runner ops (StkEl a :& r)+ res <- runner ops =<< mkStkEl a <:&> r withMetaWrapper runner (LOOP_LEFT ops) res-runInstrImpl _ (AnnLAMBDA _ lam) r = pure $ StkEl (mkVLam lam) :& r-runInstrImpl _ (AnnLAMBDA_REC _ lam) r = pure $ StkEl (mkVLamRec lam) :& r+runInstrImpl _ (AnnLAMBDA _ lam) r = mkStkEl (mkVLam lam) <:&> r+runInstrImpl _ (AnnLAMBDA_REC _ lam) r = mkStkEl (mkVLamRec lam) <:&> r runInstrImpl runner AnnEXEC{} (a :& self@(StkEl (VLam code)) :& r) = case code of LambdaCode (rfAnyInstr -> lBody) -> do@@ -671,10 +807,10 @@ | _ :: Instr (a : 'TLambda ('TPair a b) c : s) ('TLambda b c : s) <- i , _ :: LambdaCode' Instr ('TPair a b) c <- code = case code of- LambdaCode lBody -> pure $ StkEl (VLam $ LambdaCode (rfMapAnyInstr doApply lBody)) :& r+ LambdaCode lBody -> mkStkEl (VLam $ LambdaCode (rfMapAnyInstr doApply lBody)) <:&> r LambdaCodeRec lBody -> let res = RfNormal $ PUSH a `Seq` PAIR `Seq` LAMBDA_REC lBody `Seq` SWAP `Seq` EXEC- in pure $ StkEl (VLam $ LambdaCode res) :& r+ in mkStkEl (VLam $ LambdaCode res) <:&> r where doApply :: Instr ('TPair a i ': s) o -> Instr (i ': s) o doApply b = PUSH a `Seq` PAIR `Seq` Nested b@@ -689,53 +825,53 @@ runInstrImpl _ FAILWITH (a :& _) = throwMichelson $ MichelsonFailedWith (seValue a) runInstrImpl _ AnnCAST{} s = pure s runInstrImpl _ AnnRENAME{} s = pure s-runInstrImpl _ AnnPACK{} ((seValue -> a) :& r) = pure $ StkEl (VBytes $ packValue' a) :& r+runInstrImpl _ AnnPACK{} ((seValue -> a) :& r) = mkStkEl (VBytes $ packValue' a) <:&> r runInstrImpl _ AnnUNPACK{} (StkEl (VBytes a) :& r) =- pure $ StkEl (VOption . rightToMaybe $ runUnpack a) :& r-runInstrImpl _ AnnCONCAT{} (a :& b :& r) = pure $ StkEl (evalConcat (seValue a) (seValue b)) :& r-runInstrImpl _ AnnCONCAT'{} (StkEl (VList a) :& r) = pure $ StkEl (evalConcat' a) :& r+ mkStkEl (VOption . rightToMaybe $ runUnpack a) <:&> r+runInstrImpl _ AnnCONCAT{} (a :& b :& r) = mkStkEl (evalConcat (seValue a) (seValue b)) <:&> r+runInstrImpl _ AnnCONCAT'{} (StkEl (VList a) :& r) = mkStkEl (evalConcat' a) <:&> r runInstrImpl _ AnnSLICE{} (StkEl (VNat o) :& StkEl (VNat l) :& StkEl s :& r) =- pure $ StkEl (VOption (evalSlice o l s)) :& r+ mkStkEl (VOption (evalSlice o l s)) <:&> r runInstrImpl _ AnnISNAT{} (StkEl (VInt i) :& r) = if i < 0- then pure $ StkEl (VOption Nothing) :& r- else pure $ StkEl (VOption (Just (VNat $ fromInteger i))) :& r-runInstrImpl _ AnnADD{} (l :& r :& rest) = (:& rest) <$> runArithOp (Proxy @Add) l r-runInstrImpl _ AnnSUB{} (l :& r :& rest) = (:& rest) <$> runArithOp (Proxy @Sub) l r-runInstrImpl _ AnnSUB_MUTEZ{} (l :& r :& rest) = (:& rest) <$> runArithOp (Proxy @SubMutez) l r-runInstrImpl _ AnnMUL{} (l :& r :& rest) = (:& rest) <$> runArithOp (Proxy @Mul) l r-runInstrImpl _ AnnEDIV{} (l :& r :& rest) = (:& rest) <$> runArithOp (Proxy @EDiv) l r+ then mkStkEl (VOption Nothing) <:&> r+ else mkStkEl (VOption (Just (VNat $ fromInteger i))) <:&> r+runInstrImpl _ AnnADD{} (l :& r :& rest) = runArithOp (Proxy @Add) l r <:&> rest+runInstrImpl _ AnnSUB{} (l :& r :& rest) = runArithOp (Proxy @Sub) l r <:&> rest+runInstrImpl _ AnnSUB_MUTEZ{} (l :& r :& rest) = runArithOp (Proxy @SubMutez) l r <:&> rest+runInstrImpl _ AnnMUL{} (l :& r :& rest) = runArithOp (Proxy @Mul) l r <:&> rest+runInstrImpl _ AnnEDIV{} (l :& r :& rest) = runArithOp (Proxy @EDiv) l r <:&> rest runInstrImpl _ AnnABS{} ((seValue -> a) :& rest) =- pure $ StkEl (evalUnaryArithOp (Proxy @Abs) a) :& rest+ mkStkEl (evalUnaryArithOp (Proxy @Abs) a) <:&> rest runInstrImpl _ AnnNEG{} ((seValue -> a) :& rest) =- pure $ StkEl (evalUnaryArithOp (Proxy @Neg) a) :& rest-runInstrImpl _ AnnLSL{} (x :& s :& rest) = (:& rest) <$> runArithOp (Proxy @Lsl) x s-runInstrImpl _ AnnLSR{} (x :& s :& rest) = (:& rest) <$> runArithOp (Proxy @Lsr) x s-runInstrImpl _ AnnOR{} (l :& r :& rest) = (:& rest) <$> runArithOp (Proxy @Or) l r-runInstrImpl _ AnnAND{} (l :& r :& rest) = (:& rest) <$> runArithOp (Proxy @And) l r-runInstrImpl _ AnnXOR{} (l :& r :& rest) = (:& rest) <$> runArithOp (Proxy @Xor) l r+ mkStkEl (evalUnaryArithOp (Proxy @Neg) a) <:&> rest+runInstrImpl _ AnnLSL{} (x :& s :& rest) = runArithOp (Proxy @Lsl) x s <:&> rest+runInstrImpl _ AnnLSR{} (x :& s :& rest) = runArithOp (Proxy @Lsr) x s <:&> rest+runInstrImpl _ AnnOR{} (l :& r :& rest) = runArithOp (Proxy @Or) l r <:&> rest+runInstrImpl _ AnnAND{} (l :& r :& rest) = runArithOp (Proxy @And) l r <:&> rest+runInstrImpl _ AnnXOR{} (l :& r :& rest) = runArithOp (Proxy @Xor) l r <:&> rest runInstrImpl _ AnnNOT{} ((seValue -> a) :& rest) =- pure $ StkEl (evalUnaryArithOp (Proxy @Not) a) :& rest+ mkStkEl (evalUnaryArithOp (Proxy @Not) a) <:&> rest runInstrImpl _ AnnCOMPARE{} ((seValue -> l) :& (seValue -> r) :& rest) =- pure $ StkEl (VInt (compareOp l r)) :& rest+ mkStkEl (VInt (compareOp l r)) <:&> rest runInstrImpl _ AnnEQ{} ((seValue -> a) :& rest) =- pure $ StkEl (evalUnaryArithOp (Proxy @Eq') a) :& rest+ mkStkEl (evalUnaryArithOp (Proxy @Eq') a) <:&> rest runInstrImpl _ AnnNEQ{} ((seValue -> a) :& rest) =- pure $ StkEl (evalUnaryArithOp (Proxy @Neq) a) :& rest+ mkStkEl (evalUnaryArithOp (Proxy @Neq) a) <:&> rest runInstrImpl _ AnnLT{} ((seValue -> a) :& rest) =- pure $ StkEl (evalUnaryArithOp (Proxy @Lt) a) :& rest+ mkStkEl (evalUnaryArithOp (Proxy @Lt) a) <:&> rest runInstrImpl _ AnnGT{} ((seValue -> a) :& rest) =- pure $ StkEl (evalUnaryArithOp (Proxy @Gt) a) :& rest+ mkStkEl (evalUnaryArithOp (Proxy @Gt) a) <:&> rest runInstrImpl _ AnnLE{} ((seValue -> a) :& rest) =- pure $ StkEl (evalUnaryArithOp (Proxy @Le) a) :& rest+ mkStkEl (evalUnaryArithOp (Proxy @Le) a) <:&> rest runInstrImpl _ AnnGE{} ((seValue -> a) :& rest) =- pure $ StkEl (evalUnaryArithOp (Proxy @Ge) a) :& rest+ mkStkEl (evalUnaryArithOp (Proxy @Ge) a) <:&> rest runInstrImpl _ AnnINT{} (StkEl a :& r) =- pure $ StkEl (evalToIntOp a) :& r+ mkStkEl (evalToIntOp a) <:&> r runInstrImpl _ AnnNAT{} (StkEl a :& r) =- pure $ StkEl (evalToNatOp a) :& r+ mkStkEl (evalToNatOp a) <:&> r runInstrImpl _ AnnBYTES{} (StkEl a :& r) =- pure $ StkEl (evalToBytesOp a) :& r+ mkStkEl (evalToBytesOp a) <:&> r runInstrImpl runner (AnnVIEW (Anns2' _ (_ :: Notes ret)) name) (StkEl (viewArg :: Value arg) :& StkEl (VAddress epAddr) :& r) = do res :: Value ('TOption ret) <- VOption <$> runMaybeT do@@ -754,13 +890,13 @@ , .. } lift $ interpretView' runner viewEnv view' viewedContractStorage viewArg- pure (StkEl res :& r)+ mkStkEl res <:&> r runInstrImpl _ (AnnSELF _ sepc :: Instr inp out) r = do ContractEnv{..} <- ask case Proxy @out of (_ :: Proxy ('TContract cp ': s)) -> do- pure $ StkEl (VContract (MkAddress ceSelf) sepc) :& r+ mkStkEl (VContract (MkAddress ceSelf) sepc) <:&> r runInstrImpl _ (AnnCONTRACT (Anns2' _ (_ :: Notes a)) instrEpName) (StkEl (VAddress epAddr) :& r) = do ContractEnv{..} <- ask EpAddress' (Constrained addr) addrEpName <- pure epAddr@@ -771,8 +907,8 @@ (en, DefEpName) -> Just en _ -> Nothing - let withNotes v = StkEl v :& r- withNotes . VOption <$> case mepName of+ let withNotes v = mkStkEl v <:&> r+ withNotes . VOption =<< case mepName of Nothing -> pure Nothing Just epName -> case addr of ImplicitAddress{} -> pure $ case sing @a of@@ -798,13 +934,13 @@ (StkEl p :& StkEl (VMutez mutez) :& StkEl contract :& r) = do incrementCounter globalCounter <- isGlobalCounter <$> getInterpreterState- pure $ StkEl (VOp (OpTransferTokens $ TransferTokens p mutez contract globalCounter)) :& r+ mkStkEl (VOp (OpTransferTokens $ TransferTokens p mutez contract globalCounter)) <:&> r runInstrImpl _ AnnSET_DELEGATE{} (StkEl (VOption mbKeyHash) :& r) = do incrementCounter globalCounter <- isGlobalCounter <$> getInterpreterState case mbKeyHash of- Just (VKeyHash k) -> pure $ StkEl (VOp (OpSetDelegate $ SetDelegate (Just k) globalCounter)) :& r- Nothing -> pure $ StkEl (VOp (OpSetDelegate $ SetDelegate Nothing globalCounter)) :& r+ Just (VKeyHash k) -> mkStkEl (VOp (OpSetDelegate $ SetDelegate (Just k) globalCounter)) <:&> r+ Nothing -> mkStkEl (VOp (OpSetDelegate $ SetDelegate Nothing globalCounter)) <:&> r runInstrImpl _ (AnnCREATE_CONTRACT _ contract) (StkEl (VOption mbKeyHash) :& StkEl (VMutez m) :& StkEl g :& r) = do originator <- ceSelf <$> ask@@ -826,89 +962,88 @@ let resEpAddr = EpAddress resAddr DefEpName let resOp = CreateContract (Constrained originator) (unwrapMbKeyHash mbKeyHash) m g contract globalCounter- pure $ StkEl (VOp (OpCreateContract resOp))- :& StkEl (VAddress resEpAddr)- :& r+ el1 <- mkStkEl (VOp (OpCreateContract resOp))+ el2 <- mkStkEl (VAddress resEpAddr)+ pure $ el1 :& el2 :& r runInstrImpl _ AnnIMPLICIT_ACCOUNT{} (StkEl (VKeyHash k) :& r) =- pure $ (StkEl (VContract (MkAddress $ ImplicitAddress k) sepcPrimitive)) :& r+ mkStkEl (VContract (MkAddress $ ImplicitAddress k) sepcPrimitive) <:&> r runInstrImpl _ AnnNOW{} r = do ContractEnv{..} <- ask- pure $ StkEl (VTimestamp ceNow) :& r+ mkStkEl (VTimestamp ceNow) <:&> r runInstrImpl _ AnnAMOUNT{} r = do ContractEnv{..} <- ask- pure $ StkEl (VMutez ceAmount) :& r+ mkStkEl (VMutez ceAmount) <:&> r runInstrImpl _ AnnBALANCE{} r = do ContractEnv{..} <- ask- pure $ StkEl (VMutez ceBalance) :& r+ mkStkEl (VMutez ceBalance) <:&> r runInstrImpl _ AnnVOTING_POWER{} (StkEl (VKeyHash k) :& r) = do ContractEnv{..} <- ask- pure $ StkEl (VNat $ vpPick k ceVotingPowers) :& r+ mkStkEl (VNat $ vpPick k ceVotingPowers) <:&> r runInstrImpl _ AnnTOTAL_VOTING_POWER{} r = do ContractEnv{..} <- ask- pure $ StkEl (VNat $ vpTotal ceVotingPowers) :& r+ mkStkEl (VNat $ vpTotal ceVotingPowers) <:&> r runInstrImpl _ AnnCHECK_SIGNATURE{} (StkEl (VKey k) :& StkEl (VSignature v) :& StkEl (VBytes b) :& r) =- pure $ StkEl (VBool $ checkSignature k v b) :& r+ mkStkEl (VBool $ checkSignature k v b) <:&> r runInstrImpl _ AnnSHA256{} (StkEl (VBytes b) :& r) =- pure $ StkEl (VBytes $ sha256 b) :& r+ mkStkEl (VBytes $ sha256 b) <:&> r runInstrImpl _ AnnSHA512{} (StkEl (VBytes b) :& r) =- pure $ StkEl (VBytes $ sha512 b) :& r+ mkStkEl (VBytes $ sha512 b) <:&> r runInstrImpl _ AnnBLAKE2B{} (StkEl (VBytes b) :& r) =- pure $ StkEl (VBytes $ blake2b b) :& r+ mkStkEl (VBytes $ blake2b b) <:&> r runInstrImpl _ AnnSHA3{} (StkEl (VBytes b) :& r) =- pure $ StkEl (VBytes $ sha3 b) :& r+ mkStkEl (VBytes $ sha3 b) <:&> r runInstrImpl _ AnnKECCAK{} (StkEl (VBytes b) :& r) =- pure $ StkEl (VBytes $ keccak b) :& r+ mkStkEl (VBytes $ keccak b) <:&> r runInstrImpl _ AnnHASH_KEY{} (StkEl (VKey k) :& r) =- pure $ StkEl (VKeyHash $ hashKey k) :& r+ mkStkEl (VKeyHash $ hashKey k) <:&> r runInstrImpl _ AnnPAIRING_CHECK{} (StkEl (VList pairs) :& r) = do let pairs' = [ (g1, g2) | VPair (VBls12381G1 g1, VBls12381G2 g2) <- pairs ]- pure $ StkEl (VBool $ checkPairing pairs') :& r+ mkStkEl (VBool $ checkPairing pairs') <:&> r runInstrImpl _ AnnSOURCE{} r = do ContractEnv{ceSource=Constrained ceSource} <- ask- pure $ StkEl (VAddress $ EpAddress ceSource DefEpName) :& r+ mkStkEl (VAddress $ EpAddress ceSource DefEpName) <:&> r runInstrImpl _ AnnSENDER{} r = do ContractEnv{ceSender=Constrained ceSender} <- ask- pure $ StkEl (VAddress $ EpAddress ceSender DefEpName) :& r+ mkStkEl (VAddress $ EpAddress ceSender DefEpName) <:&> r runInstrImpl _ AnnADDRESS{} (StkEl (VContract a sepc) :& r) =- pure $ StkEl (VAddress $ EpAddress' a (sepcName sepc)) :& r+ mkStkEl (VAddress $ EpAddress' a (sepcName sepc)) <:&> r runInstrImpl _ AnnCHAIN_ID{} r = do ContractEnv{..} <- ask- pure $ StkEl (VChainId ceChainId) :& r+ mkStkEl (VChainId ceChainId) <:&> r runInstrImpl _ AnnLEVEL{} r = do ContractEnv{..} <- ask- pure $ StkEl (VNat ceLevel) :& r+ mkStkEl (VNat ceLevel) <:&> r runInstrImpl _ AnnSELF_ADDRESS{} r = do ContractEnv{..} <- ask- pure $ StkEl (VAddress $ EpAddress ceSelf DefEpName) :& r+ mkStkEl (VAddress $ EpAddress ceSelf DefEpName) <:&> r runInstrImpl _ AnnTICKET{} (StkEl dat :& StkEl (VNat am) :& r) = do ContractEnv{..} <- ask let result = VOption do guard (am /= 0) pure $ VTicket (MkAddress ceSelf) dat am- pure $ StkEl (result) :& r+ mkStkEl result <:&> r runInstrImpl _ AnnTICKET_DEPRECATED{} (StkEl dat :& StkEl (VNat am) :& r) = do ContractEnv{..} <- ask- pure $ StkEl (VTicket (MkAddress ceSelf) dat am) :& r+ mkStkEl (VTicket (MkAddress ceSelf) dat am) <:&> r runInstrImpl _ AnnREAD_TICKET{} (te@(StkEl (VTicket addr dat am)) :& r) = do- pure $- StkEl+ mkStkEl (VPair (VAddress (EpAddress' addr DefEpName), (VPair (dat, VNat am))))- :& te :& r+ <:&> te :& r runInstrImpl _ AnnSPLIT_TICKET{} (StkEl tv@(VTicket addr dat am) :& StkEl (VPair (VNat am1, VNat am2)) :& r) = do let result = withValueTypeSanity tv $ VOption do guard (am1 + am2 == am) return $ VPair (VTicket addr dat am1, VTicket addr dat am2)- pure $ StkEl result :& r+ mkStkEl result <:&> r runInstrImpl _ AnnJOIN_TICKETS{} (StkEl (VPair (tv1@(VTicket addr1 dat1 am1), VTicket addr2 dat2 am2)) :& r) = do let result = withValueTypeSanity tv1 $ VOption do guard (addr1 == addr2) guard (dat1 == dat2) return $ VTicket addr1 dat1 (am1 + am2)- pure $ StkEl result :& r+ mkStkEl result <:&> r runInstrImpl _ AnnOPEN_CHEST{} (StkEl (VChestKey ck) :& StkEl (VChest c) :& StkEl (VNat nat) :& r) = do let result = case mkTLTime nat of@@ -917,28 +1052,28 @@ BogusOpening -> VOr (Right (VBool True)) BogusCipher -> VOr (Right (VBool False)) Left _ -> VOr (Right (VBool True))- pure $ StkEl result :& r+ mkStkEl result <:&> r runInstrImpl _ AnnSAPLING_EMPTY_STATE{} _ = throwMichelson $ MichelsonUnsupported "SAPLING_EMPTY_STATE" runInstrImpl _ AnnSAPLING_VERIFY_UPDATE{} _ = throwMichelson $ MichelsonUnsupported "SAPLING_VERIFY_UPDATE" runInstrImpl _ AnnMIN_BLOCK_TIME{} r = do ContractEnv{..} <- ask- pure $ StkEl (VNat ceMinBlockTime) :& r+ mkStkEl (VNat ceMinBlockTime) <:&> r runInstrImpl _ (AnnEMIT _ (unAnnotation -> emTag) mNotes) ((StkEl emValue) :& r) = do incrementCounter emCounter <- isGlobalCounter <$> getInterpreterState let emNotes = fromMaybe starNotes mNotes- pure $ StkEl (VOp (OpEmit Emit{..})) :& r+ mkStkEl (VOp (OpEmit Emit{..})) <:&> r -- | Evaluates an arithmetic operation and either fails or proceeds. runArithOp- :: (ArithOp aop n m, EvalM' ext monad)+ :: (ArithOp aop n m, StkElMeta meta monad, EvalM' ext monad) => proxy aop- -> StkEl n- -> StkEl m- -> monad (StkEl (ArithRes aop n m))+ -> StkEl meta n+ -> StkEl meta m+ -> monad (StkEl meta (ArithRes aop n m)) runArithOp op l r = case evalOp op (seValue l) (seValue r) of Left err -> throwMichelson $ MichelsonArithError err- Right res -> pure $ StkEl res+ Right res -> mkStkEl res -- | Unpacks given raw data into a typed value. runUnpack@@ -960,8 +1095,8 @@ instance Buildable ViewLookupError where build = \case ViewNotFound name -> "View '" +| name |+ "' not found"- ViewArgMismatch err -> "View argument type mismatch: " +| err |+ ""- ViewRetMismatch err -> "View return type mismatch: " +| err |+ ""+ ViewArgMismatch err -> nameF "View argument type mismatch" err+ ViewRetMismatch err -> nameF "View return type mismatch" err -- | Interpret a contract's view for given t'ContractEnv' and initial -- 'InterpreterState'. It is assumed t'ContractEnv' is suitable for the view@@ -973,7 +1108,8 @@ -> ContractEnv -> InterpreterState -> InterpretReturn ret-interpretView view' st argument = runEvalOp $ interpretView' runInstr id view' st argument+interpretView view' st argument = runEvalOp $+ interpretView' (runInstr @_ @NoStkElMeta) id view' st argument -- | Attempt to find a view with a given name and given type in a given -- contract.@@ -997,16 +1133,16 @@ -- | 'EvalM' view interpretation helper. interpretView'- :: forall ret st m arg ext. EvalM' ext m- => (forall inp out. Instr inp out -> Rec StkEl inp -> m (Rec StkEl out))+ :: forall ret st m arg ext meta. (StkElMeta meta m, EvalM' ext m)+ => (forall inp out. Instr inp out -> Rec (StkEl meta) inp -> m (Rec (StkEl meta) out)) -> (ContractEnv' m -> ContractEnv' m) -> View arg st ret -> Value st -> Value arg -> m (Value ret) interpretView' runner env View{vCode} storage argument = do- resSt <- local env $ runInstrImpl runner vCode $- StkEl (VPair (argument, storage)) :& RNil+ resSt <- local env $ runInstrImpl runner vCode =<<+ mkStkEl @meta (VPair (argument, storage)) <:&> RNil let StkEl res :& RNil = resSt pure res @@ -1034,7 +1170,9 @@ unwrapMbKeyHash :: Maybe (Value 'TKeyHash) -> Maybe KeyHash unwrapMbKeyHash mbKeyHash = mbKeyHash <&> \(VKeyHash keyHash) -> keyHash -interpretExt :: EvalM' ext m => InstrRunner m -> SomeItStack -> m ()+interpretExt+ :: forall ext meta m. (StkElMeta meta m, EvalM' ext m)+ => InstrRunner meta m -> SomeItStack meta -> m () interpretExt _ (SomeItStack (PRINT (PrintComment pc)) st) = do let getEl (Left l) = l getEl (Right str) = withStackElem str st (pretty . seValue)@@ -1053,22 +1191,22 @@ -- | Access given stack reference (in CPS style). withStackElem- :: forall st a.+ :: forall st meta a. StackRef st- -> Rec StkEl st- -> (forall t. StkEl t -> a)+ -> Rec (StkEl meta) st+ -> (forall t. StkEl meta t -> a) -> a withStackElem (StackRef sn) vals cont = loop (vals, sn) where loop :: forall s (n :: Peano). (LongerThan s n)- => (Rec StkEl s, PeanoNatural n) -> a+ => (Rec (StkEl meta) s, PeanoNatural n) -> a loop = \case (e :& _, Zero) -> cont e (_ :& es, Succ n) -> loop (es, n) -assignBigMapIds' :: EvalM' ext m => Value t -> m (Value t)+assignBigMapIds' :: forall ext m t. EvalM' ext m => Value t -> m (Value t) assignBigMapIds' val = do bigMapCounter0 <- view isBigMapCounterL <$> getInterpreterState let (storageWithIds, bigMapCounter1) = runState (assignBigMapIds True val) bigMapCounter0
src/Morley/Michelson/Macro.hs view
@@ -15,6 +15,7 @@ -- * Morley Parsed instruction types , ParsedInstr , ParsedOp (..)+ , ParsedSeq (..) , ParsedUExtInstr -- * For utilities@@ -26,7 +27,7 @@ -- * Internals exported for tests , expand- , expandList+ , expandSeq , expandMacro , expandPapair , expandUnpapair@@ -37,18 +38,20 @@ import Data.Aeson.TH (deriveJSON) import Data.Data (Data(..))-import Fmt (Buildable(build), GenericBuildable(..), (+|), (|+))+import Data.Default (def)+import Fmt (Buildable(build), blockListF, (+|), (|+)) import Morley.Michelson.ErrorPos import Morley.Michelson.Printer (RenderDoc(..)) import Morley.Michelson.Untyped+import Morley.Michelson.Untyped.HoistInstr import Morley.Util.Aeson data PairStruct = F FieldAnn | P PairStruct PairStruct deriving stock (Eq, Show, Data, Generic)- deriving Buildable via GenericBuildable PairStruct+ deriving anyclass Buildable instance NFData PairStruct @@ -56,7 +59,7 @@ = UF | UP UnpairStruct UnpairStruct deriving stock (Eq, Show, Data, Generic)- deriving Buildable via GenericBuildable UnpairStruct+ deriving anyclass Buildable instance NFData UnpairStruct @@ -64,7 +67,7 @@ = A | D deriving stock (Eq, Show, Data, Generic)- deriving Buildable via GenericBuildable CadrStruct+ deriving anyclass Buildable instance NFData CadrStruct @@ -91,17 +94,23 @@ -- Types produced by parser ------------------------------------- -type ParsedUExtInstr = ExtInstrAbstract ParsedOp+data ParsedSeq op+ = PSSingleMacro SrcPos Macro+ | PSSequence [op]+ deriving stock (Eq, Show, Data, Generic, Functor, Foldable)+ deriving anyclass NFData -type ParsedInstr = InstrAbstract ParsedOp+type ParsedUExtInstr = ExtInstrAbstract ParsedSeq ParsedOp -type ParsedValue = Value' ParsedOp+type ParsedInstr = InstrAbstract ParsedSeq ParsedOp +type ParsedValue = Value' ParsedSeq ParsedOp+ -- | Built-in Michelson Macros defined by the specification data Macro- = CMP ParsedInstr VarAnn- | IFX ParsedInstr [ParsedOp] [ParsedOp]- | IFCMP ParsedInstr VarAnn [ParsedOp] [ParsedOp]+ = CMP ParsedInstr+ | IFX ParsedInstr (ParsedSeq ParsedOp) (ParsedSeq ParsedOp)+ | IFCMP ParsedInstr (ParsedSeq ParsedOp) (ParsedSeq ParsedOp) | FAIL | PAPAIR PairStruct TypeAnn VarAnn | UNPAPAIR UnpairStruct@@ -109,8 +118,8 @@ | CARN VarAnn Word | CDRN VarAnn Word | SET_CADR [CadrStruct] VarAnn FieldAnn- | MAP_CADR [CadrStruct] VarAnn FieldAnn [ParsedOp]- | DIIP Word [ParsedOp]+ | MAP_CADR [CadrStruct] VarAnn FieldAnn (ParsedSeq ParsedOp)+ | DIIP Word (ParsedSeq ParsedOp) | DUUP Word VarAnn | ASSERT | ASSERTX ParsedInstr@@ -119,15 +128,20 @@ | ASSERT_SOME | ASSERT_LEFT | ASSERT_RIGHT- | IF_SOME [ParsedOp] [ParsedOp]- | IF_RIGHT [ParsedOp] [ParsedOp]+ | IF_SOME (ParsedSeq ParsedOp) (ParsedSeq ParsedOp)+ | IF_RIGHT (ParsedSeq ParsedOp) (ParsedSeq ParsedOp) deriving stock (Eq, Show, Data, Generic) +instance Buildable op => Buildable (ParsedSeq op) where+ build = \case+ PSSingleMacro _ mac -> build mac+ PSSequence xs -> blockListF xs+ instance Buildable Macro where build = \case- CMP parsedInstr carAnn -> "<CMP: "+|parsedInstr|+", "+|carAnn|+">"+ CMP parsedInstr -> "<CMP: "+|parsedInstr|+">" IFX parsedInstr parsedOps1 parsedOps2 -> "<IFX: "+|parsedInstr|+", "+|parsedOps1|+", "+|parsedOps2|+">"- IFCMP parsedInstr varAnn parsedOps1 parsedOps2 -> "<IFCMP: "+|parsedInstr|+", "+|varAnn|+", "+|parsedOps1|+", "+|parsedOps2|+">"+ IFCMP parsedInstr parsedOps1 parsedOps2 -> "<IFCMP: "+|parsedInstr|+", "+|parsedOps1|+", "+|parsedOps2|+">" FAIL -> "FAIL" PAPAIR pairStruct typeAnn varAnn -> "<PAPAIR: "+|pairStruct|+", "+|typeAnn|+", "+|varAnn|+">" UNPAPAIR pairStruct -> "<UNPAPAIR: "+|pairStruct|+">"@@ -150,51 +164,50 @@ instance NFData Macro -expandList :: [ParsedOp] -> [ExpandedOp]-expandList = fmap expand-{-# DEPRECATED expandList "Use 'map expand' instead" #-}- -- | Expand all macros in parsed contract. expandContract :: Contract' ParsedOp -> Contract expandContract = fmap expand -- | Expand all macros in parsed value. expandValue :: ParsedValue -> Value-expandValue = fmap expand+expandValue = hoistInstr expandSeq . fmap expand +expandSeq :: ParsedSeq ExpandedOp -> [ExpandedOp]+expandSeq = \case+ PSSingleMacro pos macro -> expandMacro (ErrorSrcPos pos) macro+ PSSequence xs -> xs+ expand :: ParsedOp -> ExpandedOp expand = let ics pos = ErrorSrcPos pos in \case (Mac m pos) -> WithSrcEx (ics pos) $ either PrimEx SeqEx $ expandMacro' (ics pos) m- (Prim i pos) -> WithSrcEx (ics pos) $ PrimEx $ expand <$> i+ (Prim i pos) -> WithSrcEx (ics pos) $ PrimEx $ hoistInstr expandSeq $ expand <$> i (Seq s pos) -> WithSrcEx (ics pos) $ SeqEx $ expand <$> s expandMacro' :: ErrorSrcPos -> Macro -> Either ExpandedInstr [ExpandedOp] expandMacro' p@ErrorSrcPos{unErrorSrcPos=macroPos} = \case -- special cases- -- We handle this case specially, because it's essentially just PAIR.- -- It's needed because we have a hack in parser: we parse PAIR as PAPAIR.- -- We need to do something better eventually.- PAPAIR (P (F a) (F b)) t v -> Left $ PAIR t v a b -- DIIP is now always represented as a single instruction.- DIIP n ops -> Left $ DIPN n (expand <$> ops)+ DIIP n ops -> Left $ DIPN n $ expandSeq $ expand <$> ops -- Similarly to above, DUUP is now always represented as a single instruction. DUUP n v -> Left $ DUPN v n -- regular cases- CMP i v -> Right $ [PrimEx (COMPARE v), xo i]+ CMP i -> Right $ [PrimEx (COMPARE def), xo i] IFX i bt bf -> Right $ [xo i, PrimEx $ IF (xp bt) (xp bf)]- IFCMP i v bt bf -> Right $ PrimEx <$> [COMPARE v, expand <$> i, IF (xp bt) (xp bf)]+ IFCMP i bt bf -> Right $ PrimEx <$> [COMPARE def, ex i, IF (xp bt) (xp bf)] IF_SOME bt bf -> Right $ [PrimEx (IF_NONE (xp bf) (xp bt))] IF_RIGHT bt bf -> Right $ [PrimEx (IF_LEFT (xp bf) (xp bt))] FAIL -> Right $ PrimEx <$> [UNIT noAnn noAnn, FAILWITH] ASSERT -> Right $ oprimEx $ IF [] fail'- ASSERTX i -> Right $ [expand $ mac $ IFX i [] [mac FAIL]]- ASSERT_CMP i -> Right $ [expand $ mac $ IFCMP i noAnn [] [mac FAIL]]+ ASSERTX i -> Right $ [expand $ mac $ IFX i (PSSequence []) (PSSequence [mac FAIL])]+ ASSERT_CMP i -> Right $+ -- reference has weirdly inconsistent nesting between this and IFCMP+ [expand (Mac (CMP i) macroPos), PrimEx $ IF [] fail'] ASSERT_NONE -> Right $ oprimEx $ IF_NONE [] fail' ASSERT_SOME -> Right $ oprimEx $ IF_NONE fail' [] ASSERT_LEFT -> Right $ oprimEx $ IF_LEFT [] fail' ASSERT_RIGHT -> Right $ oprimEx $ IF_LEFT fail' []- PAPAIR ps t v -> Right $ expandPapair p ps t v+ PAPAIR ps t v -> expandPapair p ps t v UNPAPAIR ps -> Right $ expandUnpapair p ps CADR c v f -> Right $ expandCadr p c v f CARN v idx -> Right $ [PrimEx (GETN v (2 * idx + 1))]@@ -203,11 +216,12 @@ MAP_CADR c v f ops -> Right $ expandMapCadr p c v f ops where- fail' = expandMacro p FAIL+ fail' = one . expand $ mac FAIL mac = flip Mac macroPos oprimEx = one . PrimEx- xo = PrimEx . fmap expand- xp = fmap expand+ xo = PrimEx . ex+ ex = hoistInstr expandSeq . fmap expand+ xp = expandSeq . fmap expand expandMacro :: ErrorSrcPos -> Macro -> [ExpandedOp] expandMacro = either (pure . PrimEx) id ... expandMacro'@@ -216,27 +230,49 @@ -- -- The correctness of type-annotation expansion is currently untested, as these -- expansions are not explicitly documented in the Michelson Specification.-expandPapair :: ErrorSrcPos -> PairStruct -> TypeAnn -> VarAnn -> [ExpandedOp]-expandPapair ics ps t v = case ps of- P (F a) (F b) -> [PrimEx $ PAIR t v a b]+expandPapair+ :: ErrorSrcPos+ -> PairStruct+ -> TypeAnn+ -> VarAnn+ -> Either ExpandedInstr [ExpandedOp]+expandPapair ics@(ErrorSrcPos pos) ps t v = case ps of+ -- We handle this case specially, because it's essentially just PAIR.+ -- It's needed because we have a hack in parser: we parse PAIR as PAPAIR.+ -- We need to do something better eventually.+ P (F a) (F b) -> Left $ PAIR t v a b -- > PA(\right)R / S => DIP ((\right)R) ; PAIR / S- P (F a) r -> PrimEx <$> [ DIP $ expandMacro ics (PAPAIR r noAnn noAnn)- , PAIR t v a noAnn]+ -- docs lie a bit, reference actually does something weird, which we try to match+ -- to the best of our ability+ P (F a) r -> Right $+ concatMap papairDips (expandMacro ics (PAPAIR r noAnn noAnn))+ <> [PrimEx $ PAIR t v a noAnn] -- > P(\left)IR / S => (\left)R ; PAIR / S- P l (F b) -> expandMacro ics (PAPAIR l noAnn noAnn) ++- [PrimEx $ PAIR t v noAnn b]+ P l (F b) -> Right [ expand $ Mac (PAPAIR l noAnn noAnn) pos, PrimEx $ PAIR t v noAnn b ] -- > P(\left)(\right)R => (\left)R ; DIP ((\right)R) ; PAIR / S- P l r -> expandMacro ics (PAPAIR l noAnn noAnn) ++- [ PrimEx $ DIP $ expandMacro ics (PAPAIR r noAnn noAnn)- , PrimEx $ PAIR t v noAnn noAnn]+ -- docs lie a bit, reference actually does something weird, which we try to match+ -- to the best of our ability+ P l r -> Right $+ (expand $ Mac (PAPAIR l noAnn noAnn) pos)+ : concatMap papairDips (expandMacro ics (PAPAIR r noAnn noAnn))+ <> [PrimEx $ PAIR t v noAnn noAnn] -- It's impossible from the structure of PairStruct and considered cases above, -- but if it accidentally happened let's just do nothing.- F _ -> []+ F _ -> Right [] +-- | Mimic the weirdness that is the reference implementation+papairDips :: ExpandedOp -> [ExpandedOp]+papairDips = \case+ PrimEx (DIP xs) -> [PrimEx $ DIPN 2 xs]+ PrimEx (DIPN n xs) -> [PrimEx $ DIPN (succ n) xs]+ SeqEx xs -> concatMap papairDips xs+ PrimEx x -> [PrimEx $ DIP [PrimEx x]]+ WithSrcEx s x -> WithSrcEx s <$> papairDips x+ -- | The macro expansion rules below were taken from: https://tezos.gitlab.io/active/michelson.html#syntactic-conveniences expandUnpapair :: ErrorSrcPos -> UnpairStruct -> [ExpandedOp] expandUnpapair ics = \case@@ -244,10 +280,11 @@ [ PrimEx (UNPAIR noAnn noAnn noAnn noAnn) ] -- > UNPA(\right)R / S => UNPAIR ; DIP (UN(\right)R) / S+ -- docs lie a bit, reference actually does something weird, which we try to match+ -- to the best of our ability UP UF r ->- PrimEx <$> [ UNPAIR noAnn noAnn noAnn noAnn- , DIP (expandMacro ics (UNPAPAIR r))- ]+ PrimEx (UNPAIR noAnn noAnn noAnn noAnn)+ : concatMap papairDips (expandMacro ics (UNPAPAIR r)) -- > UNP(\left)IR / S => UNPAIR ; UN(\left)R / S UP l UF ->@@ -255,11 +292,12 @@ : expandMacro ics (UNPAPAIR l) -- > UNP(\left)(\right)R => UNPAIR ; DIP (UN(\right)R) ; UN(\left)R / S+ -- docs lie a bit, reference actually does something weird, which we try to match+ -- to the best of our ability UP l r ->- [ PrimEx (UNPAIR noAnn noAnn noAnn noAnn)- , PrimEx $ DIP $ expandMacro ics $ UNPAPAIR r- ] ++- expandMacro ics (UNPAPAIR l)+ PrimEx (UNPAIR noAnn noAnn noAnn noAnn)+ : concatMap papairDips (expandMacro ics $ UNPAPAIR r)+ <> expandMacro ics (UNPAPAIR l) -- It's impossible from the structure of UnpairStruct and considered cases above, -- but if it accidentally happened let's just do nothing.@@ -273,34 +311,40 @@ A:css -> PrimEx (CAR noAnn noAnn) : expandMacro ics (CADR css v f) D:css -> PrimEx (CDR noAnn noAnn) : expandMacro ics (CADR css v f) -carNoAnn :: InstrAbstract op+carNoAnn :: InstrAbstract f op carNoAnn = CAR [annQ|%%|] noAnn -cdrNoAnn :: InstrAbstract op+cdrNoAnn :: InstrAbstract f op cdrNoAnn = CDR [annQ|%%|] noAnn -pairNoAnn :: VarAnn -> InstrAbstract op+pairNoAnn :: VarAnn -> InstrAbstract f op pairNoAnn v = PAIR noAnn v [annQ|@|] [annQ|@|] expandSetCadr :: ErrorSrcPos -> [CadrStruct] -> VarAnn -> FieldAnn -> [ExpandedOp]-expandSetCadr ics cs v f = PrimEx <$> case cs of+expandSetCadr (ErrorSrcPos ps) cs v f = PrimEx <$> case cs of [] -> []- [A] -> [DUP noAnn, CAR noAnn f, DROP,- -- ↑ These operations just check that the left element of pair has %f- cdrNoAnn, SWAP, PAIR noAnn v f [annQ|@|]]- [D] -> [DUP noAnn, CDR noAnn f, DROP,- -- ↑ These operations just check that the right element of pair has %f- carNoAnn, PAIR noAnn v [annQ|@|] f]- A:css -> [DUP noAnn, DIP (PrimEx carNoAnn : expandMacro ics (SET_CADR css noAnn f)), cdrNoAnn, SWAP, pairNoAnn v]- D:css -> [DUP noAnn, DIP (PrimEx cdrNoAnn : expandMacro ics (SET_CADR css noAnn f)), carNoAnn, pairNoAnn v]+ [A] -> [cdrNoAnn, SWAP, PAIR noAnn v f [annQ|@|]]+ [D] -> [carNoAnn, PAIR noAnn v [annQ|@|] f]+ A:css -> [DUP noAnn, DIP [PrimEx carNoAnn, expand $ Mac (SET_CADR css noAnn f) ps], cdrNoAnn, SWAP, pairNoAnn v]+ D:css -> [DUP noAnn, DIP [PrimEx cdrNoAnn, expand $ Mac (SET_CADR css noAnn f) ps], carNoAnn, pairNoAnn v] -expandMapCadr :: ErrorSrcPos -> [CadrStruct] -> VarAnn -> FieldAnn -> [ParsedOp] -> [ExpandedOp]-expandMapCadr ics cs v f ops = case cs of+expandMapCadr :: ErrorSrcPos -> [CadrStruct] -> VarAnn -> FieldAnn -> ParsedSeq ParsedOp -> [ExpandedOp]+expandMapCadr (ErrorSrcPos pos) cs v f ops = case cs of [] -> []- [A] -> PrimEx <$> [DUP noAnn, cdrNoAnn, DIP [PrimEx $ CAR noAnn f, SeqEx (expand <$> ops)], SWAP, PAIR noAnn v f [annQ|@|]]- [D] -> concat [PrimEx <$> [DUP noAnn, CDR noAnn f], [SeqEx (expand <$> ops)], PrimEx <$> [SWAP, carNoAnn, PAIR noAnn v [annQ|@|] f]]- A:css -> PrimEx <$> [DUP noAnn, DIP (PrimEx carNoAnn : expandMacro ics (MAP_CADR css noAnn f ops)), cdrNoAnn, SWAP, pairNoAnn v]- D:css -> PrimEx <$> [DUP noAnn, DIP (PrimEx cdrNoAnn : expandMacro ics (MAP_CADR css noAnn f ops)), carNoAnn, pairNoAnn v]+ -- > MAP_CAR code => DUP ; CDR ; DIP { CAR ; code } ; SWAP ; PAIR+ [A] -> PrimEx <$>+ [ DUP noAnn+ , cdrNoAnn+ , DIP [PrimEx (CAR noAnn f), SeqEx $ expandSeq $ expand <$> ops]+ , SWAP+ , PAIR noAnn v f [annQ|@|]]+ -- > MAP_CDR code => DUP ; CDR ; code ; SWAP ; CAR ; PAIR+ [D] -> (PrimEx <$> [DUP noAnn, CDR noAnn f]) <>+ (SeqEx (expandSeq $ expand <$> ops) : (PrimEx <$> [SWAP, carNoAnn, PAIR noAnn v [annQ|@|] f]))+ -- > MAP_CA(\rest=[AD]+)R code / S =>+ -- { DUP ; DIP { CAR ; MAP_C(\rest)R code } ; CDR ; SWAP ; PAIR } / S+ A:css -> PrimEx <$> [DUP noAnn, DIP [PrimEx carNoAnn, expand $ Mac (MAP_CADR css noAnn f ops) pos], cdrNoAnn, SWAP, pairNoAnn v]+ D:css -> PrimEx <$> [DUP noAnn, DIP [PrimEx cdrNoAnn, expand $ Mac (MAP_CADR css noAnn f ops) pos], carNoAnn, pairNoAnn v] mapPairLeaves :: [FieldAnn] -> PairStruct -> PairStruct mapPairLeaves fs p = evalState (pairLeavesST p) fs@@ -325,4 +369,5 @@ $(mconcat [ deriveJSON morleyAesonOptions ''Macro , deriveJSON morleyAesonOptions ''ParsedOp+ , deriveJSON morleyAesonOptions ''ParsedSeq ])
src/Morley/Michelson/Optimizer.hs view
@@ -1,16 +1,9 @@ -- SPDX-FileCopyrightText: 2021 Oxhead Alpha -- SPDX-License-Identifier: LicenseRef-MIT-OA --- NOTE this pragmas.--- We disable some warnings for the sake of speed up.--- Write code with care.-{-# OPTIONS_GHC -Wno-incomplete-patterns #-}-{-# OPTIONS_GHC -Wno-overlapping-patterns #-}- -- | Optimizer for typed instructions. -- -- It's quite experimental and incomplete.- module Morley.Michelson.Optimizer ( optimize , optimizeWithConf@@ -18,8 +11,6 @@ , defaultOptimizerConf , defaultRules , defaultRulesAndPushPack- , orRule- , orSimpleRule , Rule (..) , OptimizerConf (..) , ocGotoValuesL@@ -36,95 +27,16 @@ import Prelude hiding (EQ, GT, LT) import Control.Lens (makeLensesFor)-import Data.Constraint (Dict(..), (\\)) import Data.Default (Default(def))-import Data.Map qualified as Map-import Data.Singletons (sing)-import Data.Type.Equality ((:~:)(Refl)) import Fmt (Buildable(..), (+|), (|+)) -import Morley.Michelson.Interpret.Pack (packValue')-import Morley.Michelson.Optimizer.Internal.Proofs-import Morley.Michelson.Typed.Aliases (Value)-import Morley.Michelson.Typed.Arith+import Morley.Michelson.Optimizer.Internal.Rules+import Morley.Michelson.Optimizer.Internal.Ruleset+import Morley.Michelson.Optimizer.Utils import Morley.Michelson.Typed.ClassifiedInstr import Morley.Michelson.Typed.Instr hiding ((:#))-import Morley.Michelson.Typed.Scope (ConstantScope, PackedValScope, checkScope)-import Morley.Michelson.Typed.Sing-import Morley.Michelson.Typed.T import Morley.Michelson.Typed.Util (DfsSettings(..), dfsFoldInstr, dfsTraverseInstr)-import Morley.Michelson.Typed.Value-import Morley.Util.Peano-import Morley.Util.PeanoNatural -pattern (:#) :: Instr inp b -> Instr b out -> Instr inp out-pattern l :# r <- (maybeSeq -> Seq l r)- where l :# Nop = l- Nop :# r = r- l :# r = Seq l r-infixr 8 :#--maybeSeq :: Instr inp out -> Instr inp out-maybeSeq = \case- x@Seq{} -> x- x -> Seq x Nop--------------------------------------------------------------------------------- High level--------------------------------------------------------------------------------- | Optimization stages. Stages are run in first to last order, each stage has--- an 'Int' argument, which allows splitting each stage into sub-stages, which--- will run lowest index to highest. All default rules use sub-stage @0@.-data OptimizationStage- = OptimizationStagePrepare Int- | OptimizationStageMain Int- -- ^ Main optimisation stage, except rules that would interfere with other- -- rules.- | OptimizationStageMainExtended Int- -- ^ All main stage rules.- | OptimizationStageRollAdjacent Int- -- ^ Main stage rules unroll @DROP n@, @PAIR n@, etc into their primitive- -- counterparts to simplify some optimisations. This stages coalesces them- -- back.- deriving stock (Eq, Ord)--instance Buildable OptimizationStage where- build = \case- OptimizationStagePrepare n -> "prepare " +| n |+ ""- OptimizationStageMain n -> "main " +| n |+ ""- OptimizationStageMainExtended n -> "main extended " +| n |+ ""- OptimizationStageRollAdjacent n -> "roll adjacent " +| n |+ ""---- | A set of optimization stages. Rules at the same sub-stage are applied in--- arbitrary order. See 'OptimizationStage' for explanation of sub-stages.------ 'Default' ruleset is empty.-newtype Ruleset = Ruleset { unRuleset :: Map OptimizationStage (NonEmpty Rule) }- deriving newtype Default--instance Semigroup Ruleset where- Ruleset l <> Ruleset r = Ruleset $ Map.unionWith (<>) l r--instance Monoid Ruleset where- mempty = def---- | Get rules for a given priority as a list.-rulesAtPrio :: OptimizationStage -> Ruleset -> [Rule]-rulesAtPrio prio = maybe [] toList . Map.lookup prio . unRuleset---- | Insert a single rule at a given priority without touching other rules.-insertRuleAtPrio :: OptimizationStage -> Rule -> Ruleset -> Ruleset-insertRuleAtPrio = flip $ alterRulesAtPrio . (:)---- | Remove the stage with the given priority.-clearRulesAtPrio :: OptimizationStage -> Ruleset -> Ruleset-clearRulesAtPrio = alterRulesAtPrio (const [])---- | Alter all stage rules for a given priority.-alterRulesAtPrio :: ([Rule] -> [Rule]) -> OptimizationStage -> Ruleset -> Ruleset-alterRulesAtPrio f prio = Ruleset . Map.alter (nonEmpty . f . maybe [] toList) prio . unRuleset- data OptimizerConf = OptimizerConf { ocGotoValues :: Bool , ocRuleset :: Ruleset@@ -190,545 +102,5 @@ (getAny -> changed, res) = dfsTraverseInstr def{ dsGoToValues = ocGotoValues, dsInstrStep = applyOnce stageRule } i instrRHS = snd $ applyOnce (fixpoint flattenSeqLHS) instr--------------------------------------------------------------------------------- Rewrite rules-------------------------------------------------------------------------------{--Note [Writing optimizer rules]---------------------------------We locally redefine (:#) to simplify handling instruction sequence tails.-Consider that a given instruction sequence can appear in the middle, and then @a-:# b :# tail@ will match, or at the end of the sequence, and then @a :# b@ will-match.--Local definition of (:#) makes it so we can always assume there's a tail.-However, we don't need it when matching on single instructions.--Thus, the rule of thumb is this: if you're matching on a single instruction,-everything is fine. If you're matching on a sequence, i.e. using (:#), then-always match on tail.--}---- Type of a single rewrite rule, wrapped in `newtype`. It takes an instruction--- and tries to optimize its head (first few instructions). If optimization--- succeeds, it returns `Just` the optimized instruction, otherwise it returns `Nothing`.-newtype Rule = Rule {unRule :: forall inp out. Instr inp out -> Maybe (Instr inp out)}---- | Default optimization rules.-defaultRules :: Ruleset-defaultRules = foldr ($) def $ uncurry (alterRulesAtPrio . const) <$>- -- NB: if adding more main stages, remember to check if- -- 'defaultRulesAndPushPack' needs updating.- [ (mainStageRules , OptimizationStageMain 0)- , (dipDrop2swapDropStageRules , OptimizationStageMainExtended 0)- , (glueAdjacentInstrsStageRules, OptimizationStageRollAdjacent 0)- ]- where- dipDrop2swapDropStageRules = dipDrop2swapDrop : mainStageRules- glueAdjacentInstrsStageRules =- [ adjacentDrops- , rollPairN- , rollUnpairN- , rollDips- ]---- | We do not enable 'pushPack' rule by default because it is potentially--- dangerous. There are various code processing functions that may depend on--- constants, e. g. string transformations.-defaultRulesAndPushPack :: Ruleset-defaultRulesAndPushPack = defaultRules- & insertRuleAtPrio (OptimizationStageMainExtended 0) pushPack--mainStageRules :: [Rule]-mainStageRules =- [ removeNesting- , removeExtStackType- , ifNopNop2Drop- , nopIsNeutralForSeq- , variousNops- , dupSwap2dup- , noDipNeeded- , branchShortCut- , compareWithZero- , internalNop- , simpleDups- , adjacentDips- , isSomeOnIf- , redundantIf- , emptyDip- , digDug- , specificPush- , pairUnpair- , pairMisc- , unpairMisc- , swapBeforeCommutative- , justDrops- , justDoubleDrops- , dig1AndDug1AreSwap- , notIf- , dropMeta- -- strictly speaking, these rules below are de-optimisations, but they- -- expose opportunities for other optimisations, and they are undone in the- -- last stage.- , unrollPairN- , unrollUnpairN- , unrollDropN- , unrollDips- ]--flattenSeqLHS :: Rule -> Rule-flattenSeqLHS toplevel = Rule $ \case- it@(Seq (Seq _ _) _) -> Just $ linearizeAndReapply toplevel it- _ -> Nothing--dropMeta :: Rule-dropMeta = Rule $ \case- Meta _ i -> Just i- WithLoc _ i -> Just i- _ -> Nothing--removeNesting :: Rule-removeNesting = Rule $ \case- Nested i -> Just i- _ -> Nothing---- | STACKTYPE is currently a Nop and may safely be removed.-removeExtStackType :: Rule-removeExtStackType = Rule $ \case- Ext (STACKTYPE{}) -> Just Nop- _ -> Nothing--dipDrop2swapDrop :: Rule-dipDrop2swapDrop = Rule $ \case- DIP DROP -> Just $ SWAP :# DROP- _ -> Nothing--ifNopNop2Drop :: Rule-ifNopNop2Drop = Rule $ \case- IF Nop Nop -> Just DROP- _ -> Nothing--nopIsNeutralForSeq :: Rule-nopIsNeutralForSeq = Rule $ \case- -- NB: we're not using (:#) here because it'll always match when rhs is Nop- Seq Nop i -> Just i- Seq i Nop -> Just i- _ -> Nothing--variousNops :: Rule-variousNops = Rule $ \case- DUP :# DROP :# c -> Just c- DUPN _ :# DROP :# c -> Just c- SWAP :# SWAP :# c -> Just c- PUSH _ :# DROP :# c -> Just c- NONE :# DROP :# c -> Just c- UNIT :# DROP :# c -> Just c- NIL :# DROP :# c -> Just c- EMPTY_SET :# DROP :# c -> Just c- EMPTY_MAP :# DROP :# c -> Just c- EMPTY_BIG_MAP :# DROP :# c -> Just c- LAMBDA _ :# DROP :# c -> Just c- SELF _ :# DROP :# c -> Just c- NOW :# DROP :# c -> Just c- AMOUNT :# DROP :# c -> Just c- BALANCE :# DROP :# c -> Just c- TOTAL_VOTING_POWER :# DROP :# c -> Just c- SOURCE :# DROP :# c -> Just c- SENDER :# DROP :# c -> Just c- CHAIN_ID :# DROP :# c -> Just c- LEVEL :# DROP :# c -> Just c- SELF_ADDRESS :# DROP :# c -> Just c- READ_TICKET :# DROP :# c -> Just c- _ -> Nothing--dupSwap2dup :: Rule-dupSwap2dup = Rule $ \case- DUP :# SWAP :# c -> Just $ DUP :# c- _ -> Nothing--noDipNeeded :: Rule-noDipNeeded = Rule $ \case- -- If we put a constant value on stack and then do something under it,- -- we can do this "something" on original stack and then put that constant.- PUSH x :# DIP f :# c -> Just $ f :# PUSH x :# c- UNIT :# DIP f :# c -> Just $ f :# UNIT :# c- NOW :# DIP f :# c -> Just $ f :# NOW :# c- SENDER :# DIP f :# c -> Just $ f :# SENDER :# c- EMPTY_MAP :# DIP f :# c -> Just $ f :# EMPTY_MAP :# c- EMPTY_SET :# DIP f :# c -> Just $ f :# EMPTY_SET :# c-- -- If we do something ignoring top of the stack and then immediately- -- drop top of the stack, we can drop that item in advance and- -- not use 'DIP' at all.- DIP f :# DROP :# c -> Just $ DROP :# f :# c-- _ -> Nothing--unrollDips :: Rule-unrollDips = Rule go- where- go :: Instr inp out -> Maybe (Instr inp out)- go = \case- DIPN Zero c -> Just $ c- DIPN One c -> Just $ DIP c- DIPN (Succ n) c -> DIP <$> go (DIPN n c)- _ -> Nothing--rollDips :: Rule-rollDips = Rule $ \case- DIP (DIP c) -> Just $ DIPN Two c- DIP (DIPN n c) -> Just $ DIPN (Succ n) c- _ -> Nothing--branchShortCut :: Rule-branchShortCut = Rule $ \case- LEFT :# IF_LEFT f _ :# c -> Just $ f :# c- RIGHT :# IF_LEFT _ f :# c -> Just $ f :# c- CONS :# IF_CONS f _ :# c -> Just $ f :# c- NIL :# IF_CONS _ f :# c -> Just $ f :# c- NONE :# IF_NONE f _ :# c -> Just $ f :# c- SOME :# IF_NONE _ f :# c -> Just $ f :# c-- PUSH vOr@(VOr eitherVal) :# IF_LEFT f g :# c -> case vOr of- (_ :: Value ('TOr l r)) -> case eitherVal of- Left val -> case checkScope @(ConstantScope l) of- Right Dict -> Just $ PUSH val :# f :# c- _ -> Nothing- Right val -> case checkScope @(ConstantScope r) of- Right Dict -> Just $ PUSH val :# g :# c- _ -> Nothing- PUSH (VList (x : xs)) :# IF_CONS f _ :# c -> Just $ PUSH (VList xs) :# PUSH x :# f :# c- PUSH (VList _) :# IF_CONS _ f :# c -> Just $ f :# c- PUSH (VOption Nothing) :# IF_NONE f _ :# c -> Just $ f :# c- PUSH (VOption (Just val)) :# IF_NONE _ f :# c -> Just $ PUSH val :# f :# c- PUSH (VBool True) :# IF f _ :# c -> Just $ f :# c- PUSH (VBool False) :# IF _ f :# c -> Just $ f :# c- _ -> Nothing--compareWithZero :: Rule-compareWithZero = Rule $ \case- PUSH (VInt 0) :# COMPARE :# EQ :# c -> Just $ EQ :# c- PUSH (VNat 0) :# COMPARE :# EQ :# c -> Just $ INT :# EQ :# c- _ -> Nothing---- If an instruction takes another instruction as an argument and that--- internal instruction is 'Nop', sometimes the whole instruction is--- 'Nop'.--- For now we do it only for 'DIP', but ideally we should do it for--- 'MAP' as well (which is harder).-internalNop :: Rule-internalNop = Rule $ \case- DIP Nop -> Just Nop-- _ -> Nothing--simpleDups :: Rule-simpleDups = Rule $ \case- -- DUP 1 is just DUP- DUPN One -> Just DUP-- _ -> Nothing--adjacentDips :: Rule-adjacentDips = Rule $ \case- DIP f :# DIP g :# c -> Just $ DIP (f :# g) :# c-- _ -> Nothing--redundantIf :: Rule-redundantIf = Rule \case- IF x y- | x == y- -> Just $ DROP :# x- _ -> Nothing--emptyDip :: Rule-emptyDip = Rule \case- DIP Nop -> Just Nop- DIPN _ Nop -> Just Nop- _ -> Nothing--digDug :: Rule-digDug = Rule \case- DIG x :# DUG y :# c | Just Refl <- eqPeanoNat x y -> Just c- _ -> Nothing---- | Sequences of @DROP@s can be turned into single @DROP n@.--- When @n@ is greater than 2 it saves size and gas.--- When @n@ is 2 it saves gas only.-adjacentDrops :: Rule-adjacentDrops = Rule $ \case- DROP :# DROP :# c -> Just $ DROPN Two :# c-- (DROPN n :: Instr inp out) :# (DROP :: Instr inp' out') :# c- -> Just $ DROPN (Succ n) :# c \\ dropNDropNProof @inp @out @out' n One- \\ commutativity (singPeanoNat n) (singPeanoNat One)-- (DROP :: Instr inp out) :# (DROPN n :: Instr inp' out') :# c- -> Just $ DROPN (Succ n) :# c \\ dropNDropNProof @inp @out @out' One n-- (DROPN n :: Instr inp out) :# (DROPN m :: Instr inp' out') :# c- -> Just $ DROPN (addPeanoNat n m) :# c \\ dropNDropNProof @inp @out @out' n m-- _ -> Nothing--specificPush :: Rule-specificPush = Rule $ \case- push@PUSH{} :# c -> (:# c) <$> optimizePush push-- _ -> Nothing- where- optimizePush :: Instr inp out -> Maybe (Instr inp out)- optimizePush = \case- PUSH v | _ :: Value v <- v -> case v of- VUnit -> Just UNIT- VMap m- | null m -> case sing @v of STMap{} -> Just EMPTY_MAP- VSet m- | null m -> case sing @v of STSet{} -> Just EMPTY_SET- _ -> Nothing-- _ -> Nothing---isSomeOnIf :: Rule-isSomeOnIf = Rule $ \case- IF (PUSH (VOption Just{})) (PUSH (VOption Nothing))- :# IF_NONE (PUSH (VBool False)) (DROP :# PUSH (VBool True))- :# c- -> Just c- _ -> Nothing--pairUnpair :: Rule-pairUnpair = Rule $ \case- PAIR :# UNPAIR :# c -> Just c-- UNPAIR :# PAIR :# c -> Just c-- _ -> Nothing--pairMisc :: Rule-pairMisc = Rule $ \case- PAIR :# CDR :# c -> Just $ DROP :# c-- PAIR :# CAR :# c -> Just $ (DIP DROP) :# c-- _ -> Nothing--unpairMisc :: Rule-unpairMisc = Rule $ \case- DUP :# CAR :# DIP CDR :# c -> Just $ UNPAIR :# c-- DUP :# CDR :# DIP CAR :# c -> Just $ UNPAIR :# SWAP :# c-- UNPAIR :# DROP :# c -> Just $ CDR :# c- _ -> Nothing--unrollDropN :: Rule-unrollDropN = Rule go- where- go :: forall inp out. Instr inp out -> Maybe (Instr inp out)- go = \case- DROPN Zero -> Just Nop- DROPN (Succ n) -> do- dropn <- go $ DROPN n- Just $ DROP :# dropn- \\ unconsListProof @inp n- _ -> Nothing--unrollPairN :: Rule-unrollPairN = Rule go- where- go :: forall inp out. Instr inp out -> Maybe (Instr inp out)- go = \case- PAIRN Two -> Just PAIR \\ pairN2isPairProof @inp- PAIRN (Succ n@(Succ Succ{}) ) -> do- pairn <- go $ PAIRN n- Just $ DIP pairn :# PAIR- \\ unconsListProof @inp n- _ -> Nothing--unrollUnpairN :: Rule-unrollUnpairN = Rule go- where- go :: forall inp out. Instr inp out -> Maybe (Instr inp out)- go = \case- UNPAIRN Two -> Just UNPAIR \\ unpairN2isUnpairProof @inp @out- UNPAIRN (Succ n@(Succ Succ{})) -> do- unpairn <- go $ UNPAIRN n- Just $ UNPAIR :# DIP unpairn- \\ unpairNisUnpairDipUnpairNProof @inp @out n- _ -> Nothing--rollPairN :: Rule-rollPairN = Rule $ \case- DIP PAIR :# PAIR :# c -> Just $ PAIRN (Succ Two) :# c-- (DIP (PAIRN n@(Succ Succ{})) :: Instr inp out) :# PAIR :# c -> Just $ PAIRN (Succ n) :# c- \\ dipPairNPairIsPairNProof @inp n-- _ -> Nothing--rollUnpairN :: Rule-rollUnpairN = Rule $ \case- UNPAIR :# DIP UNPAIR :# c -> Just $ UNPAIRN (Succ Two) :# c- UNPAIR :# DIP (UNPAIRN n@(Succ Succ{})) :# c -> Just $ UNPAIRN (Succ n) :# c- _ -> Nothing--commuteArith ::- forall n m s out. Instr (n ': m ': s) out -> Maybe (Instr (m ': n ': s) out)-commuteArith = \case- ADD -> do Dict <- commutativityProof @Add @n @m; Just ADD- MUL -> do Dict <- commutativityProof @Mul @n @m; Just MUL- OR -> do Dict <- commutativityProof @Or @n @m; Just OR- AND -> do Dict <- commutativityProof @And @n @m; Just AND- XOR -> do Dict <- commutativityProof @Xor @n @m; Just XOR- _ -> Nothing--swapBeforeCommutative :: Rule-swapBeforeCommutative = Rule $ \case- SWAP :# i :# c -> (:# c) <$> commuteArith i-- _ -> Nothing--pushPack :: Rule-pushPack = Rule $ \case- PUSH x :# PACK :# c -> Just $ pushPacked x :# c-- _ -> Nothing- where- pushPacked :: PackedValScope t => Value t -> Instr s ('TBytes ': s)- pushPacked = PUSH . VBytes . packValue'--justDrops :: Rule-justDrops = Rule $ \case- CAR :# DROP :# c -> Just $ DROP :# c- CDR :# DROP :# c -> Just $ DROP :# c- SOME :# DROP :# c -> Just $ DROP :# c- LEFT :# DROP :# c -> Just $ DROP :# c- RIGHT :# DROP :# c -> Just $ DROP :# c- SIZE :# DROP :# c -> Just $ DROP :# c- GETN _ :# DROP :# c -> Just $ DROP :# c- CAST :# DROP :# c -> Just $ DROP :# c- RENAME :# DROP :# c -> Just $ DROP :# c- PACK :# DROP :# c -> Just $ DROP :# c- UNPACK :# DROP :# c -> Just $ DROP :# c- CONCAT' :# DROP :# c -> Just $ DROP :# c- ISNAT :# DROP :# c -> Just $ DROP :# c- ABS :# DROP :# c -> Just $ DROP :# c- NEG :# DROP :# c -> Just $ DROP :# c- NOT :# DROP :# c -> Just $ DROP :# c- EQ :# DROP :# c -> Just $ DROP :# c- NEQ :# DROP :# c -> Just $ DROP :# c- LT :# DROP :# c -> Just $ DROP :# c- GT :# DROP :# c -> Just $ DROP :# c- LE :# DROP :# c -> Just $ DROP :# c- GE :# DROP :# c -> Just $ DROP :# c- INT :# DROP :# c -> Just $ DROP :# c- CONTRACT _ :# DROP :# c -> Just $ DROP :# c- SET_DELEGATE :# DROP :# c -> Just $ DROP :# c- IMPLICIT_ACCOUNT :# DROP :# c -> Just $ DROP :# c- VOTING_POWER :# DROP :# c -> Just $ DROP :# c- SHA256 :# DROP :# c -> Just $ DROP :# c- SHA512 :# DROP :# c -> Just $ DROP :# c- BLAKE2B :# DROP :# c -> Just $ DROP :# c- SHA3 :# DROP :# c -> Just $ DROP :# c- KECCAK :# DROP :# c -> Just $ DROP :# c- HASH_KEY :# DROP :# c -> Just $ DROP :# c- PAIRING_CHECK :# DROP :# c -> Just $ DROP :# c- ADDRESS :# DROP :# c -> Just $ DROP :# c- JOIN_TICKETS :# DROP :# c -> Just $ DROP :# c- _ -> Nothing--justDoubleDrops :: Rule-justDoubleDrops = Rule $ \case- PAIR :# DROP :# c -> Just $ DROP :# DROP :# c- MEM :# DROP :# c -> Just $ DROP :# DROP :# c- GET :# DROP :# c -> Just $ DROP :# DROP :# c- APPLY :# DROP :# c -> Just $ DROP :# DROP :# c- CONCAT :# DROP :# c -> Just $ DROP :# DROP :# c- ADD :# DROP :# c -> Just $ DROP :# DROP :# c- SUB :# DROP :# c -> Just $ DROP :# DROP :# c- SUB_MUTEZ :# DROP :# c -> Just $ DROP :# DROP :# c- MUL :# DROP :# c -> Just $ DROP :# DROP :# c- EDIV :# DROP :# c -> Just $ DROP :# DROP :# c- OR :# DROP :# c -> Just $ DROP :# DROP :# c- AND :# DROP :# c -> Just $ DROP :# DROP :# c- XOR :# DROP :# c -> Just $ DROP :# DROP :# c- COMPARE :# DROP :# c -> Just $ DROP :# DROP :# c- TICKET :# DROP :# c -> Just $ DROP :# DROP :# c- SPLIT_TICKET :# DROP :# c -> Just $ DROP :# DROP :# c- SWAP :# DROP :# DROP :# c -> Just $ DROP :# DROP :# c- _ -> Nothing--dig1AndDug1AreSwap :: Rule-dig1AndDug1AreSwap = Rule \case- DUG One -> Just SWAP- DIG One -> Just SWAP- _ -> Nothing--notIf :: Rule-notIf = Rule \case- (NOT :: Instr inp out) :# IF a b :# c | STBool <- sing @(Head inp) -> Just $ IF b a :# c- _ -> Nothing---- | Append LHS of v'Seq' to RHS and re-run pointwise ocRuleset at each point.--- That might cause reinvocation of this function (see 'defaultRules'),--- but effectively this ensures it will flatten any v'Seq'-tree right-to-left,--- while evaling no more than once on each node.------ The reason this function invokes ocRuleset is when you append an instr--- to already-optimised RHS of v'Seq', you might get an optimisable tree.------ The argument is a local, non-structurally-recursive ocRuleset.-linearizeAndReapply :: Rule -> Instr inp out -> Instr inp out-linearizeAndReapply restart = snd . \case- Seq (Seq a b) c ->- applyOnce restart $ Seq a (linearizeAndReapply restart (Seq b c))-- other -> applyOnce restart other--------------------------------------------------------------------------------- Generic functions working with rules--------------------------------------------------------------------------------- | Combine two rule fixpoints.-orRule :: (Rule -> Rule) -> (Rule -> Rule) -> (Rule -> Rule)-orRule l r topl = Rule $ \instr ->- (unRule (l topl) $ instr) <|> (unRule (r topl) $ instr)---- | Combine a rule fixpoint and a simple rule.-orSimpleRule :: (Rule -> Rule) -> Rule -> (Rule -> Rule)-orSimpleRule l r topl = Rule $ \instr ->- (unRule (l topl) $ instr) <|> (unRule r $ instr)---- | Turn rule fixpoint into rule.-fixpoint :: (Rule -> Rule) -> Rule-fixpoint r = go- where- go :: Rule- go = whileApplies (r go)---- | Apply the rule once, if it fails, return the instruction unmodified.------ Also returns a flag showing whether the rule succeeded or not.-applyOnce :: Rule -> Instr inp out -> (Any Bool, Instr inp out)-applyOnce r i = maybe (pure i) (Any True,) (unRule r $ i)---- | Apply a rule to the same code, until it fails.-whileApplies :: Rule -> Rule-whileApplies r = Rule $ go <=< unRule r- -- NB: if the rule doesn't apply even once, we want to return Nothing here,- -- hence it's first applied above and only if successful goes into recursion.- where- go :: Instr inp out -> Maybe (Instr inp out)- go i = maybe (Just i) go (unRule r i)--------------------------------------------------------------------------------- TH----------------------------------------------------------------------------- makeLensesFor [("ocGotoValues", "ocGotoValuesL")] ''OptimizerConf
+ src/Morley/Michelson/Optimizer/Internal/Rules.hs view
@@ -0,0 +1,526 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++-- NOTE this pragmas.+-- We disable some warnings for the sake of speed up.+-- Write code with care.+{-# OPTIONS_GHC -Wno-incomplete-patterns #-}+{-# OPTIONS_GHC -Wno-overlapping-patterns #-}++-- | Optimizer rewrite rules+module Morley.Michelson.Optimizer.Internal.Rules+ ( module Morley.Michelson.Optimizer.Internal.Rules+ ) where++import Prelude hiding (EQ, GT, LT)++import Data.Constraint (Dict(..), (\\))+import Data.Default (Default(def))+import Data.Singletons (sing)+import Data.Type.Equality ((:~:)(Refl))++import Morley.Michelson.Interpret.Pack (packValue')+import Morley.Michelson.Optimizer.Internal.Proofs+import Morley.Michelson.Optimizer.Internal.Ruleset+import Morley.Michelson.Optimizer.Utils+import Morley.Michelson.Typed.Aliases (Value)+import Morley.Michelson.Typed.Arith+import Morley.Michelson.Typed.Instr hiding ((:#))+import Morley.Michelson.Typed.Scope (ConstantScope, PackedValScope, checkScope)+import Morley.Michelson.Typed.Sing+import Morley.Michelson.Typed.T+import Morley.Michelson.Typed.Value+import Morley.Util.Peano+import Morley.Util.PeanoNatural++{-+Note [Writing optimizer rules]+------------------------------++We locally redefine (:#) to simplify handling instruction sequence tails.+Consider that a given instruction sequence can appear in the middle, and then @a+:# b :# tail@ will match, or at the end of the sequence, and then @a :# b@ will+match.++Local definition of (:#) makes it so we can always assume there's a tail.+However, we don't need it when matching on single instructions.++Thus, the rule of thumb is this: if you're matching on a single instruction,+everything is fine. If you're matching on a sequence, i.e. using (:#), then+always match on tail.+-}++-- | Default optimization rules.+defaultRules :: Ruleset+defaultRules = foldr ($) def $ uncurry (alterRulesAtPrio . const) <$>+ -- NB: if adding more main stages, remember to check if+ -- 'defaultRulesAndPushPack' needs updating.+ [ (mainStageRules , OptimizationStageMain 0)+ , (dipDrop2swapDropStageRules , OptimizationStageMainExtended 0)+ , (fixupStageRules , OptimizationStageFixup 0)+ , (glueAdjacentInstrsStageRules, OptimizationStageRollAdjacent 0)+ ]+ where+ dipDrop2swapDropStageRules = dipDrop2swapDrop : mainStageRules+ fixupStageRules = [dipSwapDrop]+ glueAdjacentInstrsStageRules =+ [ adjacentDrops+ , rollPairN+ , rollUnpairN+ , rollDips+ ]++-- | We do not enable 'pushPack' rule by default because it is potentially+-- dangerous. There are various code processing functions that may depend on+-- constants, e. g. string transformations.+defaultRulesAndPushPack :: Ruleset+defaultRulesAndPushPack = defaultRules+ & insertRuleAtPrio (OptimizationStageMainExtended 0) pushPack++mainStageRules :: [Rule]+mainStageRules =+ [ removeNesting+ , removeExtStackType+ , ifNopNop2Drop+ , nopIsNeutralForSeq+ , variousNops+ , dupSwap2dup+ , noDipNeeded+ , branchShortCut+ , compareWithZero+ , internalNop+ , simpleDups+ , adjacentDips+ , isSomeOnIf+ , redundantIf+ , emptyDip+ , digDug+ , specificPush+ , pairUnpair+ , pairMisc+ , unpairMisc+ , swapBeforeCommutative+ , justDrops+ , justDoubleDrops+ , dig1AndDug1AreSwap+ , notIf+ , dropMeta+ , dupDugDrop+ -- strictly speaking, these rules below are de-optimisations, but they+ -- expose opportunities for other optimisations, and they are undone in the+ -- last stage.+ , unrollPairN+ , unrollUnpairN+ , unrollDropN+ , unrollDips+ ]++flattenSeqLHS :: Rule -> Rule+flattenSeqLHS toplevel = Rule $ \case+ it@(Seq (Seq _ _) _) -> Just $ linearizeAndReapply toplevel it+ _ -> Nothing++dropMeta :: Rule+dropMeta = Rule $ \case+ Meta _ i -> Just i+ WithLoc _ i -> Just i+ _ -> Nothing++removeNesting :: Rule+removeNesting = Rule $ \case+ Nested i -> Just i+ _ -> Nothing++-- | STACKTYPE is currently a Nop and may safely be removed.+removeExtStackType :: Rule+removeExtStackType = Rule $ \case+ Ext (STACKTYPE{}) -> Just Nop+ _ -> Nothing++dipDrop2swapDrop :: Rule+dipDrop2swapDrop = Rule $ \case+ DIP DROP -> Just $ SWAP :# DROP+ _ -> Nothing++ifNopNop2Drop :: Rule+ifNopNop2Drop = Rule $ \case+ IF Nop Nop -> Just DROP+ _ -> Nothing++nopIsNeutralForSeq :: Rule+nopIsNeutralForSeq = Rule $ \case+ -- NB: we're not using (:#) here because it'll always match when rhs is Nop+ Seq Nop i -> Just i+ Seq i Nop -> Just i+ _ -> Nothing++variousNops :: Rule+variousNops = Rule $ \case+ DUP :# DROP :# c -> Just c+ DUPN _ :# DROP :# c -> Just c+ SWAP :# SWAP :# c -> Just c+ PUSH _ :# DROP :# c -> Just c+ NONE :# DROP :# c -> Just c+ UNIT :# DROP :# c -> Just c+ NIL :# DROP :# c -> Just c+ EMPTY_SET :# DROP :# c -> Just c+ EMPTY_MAP :# DROP :# c -> Just c+ EMPTY_BIG_MAP :# DROP :# c -> Just c+ LAMBDA _ :# DROP :# c -> Just c+ SELF _ :# DROP :# c -> Just c+ NOW :# DROP :# c -> Just c+ AMOUNT :# DROP :# c -> Just c+ BALANCE :# DROP :# c -> Just c+ TOTAL_VOTING_POWER :# DROP :# c -> Just c+ SOURCE :# DROP :# c -> Just c+ SENDER :# DROP :# c -> Just c+ CHAIN_ID :# DROP :# c -> Just c+ LEVEL :# DROP :# c -> Just c+ SELF_ADDRESS :# DROP :# c -> Just c+ READ_TICKET :# DROP :# c -> Just c+ _ -> Nothing++dupSwap2dup :: Rule+dupSwap2dup = Rule $ \case+ DUP :# SWAP :# c -> Just $ DUP :# c+ _ -> Nothing++noDipNeeded :: Rule+noDipNeeded = Rule $ \case+ -- If we put a constant value on stack and then do something under it,+ -- we can do this "something" on original stack and then put that constant.+ PUSH x :# DIP f :# c -> Just $ f :# PUSH x :# c+ UNIT :# DIP f :# c -> Just $ f :# UNIT :# c+ NOW :# DIP f :# c -> Just $ f :# NOW :# c+ SENDER :# DIP f :# c -> Just $ f :# SENDER :# c+ EMPTY_MAP :# DIP f :# c -> Just $ f :# EMPTY_MAP :# c+ EMPTY_SET :# DIP f :# c -> Just $ f :# EMPTY_SET :# c++ -- If we do something ignoring top of the stack and then immediately+ -- drop top of the stack, we can drop that item in advance and+ -- not use 'DIP' at all.+ DIP f :# DROP :# c -> Just $ DROP :# f :# c++ _ -> Nothing++unrollDips :: Rule+unrollDips = Rule go+ where+ go :: Instr inp out -> Maybe (Instr inp out)+ go = \case+ DIPN Zero c -> Just $ c+ DIPN One c -> Just $ DIP c+ DIPN (Succ n) c -> DIP <$> go (DIPN n c)+ _ -> Nothing++rollDips :: Rule+rollDips = Rule $ \case+ DIP (DIP c) -> Just $ DIPN Two c+ DIP (DIPN n c) -> Just $ DIPN (Succ n) c+ _ -> Nothing++branchShortCut :: Rule+branchShortCut = Rule $ \case+ LEFT :# IF_LEFT f _ :# c -> Just $ f :# c+ RIGHT :# IF_LEFT _ f :# c -> Just $ f :# c+ CONS :# IF_CONS f _ :# c -> Just $ f :# c+ NIL :# IF_CONS _ f :# c -> Just $ f :# c+ NONE :# IF_NONE f _ :# c -> Just $ f :# c+ SOME :# IF_NONE _ f :# c -> Just $ f :# c++ PUSH vOr@(VOr eitherVal) :# IF_LEFT f g :# c -> case vOr of+ (_ :: Value ('TOr l r)) -> case eitherVal of+ Left val -> case checkScope @(ConstantScope l) of+ Right Dict -> Just $ PUSH val :# f :# c+ _ -> Nothing+ Right val -> case checkScope @(ConstantScope r) of+ Right Dict -> Just $ PUSH val :# g :# c+ _ -> Nothing+ PUSH (VList (x : xs)) :# IF_CONS f _ :# c -> Just $ PUSH (VList xs) :# PUSH x :# f :# c+ PUSH (VList _) :# IF_CONS _ f :# c -> Just $ f :# c+ PUSH (VOption Nothing) :# IF_NONE f _ :# c -> Just $ f :# c+ PUSH (VOption (Just val)) :# IF_NONE _ f :# c -> Just $ PUSH val :# f :# c+ PUSH (VBool True) :# IF f _ :# c -> Just $ f :# c+ PUSH (VBool False) :# IF _ f :# c -> Just $ f :# c+ _ -> Nothing++compareWithZero :: Rule+compareWithZero = Rule $ \case+ PUSH (VInt 0) :# COMPARE :# EQ :# c -> Just $ EQ :# c+ PUSH (VNat 0) :# COMPARE :# EQ :# c -> Just $ INT :# EQ :# c+ _ -> Nothing++-- If an instruction takes another instruction as an argument and that+-- internal instruction is 'Nop', sometimes the whole instruction is+-- 'Nop'.+-- For now we do it only for 'DIP', but ideally we should do it for+-- 'MAP' as well (which is harder).+internalNop :: Rule+internalNop = Rule $ \case+ DIP Nop -> Just Nop++ _ -> Nothing++simpleDups :: Rule+simpleDups = Rule $ \case+ -- DUP 1 is just DUP+ DUPN One -> Just DUP++ _ -> Nothing++adjacentDips :: Rule+adjacentDips = Rule $ \case+ DIP f :# DIP g :# c -> Just $ DIP (f :# g) :# c++ _ -> Nothing++redundantIf :: Rule+redundantIf = Rule \case+ IF x y+ | x == y+ -> Just $ DROP :# x+ _ -> Nothing++emptyDip :: Rule+emptyDip = Rule \case+ DIP Nop -> Just Nop+ DIPN _ Nop -> Just Nop+ _ -> Nothing++digDug :: Rule+digDug = Rule \case+ DIG x :# DUG y :# c | Just Refl <- eqPeanoNat x y -> Just c+ _ -> Nothing++-- | Sequences of @DROP@s can be turned into single @DROP n@.+-- When @n@ is greater than 2 it saves size and gas.+-- When @n@ is 2 it saves gas only.+adjacentDrops :: Rule+adjacentDrops = Rule $ \case+ DROP :# DROP :# c -> Just $ DROPN Two :# c++ (DROPN n :: Instr inp out) :# (DROP :: Instr inp' out') :# c+ -> Just $ DROPN (Succ n) :# c \\ dropNDropNProof @inp @out @out' n One+ \\ commutativity (singPeanoNat n) (singPeanoNat One)++ (DROP :: Instr inp out) :# (DROPN n :: Instr inp' out') :# c+ -> Just $ DROPN (Succ n) :# c \\ dropNDropNProof @inp @out @out' One n++ (DROPN n :: Instr inp out) :# (DROPN m :: Instr inp' out') :# c+ -> Just $ DROPN (addPeanoNat n m) :# c \\ dropNDropNProof @inp @out @out' n m++ _ -> Nothing++specificPush :: Rule+specificPush = Rule $ \case+ push@PUSH{} :# c -> (:# c) <$> optimizePush push++ _ -> Nothing+ where+ optimizePush :: Instr inp out -> Maybe (Instr inp out)+ optimizePush = \case+ PUSH v | _ :: Value v <- v -> case v of+ VUnit -> Just UNIT+ VMap m+ | null m -> case sing @v of STMap{} -> Just EMPTY_MAP+ VSet m+ | null m -> case sing @v of STSet{} -> Just EMPTY_SET+ _ -> Nothing++ _ -> Nothing+++isSomeOnIf :: Rule+isSomeOnIf = Rule $ \case+ IF (PUSH (VOption Just{})) (PUSH (VOption Nothing))+ :# IF_NONE (PUSH (VBool False)) (DROP :# PUSH (VBool True))+ :# c+ -> Just c+ _ -> Nothing++pairUnpair :: Rule+pairUnpair = Rule $ \case+ PAIR :# UNPAIR :# c -> Just c++ UNPAIR :# PAIR :# c -> Just c++ _ -> Nothing++pairMisc :: Rule+pairMisc = Rule $ \case+ PAIR :# CDR :# c -> Just $ DROP :# c++ PAIR :# CAR :# c -> Just $ (DIP DROP) :# c++ _ -> Nothing++unpairMisc :: Rule+unpairMisc = Rule $ \case+ DUP :# CAR :# DIP CDR :# c -> Just $ UNPAIR :# c++ DUP :# CDR :# DIP CAR :# c -> Just $ UNPAIR :# SWAP :# c++ UNPAIR :# DROP :# c -> Just $ CDR :# c+ _ -> Nothing++unrollDropN :: Rule+unrollDropN = Rule go+ where+ go :: forall inp out. Instr inp out -> Maybe (Instr inp out)+ go = \case+ DROPN Zero -> Just Nop+ DROPN (Succ n) -> do+ dropn <- go $ DROPN n+ Just $ DROP :# dropn+ \\ unconsListProof @inp n+ _ -> Nothing++unrollPairN :: Rule+unrollPairN = Rule go+ where+ go :: forall inp out. Instr inp out -> Maybe (Instr inp out)+ go = \case+ PAIRN Two -> Just PAIR \\ pairN2isPairProof @inp+ PAIRN (Succ n@(Succ Succ{}) ) -> do+ pairn <- go $ PAIRN n+ Just $ DIP pairn :# PAIR+ \\ unconsListProof @inp n+ _ -> Nothing++unrollUnpairN :: Rule+unrollUnpairN = Rule go+ where+ go :: forall inp out. Instr inp out -> Maybe (Instr inp out)+ go = \case+ UNPAIRN Two -> Just UNPAIR \\ unpairN2isUnpairProof @inp @out+ UNPAIRN (Succ n@(Succ Succ{})) -> do+ unpairn <- go $ UNPAIRN n+ Just $ UNPAIR :# DIP unpairn+ \\ unpairNisUnpairDipUnpairNProof @inp @out n+ _ -> Nothing++rollPairN :: Rule+rollPairN = Rule $ \case+ DIP PAIR :# PAIR :# c -> Just $ PAIRN (Succ Two) :# c++ (DIP (PAIRN n@(Succ Succ{})) :: Instr inp out) :# PAIR :# c -> Just $ PAIRN (Succ n) :# c+ \\ dipPairNPairIsPairNProof @inp n++ _ -> Nothing++rollUnpairN :: Rule+rollUnpairN = Rule $ \case+ UNPAIR :# DIP UNPAIR :# c -> Just $ UNPAIRN (Succ Two) :# c+ UNPAIR :# DIP (UNPAIRN n@(Succ Succ{})) :# c -> Just $ UNPAIRN (Succ n) :# c+ _ -> Nothing++commuteArith ::+ forall n m s out. Instr (n ': m ': s) out -> Maybe (Instr (m ': n ': s) out)+commuteArith = \case+ ADD -> do Dict <- commutativityProof @Add @n @m; Just ADD+ MUL -> do Dict <- commutativityProof @Mul @n @m; Just MUL+ OR -> do Dict <- commutativityProof @Or @n @m; Just OR+ AND -> do Dict <- commutativityProof @And @n @m; Just AND+ XOR -> do Dict <- commutativityProof @Xor @n @m; Just XOR+ _ -> Nothing++swapBeforeCommutative :: Rule+swapBeforeCommutative = Rule $ \case+ SWAP :# i :# c -> (:# c) <$> commuteArith i++ _ -> Nothing++pushPack :: Rule+pushPack = Rule $ \case+ PUSH x :# PACK :# c -> Just $ pushPacked x :# c++ _ -> Nothing+ where+ pushPacked :: PackedValScope t => Value t -> Instr s ('TBytes ': s)+ pushPacked = PUSH . VBytes . packValue'++justDrops :: Rule+justDrops = Rule $ \case+ CAR :# DROP :# c -> Just $ DROP :# c+ CDR :# DROP :# c -> Just $ DROP :# c+ SOME :# DROP :# c -> Just $ DROP :# c+ LEFT :# DROP :# c -> Just $ DROP :# c+ RIGHT :# DROP :# c -> Just $ DROP :# c+ SIZE :# DROP :# c -> Just $ DROP :# c+ GETN _ :# DROP :# c -> Just $ DROP :# c+ CAST :# DROP :# c -> Just $ DROP :# c+ RENAME :# DROP :# c -> Just $ DROP :# c+ PACK :# DROP :# c -> Just $ DROP :# c+ UNPACK :# DROP :# c -> Just $ DROP :# c+ CONCAT' :# DROP :# c -> Just $ DROP :# c+ ISNAT :# DROP :# c -> Just $ DROP :# c+ ABS :# DROP :# c -> Just $ DROP :# c+ NEG :# DROP :# c -> Just $ DROP :# c+ NOT :# DROP :# c -> Just $ DROP :# c+ EQ :# DROP :# c -> Just $ DROP :# c+ NEQ :# DROP :# c -> Just $ DROP :# c+ LT :# DROP :# c -> Just $ DROP :# c+ GT :# DROP :# c -> Just $ DROP :# c+ LE :# DROP :# c -> Just $ DROP :# c+ GE :# DROP :# c -> Just $ DROP :# c+ INT :# DROP :# c -> Just $ DROP :# c+ CONTRACT _ :# DROP :# c -> Just $ DROP :# c+ SET_DELEGATE :# DROP :# c -> Just $ DROP :# c+ IMPLICIT_ACCOUNT :# DROP :# c -> Just $ DROP :# c+ VOTING_POWER :# DROP :# c -> Just $ DROP :# c+ SHA256 :# DROP :# c -> Just $ DROP :# c+ SHA512 :# DROP :# c -> Just $ DROP :# c+ BLAKE2B :# DROP :# c -> Just $ DROP :# c+ SHA3 :# DROP :# c -> Just $ DROP :# c+ KECCAK :# DROP :# c -> Just $ DROP :# c+ HASH_KEY :# DROP :# c -> Just $ DROP :# c+ PAIRING_CHECK :# DROP :# c -> Just $ DROP :# c+ ADDRESS :# DROP :# c -> Just $ DROP :# c+ JOIN_TICKETS :# DROP :# c -> Just $ DROP :# c+ _ -> Nothing++justDoubleDrops :: Rule+justDoubleDrops = Rule $ \case+ PAIR :# DROP :# c -> Just $ DROP :# DROP :# c+ MEM :# DROP :# c -> Just $ DROP :# DROP :# c+ GET :# DROP :# c -> Just $ DROP :# DROP :# c+ APPLY :# DROP :# c -> Just $ DROP :# DROP :# c+ CONCAT :# DROP :# c -> Just $ DROP :# DROP :# c+ ADD :# DROP :# c -> Just $ DROP :# DROP :# c+ SUB :# DROP :# c -> Just $ DROP :# DROP :# c+ SUB_MUTEZ :# DROP :# c -> Just $ DROP :# DROP :# c+ MUL :# DROP :# c -> Just $ DROP :# DROP :# c+ EDIV :# DROP :# c -> Just $ DROP :# DROP :# c+ OR :# DROP :# c -> Just $ DROP :# DROP :# c+ AND :# DROP :# c -> Just $ DROP :# DROP :# c+ XOR :# DROP :# c -> Just $ DROP :# DROP :# c+ COMPARE :# DROP :# c -> Just $ DROP :# DROP :# c+ TICKET :# DROP :# c -> Just $ DROP :# DROP :# c+ SPLIT_TICKET :# DROP :# c -> Just $ DROP :# DROP :# c+ SWAP :# DROP :# DROP :# c -> Just $ DROP :# DROP :# c+ _ -> Nothing++dig1AndDug1AreSwap :: Rule+dig1AndDug1AreSwap = Rule \case+ DUG One -> Just SWAP+ DIG One -> Just SWAP+ _ -> Nothing++notIf :: Rule+notIf = Rule \case+ (NOT :: Instr inp out) :# IF a b :# c | STBool <- sing @(Head inp) -> Just $ IF b a :# c+ _ -> Nothing++-- | NB: This rule MUST be applied AFTER all main stages, but BEFORE nested dips+-- are rolled up+dipSwapDrop :: Rule+dipSwapDrop = Rule \case+ DIP (SWAP :# DROP) -> Just $ DIPN Two DROP+ _ -> Nothing++dupDugDrop :: Rule+dupDugDrop = Rule \case+ DUP :# DUG (Succ m) :# DROP :# xs -> Just $ DUG m :# xs+ _ -> Nothing
+ src/Morley/Michelson/Optimizer/Internal/Ruleset.hs view
@@ -0,0 +1,78 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++-- | Optimizer rule and ruleset definitions.+module Morley.Michelson.Optimizer.Internal.Ruleset+ ( module Morley.Michelson.Optimizer.Internal.Ruleset+ ) where++import Prelude++import Data.Default (Default(def))+import Data.Map qualified as Map+import Fmt (Buildable(..), (+|), (|+))++import Morley.Michelson.Typed.Instr++-- | Type of a single rewrite rule, wrapped in `newtype`. It takes an+-- instruction and tries to optimize its head (first few instructions). If+-- optimization succeeds, it returns `Just` the optimized instruction, otherwise+-- it returns `Nothing`.+newtype Rule = Rule {unRule :: forall inp out. Instr inp out -> Maybe (Instr inp out)}++-- | Optimization stages. Stages are run in first to last order, each stage has+-- an 'Int' argument, which allows splitting each stage into sub-stages, which+-- will run lowest index to highest. All default rules use sub-stage @0@.+data OptimizationStage+ = OptimizationStagePrepare Int+ | OptimizationStageMain Int+ -- ^ Main optimisation stage, except rules that would interfere with other+ -- rules.+ | OptimizationStageMainExtended Int+ -- ^ All main stage rules.+ | OptimizationStageFixup Int+ -- ^ Post main stage fixups.+ | OptimizationStageRollAdjacent Int+ -- ^ Main stage rules unroll @DROP n@, @PAIR n@, etc into their primitive+ -- counterparts to simplify some optimisations. This stages coalesces them+ -- back.+ deriving stock (Eq, Ord)++instance Buildable OptimizationStage where+ build = \case+ OptimizationStagePrepare n -> "prepare " +| n |+ ""+ OptimizationStageMain n -> "main " +| n |+ ""+ OptimizationStageMainExtended n -> "main extended " +| n |+ ""+ OptimizationStageFixup n -> "fixup " +| n |+ ""+ OptimizationStageRollAdjacent n -> "roll adjacent " +| n |+ ""++-- | A set of optimization stages. Rules at the same sub-stage are applied in+-- arbitrary order. See 'OptimizationStage' for explanation of sub-stages.+--+-- 'Default' ruleset is empty.+newtype Ruleset = Ruleset { unRuleset :: Map OptimizationStage (NonEmpty Rule) }+ deriving newtype Default++instance Semigroup Ruleset where+ Ruleset l <> Ruleset r = Ruleset $ Map.unionWith (<>) l r++instance Monoid Ruleset where+ mempty = def++-- | Get rules for a given priority as a list.+rulesAtPrio :: OptimizationStage -> Ruleset -> [Rule]+rulesAtPrio prio = maybe [] toList . Map.lookup prio . unRuleset++-- | Insert a single rule at a given priority without touching other rules.+insertRuleAtPrio :: OptimizationStage -> Rule -> Ruleset -> Ruleset+insertRuleAtPrio = flip $ alterRulesAtPrio . (:)++-- | Remove the stage with the given priority.+clearRulesAtPrio :: OptimizationStage -> Ruleset -> Ruleset+clearRulesAtPrio = alterRulesAtPrio (const [])++-- | Alter all stage rules for a given priority.+alterRulesAtPrio :: ([Rule] -> [Rule]) -> OptimizationStage -> Ruleset -> Ruleset+alterRulesAtPrio f prio = Ruleset . Map.alter (nonEmpty . f . maybe [] toList) prio . unRuleset
+ src/Morley/Michelson/Optimizer/Utils.hs view
@@ -0,0 +1,107 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++-- | Utilities for writing optimizer rules.+module Morley.Michelson.Optimizer.Utils+ ( pattern (:#)+ , orRule+ , orSimpleRule+ , fixpoint+ , applyOnce+ , whileApplies+ , linearizeAndReapply+ ) where++import Morley.Michelson.Optimizer.Internal.Ruleset (Rule(..))+import Morley.Michelson.Typed.Instr hiding ((:#))++{- | This is a redefinition of @(:#)@ from "Morley.Michelson.Typed.Instr" that+is particularly useful for writing optimizer rules. When matching on an+instruction @x@ that isn't v'Seq', it behaves as if it matched on @x :# Nop@.++When constructing instructions using this pattern, @Nop@ is automatically+removed.++To understand why this is useful, consider that a given instruction sequence can+appear in the middle of a sequence, and then @a :# b :# tail@ will match, or at+the end of the sequence, and then @a :# b@ will match. Thus, to cover all cases+one would have to duplicate most rules.++This definition of @(:#)@ makes it so we can always assume there's a @tail@.+However, we don't need it when matching on single instructions.++Thus, the rule of thumb is this: if you're matching on a single instruction,+everything is fine. If you're matching on a sequence, i.e. using (:#), then+always match on tail, e.g.++@+dupSwap2dup :: Rule+dupSwap2dup = Rule $ \case+ DUP :# SWAP :# c -> Just $ DUP :# c+ _ -> Nothing+@++But this works, too:++@+ifNopNop2Drop :: Rule+ifNopNop2Drop = Rule $ \case+ IF Nop Nop -> Just DROP+ _ -> Nothing+@++-}+pattern (:#) :: Instr inp b -> Instr b out -> Instr inp out+pattern l :# r <- (\case { x@Seq{} -> x; x -> Seq x Nop } -> Seq l r)+ where l :# Nop = l+ Nop :# r = r+ l :# r = Seq l r+infixr 8 :#++-- | Combine two rule fixpoints.+orRule :: (Rule -> Rule) -> (Rule -> Rule) -> (Rule -> Rule)+orRule l r topl = Rule $ \instr ->+ (unRule (l topl) $ instr) <|> (unRule (r topl) $ instr)++-- | Combine a rule fixpoint and a simple rule.+orSimpleRule :: (Rule -> Rule) -> Rule -> (Rule -> Rule)+orSimpleRule l r topl = Rule $ \instr ->+ (unRule (l topl) $ instr) <|> (unRule r $ instr)++-- | Turn rule fixpoint into rule.+fixpoint :: (Rule -> Rule) -> Rule+fixpoint r = go+ where+ go :: Rule+ go = whileApplies (r go)++-- | Apply the rule once, if it fails, return the instruction unmodified.+--+-- Also returns a flag showing whether the rule succeeded or not.+applyOnce :: Rule -> Instr inp out -> (Any Bool, Instr inp out)+applyOnce r i = maybe (pure i) (Any True,) (unRule r $ i)++-- | Apply a rule to the same code, until it fails.+whileApplies :: Rule -> Rule+whileApplies r = Rule $ go <=< unRule r+ -- NB: if the rule doesn't apply even once, we want to return Nothing here,+ -- hence it's first applied above and only if successful goes into recursion.+ where+ go :: Instr inp out -> Maybe (Instr inp out)+ go i = maybe (Just i) go (unRule r i)++-- | Append LHS of v'Seq' to RHS and re-run pointwise ocRuleset at each point.+-- That might cause reinvocation of this function (see @defaultRule@'),+-- but effectively this ensures it will flatten any v'Seq'-tree right-to-left,+-- while evaling no more than once on each node.+--+-- The reason this function invokes ocRuleset is when you append an instr+-- to already-optimised RHS of v'Seq', you might get an optimisable tree.+--+-- The argument is a local, non-structurally-recursive ocRuleset.+linearizeAndReapply :: Rule -> Instr inp out -> Instr inp out+linearizeAndReapply restart = snd . \case+ Seq (Seq a b) c ->+ applyOnce restart $ Seq a (linearizeAndReapply restart (Seq b c))++ other -> applyOnce restart other
src/Morley/Michelson/Parser.hs view
@@ -22,6 +22,7 @@ , parseValue , parseExpandValue , parseType+ , rawOpsSequence -- * For tests , codeEntry@@ -44,17 +45,17 @@ import Prelude hiding (try) -import Fmt (pretty, (+|), (|+))+import Data.Default (def)+import Fmt (nameF, pretty, unlinesF, (+|), (|+)) import Language.Haskell.TH qualified as TH import Language.Haskell.TH.Quote qualified as TH import Language.Haskell.TH.Syntax qualified as TH import Text.Megaparsec- (Parsec, choice, eitherP, eof, errorBundlePretty, getSourcePos, hidden, lookAhead, parse,- sepEndBy, try)+ (Parsec, choice, eitherP, eof, errorBundlePretty, getSourcePos, hidden, parse, sepEndBy, try) import Text.Megaparsec.Pos (SourcePos(..), unPos) import Morley.Michelson.ErrorPos (SrcPos(..), mkPos)-import Morley.Michelson.Macro (Macro(..), ParsedInstr, ParsedOp(..), ParsedValue, expandValue)+import Morley.Michelson.Macro import Morley.Michelson.Parser.Common import Morley.Michelson.Parser.Error import Morley.Michelson.Parser.Instr@@ -67,6 +68,11 @@ import Morley.Michelson.Untyped import Morley.Michelson.Untyped qualified as U +{- $setup+>>> import Morley.Michelson.Parser.Lexer+>>> import Text.Megaparsec (sepEndBy)+-}+ ---------------------------------------------------------------------------- -- Helpers ----------------------------------------------------------------------------@@ -102,7 +108,7 @@ cbStorage :: Parser Ty cbStorage = symbol1 "storage" *> type_ -cbCode :: Parser [ParsedOp]+cbCode :: Parser ParsedOp cbCode = symbol "code" *> codeEntry cbView :: Parser (View' ParsedOp)@@ -111,7 +117,7 @@ viewName <- viewName_ viewArgument <- type_ viewReturn <- type_- viewCode <- ops+ viewCode <- codeEntry return View{..} contractBlock :: Parser (ContractBlock ParsedOp)@@ -142,11 +148,8 @@ contract = do mSpace result <- braces contractTuple <|> contractTuple- case orderContractBlock result of- Just contract' ->- return contract'- Nothing ->- fail $ "Duplicate contract field: " <> pretty result+ either (fail . pretty . nameF "Contract parsing error" . unlinesF) pure $+ orderContractBlock result where -- @ensureNotDuplicate@ provides a better message and point to the correct line -- when the parser fails.@@ -160,7 +163,7 @@ ------------------ value :: Parser ParsedValue-value = value' parsedOp+value = value' ops -- | Parse untyped value from text which comes from something that is -- not a file (which is often the case). So we assume it does not need@@ -188,36 +191,82 @@ ------------------ prim :: Parser ParsedInstr-prim = primInstr contract parsedOp+prim = primInstr contract ops -- Parsed operations (primitive instructions, macros, extras, etc.) ------------------ --- | Parses code block after "code" keyword of a contract.------ This function is part of the module API, its semantics should not change.-codeEntry :: Parser [ParsedOp]-codeEntry = bracewrappedOps+-- | Parses code block after "code" keyword of a contract, or code in a view+-- block.+codeEntry :: Parser ParsedOp+codeEntry = flip Seq <$> getSrcPos <*> bracewrappedOps <|> parsedOp bracewrappedOps :: Parser [ParsedOp]-bracewrappedOps = lookAhead (symbol "{") *> ops+bracewrappedOps = symbol "{" *> rawOpsSequence (symbol "}") --- |--- >>> parseNoEnv parsedOp "" "{a}" & either (putStrLn . displayException . ParserException) (const $ pure ())--- 1:2:--- |--- 1 | {a}--- | ^--- unexpected 'a'--- expecting '{', '}', macro, or primitive instruction--- <BLANKLINE>+{-| Michelson sequence of instructions, separated with a semicolon. Last+semicolon is optional, semicolon after @}@ is optional.++The first argument is the sequence terminator, that is to say, usually @}@. This+might look mysterious, until one considers the alternatives. For example:++>>> let fmt = either (putStrLn . displayException . ParserException) (const $ pure ())+>>> parseNoEnv (braces (sepEndBy parsedOp semicolon)) "" "{ DIIIP CMPEQ }" & fmt+...+1 | { DIIIP CMPEQ }+ | ^+unexpected 'D'+expecting '}'+...+>>> parseNoEnv (symbol "{" *> rawOpsSequence (symbol "}")) "" "{ DIIIP CMPEQ }" & fmt+...+1 | { DIIIP CMPEQ }+ | ^+unexpected 'C'+...++This happens because @braces . sepEndBy@ backtracks a bit too far.++Note that @braces . sepEndBy@ doesn't match Michelson syntax exactly, it's used+as an example only.+-}+rawOpsSequence :: Parser a -> Parser [ParsedOp]+rawOpsSequence endP = inner <|> end+ where+ end = [] <$ endP+ inner = do+ op <- parsedOp+ let sep = case op of+ Seq{} -> void $ optional semicolon -- semicolon optional after }+ _ -> semicolon+ (op :) <$> ((sep *> rawOpsSequence endP) <|> end)++{- |+>>> let fmt = either (putStrLn . displayException . ParserException) (const $ pure ())+>>> parseNoEnv parsedOp "" "{a}" & fmt+1:2:+ |+1 | {a}+ | ^^+unexpected "a}"+expecting '{', '}', macro, or primitive instruction+<BLANKLINE>++>>> parseNoEnv parsedOp "" "{ UNIT; DIIIP CMPEQ }" & fmt+1:15:+ |+1 | { UNIT; DIIIP CMPEQ }+ | ^+unexpected 'C'+<BLANKLINE>+-} parsedOp :: Parser ParsedOp parsedOp = do pos <- getSrcPos choice [ flip Prim pos <$> prim- , flip Mac pos <$> macro parsedOp- , primOrMac+ , flip Mac pos <$> macro ops+ , hidden primOrMac , flip Seq pos <$> bracewrappedOps ] @@ -239,8 +288,13 @@ srcPos <- getSrcPos flip Mac srcPos <$> act -ops :: Parser [ParsedOp]-ops = ops' parsedOp+ops :: Parser (ParsedSeq ParsedOp)+ops = do+ pos <- getSrcPos+ choice+ [ PSSequence <$> bracewrappedOps+ , PSSingleMacro pos <$> ( parens (allMacros ops) <|> allSingleTokenMacros )+ ] ------------------------------------------------------------------------------- -- Mixed parsers@@ -251,20 +305,24 @@ ifOrIfX = do pos <- getSrcPos symbol "IF"- a <- eitherP cmpOp ops+ a <- eitherP (try $ cmpOp $ pure def) ops case a of Left cmp -> flip Mac pos <$> (IFX cmp <$> ops <*> ops)- Right op -> flip Prim pos <$> (IF op <$> ops)+ Right op -> flip Prim pos . IF op <$> ops -- Some of the operations and macros have the same prefixes in their names -- So this case should be handled separately primOrMac :: Parser ParsedOp-primOrMac = hidden- $ (macWithPos (ifCmpMac parsedOp) <|> ifOrIfX)- <|> (macWithPos (mapCadrMac parsedOp) <|> primWithPos (mapOp parsedOp))- <|> (try (primWithPos pairOp) <|> try (primWithPos pairNOp) <|> macWithPos pairMac)- <|> (try (macWithPos duupMac) <|> primWithPos dupOp)- <|> (try (macWithPos carnMac) <|> try (macWithPos cdrnMac) <|> try (macWithPos cadrMac) <|> primWithPos carOp <|> primWithPos cdrOp)+primOrMac = choice+ [ macWithPos (ifCmpMac ops), ifOrIfX+ , macWithPos (mapCadrMac ops), primWithPos (mapOp ops)+ , try (primWithPos pairOp), try (primWithPos pairNOp), macWithPos pairMac+ , try (macWithPos duupMac), primWithPos dupOp+ , try (macWithPos (diipMac bracewrappedOps)), primWithPos (dipOp ops)+ , try (macWithPos carnMac), try (macWithPos cdrnMac), try (macWithPos cadrMac)+ , primWithPos carOp+ , primWithPos cdrOp+ ] ------------------------------------------------------------------------------- -- Safe construction of Haskell values
src/Morley/Michelson/Parser/Instr.hs view
@@ -5,7 +5,6 @@ module Morley.Michelson.Parser.Instr ( primInstr- , ops' -- * These are handled separately to have better error messages , mapOp , pairOp@@ -13,6 +12,7 @@ , pairNOp , cmpOp , dupOp+ , dipOp , carOp , cdrOp , viewOp@@ -23,7 +23,7 @@ import Text.Megaparsec (choice, label, many, notFollowedBy, try) import Text.Megaparsec.Char.Lexer qualified as L -import Morley.Michelson.Macro (ParsedInstr, ParsedOp(..))+import Morley.Michelson.Macro (ParsedInstr, ParsedOp(..), ParsedSeq(..)) import Morley.Michelson.Parser.Annotations import Morley.Michelson.Parser.Common import Morley.Michelson.Parser.Lexer@@ -33,16 +33,16 @@ import Morley.Michelson.Untyped -- | Parser for primitive Michelson instruction (no macros and extensions).-primInstr :: Parser (Contract' ParsedOp) -> Parser ParsedOp -> Parser ParsedInstr-primInstr contractParser opParser = label "primitive instruction" $ choice- [ dropOp, swapOp, digOp, dugOp, pushOp opParser, someOp, noneOp, unitOp- , ifNoneOp opParser, leftOp, rightOp, ifLeftOp opParser, nilOp- , consOp, ifConsOp opParser, sizeOp, emptySetOp, emptyMapOp, emptyBigMapOp, iterOp opParser- , memOp, getAndUpdateOp, getOp, updateOp, loopLOp opParser, loopOp opParser- , lambdaOp opParser, execOp, applyOp, dipOp opParser, failWithOp, castOp, renameOp, levelOp+primInstr :: Parser (Contract' ParsedOp) -> Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+primInstr contractParser opsParser = label "primitive instruction" $ choice+ [ dropOp, swapOp, digOp, dugOp, pushOp opsParser, someOp, noneOp, unitOp+ , ifNoneOp opsParser, leftOp, rightOp, ifLeftOp opsParser, nilOp+ , consOp, ifConsOp opsParser, sizeOp, emptySetOp, emptyMapOp, emptyBigMapOp, iterOp opsParser+ , memOp, getAndUpdateOp, getOp, updateOp, loopLOp opsParser, loopOp opsParser+ , lambdaOp opsParser, execOp, applyOp, dipOp opsParser, failWithOp, castOp, renameOp, levelOp , concatOp, packOp, unpackOp, sliceOp, isNatOp, addressOp, selfAddressOp, addOp, subOp , subMutezOp, mulOp, edivOp, absOp, negOp, lslOp, lsrOp, orOp, andOp, xorOp, notOp- , compareOp, eqOp, neqOp, ltOp, leOp, gtOp, geOp, intOp, viewOp, selfOp, contractOp+ , compareOp, cmpOp noteDef, intOp, viewOp, selfOp, contractOp , transferTokensOp, setDelegateOp , createContractOp contractParser, implicitAccountOp, nowOp, amountOp , balanceOp, checkSigOp, sha256Op, sha512Op, blake2BOp, hashKeyOp, pairingCheckOp@@ -53,38 +53,20 @@ , openChestOp , saplingEmptyStateOp, saplingVerifyUpdateOp, minBlockTimeOp , emitOp- , lambdaRecOp opParser+ , lambdaRecOp opsParser , natOp, bytesOp ] --- | Parse a sequence of instructions.-ops' :: Parser ParsedOp -> Parser [ParsedOp]-ops' opParser = (braces $ parseSeq) <|> (pure <$> opParser)- where- parseSeq =- do{ op <- opParser- ; let separator = case op of- Seq _ _ -> void (optional semicolon)- _ -> semicolon- ; do{ _ <- separator- ; ops <- parseSeq- ; return (op:ops)- }- <|> return [op]- }- <|> return []-- -- Control Structures failWithOp :: Parser ParsedInstr failWithOp = word "FAILWITH" FAILWITH -loopOp :: Parser ParsedOp -> Parser ParsedInstr-loopOp opParser = word "LOOP" LOOP <*> ops' opParser+loopOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+loopOp opsParser = word "LOOP" LOOP <*> opsParser -loopLOp :: Parser ParsedOp -> Parser ParsedInstr-loopLOp opParser = word "LOOP_LEFT" LOOP_LEFT <*> ops' opParser+loopLOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+loopLOp opsParser = word "LOOP_LEFT" LOOP_LEFT <*> opsParser execOp :: Parser ParsedInstr execOp = word "EXEC" EXEC <*> noteDef@@ -93,8 +75,8 @@ applyOp = word "APPLY" APPLY <*> noteDef -- Parses both `DIP` and `DIP n`.-dipOp :: Parser ParsedOp -> Parser ParsedInstr-dipOp opParser = parseWithOptionalParameter "DIP" DIPN DIP <*> ops' opParser+dipOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+dipOp opsParser = parseWithOptionalParameter "DIP" DIPN DIP <*> opsParser -- Helper for instructions which have optional numeric non-negative parameter. parseWithOptionalParameter :: Text -> (Word -> instr) -> instr -> Parser instr@@ -123,50 +105,50 @@ dugOp :: Parser ParsedInstr dugOp = word "DUG" DUG <*> lexeme L.decimal -pushOp :: Parser ParsedOp -> Parser ParsedInstr-pushOp opParser = do+pushOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+pushOp opsParser = do symbol1 "PUSH" v <- noteDef push' v where push' :: VarAnn -> Parser ParsedInstr- push' v = PUSH v <$> type_ <*> value' opParser+ push' v = PUSH v <$> type_ <*> value' opsParser unitOp :: Parser ParsedInstr unitOp = do symbol1 "UNIT"; (t, v) <- notesTV; return $ UNIT t v -lambdaOp :: Parser ParsedOp -> Parser ParsedInstr-lambdaOp opParser =- word "LAMBDA" LAMBDA <*> noteDef <*> type_ <*> type_ <*> ops' opParser+lambdaOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+lambdaOp opsParser =+ word "LAMBDA" LAMBDA <*> noteDef <*> type_ <*> type_ <*> opsParser -lambdaRecOp :: Parser ParsedOp -> Parser ParsedInstr-lambdaRecOp opParser =- word "LAMBDA_REC" LAMBDA_REC <*> noteDef <*> type_ <*> type_ <*> ops' opParser+lambdaRecOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+lambdaRecOp opsParser =+ word "LAMBDA_REC" LAMBDA_REC <*> noteDef <*> type_ <*> type_ <*> opsParser neverOp :: Parser ParsedInstr neverOp = word "NEVER" NEVER -- Generic comparison -cmpOp :: Parser ParsedInstr-cmpOp = eqOp <|> neqOp <|> ltOp <|> gtOp <|> leOp <|> gtOp <|> geOp+cmpOp :: Parser VarAnn -> Parser ParsedInstr+cmpOp ann = (eqOp <|> neqOp <|> ltOp <|> gtOp <|> leOp <|> gtOp <|> geOp) <*> ann -eqOp :: Parser ParsedInstr-eqOp = word "EQ" EQ <*> noteDef+eqOp :: Parser (VarAnn -> ParsedInstr)+eqOp = word "EQ" EQ -neqOp :: Parser ParsedInstr-neqOp = word "NEQ" NEQ <*> noteDef+neqOp :: Parser (VarAnn -> ParsedInstr)+neqOp = word "NEQ" NEQ -ltOp :: Parser ParsedInstr-ltOp = word "LT" LT <*> noteDef+ltOp :: Parser (VarAnn -> ParsedInstr)+ltOp = word "LT" LT -gtOp :: Parser ParsedInstr-gtOp = word "GT" GT <*> noteDef+gtOp :: Parser (VarAnn -> ParsedInstr)+gtOp = word "GT" GT -leOp :: Parser ParsedInstr-leOp = word "LE" LE <*> noteDef+leOp :: Parser (VarAnn -> ParsedInstr)+leOp = word "LE" LE -geOp :: Parser ParsedInstr-geOp = word "GE" GE <*> noteDef+geOp :: Parser (VarAnn -> ParsedInstr)+geOp = word "GE" GE -- ad-hoc comparison @@ -302,14 +284,14 @@ getAndUpdateOp :: Parser ParsedInstr getAndUpdateOp = word "GET_AND_UPDATE" GET_AND_UPDATE <*> noteDef -iterOp :: Parser ParsedOp -> Parser ParsedInstr-iterOp opParser = word "ITER" ITER <*> ops' opParser+iterOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+iterOp opsParser = word "ITER" ITER <*> opsParser sizeOp :: Parser ParsedInstr sizeOp = word "SIZE" SIZE <*> noteDef -mapOp :: Parser ParsedOp -> Parser ParsedInstr-mapOp opParser = word "MAP" MAP <*> noteDef <*> ops' opParser+mapOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+mapOp opsParser = word "MAP" MAP <*> noteDef <*> opsParser getOp :: Parser ParsedInstr getOp = do@@ -324,8 +306,8 @@ consOp :: Parser ParsedInstr consOp = word "CONS" CONS <*> noteDef -ifConsOp :: Parser ParsedOp -> Parser ParsedInstr-ifConsOp opParser = word "IF_CONS" IF_CONS <*> ops' opParser <*> ops' opParser+ifConsOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+ifConsOp opsParser = word "IF_CONS" IF_CONS <*> opsParser <*> opsParser -- Operations on options @@ -335,8 +317,8 @@ noneOp :: Parser ParsedInstr noneOp = do symbol1 "NONE"; (t, v) <- notesTV; NONE t v <$> type_ -ifNoneOp :: Parser ParsedOp -> Parser ParsedInstr-ifNoneOp opParser = word "IF_NONE" IF_NONE <*> ops' opParser <*> ops' opParser+ifNoneOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+ifNoneOp opsParser = word "IF_NONE" IF_NONE <*> opsParser <*> opsParser -- Operations on unions @@ -348,8 +330,8 @@ rightOp = do symbol1 "RIGHT"; (t, v, (f, f')) <- notesTVF2Def; RIGHT t v f f' <$> type_ -ifLeftOp :: Parser ParsedOp -> Parser ParsedInstr-ifLeftOp opParser = word "IF_LEFT" IF_LEFT <*> ops' opParser <*> ops' opParser+ifLeftOp :: Parser (ParsedSeq ParsedOp) -> Parser ParsedInstr+ifLeftOp opsParser = word "IF_LEFT" IF_LEFT <*> opsParser <*> opsParser -- Operations on contracts
src/Morley/Michelson/Parser/Macro.hs view
@@ -5,8 +5,11 @@ module Morley.Michelson.Parser.Macro ( macro+ , allMacros+ , allSingleTokenMacros -- * These are handled separately to have better error messages , duupMac+ , diipMac , pairMac , ifCmpMac , mapCadrMac@@ -17,45 +20,101 @@ import Prelude hiding (note, try) -import Text.Megaparsec (label, notFollowedBy, skipMany, try)+import Data.Default (Default(..))+import Text.Megaparsec (choice, label, skipMany) import Text.Megaparsec.Char (string) import Text.Megaparsec.Char.Lexer (decimal)-import Unsafe qualified (fromIntegral) import Morley.Michelson.Macro- (CadrStruct(..), Macro(..), PairStruct(..), ParsedOp(..), UnpairStruct(..))+ (CadrStruct(..), Macro(..), PairStruct(..), ParsedOp(..), ParsedSeq, UnpairStruct(..)) import Morley.Michelson.Macro qualified as Macro import Morley.Michelson.Parser.Annotations-import Morley.Michelson.Parser.Instr+import Morley.Michelson.Parser.Instr qualified as Instr import Morley.Michelson.Parser.Lexer import Morley.Michelson.Parser.Types (Parser) import Morley.Michelson.Untyped (noAnn) -macro :: Parser ParsedOp -> Parser Macro-macro opParser = label "macro"- $ setCadrMac- <|> (string "CMP" >> return CMP <*> cmpOp <*> noteDef)+data AllowAnnotations = ForbidAnnotations | AllowAnnotations++annWithDef :: Default a => AllowAnnotations -> Parser a -> Parser a+annWithDef allow p = case allow of+ AllowAnnotations -> p+ ForbidAnnotations -> pure def++cmpOp :: AllowAnnotations -> Parser Macro.ParsedInstr+cmpOp = Instr.cmpOp . flip annWithDef noteDef++-- | Macros consisting of a single token are allowed in more contexts than other+-- macros.+singleTokenMacro+ :: AllowAnnotations+ -- ^ Whether we allow annotations. When used for parsing a single token, this+ -- is obviously disabled. Enabled when reused in the general context, e.g. in 'macro'.+ -> Parser Macro+singleTokenMacro allowAnns = choice+ [ setCadrMac allowAnns+ , string "CMP" *> (CMP <$> cmpOp allowAnns)+ , word "FAIL" FAIL+ , string "ASSERT_CMP" *> (ASSERT_CMP <$> cmpOp allowAnns)+ , word "ASSERT_NONE" ASSERT_NONE+ , word "ASSERT_SOME" ASSERT_SOME+ , word "ASSERT_LEFT" ASSERT_LEFT+ , word "ASSERT_RIGHT" ASSERT_RIGHT+ , string "ASSERT_" *> (ASSERTX <$> cmpOp allowAnns)+ , word "ASSERT" ASSERT+ , unpairMac allowAnns+ ]++-- | This includes all macros consisting of a single token, i.e. also the+-- specially-handled ones, like @PAIIR@, @CADR@, etc, but not @DUUP@, as it's+-- always represented as @DUPN@ and thus behaves like a primitive.+allSingleTokenMacros :: Parser Macro+allSingleTokenMacros = label "single-token macro" $ choice+ [ singleTokenMacro ForbidAnnotations+ , pairMac' ForbidAnnotations+ , cadrMac' ForbidAnnotations+ ]++-- | Includes all macros, also the specially-handled ones. Macros are allowed in+-- more contexts than instructions, so sometimes it's unambiguous.+--+-- Notably @DUUP@ and @DIIP@ are excluded, as they're always represented by a+-- single instruction and thus behave more like a primitive.+allMacros :: Parser (ParsedSeq ParsedOp) -> Parser Macro+allMacros ops = label "macro" $ choice+ [ macro ops+ , pairMac+ , carnMac+ , cdrnMac+ , cadrMac+ , ifCmpMac ops+ , mapCadrMac ops+ , ifX ops+ ]++macro :: Parser (ParsedSeq ParsedOp) -> Parser Macro+macro ops = label "macro"+ $ singleTokenMacro AllowAnnotations <|> word "IF_SOME" IF_SOME <*> ops <*> ops <|> word "IF_RIGHT" IF_RIGHT <*> ops <*> ops- <|> word "FAIL" FAIL- <|> (string "ASSERT_CMP" >> return ASSERT_CMP <*> cmpOp)- <|> word "ASSERT_NONE" ASSERT_NONE- <|> word "ASSERT_SOME" ASSERT_SOME- <|> word "ASSERT_LEFT" ASSERT_LEFT- <|> word "ASSERT_RIGHT" ASSERT_RIGHT- <|> (string "ASSERT_" >> return ASSERTX <*> cmpOp)- <|> word "ASSERT" ASSERT- <|> do string "DI"; n <- num "I"; symbol1 "P"; DIIP (n + 1) <$> ops- <|> unpairMac- where- ops = ops' opParser- num str = Unsafe.fromIntegral @Int @Word . length <$> some (string str) +-- | This might look strange, but at the time of writing, reference+-- implementation requires braced argument to @DIIP@, even if the argument is a+-- macro. Thus, @DIP 2 FAIL@ is fine, but @DIIP FAIL@ is a syntax error.+diipMac :: Parser [ParsedOp] -> Parser Macro+diipMac ops =+ (string "DI" *> (DIIP . succ <$> num "I") <* symbol1 "P") <*> (Macro.PSSequence <$> ops)++num :: Text -> Parser Word+num str = length <$> some (string str)+ duupMac :: Parser Macro-duupMac = do string "DU"; n <- num "U"; symbol1 "P"; DUUP (n + 1) <$> noteDef- where- num str = Unsafe.fromIntegral @Int @Word . length <$> some (string str)+duupMac = duupMac' AllowAnnotations +duupMac' :: AllowAnnotations -> Parser Macro+duupMac' allowAnns =+ (string "DU" *> (DUUP . succ <$> num "U") <* symbol1 "P") <*> annWithDef allowAnns noteDef+ pairMacInner :: Parser PairStruct pairMacInner = do string "P"@@ -64,10 +123,13 @@ return $ P l r pairMac :: Parser Macro-pairMac = do+pairMac = pairMac' AllowAnnotations++pairMac' :: AllowAnnotations -> Parser Macro+pairMac' allowAnns = do a <- pairMacInner symbol1 "R"- (tn, vn, fns) <- permute3Def noteDef note (some note)+ (tn, vn, fns) <- annWithDef allowAnns $ permute3Def noteDef note (some note) let ps = Macro.mapPairLeaves fns a return $ PAPAIR ps tn vn @@ -78,22 +140,21 @@ r <- (string "I" $> UF) <|> unpairMacInner return $ UP l r -unpairMac :: Parser Macro-unpairMac = do- string "UN"- a <- unpairMacInner- symbol1 "R"- skipMany $ (void noteF) <|> (void noteV)- return $ UNPAPAIR a+unpairMac :: AllowAnnotations -> Parser Macro+unpairMac allowAnns =+ string "UN" *> (UNPAPAIR <$> unpairMacInner) <* symbol1 "R" <*+ annWithDef allowAnns (skipMany $ void noteF <|> void noteV) cadrMac :: Parser Macro-cadrMac = lexeme $ do+cadrMac = cadrMac' AllowAnnotations++cadrMac' :: AllowAnnotations -> Parser Macro+cadrMac' allowAnns = do string "C"- a <- some $ try $ cadrInner <* notFollowedBy (string "R")- b <- cadrInner+ as <- (:) <$> cadrInner <*> some cadrInner symbol1 "R"- (vn, fn) <- notesVF- return $ CADR (a ++ pure b) vn fn+ (vn, fn) <- annWithDef allowAnns notesVF+ return $ CADR as vn fn cadrInner :: Parser CadrStruct cadrInner = (string "A" $> A) <|> (string "D" $> D)@@ -105,22 +166,24 @@ cdrnMac = symbol1 "CDR" *> (CDRN <$> noteDef <*> lexeme decimal) {-# ANN module ("HLint: ignore Reduce duplication" :: Text) #-}-setCadrMac :: Parser Macro-setCadrMac = do+setCadrMac :: AllowAnnotations -> Parser Macro+setCadrMac allowAnns = do string "SET_C" a <- some cadrInner symbol1 "R"- (v, f) <- notesVF+ (v, f) <- annWithDef allowAnns notesVF return $ SET_CADR a v f -mapCadrMac :: Parser ParsedOp -> Parser Macro-mapCadrMac opParser = do+mapCadrMac :: Parser (ParsedSeq ParsedOp) -> Parser Macro+mapCadrMac ops = do string "MAP_C" a <- some cadrInner symbol1 "R" (v, f) <- notesVF- MAP_CADR a v f <$> ops' opParser+ MAP_CADR a v f <$> ops -ifCmpMac :: Parser ParsedOp -> Parser Macro-ifCmpMac opParser = string "IFCMP" >> return- IFCMP <*> cmpOp <*> noteDef <*> ops' opParser <*> ops' opParser+ifCmpMac :: Parser (ParsedSeq ParsedOp) -> Parser Macro+ifCmpMac ops = string "IFCMP" $> IFCMP <*> cmpOp ForbidAnnotations <*> ops <*> ops++ifX :: Parser (ParsedSeq ParsedOp) -> Parser Macro+ifX ops = symbol "IF" $> IFX <*> cmpOp ForbidAnnotations <*> ops <*> ops
src/Morley/Michelson/Parser/Value.hs view
@@ -21,7 +21,7 @@ import Text.Megaparsec.Char (char, string) import Text.Megaparsec.Char.Lexer qualified as L -import Morley.Michelson.Macro (ParsedOp, ParsedValue)+import Morley.Michelson.Macro (ParsedOp, ParsedSeq(..), ParsedValue) import Morley.Michelson.Parser.Error import Morley.Michelson.Parser.Helpers import Morley.Michelson.Parser.Lexer@@ -31,22 +31,22 @@ -- | Parse untyped 'ParsedValue'. Take instruction parser as argument -- to avoid cyclic dependencies between modules, hence ' in its name.-value' :: Parser ParsedOp -> Parser ParsedValue-value' opParser = parensOrTuple opParser <|> valueInnerWithoutParens opParser+value' :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+value' opsParser = parensOrTuple opsParser <|> valueInnerWithoutParens opsParser -parensOrTuple :: Parser ParsedOp -> Parser ParsedValue-parensOrTuple opParser = parens $ value' opParser+parensOrTuple :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+parensOrTuple opsParser = parens $ value' opsParser -valueInnerWithoutParens :: Parser ParsedOp -> Parser ParsedValue-valueInnerWithoutParens opParser = label "value" $ choice $+valueInnerWithoutParens :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+valueInnerWithoutParens opsParser = label "value" $ choice $ [ stringLiteral, bytesLiteral, intLiteral, unitValue- , trueValue, falseValue, pairValueCore opParser, leftValue opParser- , rightValue opParser, someValue opParser, noneValue, nilValue- , seqOrLambda opParser, mapValue opParser, lambdaRecValue opParser+ , trueValue, falseValue, pairValueCore opsParser, leftValue opsParser+ , rightValue opsParser, someValue opsParser, noneValue, nilValue+ , seqOrLambda opsParser, mapValue opsParser, lambdaRecValue opsParser ] -seqOrLambda :: Parser ParsedOp -> Parser ParsedValue-seqOrLambda opParser = try (lambdaValue opParser) <|> seqValue opParser+seqOrLambda :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+seqOrLambda opsParser = try (lambdaValue opsParser) <|> seqValue opsParser stringLiteral :: Parser ParsedValue stringLiteral = lexeme $ U.ValueString . unsafe . mkMText . toText <$> do@@ -73,7 +73,7 @@ -- It is safe not to use `try` here because bytesLiteral is the only -- thing that starts from 0x (at least for now)-bytesLiteral :: Parser (U.Value' op)+bytesLiteral :: Parser (U.Value' f op) bytesLiteral = lexeme $ do string "0x" hexdigits <- takeWhileP Nothing Char.isHexDigit@@ -83,7 +83,7 @@ (return . U.ValueBytes . U.InternalByteString) mBytes -intLiteral :: Parser (U.Value' op)+intLiteral :: Parser (U.Value' f op) intLiteral = lexeme $ try $ U.ValueInt <$> L.signed pass L.decimal unitValue :: Parser ParsedValue@@ -95,21 +95,21 @@ falseValue :: Parser ParsedValue falseValue = word "False" U.ValueFalse -pairValueCore :: Parser ParsedOp -> Parser ParsedValue-pairValueCore opParser = symbol1 "Pair" *> pairInner+pairValueCore :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+pairValueCore opsParser = symbol1 "Pair" *> pairInner where pairInner = U.ValuePair- <$> value' opParser- <*> (foldr1 U.ValuePair <$> some' (value' opParser))+ <$> value' opsParser+ <*> (foldr1 U.ValuePair <$> some' (value' opsParser)) -leftValue :: Parser ParsedOp -> Parser ParsedValue-leftValue opParser = word "Left" U.ValueLeft <*> value' opParser+leftValue :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+leftValue opsParser = word "Left" U.ValueLeft <*> value' opsParser -rightValue :: Parser ParsedOp -> Parser ParsedValue-rightValue opParser = word "Right" U.ValueRight <*> value' opParser+rightValue :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+rightValue opsParser = word "Right" U.ValueRight <*> value' opsParser -someValue :: Parser ParsedOp -> Parser ParsedValue-someValue opParser = word "Some" U.ValueSome <*> value' opParser+someValue :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+someValue opsParser = word "Some" U.ValueSome <*> value' opsParser noneValue :: Parser ParsedValue noneValue = word "None" U.ValueNone@@ -117,25 +117,21 @@ nilValue :: Parser ParsedValue nilValue = U.ValueNil <$ (try $ braces pass) -lambdaValue :: Parser ParsedOp -> Parser ParsedValue-lambdaValue opParser = U.ValueLambda <$> ops1- where- ops1 :: Parser (NonEmpty ParsedOp)- ops1 = braces $ sepEndBy1 opParser semicolon+lambdaValue :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+lambdaValue opsParser = opsParser <&> \case+ PSSequence [] -> U.ValueNil+ ops -> U.ValueLambda ops -lambdaRecValue :: Parser ParsedOp -> Parser ParsedValue-lambdaRecValue opParser = word "Lambda_rec" U.ValueLamRec <*> ops1- where- ops1 :: Parser (NonEmpty ParsedOp)- ops1 = braces $ sepEndBy1 opParser semicolon+lambdaRecValue :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+lambdaRecValue opsParser = word "Lambda_rec" U.ValueLamRec <*> opsParser -seqValue :: Parser ParsedOp -> Parser ParsedValue-seqValue opParser =- U.ValueSeq <$> (try $ braces $ sepEndBy1 (value' opParser) semicolon)+seqValue :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+seqValue opsParser =+ U.ValueSeq <$> (try $ braces $ sepEndBy1 (value' opsParser) semicolon) -eltValue :: Parser ParsedOp -> Parser (U.Elt ParsedOp)-eltValue opParser = word "Elt" U.Elt <*> value' opParser <*> value' opParser+eltValue :: Parser (ParsedSeq ParsedOp) -> Parser (U.Elt ParsedSeq ParsedOp)+eltValue opsParser = word "Elt" U.Elt <*> value' opsParser <*> value' opsParser -mapValue :: Parser ParsedOp -> Parser ParsedValue-mapValue opParser =- U.ValueMap <$> (try $ braces $ sepEndBy1 (eltValue opParser) semicolon)+mapValue :: Parser (ParsedSeq ParsedOp) -> Parser ParsedValue+mapValue opsParser =+ U.ValueMap <$> (try $ braces $ sepEndBy1 (eltValue opsParser) semicolon)
src/Morley/Michelson/Printer.hs view
@@ -16,14 +16,14 @@ import Data.Singletons (SingI) import Data.Text.Lazy qualified as TL -import Morley.Michelson.Printer.Util (RenderDoc(..), doesntNeedParens, printDoc, renderAnyBuildable)+import Morley.Michelson.Printer.Util import Morley.Michelson.Typed qualified as T import Morley.Michelson.Untyped qualified as U -- | Convert an untyped contract into a textual representation which -- will be accepted by the OCaml reference client: @octez-client@. printUntypedContract :: (RenderDoc op) => Bool -> U.Contract' op -> TL.Text-printUntypedContract forceSingleLine = printDoc forceSingleLine . renderDoc doesntNeedParens+printUntypedContract = printRenderDoc -- | Convert a typed contract into a textual representation which -- will be accepted by the OCaml reference client: @octez-client@.@@ -40,17 +40,15 @@ -- | Convert typed value into a textual representation which -- will be accepted by the OCaml reference client: @octez-client@. printTypedValue- :: forall t.- (T.ProperUntypedValBetterErrors t)+ :: forall t. (T.UntypedValScope t) => Bool -> T.Value t -> TL.Text printTypedValue forceSingleLine = printUntypedValue forceSingleLine . T.untypeValue -- | Convert untyped value into a textual representation which -- will be accepted by the OCaml reference client: @octez-client@.-printUntypedValue :: (RenderDoc op) => Bool -> U.Value' op -> TL.Text-printUntypedValue forceSingleLine =- printDoc forceSingleLine . renderDoc doesntNeedParens+printUntypedValue :: (Foldable f, RenderDoc op) => Bool -> U.Value' f op -> TL.Text+printUntypedValue = printRenderDoc -- | Convert 'T.SomeContract' into a textual representation which -- will be accepted by the OCaml reference client: @octez-client@.
src/Morley/Michelson/Printer/Util.hs view
@@ -1,6 +1,8 @@ -- SPDX-FileCopyrightText: 2021 Oxhead Alpha -- SPDX-License-Identifier: LicenseRef-MIT-OA +{-# OPTIONS_GHC -Wno-orphans #-}+ -- | Utilities for rendering Michelson code in a format compatible with -- Octez software (e.g @octez-client@) module Morley.Michelson.Printer.Util@@ -9,6 +11,7 @@ , printDoc , printDocB , printDocS+ , printRenderDoc , renderOps , renderOpsList , renderOpsListNoBraces@@ -30,13 +33,14 @@ import Prelude hiding (group) import Control.Exception (assert)-import Data.Text.Lazy qualified as LT+import Data.Foldable qualified as Foldable import Data.Text.Lazy.Builder (Builder)-import Fmt (Buildable, pretty)-import Text.PrettyPrint.Leijen.Text- (Doc, SimpleDoc, align, braces, displayB, displayT, enclose, encloseSep, hsep, isEmpty, lbracket,- parens, punctuate, rbracket, renderOneLine, renderPretty, semi, sep, space, text, textStrict,- (<+>), (<//>))+import Fmt (Buildable(build), FromSimpleDoc(..))+import Fmt.Operators ((<+>), (<//>))+import Fmt.Utils (Doc, SimpleDoc, isEmpty, mkLayoutOptions, renderOneLine)+import Prettyprinter+ (align, braces, enclose, encloseSep, group, hsep, layoutPretty, lbracket, parens, punctuate,+ rbracket, semi, sep, space) -- | Environment carried during recursive rendering. newtype RenderContext = RenderContext@@ -47,9 +51,8 @@ -- parentheses. } --- | Generalize converting a type into a--- Text.PrettyPrint.Leijen.Text.Doc. Used to pretty print Michelson code--- and define Fmt.Buildable instances.+-- | Generalize converting a type into a 'Doc'. Used to pretty print Michelson+-- code and define 'Buildable' instances. class RenderDoc a where renderDoc :: RenderContext -> a -> Doc @@ -64,49 +67,64 @@ isRenderable _ = True instance RenderDoc Text where- renderDoc _ = textStrict+ renderDoc _ = build +instance RenderDoc Doc where+ renderDoc = addParens+ -- | Renders a list of 'RenderDoc' elements surrounded with square brackets, -- separated by a comma and a space. renderDocList :: RenderDoc a => RenderContext -> [a] -> Doc-renderDocList context = encloseSep lbracket rbracket ", " . fmap (renderDoc context)+renderDocList context = align . encloseSep lbracket rbracket ", " . fmap (renderDoc context) renderAnyBuildable :: Buildable a => a -> Doc-renderAnyBuildable = text . pretty+renderAnyBuildable = build+{-# DEPRECATED renderAnyBuildable "Use build instead" #-} -- | A new type that can wrap values so that the RenderDoc -- instances of the combined value can have a different -- behavior for the pretty printer. newtype Prettier a = Prettier a deriving stock Functor+{-# DEPRECATED Prettier "This has no actual effect nowadays" #-} --- | Convert 'Doc' to 'Text' with a line width of 80.-printDoc :: Bool -> Doc -> LT.Text-printDoc oneLine = displayT . doRender oneLine+instance RenderDoc a => RenderDoc (Prettier a) where+ renderDoc ctx (Prettier a) = renderDoc ctx a +-- | Convert anything renderable to some text format with line width of 80.+printRenderDoc :: (RenderDoc a, FromSimpleDoc b) => Bool -> a -> b+printRenderDoc oneLine = fmtSimple . doRender oneLine . renderDoc doesntNeedParens++-- | Convert 'Doc' to 'LText' with a line width of 80.+printDoc :: Bool -> Doc -> LText+printDoc = printRenderDoc+ -- | Convert 'Doc' to 'Builder' in the same manner as 'printDoc'. printDocB :: Bool -> Doc -> Builder-printDocB oneLine = displayB . doRender oneLine+printDocB = printRenderDoc -- | Convert 'Doc' to 'String' in the same manner as 'printDoc'. printDocS :: Bool -> Doc -> String-printDocS oneLine = toString . printDoc oneLine+printDocS = printRenderDoc +{-# DEPRECATED printDoc, printDocB, printDocS "Use printRenderDoc instead" #-}+ -- | Generic way to render the different op types that get passed -- to a contract. renderOps :: (RenderDoc op) => Bool -> NonEmpty op -> Doc-renderOps oneLine = renderOpsList oneLine . toList+renderOps = renderOpsList+{-# DEPRECATED renderOps "Use renderOpsList instead" #-} -- | Render a comma-separated list of items in braces-renderOpsList :: (RenderDoc op) => Bool -> [op] -> Doc+renderOpsList :: (RenderDoc op, Foldable f) => Bool -> f op -> Doc renderOpsList oneLine ops = braces $ enclose space space $ renderOpsListNoBraces oneLine ops -- | Render a semi-colon-separated list of items without braces-renderOpsListNoBraces :: RenderDoc op => Bool -> [op] -> Doc+renderOpsListNoBraces :: (RenderDoc op, Foldable f) => Bool -> f op -> Doc renderOpsListNoBraces oneLine = align . (if oneLine then hsep else sep) . punctuate semi .- fmap (renderDoc doesntNeedParens) . filter isRenderable+ fmap (renderDoc doesntNeedParens) . filter isRenderable . Foldable.toList -- | Wrap documents in parentheses if there are two or more in the list. wrapInParens :: RenderContext -> NonEmpty Doc -> Doc@@ -115,19 +133,24 @@ in addParens (RenderContext (pn && moreThanOne)) $ foldr (<+>) mempty ds --- | Turn something that is instance of `RenderDoc` into a `Builder`.--- It's formatted the same way as `printDoc` formats docs.-buildRenderDoc :: RenderDoc a => a -> Builder-buildRenderDoc = printDocB True . renderDoc doesntNeedParens+-- | 'renderDoc', then 'group' and 'align'. Generally, this is the same as+-- 'build'.+buildRenderDoc :: RenderDoc a => a -> Doc+buildRenderDoc = align . group . renderDoc doesntNeedParens --- | Works as 'buildRenderDoc' above, but doesn't force the doc to be printed in one line-buildRenderDocExtended :: RenderDoc a => a -> Builder-buildRenderDocExtended = printDocB False . renderDoc doesntNeedParens+-- | Works as 'buildRenderDoc' above, but doesn't 'group'.+buildRenderDocExtended :: RenderDoc a => a -> Doc+buildRenderDocExtended = align . renderDoc doesntNeedParens+{-# DEPRECATED buildRenderDoc, buildRenderDocExtended+ "`RenderDoc` already implies `Buildable`, use `build` if you can" #-} +instance {-# overlappable #-} RenderDoc a => Buildable a where+ build = align . group . renderDoc doesntNeedParens+ -- | Here using a page width of 80 and a ribbon width of 1.0 -- https://hackage.haskell.org/package/wl-pprint-1.2.1/docs/Text-PrettyPrint-Leijen.html doRender :: Bool -> Doc -> SimpleDoc-doRender oneLine = if oneLine then renderOneLine else renderPretty 1.0 80+doRender oneLine = if oneLine then renderOneLine else layoutPretty $ mkLayoutOptions 1.0 80 -- Smart parentheses ----------------------------------------------------------------------------
src/Morley/Michelson/Runtime.hs view
@@ -41,6 +41,7 @@ , erInterpretResults , erRemainingSteps , ExecutorError' (..)+ , ExecutorErrorPrim (..) , ExecutorError , ExecutorM , runExecutorM@@ -64,6 +65,7 @@ import Control.Lens (assign, at, each, ix, makeLenses, to, (.=), (<>=)) import Control.Monad.Except (Except, liftEither, runExcept, throwError)+import Data.Coerce (coerce) import Data.Constraint (Dict(..), (\\)) import Data.Default (Default(..)) import Data.HashSet qualified as HS@@ -72,7 +74,8 @@ import Data.Text.IO (getContents) import Data.Text.IO.Utf8 qualified as Utf8 (readFile) import Data.Type.Equality (pattern Refl)-import Fmt (Buildable(build), blockListF, fmt, fmtLn, indentF, nameF, pretty, (+|), (|+))+import Data.Typeable (cast)+import Fmt (Buildable(build), blockListF, fmt, indentF, nameF, pretty, unlinesF, (+|), (|+)) import Text.Megaparsec (parse) import Morley.Michelson.Interpret@@ -125,20 +128,10 @@ instance Buildable ExecutorOp where build = \case- TransferOp (TransferOperation addr TxData{..} _)->- "Transfer " +| tdAmount |+ " tokens from " +| tdSenderAddress |+ " to " +| addr |+ ""- OriginateOp OriginationOperation{..} ->- "Originate a contract with" <>- " delegate " +| maybe "<nobody>" build ooDelegate |+- " and balance = " +| ooBalance |+ ""- SetDelegateOp SetDelegateOperation{..} ->- "Set delegate of contract " +| sdoContract |+- " to " +| maybe "<nobody>" build sdoDelegate |+ ""- EmitOp (EmitOperation source T.Emit{..}) ->- "Emit event " +| emTag |+- " from contract " +| source |+- " with type " +| emNotes |+- " and value " +| emValue |+ ""+ TransferOp op -> build op+ OriginateOp op -> build op+ SetDelegateOp op -> build op+ EmitOp op -> build op data SomeInterpretResult = forall st. SomeInterpretResult { unSomeInterpretResult :: InterpretResult st@@ -165,6 +158,7 @@ , _eeLevel :: Natural , _eeMinBlockTime :: Natural , _eeTcOpts :: TypeCheckOptions+ , _eeCallChain :: [ExecutorOp] } deriving stock (Generic) @@ -190,10 +184,17 @@ makeLenses ''ExecutorState makeLenses ''ExecutorLog +-- | 'ExecutorErrorPrim', enriched by the list of operations that succeeded+-- before the error.+data ExecutorError' a = ExecutorError+ { eeCallStack :: [ExecutorOp]+ , eeError :: ExecutorErrorPrim a+ } deriving stock (Show, Functor, Foldable, Traversable)+ -- | Errors that can happen during contract interpreting. -- Type parameter @a@ determines how contracts will be represented -- in these errors, e.g. 'Address'.-data ExecutorError' a+data ExecutorErrorPrim a = EEUnknownContract a -- ^ The interpreted contract hasn't been originated. | EEInterpreterFailed a (InterpretError Void)@@ -245,7 +246,7 @@ -- ^ Trying to run emit operation as a global operation, which should be impossible. deriving stock (Show, Functor, Foldable, Traversable) -instance (Buildable a) => Buildable (ExecutorError' a) where+instance (Buildable a) => Buildable (ExecutorErrorPrim a) where build = \case EEUnknownAddressAlias (SomeAlias (alias :: Alias kind)) ->@@ -295,6 +296,18 @@ EEGlobalEmitOp -> "Attempted to run emit event as a global operation, this should be impossible." +-- | To reduce friction between 'ExecutorError'' and 'ExecutorErrorPrim', this+-- instance will try to run 'fromException' for both.+instance (Typeable a, Show a, Buildable a) => Exception (ExecutorErrorPrim a) where+ displayException = pretty+ fromException (SomeException exc) = cast exc <|> fmap eeError (cast exc)++instance (Buildable a) => Buildable (ExecutorError' a) where+ build ExecutorError{..} = unlinesF+ [ build eeError+ , nameF "While running" $ unlinesF $ build <$> eeCallStack+ ]+ type ExecutorError = ExecutorError' Address instance (Typeable a, Show a, Buildable a) => Exception (ExecutorError' a) where@@ -532,7 +545,7 @@ runExecutorM now level minBlockTime remainingSteps tcOpts gState action = fmap preResToRes $ runExcept- $ runStateT (runReaderT action $ ExecutorEnv now level minBlockTime tcOpts)+ $ runStateT (runReaderT action $ ExecutorEnv now level minBlockTime tcOpts mempty) initialState where initialOpHash = error "Initial OperationHash touched"@@ -561,7 +574,7 @@ -- -- If 'croDryRun' is @False@, the final state is written back to the disk. ----- If the executor fails with 'ExecutorError' it will be thrown as an exception.+-- If the executor fails with t'ExecutorError' it will be thrown as an exception. runExecutorMWithDB :: CommonRunOptions -> ExecutorM a@@ -577,7 +590,7 @@ mapM_ printInterpretResult _erInterpretResults when (verbose && not (null _erUpdates)) $ do- fmtLn $ nameF "Updates" (blockListF _erUpdates)+ putTextLn $ fmt $ nameF "Updates" (blockListF _erUpdates) putTextLn $ "Remaining gas: " <> pretty _erRemainingSteps <> "." return (res, a)@@ -612,10 +625,10 @@ implicitAddrMb <- preuse $ esGState . gsImplicitAddressAliasesL . ix (ImplicitAlias aliasText) contractAddrMb <- preuse $ esGState . gsContractAddressAliasesL . ix (ContractAlias aliasText) case (implicitAddrMb, contractAddrMb) of- (Nothing, Nothing) -> throwError $ EEUnknownL1AddressAlias aliasText+ (Nothing, Nothing) -> throwEE $ EEUnknownL1AddressAlias aliasText (Just implicitAddr, Nothing) -> pure $ Constrained implicitAddr (Nothing, Just contractAddr) -> pure $ Constrained contractAddr- (Just implicitAddr, Just contractAddr) -> throwError $ EEAmbiguousAlias aliasText implicitAddr contractAddr+ (Just implicitAddr, Just contractAddr) -> throwEE $ EEAmbiguousAlias aliasText implicitAddr contractAddr SAOAKindSpecified (AddressResolved (addr@ContractAddress{})) -> pure $ Constrained addr SAOAKindSpecified (AddressResolved (addr@ImplicitAddress{})) -> pure $ Constrained addr SAOAKindSpecified (AddressAlias alias) -> do@@ -625,7 +638,7 @@ ContractAlias{} -> esGState . gsContractAddressAliasesL . ix alias . to Constrained case addrMb of Just addr -> pure addr- Nothing -> throwError $ EEUnknownAddressAlias $ SomeAlias alias+ Nothing -> throwEE $ EEUnknownAddressAlias $ SomeAlias alias -- | Resolves 'ContractAddressOrAlias' type to an address. resolveContractAddress@@ -637,7 +650,7 @@ AddressAlias alias -> resolveAddress (SAOAKindSpecified ct) >>= \case Constrained result -> case result of ContractAddress{} -> pure result- ImplicitAddress{} -> throwError $ EEUnknownAddressAlias (SomeAlias alias)+ ImplicitAddress{} -> throwEE $ EEUnknownAddressAlias (SomeAlias alias) -- | Execute a list of global operations, returning a list of generated events. executeGlobalOperations@@ -649,7 +662,7 @@ executeMany :: "isGlobalOp" :! Bool -> [ExecutorOp] -> ExecutorM [EmitOperation] executeMany isGlobalOp = \case [] -> pure []- (op:opsTail) -> do+ (op:opsTail) -> addStackEntry op do case op of OriginateOp origination -> do void $ executeOrigination isGlobalOp origination@@ -683,7 +696,7 @@ tcOpts <- view eeTcOpts when (tcStrict tcOpts) $- liftEither $ first EEDeprecatedType $ checkContractDeprecations ooContract+ liftEE $ first EEDeprecatedType $ checkContractDeprecations ooContract opHash <- use esOperationHash @@ -698,10 +711,10 @@ let originatorAddress = ooOriginator originatorBalance <- case lookupBalance originatorAddress gs of- Nothing -> throwError $ EEUnknownManager $ MkAddress ooOriginator+ Nothing -> throwEE $ EEUnknownManager $ MkAddress ooOriginator Just oldBalance | oldBalance < ooBalance ->- throwError $ EENotEnoughFunds (MkAddress ooOriginator) oldBalance+ throwEE $ EENotEnoughFunds (MkAddress ooOriginator) oldBalance | otherwise -> -- Subtraction is safe because we have checked its -- precondition in guard.@@ -720,7 +733,7 @@ ] case applyUpdates updates gs of- Left err -> throwError $ EEFailedToApplyUpdates err+ Left err -> throwEE $ EEFailedToApplyUpdates err Right newGS -> do esGState .= newGS esLog <>= ExecutorLog updates []@@ -745,7 +758,7 @@ let updates = [GSSetDelegate address sdoDelegate] case applyUpdates updates gs of- Left err -> throwError $ EEFailedToApplyUpdates err+ Left err -> throwEE $ EEFailedToApplyUpdates err Right newGS -> do esGState .= newGS esLog <>= ExecutorLog updates []@@ -758,7 +771,7 @@ -> EmitOperation -> ExecutorM EmitOperation executeEmit (arg #isGlobalOp -> isGlobalOp) op = do- when isGlobalOp $ throwError EEGlobalEmitOp+ when isGlobalOp $ throwEE EEGlobalEmitOp checkOperationReplay $ EmitOp op pure op @@ -798,8 +811,8 @@ :: forall arg. T.SingI arg => ContractAddress -> TxParam- -> "typedParamError" :! (Address -> MismatchError T.T -> ExecutorError)- -> "untypedParamError" :! (Address -> TcError -> ExecutorError)+ -> "typedParamError" :! (Address -> MismatchError T.T -> ExecutorErrorPrim Address)+ -> "untypedParamError" :! (Address -> TcError -> ExecutorErrorPrim Address) -> ExecutorM (T.Value arg, BigMapCounter) prepareParameter addr tdParameter (arg #typedParamError -> tyParErr)@@ -808,7 +821,7 @@ tcOpts <- view eeTcOpts gs <- use esGState let existingContracts = extractAllContracts gs- when (tcStrict tcOpts) $ liftEither $ first EEDeprecatedType $ checkSingDeprecations (sing @arg)+ when (tcStrict tcOpts) $ liftEE $ first EEDeprecatedType $ checkSingDeprecations (sing @arg) -- If the parameter has already been typechecked, simply check if -- its type matches the contract's entrypoint's type. -- Otherwise (e.g. if it was parsed from stdin via the CLI),@@ -817,9 +830,9 @@ case tdParameter of TxTypedParam (typedVal :: T.Value t) -> T.castM @t @arg typedVal $- throwError . tyParErr (MkAddress addr)+ throwEE . tyParErr (MkAddress addr) TxUntypedParam untypedVal ->- liftEither $ first (unTyParErr $ MkAddress addr) $+ liftEE $ first (unTyParErr $ MkAddress addr) $ typeCheckingWith tcOpts $ typeVerifyParameter @arg existingContracts untypedVal @@ -864,31 +877,31 @@ case isImplicitAddress senderAddr of Nothing -> do when (isGlobalOp && not isZeroTransfer) $- throwError $ EETransactionFromContract (MkAddress senderAddr) tdAmount+ throwEE $ EETransactionFromContract (MkAddress senderAddr) tdAmount Just Refl -> do case senderBalance of- Nothing -> throwError $ EEEmptyImplicitContract $ MkAddress senderAddr+ Nothing -> throwEE $ EEEmptyImplicitContract $ MkAddress senderAddr Just balance | balance == zeroMutez ->- throwError $ EEEmptyImplicitContract $ MkAddress senderAddr+ throwEE $ EEEmptyImplicitContract $ MkAddress senderAddr _ -> pass case isImplicitAddress addr of Nothing -> pass Just Refl -> do when (badParamToImplicitAccount tdParameter) $- throwError $ EEWrongParameterType $ MkAddress addr+ throwEE $ EEWrongParameterType $ MkAddress addr -- Transferring 0 XTZ to a key address is prohibited. when (isZeroTransfer && isUnitParam tdParameter) $- throwError $ EEZeroTransaction $ MkAddress addr+ throwEE $ EEZeroTransaction $ MkAddress addr mDecreaseSenderBalance <- case senderBalance of _ | isZeroTransfer -> pure Nothing- Nothing -> throwError $ EEUnknownSender $ MkAddress senderAddr+ Nothing -> throwEE $ EEUnknownSender $ MkAddress senderAddr Just balance | balance < tdAmount ->- throwError $ EENotEnoughFunds (MkAddress senderAddr) balance+ throwEE $ EENotEnoughFunds (MkAddress senderAddr) balance | otherwise -> do -- Subtraction is safe because we have checked its -- precondition in guard.@@ -922,7 +935,7 @@ updates = catMaybes [mDecreaseSenderBalance, mDecreaseSenderTickets] <> otherUpdates <> [GSIncrementCounter] - newGState <- liftEither $ first EEFailedToApplyUpdates $ applyUpdates updates gs+ newGState <- liftEE $ first EEFailedToApplyUpdates $ applyUpdates updates gs esGState .= newGState esRemainingSteps .= newRemSteps@@ -941,7 +954,7 @@ case addr of SmartRollupAddress{} ->- throwError $ EEUnknownContract (MkAddress addr)+ throwEE $ EEUnknownContract (MkAddress addr) ImplicitAddress{} -> case addresses ^. at addr of Nothing -> onlyUpdates Dict . one $ GSAddImplicitAddress addr tdAmount $ maybeToList sentTickets@@ -958,7 +971,7 @@ updTickets = uncurry (GSAddTickets addr) <$> sentTickets onlyUpdates Dict $ catMaybes [updBalance, updTickets] ContractAddress{} -> case addresses ^. at addr of- Nothing -> throwError $ EEUnknownContract (MkAddress addr)+ Nothing -> throwEE $ EEUnknownContract (MkAddress addr) Just ContractState{..} -> do let -- Calculate the contract's new balance.@@ -970,7 +983,7 @@ T.MkEntrypointCallRes _ (epc :: EntrypointCallT cp epArg) <- T.mkEntrypointCall epName (T.cParamNotes csContract)- & maybe (throwError $ EEUnknownEntrypoint epName) pure+ & maybe (throwEE $ EEUnknownEntrypoint epName) pure (typedParameterWithIds, bigMapCounter1) <- prepareParameter addr tdParameter ! #typedParamError EEUnexpectedParameterType@@ -1001,7 +1014,7 @@ { rslResult = extractValOps -> (sideEffects, newValue) , rslState = InterpreterState newRemainingSteps globalCounter2 bigMapCounter2 })- <- liftEither $ first (EEInterpreterFailed (MkAddress addr)) $+ <- liftEE $ first (EEInterpreterFailed (MkAddress addr)) $ handleReturn $ interpret csContract@@ -1044,10 +1057,10 @@ callView sender addr viewName viewArg = do ContractState{..} <- use (esGState . gsContractAddressesL . at addr)- >>= maybe (throwError $ EEUnknownContract (MkAddress addr)) pure+ >>= maybe (throwEE $ EEUnknownContract (MkAddress addr)) pure T.SomeView (view'@T.View{} :: T.View viewArg st viewRet)- <- liftEither $ first (EEViewLookupError (Constrained addr)) $ getViewByName csContract viewName+ <- liftEE $ first (EEViewLookupError (Constrained addr)) $ getViewByName csContract viewName (typedParameterWithIds, bigMapCounter1) <- prepareParameter addr viewArg ! #typedParamError (\a -> EEViewLookupError a . ViewArgMismatch)@@ -1064,7 +1077,7 @@ remainingSteps <- use esRemainingSteps iur@ResultStateLogs{..} <-- liftEither $ first (EEInterpreterFailed (MkAddress addr)) $+ liftEE $ first (EEInterpreterFailed (MkAddress addr)) $ handleReturn $ interpretView view' csStorage@@ -1091,7 +1104,7 @@ EmitOp (EmitOperation _ T.Emit{..}) -> emCounter prevCounters <- use esPrevCounters when (opCounter `HS.member` prevCounters) $- throwError $ EEOperationReplay op+ throwEE $ EEOperationReplay op esPrevCounters <>= one opCounter -- The argument is the address of the contract that generated this operation.@@ -1132,7 +1145,7 @@ } OpEmit emit -> case interpretedAddr of ContractAddress{} -> pure $ EmitOp $ EmitOperation interpretedAddr emit- _ -> throwError $ EEUnknownContract $ MkAddress interpretedAddr+ _ -> throwEE $ EEUnknownContract $ MkAddress interpretedAddr -- | Reset source address before executing a global operation. beginGlobalOperation :: ExecutorM ()@@ -1149,3 +1162,17 @@ isUnitParam (TxTypedParam T.VUnit) = True isUnitParam (TxUntypedParam U.ValueUnit) = True isUnitParam _ = False++getContractStack :: ExecutorM [ExecutorOp]+getContractStack = reverse <$> view eeCallChain++throwEE :: ExecutorErrorPrim Address -> ExecutorM r+throwEE err = throwError . flip ExecutorError err =<< getContractStack++liftEE :: Either (ExecutorErrorPrim Address) r -> ExecutorM r+liftEE x = do+ stack <- getContractStack+ liftEither . first (ExecutorError stack) $ x++addStackEntry :: ExecutorOp -> ExecutorM a -> ExecutorM a+addStackEntry entry = local (eeCallChain %~ coerce (entry :))
src/Morley/Michelson/Runtime/GState.hs view
@@ -121,10 +121,11 @@ hashWithSalt s = hashWithSalt s . toJSON -- | Convert a typed ticket value to 'TicketKey' and amount.-toTicketKey :: forall t. T.HasNoOp t => T.Value ('T.TTicket t) -> (TicketKey, Natural)+toTicketKey :: forall t. T.Value ('T.TTicket t) -> (TicketKey, Natural) toTicketKey (T.VTicket ticketer value amount) = (TicketKey (ticketer, T.untypeValue value, T.mkUType $ T.starNotes @t), amount) \\ T.valueTypeSanity value+ \\ T.comparableImplies (Proxy @t) deriveJSON morleyAesonOptions ''ImplicitState makeLensesWith postfixLFields ''ImplicitState
src/Morley/Michelson/Runtime/TxData.hs view
@@ -13,6 +13,7 @@ ) where import Control.Lens (makeLensesWith)+import Fmt (Buildable(..)) import Morley.Michelson.Typed (ParameterScope) import Morley.Michelson.Typed qualified as T@@ -28,6 +29,11 @@ TxUntypedParam :: U.Value -> TxParam deriving stock instance Show TxParam++instance Buildable TxParam where+ build = \case+ TxTypedParam val -> build val+ TxUntypedParam val -> build val -- | Data associated with a particular transaction. data TxData = TxData
src/Morley/Michelson/TypeCheck/Error.hs view
@@ -11,19 +11,21 @@ , TcError' (..) , ExtError (..) , StackSize (..)+ , TCOpSeq (..) , pairWithNodeIndex , pairWithElems ) where -import Fmt (Buildable(..), pretty, (+|), (|+)) import Prelude hiding (empty, (<$>))-import Text.PrettyPrint.Leijen.Text- (Doc, cat, enclose, indent, line, list, punctuate, textStrict, (<$$>), (<$>), (<+>)) +import Fmt (Buildable(..), Doc, isEmpty, nameF, pretty, (+|), (<$>), (<+>), (<//>), (</>), (|+))+import Fmt.Utils qualified as PP+import Prettyprinter (flatAlt, hardline)+import Prettyprinter qualified as PP+import Prettyprinter.Util (reflow)+ import Morley.Michelson.ErrorPos (ErrorSrcPos(..)) import Morley.Michelson.Printer.Util- (RenderDoc(..), buildRenderDoc, buildRenderDocExtended, doesntNeedParens, renderAnyBuildable,- renderDoc, renderDocList) import Morley.Michelson.TypeCheck.TypeCheckedOp (TypeCheckedOp) import Morley.Michelson.TypeCheck.Types (SomeHST(..)) import Morley.Michelson.Typed qualified as T@@ -59,8 +61,8 @@ deriving stock (Show, Eq, Generic) deriving anyclass (NFData) -instance RenderDoc TypeContext where- renderDoc _ = \case+instance Buildable TypeContext where+ build = \case LambdaArgument -> "argument to some lambda" LambdaCodeCtx -> "code in LAMBDA" DipCode -> "code in DIP"@@ -90,16 +92,10 @@ deriving anyclass (NFData) instance Buildable TopLevelType where- build = buildRenderDoc--instance RenderDoc TopLevelType where- renderDoc _ = \case+ build = \case TltParameterType -> "parameter" TltStorageType -> "storage" -instance Buildable TypeContext where- build = buildRenderDoc- -- | Data type that represents various errors -- which are related to type system. -- These errors are used to specify info about type check errors@@ -124,7 +120,7 @@ | UnexpectedTopLevelType TopLevelType (MismatchError T.T) -- ^ Error that happens when the caller expected one top-level type, but -- the contract has another type specified.- | InvalidInstruction (U.InstrAbstract ()) Text+ | InvalidInstruction (U.InstrAbstract [] ()) Text -- ^ Some instruction is invalid or used in an invalid way. -- For example, @PAIR 0@ or @PAIR 1@, or a @SELF@ instruction was used in a @LAMBDA@. --@@ -176,131 +172,136 @@ deriving anyclass (NFData) instance Buildable TcTypeError where- build = buildRenderDocExtended--instance RenderDoc TcTypeError where- renderDoc context = \case- TypeEqError merr ->- "Types not equal:" <$> renderDoc context merr- StackEqError merr ->- "Stacks not equal:" <$> renderDoc context merr- UnsupportedTypeForScope typ reason ->- "Type '" <> (renderDoc context typ) <> "' is unsupported here because it"- <+> (renderDoc context reason)+ build = \case+ TypeEqError merr -> nameF "Types not equal" $ build merr+ StackEqError merr -> nameF "Stacks not equal" $ build merr+ UnsupportedTypeForScope typ reason -> PP.group+ ("Type" <$>+ let res = build typ in flatAlt (PP.indent 2 res) (PP.squotes res) <> PP.line)+ <//> reflow "is unsupported here because it" </> build reason NotNumericTypes t1 t2 ->- "Some of the types in an arithmetic operation are not numeric:"- <+> (renderDoc context t1) <+> "and" <+> (renderDoc context t2)- UnexpectedType (t :| ts) ->- "Wrong stack type for instruction, expect stack type to begin with " <+>- (cat $ punctuate "or"- $ fmap (\(x :| xs) -> list $ fmap (renderAnyBuildable) (x:xs))- $ (t:ts)- )- UnexpectedTopLevelType tyDesc mmerr ->- "Unexpected" <+> renderDoc context tyDesc <+> "type."- <$$> renderDoc doesntNeedParens mmerr- InvalidInstruction instr reason ->- "Invalid instruction" <+> (renderDoc context (instr $> ("..." :: Text)))- <$$> "Reason:" <+> textStrict reason- InvalidValueType t ->- "Value type is never a valid" <+> enclose "`" "`" (renderDoc context t)- NotEnoughItemsOnStack ->- "Not enough items on stack"- UnknownContract addr ->- "Contract is not registered:" <+> (renderAnyBuildable addr)- IllegalEntrypoint err -> renderDoc context err- EntrypointNotFound ep ->- "No such entrypoint" <+> enclose "`" "`" (renderAnyBuildable ep)- IllegalParamDecl err -> renderDoc context err+ nameF (reflow "Some of the types in an arithmetic operation are not numeric") $+ PP.sep+ [ build t1 <+> "and"+ , build t2+ ]+ UnexpectedType stacks -> "Wrong stack type for instruction."+ </> nameF "Expected stack type to begin with"+ (PP.sep $ PP.punctuate " or" (fmap build $ toList stacks))+ UnexpectedTopLevelType tyDesc mmerr -> nameF+ ("Unexpected" <+> build tyDesc <+> "type")+ (build mmerr)+ InvalidInstruction instr reason -> PP.vsep+ [ nameF "Invalid instruction" $ build (instr $> ("..." :: Text))+ , nameF "Reason" $ build reason+ ]+ InvalidValueType t -> nameF "Value type is never a valid" $ build t+ NotEnoughItemsOnStack -> "Not enough items on stack"+ UnknownContract addr -> nameF "Contract is not registered" $ build addr+ IllegalEntrypoint err -> build err+ EntrypointNotFound ep -> nameF "No such entrypoint" $ build ep+ IllegalParamDecl err -> build err NegativeNat -> "Natural number cannot be negative" MutezOverflow -> "Exceeds maximal value for mutez"- InvalidAddress e -> renderDoc context e- InvalidKeyHash e -> renderDoc context e- InvalidBls12381Object e -> renderDoc context e+ InvalidAddress e -> build e+ InvalidKeyHash e -> build e+ InvalidBls12381Object e -> build e InvalidTimestamp -> "Is not a valid RFC3339 timestamp"- CodeAlwaysFails ->- "Cannot use a terminate instruction (like FAILWITH) in this block"+ CodeAlwaysFails -> "Cannot use a terminate instruction (like FAILWITH) in this block" EmptyCode -> "Code block is empty" AnyError -> "Some of the arguments have invalid types"- InvalidBigMapId bigMapId ->- "No big_map with ID" <+> renderAnyBuildable bigMapId <+> "was found."- UnexpectedBigMapType bigMapId mismatchError ->- "A big_map with the ID" <+> renderAnyBuildable bigMapId <+> "was found, but it does not have the expected type."- <$$> renderDoc context mismatchError+ InvalidBigMapId bigMapId -> PP.nest 2 $+ reflow "No big_map with ID"+ </> build bigMapId+ </> reflow "was found."+ UnexpectedBigMapType bigMapId mismatchError -> PP.nest 2 $ PP.vsep+ [ reflow "A big_map with the ID"+ </> build bigMapId+ </> reflow "was found, but it does not have the expected type."+ , build mismatchError+ ] instance Exception TcTypeError where displayException = pretty -- | Type check error data TcError' op- = TcFailedOnInstr (U.InstrAbstract op) SomeHST ErrorSrcPos (Maybe TypeContext) (Maybe TcTypeError)- | TcFailedOnValue (U.Value' op) T.T Text ErrorSrcPos (Maybe TcTypeError)+ = TcFailedOnInstr (U.InstrAbstract [] op) SomeHST ErrorSrcPos (Maybe TypeContext) (Maybe TcTypeError)+ | TcFailedOnValue (U.Value' [] op) T.T Text ErrorSrcPos (Maybe TcTypeError) | TcContractError Text (Maybe TcTypeError) | TcViewError Text U.ViewName (Maybe TcTypeError) | TcUnreachableCode ErrorSrcPos (NonEmpty op) | TcExtError SomeHST ErrorSrcPos ExtError- | TcIncompletelyTyped (TcError' op) (U.Contract' (TypeCheckedOp op))- | TcIncompletelyTypedView (TcError' op) (U.View' (TypeCheckedOp op))+ | TcIncompletelyTyped (TcError' op) (U.Contract' (TCOpSeq op))+ | TcIncompletelyTypedView (TcError' op) (U.View' (TCOpSeq op)) | TcDeprecatedType Text T.T deriving stock (Show, Eq, Generic) +-- | Used to smooth out the impedance mismatch between instruction arguments,+-- which must be sequences, and contract/view code which can be a singular+-- instruction. Only used for error reporting, as in general this isn't valid.+newtype TCOpSeq op = TCOpSeq [TypeCheckedOp op]+ deriving newtype (Show, Eq)+ deriving stock (Functor, Generic)+ deriving anyclass NFData++instance RenderDoc op => RenderDoc (TCOpSeq op) where+ renderDoc _ (TCOpSeq ops) = renderOpsListNoBraces False ops+ type TcError = TcError' U.ExpandedOp instance (NFData op, NFData (TypeCheckedOp op)) => NFData (TcError' op) -instance RenderDoc op => Buildable (TcError' op) where- build = buildRenderDocExtended--instance RenderDoc op => RenderDoc (TcError' op) where- renderDoc context = \case- TcFailedOnInstr instr (SomeHST t) ics mbTCTypeContext mbTcTypeError -> line- <> "Error checking expression:"- <> surroundWithNewLines (renderDoc context instr)- <> "against input stack type:"- <> surroundWithNewLines (renderDoc context t)- <> maybe "" (\c -> "Error in" <+> renderDoc context c) mbTCTypeContext- <> maybe "" (\e -> ":" <+> (renderDoc context e) <> "." <$$> line) mbTcTypeError- <> (renderDoc context ics)- TcFailedOnValue v t custom ics mbTcTypeError ->- "Error checking value"- <$$> (renderDoc context v) <+> "against type"- <+> (renderDoc context t) <> (bool (":" <+> (renderAnyBuildable custom)) "." (null custom))- <+> (maybe "" (\e -> line <> (renderDoc context e) <> line) mbTcTypeError)- <+> (renderDoc context ics)- TcContractError msg typeError ->- "Error occurred during contract typecheck:"- <$$> (renderAnyBuildable msg) <> (maybe "" (\e -> " " <> (renderDoc context e)) typeError)- TcViewError msg viewName typeError ->- "Error occurred during typecheck of view " <> renderDoc context viewName <> ":"- <$$> (renderAnyBuildable msg) <> (maybe "" (\e -> " " <> (renderDoc context e)) typeError)- TcUnreachableCode ics instrs ->- "Unreachable code:" <$$> buildTruncated 3 (toList instrs) <> "."- <+> (renderDoc context ics)- TcExtError (SomeHST t) ics e ->- "Error occurred during Morley extension typecheck:" <>- (renderAnyBuildable e) <+> "on stack" <+> (renderDoc context t) <> "."- <+> (renderDoc context ics)+instance (RenderDoc op, Buildable op) => Buildable (TcError' op) where+ build = \case+ TcFailedOnInstr instr (SomeHST t) ics mbTCTypeContext mbTcTypeError -> PP.vsep+ [ PP.nest 2 $ "Error checking expression:"+ <$> surroundWithNewLines (build instr)+ , PP.nest 2 $ "against input stack type:"+ <$> surroundWithNewLines (build t)+ , nameF+ (maybe mempty (("Error in" <+>) . build) mbTCTypeContext)+ (build mbTcTypeError)+ , build ics+ ]+ TcFailedOnValue v t custom ics mbTcTypeError -> PP.nest 2 $ PP.vsep $ filter (not . isEmpty)+ [ nameF "Error checking value" $ build v+ , nameF "Against type" $ build t+ , build custom+ , build mbTcTypeError+ , build ics+ ]+ TcContractError msg typeError -> nameF "Error occurred during contract typecheck" $+ build msg <$> build typeError+ TcViewError msg viewName typeError -> nameF+ ("Error occurred during typecheck of view " <> build viewName) $+ build msg <$> build typeError+ TcUnreachableCode ics instrs -> nameF "Unreachable code" $+ buildTruncated 3 (toList instrs) <> hardline <> build ics+ TcExtError (SomeHST t) ics e -> nameF+ "Error occurred during Morley extension typecheck" $ PP.vsep+ [ build e+ , "on stack"+ , build t+ , build ics+ ] TcIncompletelyTyped err contract ->- line- <> renderDoc doesntNeedParens contract- <$> renderDoc context err- TcIncompletelyTypedView err _view ->- line- <> renderDoc context err+ renderDoc doesntNeedParens contract <> PP.linebreak+ <$> build err+ TcIncompletelyTypedView err _view -> build err TcDeprecatedType err ty ->- "Found deprecated type:" <+> renderDoc doesntNeedParens ty <$> renderDoc doesntNeedParens err+ nameF "Found deprecated type" (renderDoc doesntNeedParens ty)+ <$> renderDoc doesntNeedParens err where- buildTruncated k l- | null (drop k l) = renderDocList context l- | otherwise = (renderDocList context (take k l)) <> " ..."+ buildTruncated k =+ PP.align . renderOpsListNoBraces False . trunc . fmap (renderDoc doesntNeedParens)+ where+ trunc (splitAt k -> (h, t))+ | null t = h+ | otherwise = h <> ["..."] - -- Helper to format a line using empty lines at the end and at the beginning,- -- and 4-space indents for the line itself- surroundWithNewLines :: Doc -> Doc- surroundWithNewLines l =- line- <$$> indent 4 l- <$$> line+ surroundWithNewLines :: Doc -> Doc+ surroundWithNewLines = PP.enclose PP.linebreak PP.linebreak instance Exception TcError where displayException = pretty
src/Morley/Michelson/TypeCheck/Ext.hs view
@@ -30,7 +30,7 @@ -- @SomeTcInstr@, wrap it in a @WellTypedSeq@. workOnInstr :: IsInstrOp op- => U.ExtInstrAbstract op+ => U.ExtInstrAbstract [] op -> TypeCheckInstr op (SomeTcInstr s) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op s) workOnInstr ext = tcEither@@ -41,7 +41,7 @@ :: forall s op. (SingI s, IsInstrOp op) => TcInstrBase op- -> U.ExtInstrAbstract op+ -> U.ExtInstrAbstract [] op -> HST s -> TypeCheckInstrNoExcept op (TypeCheckedSeq op s) typeCheckExt tcOp ext hst = do
src/Morley/Michelson/TypeCheck/Helpers.hs view
@@ -57,7 +57,7 @@ import Morley.Michelson.TypeCheck.Types import Morley.Michelson.Typed (BadTypeForScope(..), CommentType(StackTypeComment), Comparable, Contract, Contract'(..),- ExtInstr(COMMENT_ITEM), Instr(..), SingT(..), T(..), WellTyped, getComparableProofS, requireEq)+ ExtInstr(COMMENT_ITEM), Instr(..), SingT(..), T(..), WellTyped, comparabilityPresence, requireEq) import Morley.Michelson.Typed.Annotation import Morley.Michelson.Typed.Arith (Add, ArithOp(..), EDiv, Mul, Sub, UnaryArithOp(..)) import Morley.Michelson.Typed.Polymorphic@@ -125,7 +125,7 @@ onTypeCheckInstrErr :: (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m)- => Un.InstrAbstract op -> SomeHST -> Maybe TypeContext+ => Un.InstrAbstract [] op -> SomeHST -> Maybe TypeContext -> Either TcTypeError a -> m a onTypeCheckInstrErr instr hst mContext ei = do either (typeCheckInstrErr' instr hst mContext) return ei@@ -133,7 +133,7 @@ onScopeCheckInstrErr :: forall (t :: T) op m a. (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m, SingI t)- => Un.InstrAbstract op -> SomeHST -> Maybe TypeContext+ => Un.InstrAbstract [] op -> SomeHST -> Maybe TypeContext -> Either BadTypeForScope a -> m a onScopeCheckInstrErr instr hst mContext = \case Right a -> return a@@ -144,7 +144,7 @@ typeCheckInstrErr :: (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m)- => Un.InstrAbstract op -> SomeHST -> Maybe TypeContext+ => Un.InstrAbstract [] op -> SomeHST -> Maybe TypeContext -> m a typeCheckInstrErr instr hst mContext = do pos <- view tcieErrorPos@@ -152,7 +152,7 @@ typeCheckInstrErr' :: (MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m)- => Un.InstrAbstract op -> SomeHST -> Maybe TypeContext+ => Un.InstrAbstract [] op -> SomeHST -> Maybe TypeContext -> TcTypeError -> m a typeCheckInstrErr' instr hst mContext err = do pos <- view tcieErrorPos@@ -161,11 +161,11 @@ withCompareableCheck :: forall a m v ts op. (SingI ts, MonadReader TypeCheckInstrEnv m, MonadError (TcError' op) m) => Sing a- -> Un.InstrAbstract op+ -> Un.InstrAbstract [] op -> HST ts -> (Comparable a => v) -> m v-withCompareableCheck sng instr i act = case getComparableProofS sng of+withCompareableCheck sng instr i act = case comparabilityPresence sng of Just d@Dict -> pure $ withDict d act Nothing -> typeCheckInstrErr instr (SomeHST i) $ Just ComparisonArguments @@ -193,7 +193,7 @@ -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp) continueTypeChecking tcOp done rest = case done of WellTypedSeq instr -> handleFirst instr- MixedSeq i e left -> pure (MixedSeq i e (left <> map NonTypedInstr rest))+ MixedSeq n i e left -> pure (MixedSeq n i e (left <> map NonTypedInstr rest)) IllTypedSeq e left -> pure (IllTypedSeq e (left <> map NonTypedInstr rest)) where handleFirst :: SomeTcInstr inp -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)@@ -204,11 +204,11 @@ let combiner = combine inputStack instr pure case nextPiece of WellTypedSeq nextInstr -> WellTypedSeq (combiner nextInstr)- MixedSeq nextInstr err left -> MixedSeq (combiner nextInstr) err left- IllTypedSeq err left -> MixedSeq packedInstr err left+ MixedSeq n nextInstr err left -> MixedSeq n (combiner nextInstr) err left+ IllTypedSeq err left -> MixedSeq 0 packedInstr err left AnyOutInstr{} -> pure case rest of [] -> WellTypedSeq packedInstr- op : ops -> (MixedSeq+ op : ops -> (MixedSeq 0 packedInstr (TcUnreachableCode (extractOpPos op) (op :| ops)) (map NonTypedInstr ops))@@ -285,7 +285,7 @@ -> f (TypeCheckedSeq op inp') mapMSeq f v = case v of WellTypedSeq instr -> f instr <&> WellTypedSeq- MixedSeq instr err tail' -> f instr <&> \instr' -> MixedSeq instr' err tail'+ MixedSeq n instr err tail' -> f instr <&> \instr' -> MixedSeq n instr' err tail' IllTypedSeq err tail' -> pure $ IllTypedSeq err tail' mapSeq@@ -454,7 +454,7 @@ => (Anns '[VarAnn] -> Instr inp (ArithRes aop n m ': s)) -> HST inp -> VarAnn- -> Un.InstrAbstract op+ -> Un.InstrAbstract [] op -> t (SomeTcInstr inp) arithImpl mkInstr i@(_ ::& _ ::& rs) vn _ = pure $ i :/ mkInstr (Anns1 vn) ::: ((sing, Dict) ::& rs)@@ -470,7 +470,7 @@ => Sing a -> Sing b -> HST inp -> VarAnn- -> Un.InstrAbstract op+ -> Un.InstrAbstract [] op -> m (SomeTcInstr inp) addImpl t1 t2 = case (t1, t2) of (STInt, STInt) -> arithImpl @Add AnnADD@@ -497,7 +497,7 @@ => Sing a -> Sing b -> HST inp -> VarAnn- -> Un.InstrAbstract op+ -> Un.InstrAbstract [] op -> m (SomeTcInstr inp) edivImpl t1 t2 = case (t1, t2) of (STInt, STInt) -> edivImplDo@@ -519,7 +519,7 @@ ) => HST inp -> VarAnn- -> Un.InstrAbstract op+ -> Un.InstrAbstract [] op -> t (SomeTcInstr inp) edivImplDo i@(_ ::& _ ::& rs) vn _ = pure $ i :/ AnnEDIV (Anns1 vn) ::: ((sing, Dict) ::& rs)@@ -535,7 +535,7 @@ => Sing a -> Sing b -> HST inp -> VarAnn- -> Un.InstrAbstract op+ -> Un.InstrAbstract [] op -> m (SomeTcInstr inp) subImpl t1 t2 = case (t1, t2) of (STInt, STInt) -> arithImpl @Sub AnnSUB@@ -560,7 +560,7 @@ => Sing a -> Sing b -> HST inp -> VarAnn- -> Un.InstrAbstract op+ -> Un.InstrAbstract [] op -> m (SomeTcInstr inp) mulImpl t1 t2 = case (t1, t2) of (STInt, STInt) -> arithImpl @Mul AnnMUL
src/Morley/Michelson/TypeCheck/Instr.hs view
@@ -100,7 +100,7 @@ typeCheckContractAndStorage' :: IsInstrOp op- => TcInstrBase op -> U.Contract' op -> U.Value' op -> TypeCheckResult op SomeContractAndStorage+ => TcInstrBase op -> U.Contract' op -> U.Value' [] op -> TypeCheckResult op SomeContractAndStorage typeCheckContractAndStorage' tcOp uContract uStorage = do SomeContract (contract@Contract{} :: Contract cp st) <- typeCheckContract' tcOp uContract storage <- typeVerifyStorage' @st tcOp uStorage@@ -112,8 +112,7 @@ typeCheckContract = typeCheckContract' typeCheckExpandedOp typeCheckContract'- :: IsInstrOp op- => TcInstrBase op+ :: TcInstrBase op -> U.Contract' op -> TypeCheckResult op SomeContract typeCheckContract' tcOp c = do@@ -129,7 +128,7 @@ typeVerifyContract' :: forall cp st op.- (SingI cp, SingI st, IsInstrOp op)+ (SingI cp, SingI st) => TcInstrBase op -> U.Contract' op -> TypeCheckResult op (Contract cp st) typeVerifyContract' tcOp uContract = do SomeContract tContract@(Contract{} :: Contract cp' st') <-@@ -148,7 +147,7 @@ Right Dict -> fn Left err -> throwError $ TcContractError (pretty err) Nothing -withWTPInstr_ :: forall t op a. SingI t => U.InstrAbstract op -> SomeHST -> (WellTyped t => TypeCheckInstr op a) -> TypeCheckInstr op a+withWTPInstr_ :: forall t op a. SingI t => U.InstrAbstract [] op -> SomeHST -> (WellTyped t => TypeCheckInstr op a) -> TypeCheckInstr op a withWTPInstr_ v t fn = case getWTP @t of Right Dict -> fn Left (NotWellTyped badType cause) -> do@@ -157,7 +156,7 @@ withWTPInstr'_ :: forall t op inp. (SingI t, IsInstrOp op)- => U.InstrAbstract op+ => U.InstrAbstract [] op -> SomeHST -> (WellTyped t => TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)@@ -170,13 +169,10 @@ pure $ IllTypedSeq err [NonTypedInstr $ liftInstr v] doTypeCheckContract'- :: forall op. IsInstrOp op- => TcInstrBase op+ :: forall op. TcInstrBase op -> U.Contract' op -> TypeCheck op SomeContract doTypeCheckContract' tcOp uContract@(U.Contract wholeParam@(U.ParameterType mParam rootAnn) mStorage pCode entriesOrder uViews) = do- _ <- maybe (throwError $ TcContractError "no instructions in contract code" $ Just EmptyCode)- pure (nonEmpty pCode) withUType mParam $ \(paramNote :: Notes param) -> withUType mStorage $ \(storageNote :: Notes st) -> do withWTP @st $ do@@ -191,20 +187,18 @@ codeRes <- usingReaderT def $ liftNoExcept $- typeCheckImpl- (giveNotInView $ local (set tcieNotInView $ Just Dict) ... tcOp)- pCode- inp+ giveNotInView $ local (set tcieNotInView $ Just Dict) $+ tcOp pCode inp instr@(_ :/ instrOut) <- tcsEither onFailedCodeTypeCheck pure codeRes -- typecheck views cViews <- typeCheckViews' tcOp- uContract{ U.contractCode = [someInstrToOp instr], U.contractViews = def }+ uContract{ U.contractCode = someInstrToOp instr, U.contractViews = def } storageNote uViews let tcViews = coerce $ someViewToOp @_ @op <$> coerce @_ @(ViewsSetF (SomeView st)) cViews- handleError (onFailedFullTypeCheck [someInstrToOp instr] tcViews) $ do+ handleError (onFailedFullTypeCheck (someInstrToOp instr) tcViews) $ do -- match contract code with contract signature, construct contract let cStoreNotes = storageNote cParamNotes <-@@ -235,22 +229,22 @@ then TcIncompletelyTyped err U.Contract { contractParameter = wholeParam , contractStorage = mStorage- , contractCode = ops+ , contractCode = TCOpSeq ops , entriesOrder = entriesOrder , contractViews = def } else err - onFailedFullTypeCheck :: [TypeCheckedOp op] -> U.ViewsSet (TypeCheckedOp op) -> TcError' op -> TypeCheck op a+ onFailedFullTypeCheck :: TypeCheckedOp op -> U.ViewsSet (TypeCheckedOp op) -> TcError' op -> TypeCheck op a onFailedFullTypeCheck ops views err = do verbose <- asks' tcVerbose throwError if verbose then TcIncompletelyTyped err U.Contract { contractParameter = wholeParam , contractStorage = mStorage- , contractCode = ops+ , contractCode = TCOpSeq [ops] , entriesOrder = entriesOrder- , contractViews = views+ , contractViews = TCOpSeq . one <$> views } else err @@ -262,7 +256,7 @@ typeVerifyView' :: forall arg ret st op.- (SingI arg, SingI ret, WellTyped st, IsInstrOp op)+ (SingI arg, SingI ret, WellTyped st) => TcInstrBase op -> Notes st -> U.View' op -> TypeCheckResult op (View arg st ret) typeVerifyView' tcOp notes v = do SomeView (tcView@View{} :: View arg' st' ret') <-@@ -278,7 +272,7 @@ UnexpectedTopLevelType tyDesc merr typeCheckView'- :: (WellTyped st, IsInstrOp op)+ :: WellTyped st => TcInstrBase op -> Notes st -> U.View' op@@ -301,7 +295,7 @@ codeRes <- usingReaderT def $ liftNoExcept $- typeCheckImpl tcOp uInstr inp+ tcOp uInstr inp _ :/ instrOut <- tcsEither (onFailedViewsTypeCheck uView) pure codeRes @@ -322,7 +316,7 @@ onFailedViewsTypeCheck v viewOps err = do verbose <- asks' tcVerbose throwError if verbose- then TcIncompletelyTypedView err v{ U.viewCode = viewOps }+ then TcIncompletelyTypedView err v{ U.viewCode = TCOpSeq viewOps } else err hasTypeError :: forall (t :: T) a op. SingI t => Text -> BadTypeForScope -> TypeCheck op a@@ -332,7 +326,7 @@ typeCheckViews' :: forall st op.- (WellTyped st, IsInstrOp op)+ WellTyped st => TcInstrBase op -> U.Contract' (TypeCheckedOp op) -> Notes st@@ -343,7 +337,7 @@ typeCheckView' doTypeCheckOp storageNote uView `catchError` \case TcIncompletelyTypedView err view' ->- let tcViews = someViewToOp <$> processedViews+ let tcViews = fmap (TCOpSeq . one) . someViewToOp <$> processedViews in onFailedViewsTypeCheck (coerce $ unsafeInsert name view' tcViews) err err -> throwError err where@@ -352,11 +346,11 @@ unsafeInsert :: ViewName -> a -> ViewsSetF a -> ViewsSetF a unsafeInsert = unsafe ... VS.addViewToSet . const - onFailedViewsTypeCheck :: U.ViewsSet (TypeCheckedOp op) -> TcError' op -> TypeCheck op a+ onFailedViewsTypeCheck :: U.ViewsSet (TCOpSeq op) -> TcError' op -> TypeCheck op a onFailedViewsTypeCheck processedViews err = do verbose <- asks' tcVerbose throwError if verbose- then TcIncompletelyTyped err tcContract+ then TcIncompletelyTyped err (TCOpSeq . one <$> tcContract) { U.contractViews = processedViews } else err@@ -445,7 +439,7 @@ typeVerifyStorage' :: (SingI t, IsInstrOp op)- => TcInstrBase op -> U.Value' op -> TypeCheckResult op (Value t)+ => TcInstrBase op -> U.Value' [] op -> TypeCheckResult op (Value t) typeVerifyStorage' tcOp = typeVerifyTopLevelType' tcOp Nothing typeVerifyTopLevelType@@ -455,7 +449,7 @@ typeVerifyTopLevelType' :: forall t op. (SingI t, IsInstrOp op)- => TcInstrBase op -> Maybe TcOriginatedContracts -> U.Value' op -> TypeCheckResult op (Value t)+ => TcInstrBase op -> Maybe TcOriginatedContracts -> U.Value' [] op -> TypeCheckResult op (Value t) typeVerifyTopLevelType' tcOp mOriginatedContracts valueU = runTypeCheck (TypeCheckValue (valueU, demote @t) Nothing) $ usingReaderT def $ typeCheckValImpl mOriginatedContracts tcOp valueU@@ -479,7 +473,7 @@ typeCheckTopLevelType' :: IsInstrOp op- => TcInstrBase op -> Maybe TcOriginatedContracts -> U.Ty -> U.Value' op -> TypeCheckResult op SomeValue+ => TcInstrBase op -> Maybe TcOriginatedContracts -> U.Ty -> U.Value' [] op -> TypeCheckResult op SomeValue typeCheckTopLevelType' tcOp mOriginatedContracts (AsUType (_ :: Notes t)) valueU = SomeValue <$> typeVerifyTopLevelType' @t tcOp mOriginatedContracts valueU @@ -555,7 +549,7 @@ -- non-throwing one, embedding possible errors into the type checking tree. workOnInstr :: IsInstrOp op- => U.InstrAbstract op+ => U.InstrAbstract [] op -> TypeCheckInstr op (SomeTcInstr s) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op s) workOnInstr instr = tcEither@@ -579,7 +573,7 @@ -- If there was no match on a given pair of instruction and input stack, -- that is interpreted as input of wrong type and type check finishes with -- error.-typeCheckInstr :: forall op. IsInstrOp op => TcInstrBase op -> TcInstr op (U.InstrAbstract op)+typeCheckInstr :: forall op. IsInstrOp op => TcInstrBase op -> TcInstr op (U.InstrAbstract [] op) typeCheckInstr tcOp uInstr inp = case (uInstr, inp) of (U.EXT ext, si) -> typeCheckExt tcOp ext si@@ -1144,7 +1138,7 @@ (U.DIP is, a ::& s) -> do typeCheckDipBody tcOp U.DIP uInstr is s- (IllTypedSeq)+ IllTypedSeq (\subI t -> WellTypedSeq $ inp :/ DIP subI ::: (a ::& t)) (U.DIP _is, SNil) -> notEnoughItemsOnStack@@ -1552,8 +1546,11 @@ (STOption STKeyHash, _) ::& (STMutez{}, _) ::& (_ :: SingT g, Dict) ::& rs) -> workOnInstr uInstr $ withNotInView uInstr do- (SomeContract contr@(Contract _ _ (_ :: Notes st) _ _))- <- lift $ doTypeCheckContract' tcOp contract+ paramType <- liftEither $ first (TcContractError "illegal parameter declaration: " . Just ) $+ mkSomeParamType $ U.contractParameter contract+ SomeContract contr@(Contract _ _ (_ :: Notes st) _ _) <- lift $+ local (tcModeL .~ TypeCheckContract paramType) $+ doTypeCheckContract' tcOp contract Refl <- onTypeCheckInstrErr uInstr (SomeHST inp) (Just ContractStorage) $ eqType @g @st pure@@ -1789,7 +1786,7 @@ notEnoughItemsOnStack' :: TypeCheckInstr op a notEnoughItemsOnStack' = failWithErr' NotEnoughItemsOnStack - withNotInView :: U.InstrAbstract op -> (IsNotInView => TypeCheckInstr op r) -> TypeCheckInstr op r+ withNotInView :: U.InstrAbstract [] op -> (IsNotInView => TypeCheckInstr op r) -> TypeCheckInstr op r withNotInView instr act = asks' (tcMode @op) >>= \case -- we provide the not-in-view constraint in the isolated mode TypeCheckTest -> giveNotInView act@@ -1809,7 +1806,7 @@ Instr bfi s' -> Instr (cond ': rs) s' )- -> (forall op1. [op1] -> [op1] -> U.InstrAbstract op1)+ -> (forall op1. [op1] -> [op1] -> U.InstrAbstract [] op1) -> [op] -> [op] -> HST bti@@ -1817,7 +1814,7 @@ -> HST (cond ': rs) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op (cond ': rs)) genericIf tcOp cons mCons mbt mbf bti bfi i@(_ ::& _) = do- let cons1 opsT = mCons opsT (map (IllTypedOp . NonTypedInstr) mbf)+ let cons1 opsT = mCons opsT (one $ IllTypedOp $ map NonTypedInstr mbf) preserving' (tcList tcOp mbt bti) cons1 $ \tInstr@(_ :/ pinstr) -> do let cons2 opsF = mCons [someInstrToOp tInstr] opsF preserving (tcList tcOp mbf bfi) cons2 $ \(_ :/ qinstr) -> do@@ -1845,7 +1842,7 @@ -> ([TypeCheckedOp op] -> TypeCheckedInstr op) -> SingT (MapOpInp c) -> VarAnn- -> U.InstrAbstract op+ -> U.InstrAbstract [] op -> [op] -> HST (c ': rs) -> (forall v'. (SingI v') =>@@ -1873,7 +1870,7 @@ ) => TcInstrBase op -> SingT (IterOpEl c)- -> U.InstrAbstract op+ -> U.InstrAbstract [] op -> [op] -> HST (c ': rs) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op (c ': rs))@@ -1895,7 +1892,7 @@ -> SingT ot -> ([TypeCheckedOp op] -> TypeCheckedInstr op) -> Anns '[VarAnn, Notes it, Notes ot]- -> U.InstrAbstract op+ -> U.InstrAbstract [] op -> HST ts -> TypeCheckInstrNoExcept op (TypeCheckedSeq op ts) @@ -1951,11 +1948,11 @@ AnyOutInstr lam -> pure (tyCon anns (RfAlwaysFails lam) ::: lamSt ons) where- hasSelf :: op -> First (U.InstrAbstract op)+ hasSelf :: op -> First (U.InstrAbstract [] op) hasSelf = everything (<>) (mkQ (First Nothing) (\case- selfInstr@(U.SELF{} :: U.InstrAbstract op) -> First $ Just selfInstr+ selfInstr@(U.SELF{} :: U.InstrAbstract [] op) -> First $ Just selfInstr _ -> First Nothing ) )@@ -1980,8 +1977,10 @@ typeCheckSeqWithLoc loc op = fmap (wrapWithLoc loc) . local (set tcieErrorPos loc) . typeCheckSeq op typeCheckSeq :: TcInstr U.ExpandedOp [U.ExpandedOp]- typeCheckSeq sq hst = typeCheckImpl typeCheckExpandedOp sq hst- <&> mapSeq (mapSomeInstr Nested)+ typeCheckSeq sq hst = typeCheckImpl typeCheckExpandedOp sq hst <&> \case+ WellTypedSeq instr -> WellTypedSeq $ mapSomeInstr Nested instr+ MixedSeq nest instr err rest -> MixedSeq (succ nest) instr err rest+ IllTypedSeq err op -> IllTypedSeq err [IllTypedNest op] ---------------------------------------------------------------------------- -- Helpers for DIP (n) typechecking@@ -1999,7 +1998,7 @@ :: (SingI inp, IsInstrOp op) => TcInstrBase op -> ([TypeCheckedOp op] -> TypeCheckedInstr op)- -> U.InstrAbstract op+ -> U.InstrAbstract [] op -> [op] -> HST inp -> (TcError' op -> [IllTypedInstr op] -> r)
src/Morley/Michelson/TypeCheck/TypeCheck.hs view
@@ -121,7 +121,7 @@ data TypeCheckMode op = TypeCheckValue -- ^ We're typechecking a value.- (U.Value' op, T.T)+ (U.Value' [] op, T.T) (Maybe BigMapFinder) -- ^ When this is a `Just`, we simulate the typechecking behavior of the RPC's @/run_code@ endpoint. --@@ -220,7 +220,7 @@ -- | Lift a single instruction to operation. -- -- This is used only in error messages.- liftInstr :: U.InstrAbstract op -> op+ liftInstr :: U.InstrAbstract [] op -> op -- | Get callstack at this instruction, if any given. --@@ -235,14 +235,14 @@ -- two forms. -- -- TODO [#785]: try to remove these two functions- tryOpToVal :: op -> Maybe (U.Value' op)+ tryOpToVal :: op -> Maybe (U.Value' [] op) -- | Do our best to re-interpret a value as an instruction. -- -- This does the opposite to 'tryOpToVal'. -- -- If a value is already a lambda, this can return 'Nothing'.- tryValToOp :: U.Value' op -> Maybe op+ tryValToOp :: U.Value' [] op -> Maybe op instance IsInstrOp U.ExpandedOp where liftInstr = U.PrimEx@@ -299,7 +299,7 @@ -- untyped instruction. guarding :: IsInstrOp op- => U.InstrAbstract op -- ^ Untyped instruction+ => U.InstrAbstract [] op -- ^ Untyped instruction -> TypeCheckInstr op a -- ^ Acquiring computation -> (a -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)) -- ^ Follow-up action -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)@@ -312,7 +312,7 @@ -- action. guarding_ :: IsInstrOp op- => U.InstrAbstract op+ => U.InstrAbstract [] op -> TypeCheckInstr op a -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp) -> TypeCheckInstrNoExcept op (TypeCheckedSeq op inp)
src/Morley/Michelson/TypeCheck/TypeCheckedOp.hs view
@@ -7,13 +7,19 @@ ( TypeCheckedInstr , TypeCheckedOp(..) , IllTypedInstr(..)+ , Nesting+ , SomeSingInstr(..) , someInstrToOp , someViewToOp+ , withSomeTcInstr ) where import Data.Singletons (SingI)+import Fmt (Doc)+import Prettyprinter (enclose) -import Morley.Michelson.Printer.Util (RenderDoc(..), renderOpsListNoBraces)+import Morley.Michelson.Printer.Util+ (RenderDoc(..), doesntNeedParens, renderOpsList, renderOpsListNoBraces) import Morley.Michelson.TypeCheck.Types (HST(..), SomeTcInstr(..), SomeTcInstrOut(..)) import Morley.Michelson.Typed.Aliases import Morley.Michelson.Typed.Annotation@@ -22,58 +28,98 @@ import Morley.Michelson.Typed.View (SomeView'(..), View'(..)) import Morley.Michelson.Untyped qualified as U import Morley.Michelson.Untyped.Instr (InstrAbstract(..))-import Morley.Util.TH (deriveGADTNFData) -- | Represents a root of a partially typed operation tree.-type TypeCheckedInstr op = InstrAbstract (TypeCheckedOp op)+type TypeCheckedInstr op = InstrAbstract [] (TypeCheckedOp op) +newtype Nesting = Nesting Word+ deriving newtype (Eq, Ord, Enum, Bounded, Num, NFData)+ deriving stock Show++data SomeSingInstr where+ SomeSingInstr :: (SingI inp, SingI out) => Instr inp out -> SomeSingInstr++deriving stock instance Show SomeSingInstr++instance Eq SomeSingInstr where+ SomeSingInstr i1 == SomeSingInstr i2 = castInstr i1 == Just i2++instance NFData SomeSingInstr where+ rnf (SomeSingInstr x) = rnf x+ -- | Represents nodes of a partially typed operation tree. data TypeCheckedOp op where -- | Constructs well-typed node.- WellTypedOp :: (SingI inp, SingI out) => Instr inp out -> TypeCheckedOp op+ WellTypedOp :: SomeSingInstr -> TypeCheckedOp op -- | Constructs ill-typed node which might in turn contain well-typed and -- non-typed operations.- IllTypedOp :: IllTypedInstr op -> TypeCheckedOp op--deriving stock instance Show op => Show (TypeCheckedOp op)-deriving stock instance Functor TypeCheckedOp--instance Eq op => Eq (TypeCheckedOp op) where- WellTypedOp i1 == WellTypedOp i2 = castInstr i1 == Just i2- IllTypedOp i1 == IllTypedOp i2 = i1 == i2- _ == _ = False+ IllTypedOp :: [IllTypedInstr op] -> TypeCheckedOp op+ -- | Partially typed sequence of operations. Used exclusively for error-reporting.+ -- 'Nesting' argument exists because we can't mix typed and untyped+ -- instructions, so we need a way to represent brace nesting of @{ <typed+ -- seq>; <untyped seq> }@+ MixedOp :: Nesting -> SomeSingInstr -> [IllTypedInstr op] -> TypeCheckedOp op+ deriving stock (Eq, Functor, Show) -- | Represents a non-well-typed operation data IllTypedInstr op- = SemiTypedInstr (TypeCheckedInstr op) -- ^ Constructs a partialy typed operation.+ = SemiTypedInstr (TypeCheckedInstr op) -- ^ Constructs a partially typed operation. | NonTypedInstr op -- ^ Constructs a completely untyped operation.+ | IllTypedNest [IllTypedInstr op] -- ^ Nested sequence of ill-typed operations. deriving stock (Show, Eq, Generic, Functor) +instance RenderDoc op => RenderDoc (IllTypedInstr op) where+ renderDoc pn = \case+ SemiTypedInstr instr -> renderDoc pn instr+ NonTypedInstr op -> renderDoc pn op+ IllTypedNest ops -> renderOpsList False ops+ deriving anyclass instance (NFData (TypeCheckedOp op), NFData op) => NFData (IllTypedInstr op) instance RenderDoc op => RenderDoc (TypeCheckedOp op) where- renderDoc _ (WellTypedOp instr) = renderOpsListNoBraces False (instrToOps instr)- renderDoc pn (IllTypedOp (SemiTypedInstr instr)) = renderDoc pn instr- renderDoc pn (IllTypedOp (NonTypedInstr op)) = renderDoc pn op+ renderDoc _ (WellTypedOp (SomeSingInstr instr)) = renderOpsListNoBraces False (instrToOps instr)+ renderDoc _ (MixedOp nesting (SomeSingInstr instr) rest) =+ nestBraces nesting $ renderOpsListNoBraces False $ doRender (instrToOps instr) <> doRender rest+ where+ doRender :: RenderDoc a => [a] -> [Doc]+ doRender = fmap (renderDoc doesntNeedParens) . filter isRenderable+ renderDoc _ (IllTypedOp ops) = renderOpsListNoBraces False ops +nestBraces :: Nesting -> Doc -> Doc+nestBraces 0 = id+nestBraces n = enclose "{ " " }" . nestBraces (pred n)+ -- | Makes a well-typed node out of `SomeTcInstr` someInstrToOp :: SomeTcInstr inp -> TypeCheckedOp op-someInstrToOp (hst :/ rest) = case hst of+someInstrToOp hst = withSomeTcInstr hst $ WellTypedOp . SomeSingInstr++-- | Extracts 'Instr' from 'SomeTcInstr' and passes it to a continuation.+withSomeTcInstr+ :: SomeTcInstr inp+ -> (forall out. (SingI inp, SingI out) => Instr inp out -> r)+ -> r+withSomeTcInstr (hst :/ rest) = case hst of SNil -> go rest (::&){} -> go rest where- go :: SingI inp => SomeTcInstrOut inp -> TypeCheckedOp op- go (i ::: _) = WellTypedOp i- go (AnyOutInstr i) = WellTypedOp (i @'[])+ go :: SingI inp => SomeTcInstrOut inp+ -> (forall out. (SingI inp, SingI out) => Instr inp out -> r)+ -> r+ go (i ::: _) cont = cont i+ go (AnyOutInstr i) cont = cont (i @'[]) -- | Makes takes a typed view and converts it into an untyped one with -- typechecked code. someViewToOp :: SomeView st -> U.View' (TypeCheckedOp op) someViewToOp (SomeView View{..}) = U.View- { U.viewCode = [WellTypedOp vCode]+ { U.viewCode = WellTypedOp $ SomeSingInstr vCode , U.viewName = vName , U.viewArgument = mkUType vArgument , U.viewReturn = mkUType vReturn } -$(deriveGADTNFData ''TypeCheckedOp)+instance NFData op => NFData (TypeCheckedOp op) where+ rnf = \case+ WellTypedOp x -> rnf x+ IllTypedOp x -> rnf x+ MixedOp x y z -> rnf x `seq` rnf y `seq` rnf z
src/Morley/Michelson/TypeCheck/TypeCheckedSeq.hs view
@@ -12,6 +12,7 @@ , TypeCheckedOp(..) , IllTypedInstr(..) , TypeCheckedSeq(..)+ , Nesting , tcsEither , seqToOps , someInstrToOp@@ -20,7 +21,6 @@ import Morley.Michelson.TypeCheck.Error (TcError') import Morley.Michelson.TypeCheck.TypeCheckedOp- (IllTypedInstr(..), TypeCheckedInstr, TypeCheckedOp(..), someInstrToOp, someViewToOp) import Morley.Michelson.TypeCheck.Types (SomeTcInstr(..)) -- | Represents a partiall typed sequence of instructions.@@ -28,15 +28,18 @@ -- | A fully well-typed sequence. = WellTypedSeq (SomeTcInstr inp) -- | A well-typed prefix followed by some error and semi-typed instructions.- | MixedSeq (SomeTcInstr inp) (TcError' op) [IllTypedInstr op]+ -- 'Nesting' argument exists because we can't mix typed and untyped+ -- instructions, so we need a way to represent brace nesting of @{ <typed+ -- seq>; <untyped seq> }@+ | MixedSeq Nesting (SomeTcInstr inp) (TcError' op) [IllTypedInstr op] -- | There is no well-typed prefix, only an error and semi-typed instructions. | IllTypedSeq (TcError' op) [IllTypedInstr op] seqToOps :: TypeCheckedSeq op inp -> [TypeCheckedOp op] seqToOps = \case WellTypedSeq instr -> [someInstrToOp instr]- MixedSeq instr _ tail' -> someInstrToOp instr : map IllTypedOp tail'- IllTypedSeq _ tail' -> map IllTypedOp tail'+ MixedSeq nesting instr _ tail' -> [withSomeTcInstr instr (MixedOp nesting . SomeSingInstr) tail']+ IllTypedSeq _ tail' -> [IllTypedOp tail'] -- | Case analysis for @TypeCheckedSeq@. tcsEither@@ -47,5 +50,5 @@ -> a tcsEither onErr onInstr v = case v of WellTypedSeq instr -> onInstr instr- MixedSeq _ err _ -> onErr (seqToOps v) err+ MixedSeq _ _ err _ -> onErr (seqToOps v) err IllTypedSeq err _ -> onErr (seqToOps v) err
src/Morley/Michelson/TypeCheck/Types.hs view
@@ -19,11 +19,9 @@ import Data.Constraint (Dict(..)) import Data.Map.Lazy qualified as Map import Data.Singletons (Sing, SingI(..))-import Fmt (Buildable(..), pretty, (+|), (|+))+import Fmt (Buildable(..), Doc, pretty, (+|), (<+>), (|+)) import Prelude hiding (EQ, GT, LT)-import Text.PrettyPrint.Leijen.Text (Doc, (<+>)) -import Morley.Michelson.Printer.Util import Morley.Michelson.Typed (SomeContract(..), T(..)) import Morley.Michelson.Typed qualified as T import Morley.Michelson.Typed.Contract@@ -69,16 +67,13 @@ rnf ((d, b) ::& hst) = rnf (d, b, hst) instance Buildable (HST ts) where- build = buildRenderDocExtended--instance RenderDoc (HST ts) where- renderDoc _ SNil = "[]"- renderDoc context (r ::& rs) = "[" <+> doRender (r ::& rs) <+> "]"+ build SNil = "[]"+ build (r ::& rs) = "[" <+> doRender (r ::& rs) <+> "]" where doRender :: HST (t ': ts_) -> Doc doRender ((t, Dict) ::& (b ::& c)) =- renderDoc context t <> "," <+> doRender (b ::& c)- doRender ((t, Dict) ::& SNil) = renderDoc context t+ build t <> "," <+> doRender (b ::& c)+ doRender ((t, Dict) ::& SNil) = build t infixr 7 ::& instance Eq (HST ts) where
src/Morley/Michelson/TypeCheck/Value.hs view
@@ -33,7 +33,7 @@ import Morley.Tezos.Crypto.Timelock (chestFromBytes, chestKeyFromBytes) import Morley.Util.Type (onFirst) -tcFailedOnValue :: U.Value' op -> T.T -> Text -> Maybe TcTypeError -> TypeCheckInstr op a+tcFailedOnValue :: U.Value' [] op -> T.T -> Text -> Maybe TcTypeError -> TypeCheckInstr op a tcFailedOnValue v t msg err = do loc <- view tcieErrorPos throwError $ TcFailedOnValue v t msg loc err@@ -59,11 +59,11 @@ (SingI ty, IsInstrOp op) => Maybe TcOriginatedContracts -> TcInstrBase op- -> U.Value' op+ -> U.Value' [] op -> TypeCheckInstr op (T.Value ty) typeCheckValImpl mOriginatedContracts tcDo uv = doTypeCheckVal (uv, sing @ty) where- doTypeCheckVal :: forall tz. (U.Value' op, Sing tz) -> TypeCheckInstr op (T.Value tz)+ doTypeCheckVal :: forall tz. (U.Value' [] op, Sing tz) -> TypeCheckInstr op (T.Value tz) doTypeCheckVal (uvalue, sng) = do typeCheckMode <- asks' (tcMode @op) case (uvalue, sng) of@@ -215,7 +215,7 @@ (U.ValueNil, STSet s) -> do instrPos <- view tcieErrorPos- case T.getComparableProofS s of+ case T.comparabilityPresence s of Just Dict -> withSingI s $ pure (T.VSet S.empty) Nothing -> throwError $ TcFailedOnValue uvalue (fromSing s) "Non comparable types are not allowed in Sets" instrPos (Just $ UnsupportedTypeForScope (fromSing s) T.BtNotComparable)@@ -250,13 +250,34 @@ -- `{ {} }` can be typechecked either as `VLam` or `VList`. (U.ValueLambda s, STList l) -> case traverse tryOpToVal s of- Just xs -> doTypeCheckVal (U.ValueSeq xs, sng)+ Just xs -> doTypeCheckVal (maybe U.ValueNil U.ValueSeq $ nonEmpty xs, sng) Nothing -> tcFailedOnValue uvalue (fromSing l) "" Nothing (U.ValueSeq s, STLambda _ _) -> case traverse tryValToOp s of- Just xs -> doTypeCheckVal (U.ValueLambda xs, sng)+ Just xs -> doTypeCheckVal (U.ValueLambda $ toList xs, sng) Nothing -> tcFailedOnValue uvalue (fromSing sng) "" Nothing + (U.ValueLamRec mp, lam@(STLambda (var :: Sing it) (b :: Sing ot)) :: Sing lam) ->+ withSingI var $ withSingI b $ do+ _ :/ instr <-+ withWTP @lam uvalue $ throwingTcError $+ typeCheckImpl+ -- lambdas can contain operations forbidden inside views, hence+ -- we invent a "not in view" constraint here.+ (giveNotInView $ local (set tcieNotInView $ Just Dict) ... tcDo)+ (toList mp)+ ((sing @it, Dict) ::& (lam, Dict) ::& SNil)+ case instr of+ code ::: (lo :: HST lo) -> withWTP @ot uvalue $ do+ case eqHST1 @ot lo of+ Right Refl -> do+ pure $ T.mkVLamRec (T.RfNormal code)+ Left m ->+ tcFailedOnValue uvalue (demote @ty)+ "wrong output type of lambda's value:" (Just m)+ AnyOutInstr code ->+ pure $ T.mkVLamRec (T.RfAlwaysFails code)+ (v, STLambda (var :: Sing it) (b :: Sing ot)) -> withSingI var $ withSingI b $ do mp <- case v of U.ValueNil -> pure []@@ -304,13 +325,13 @@ (v, t) -> tcFailedOnValue v (fromSing t) "unknown value" Nothing - seqToRightCombedPair :: (NonEmpty $ U.Value' op) -> U.Value' op+ seqToRightCombedPair :: (NonEmpty $ U.Value' [] op) -> U.Value' [] op seqToRightCombedPair (x :| [y]) = U.ValuePair x y seqToRightCombedPair (x :| xs) = U.ValuePair x $ seqToRightCombedPair (NE.fromList xs) withWTP :: forall t a. SingI t- => U.Value' op+ => U.Value' [] op -> (T.WellTyped t => TypeCheckInstr op a) -> TypeCheckInstr op a withWTP uvalue fn = case T.getWTP @t of@@ -318,7 +339,7 @@ Left err -> tcFailedOnValue uvalue (demote @ty) (pretty err) Nothing typeCheckValsImpl- :: ([U.Value' op], Sing t)+ :: ([U.Value' [] op], Sing t) -> TypeCheckInstr op [T.Value t] typeCheckValsImpl (mvs, sng) = fmap reverse $ foldM (\res mv -> (: res) <$> (doTypeCheckVal (mv, sng))) [] mvs@@ -328,8 +349,8 @@ -- It return list of pairs (key, value) with keys in ascending order -- so it is safe to call @fromDistinctAscList@ on returned list typeCheckMapVal- :: [U.Elt op]- -> U.Value' op+ :: [U.Elt [] op]+ -> U.Value' [] op -> Sing kt -> Sing vt -> TypeCheckInstr op [(T.Value kt, T.Value vt)]@@ -343,31 +364,27 @@ typecheckContractValue :: forall cp tz. (tz ~ 'T.TContract cp)- => U.Value' op -> EpAddress -> Sing cp -> TypeCheckInstr op (T.Value tz)+ => U.Value' [] op -> EpAddress -> Sing cp -> TypeCheckInstr op (T.Value tz) typecheckContractValue cv (EpAddress addr epName) pc = do instrPos <- view tcieErrorPos- let ensureTypeMatches :: forall t'. SingI t' => TypeCheckInstr op (cp :~: t')- ensureTypeMatches = liftEither @_ @(TypeCheckInstr op) $- first (TcFailedOnValue cv (demote @ty) "wrong contract parameter" instrPos . Just) $- (withSingI pc $ eqType @cp @t')- let unsupportedType :: T.BadTypeForScope -> TcError' op- unsupportedType reason = TcFailedOnValue cv (fromSing pc)- "Unsupported type in type argument of 'contract' type" instrPos $- Just $ UnsupportedTypeForScope (fromSing pc) reason+ let unsupportedType =+ TcFailedOnValue cv (demote @ty) "wrong contract parameter" instrPos . Just+ checkParameterScope :: TypeCheckInstr op (Dict (T.ParameterScope cp))+ checkParameterScope = liftEither+ $ first (unsupportedType . UnsupportedTypeForScope (fromSing pc))+ $ withSingI pc $ T.checkScope @(T.ParameterScope cp) case addr of ImplicitAddress _ -> case pc of STUnit -> pure $ VContract (MkAddress addr) T.sepcPrimitive STTicket _ -> do- Dict <- liftEither- $ first unsupportedType- $ withSingI pc $ T.checkScope @(T.ParameterScope cp)+ Dict <- checkParameterScope pure $ VContract (MkAddress addr) T.sepcPrimitive- _ -> throwError $- TcFailedOnValue cv (demote @ty) "wrong contract parameter" instrPos $ Just $- UnexpectedType (one "unit" :| [one "ticket 'a"])+ _ -> throwError $ unsupportedType $ UnexpectedType (one "unit" :| [one "ticket 'a"]) ContractAddress ca -> case mOriginatedContracts of- Nothing -> liftEither . Left $ unsupportedType T.BtHasContract+ Nothing -> throwError $ TcFailedOnValue cv (fromSing $ STContract pc)+ "'contract' type can not be used in this context" instrPos $+ Just $ UnsupportedTypeForScope (fromSing $ STContract pc) T.BtHasContract Just originatedContracts -> case M.lookup ca originatedContracts of Just (SomeParamType paramNotes) -> case T.mkEntrypointCall epName paramNotes of@@ -376,26 +393,23 @@ TcFailedOnValue cv (demote @ty) "unknown entrypoint" instrPos . Just $ EntrypointNotFound epName Just (T.MkEntrypointCallRes (_ :: Notes t') epc) -> do- Refl <- ensureTypeMatches @t'+ Refl <- liftEither $ first unsupportedType $ withSingI pc $ eqType @cp @t' pure $ VContract (MkAddress addr) (T.SomeEpc epc) Nothing -> throwError $ TcFailedOnValue cv (demote @ty) "Contract literal unknown" instrPos (Just $ UnknownContract addr) SmartRollupAddress _ -> do -- TODO [#932]: Check that argument type matches- Dict <- liftEither $- first (TcFailedOnValue cv (demote @ty) "Bad parameter type" instrPos .- Just . UnsupportedTypeForScope (fromSing pc)) $- withSingI pc $ T.checkScope @(T.ParameterScope cp)+ Dict <- checkParameterScope pure $ VContract (MkAddress addr) $ T.SomeEpc T.unsafeEpcCallRoot withComparable :: forall a (t :: T.T) ty op. Sing a- -> U.Value' op+ -> U.Value' [] op -> Sing t -> (T.Comparable a => TypeCheckInstr op ty) -> TypeCheckInstr op ty-withComparable s uv t act = case T.getComparableProofS s of+withComparable s uv t act = case T.comparabilityPresence s of Just Dict -> act Nothing -> do instrPos <- view tcieErrorPos@@ -404,12 +418,12 @@ withBigMapAbsence :: forall a (t :: T.T) ty op. Sing a- -> U.Value' op+ -> U.Value' [] op -> Sing t- -> (T.HasNoBigMap a => TypeCheckInstr op ty)+ -> (T.ForbidBigMap a => TypeCheckInstr op ty) -> TypeCheckInstr op ty-withBigMapAbsence s uv t act = case T.bigMapAbsense s of- Just Dict -> act+withBigMapAbsence s uv t act = case T.tAbsence T.SPSBigMap s of+ Just Refl -> act Nothing -> do instrPos <- view tcieErrorPos liftEither . Left $
src/Morley/Michelson/Typed/Annotation.hs view
@@ -34,10 +34,9 @@ import Data.Default (Default(def)) import Data.Singletons (Sing, SingI(..), fromSing)-import Fmt (Buildable(..)) import Language.Haskell.TH.Syntax (Lift) -import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDoc)+import Morley.Michelson.Printer.Util (RenderDoc(..)) import Morley.Michelson.Typed.Sing import Morley.Michelson.Typed.T (T(..)) import Morley.Michelson.Untyped qualified as Un@@ -94,10 +93,6 @@ deriving stock instance Show (Notes t) deriving stock instance Lift (Notes t) $(deriveGADTNFData ''Notes)---instance Buildable (Notes t) where- build = buildRenderDoc instance RenderDoc (Notes t) where renderDoc pn = renderDoc pn . mkUType
src/Morley/Michelson/Typed/ClassifiedInstr/Internal/TH.hs view
@@ -8,12 +8,12 @@ ( module Morley.Michelson.Typed.ClassifiedInstr.Internal.TH ) where -import Prelude hiding (Type)+import Prelude hiding (Type, lift) import Prelude qualified import Data.Constraint (Dict(..)) import Language.Haskell.TH-import Text.Show qualified as Show (show)+import Language.Haskell.TH.Syntax (Lift(..)) import Morley.Michelson.Typed.ClassifiedInstr.Internal.Classifiers.HasAnns import Morley.Michelson.Typed.ClassifiedInstr.Internal.Classifiers.IsAlwaysFailing@@ -46,9 +46,12 @@ cons'' <- mapM substOne cons pure [DataD cxt' name tvb mk cons'' ders] --- | A dirty hack to turn a enum value into its corresponding 'Name'-toName :: forall a. (Enum a, Show a) => a -> Name-toName = mkName . Show.show+-- | Convert a 'Enum' constructor to a TemplateHaskell type quote with the+-- corresponding promoted datakind constructor.+promote :: forall a. (Enum a, Lift a) => a -> TypeQ+promote = lift >=> \case+ ConE nm -> promotedT nm+ _ -> error "impossible because it's a enum" where _ = Dict @(Enum a) -- silence redundant constraint warning -- | Based on instruction constructor name and types of its arguments, generate@@ -56,11 +59,10 @@ classifyInstrTH :: Name -> [Type] -> TypeQ classifyInstrTH nm args = [t|'InstrClass $numc $ft $mich $anns|] where- numc = promotedT $ toName numc'- numc' = numChildren args- ft = promotedT . toName @FailureType $ isAlwaysFailing someEnum- mich = promotedT . toName $ isMichelson someEnum- anns = promotedT . toName $ hasAnns someEnum+ numc = promote $ numChildren args+ ft = promote $ isAlwaysFailing someEnum+ mich = promote $ isMichelson someEnum+ anns = promote $ hasAnns someEnum someEnum = fromName nm -- | Generate the function converting from 'Instr' to @WellClassifiedInstr@ existential.
src/Morley/Michelson/Typed/ClassifiedInstr/Internal/Types.hs view
@@ -2,6 +2,7 @@ -- SPDX-License-Identifier: LicenseRef-MIT-OA {-# OPTIONS_HADDOCK not-home #-}+{-# LANGUAGE DeriveLift #-} -- Required due to 'genSingletonsType' producing those. {-# OPTIONS_GHC -Wno-redundant-constraints #-}@@ -12,6 +13,7 @@ ) where import Data.Singletons (Sing)+import Language.Haskell.TH.Syntax (Lift) import Morley.Util.Sing @@ -28,7 +30,7 @@ -- ^ The instruction has one child. | TwoChildren -- ^ The instruction has two children.- deriving stock (Show, Enum)+ deriving stock (Show, Enum, Lift) -- | Whether an instruction always fails. An example of always-failing -- instruction is @NEVER@.@@ -38,7 +40,7 @@ | FailingNormal -- ^ Instruction might fail if inputs are incorrect, but will generally -- work.- deriving stock (Show, Enum)+ deriving stock (Show, Enum, Lift) data IsMichelson = FromMichelson@@ -50,7 +52,7 @@ -- ^ Wrappers that don't affect execution. | Structural -- ^ Michelson structures that are not instructions, e.g. a nested code block.- deriving stock (Show, Enum)+ deriving stock (Show, Enum, Lift) -- | Whether an instruction carries Michelson annotations. data HasAnns@@ -60,7 +62,7 @@ -- annotations as @Anns@ type, which is true for most annotated -- instructions. There are a couple exceptions, however. | DoesHaveNonStandardAnns- deriving stock (Show, Enum)+ deriving stock (Show, Enum, Lift) -- | A product type of all classifications. data InstrClass = InstrClass NumChildren FailureType IsMichelson HasAnns
src/Morley/Michelson/Typed/Contract.hs view
@@ -23,12 +23,10 @@ , mapContractCodeM , mapContractCodeBlockM , mapContractViewBlocksM- , mapEntriesOrdered ) where import Data.Constraint (Dict(..)) import Data.Default (Default(..))-import Data.Map qualified as Map import GHC.TypeLits (TypeError, pattern Text) import Unsafe.Coerce (unsafeCoerce) @@ -38,7 +36,6 @@ import Morley.Michelson.Typed.T (T(..)) import Morley.Michelson.Typed.View import Morley.Michelson.Untyped.Contract (EntriesOrder)-import Morley.Michelson.Untyped.Contract qualified as U type ContractInp1 param st = 'TPair param st type ContractInp param st = '[ ContractInp1 param st ]@@ -162,7 +159,7 @@ -> Contract' instr cp st -> m (Contract' instr cp st) mapContractViewBlocksM f contract = do- views <- UnsafeViewsSet <$> forM (unViewsSet (cViews contract)) \(SomeView v) -> do+ views <- ViewsSet <$> forM (unViewsSet (cViews contract)) \(SomeView v) -> do code <- f $ vCode v pure $ SomeView v{ vCode = code } pure contract{ cViews = views }@@ -181,24 +178,3 @@ -> Contract' instr cp st -> m (Contract' instr cp st) mapContractCodeM f = mapContractCodeBlockM f <=< mapContractViewBlocksM f---- | Map each typed contract fields by the given function and sort the output--- based on the 'EntriesOrder'.-mapEntriesOrdered- :: Contract' instr cp st- -> (ParamNotes cp -> a)- -> (Notes st -> a)- -> (ContractCode' instr cp st -> a)- -> (forall arg ret. View' instr arg st ret -> a)- -> [a]-mapEntriesOrdered Contract{..} fParam fStorage fCode fView = snd <$> sortWith fst elements- where- getElemOrder ty = fromMaybe maxBound $ Map.lookup ty $ U.unEntriesOrder cEntriesOrder- elements- = first getElemOrder- <$> [ (U.EntryParameter, fParam cParamNotes)- , (U.EntryStorage, fStorage cStoreNotes)- , (U.EntryCode, fCode cCode)]- <> (toList cViews <&> \(SomeView v@View{..}) -> (U.EntryView vName, fView v))-{-# DEPRECATED mapEntriesOrdered "Unused and untested, essentially dead code; open an issue on the \- \morley repository if you use this." #-}
src/Morley/Michelson/Typed/Convert.hs view
@@ -8,7 +8,9 @@ , convertView , convertSomeView , convertContractCode+ , convertContractCodeOptimized , convertContract+ , convertContractOptimized , instrToOps , instrToOpsOptimized , untypeDemoteT@@ -31,8 +33,7 @@ import Data.List.NonEmpty ((<|)) import Data.Map qualified as Map import Data.Singletons (Sing, demote)-import Fmt (Buildable(..), fmt, listF, pretty)-import Text.PrettyPrint.Leijen.Text (Doc)+import Fmt (Buildable(..), Doc, fmt, listF, pretty) import Unsafe qualified (fromIntegral) import Morley.Michelson.Printer.Util@@ -69,35 +70,66 @@ convertContractCode :: forall param store . (SingI param, SingI store) => ContractCode param store -> U.Contract-convertContractCode contract =+convertContractCode = convertContractCode' Readable++-- | Convert typed t'ContractCode' to an untyped t'U.Contract' using optimized+-- representation.+convertContractCodeOptimized+ :: forall param store . (SingI param, SingI store)+ => ContractCode param store -> U.Contract+convertContractCodeOptimized = convertContractCode' Optimized++convertContractCode'+ :: forall param store . (SingI param, SingI store)+ => UntypingOptions -> ContractCode param store -> U.Contract+convertContractCode' opts contract = U.Contract { contractParameter = U.ParameterType (untypeDemoteT @param) U.noAnn , contractStorage = untypeDemoteT @store- , contractCode = instrToOps $ unContractCode contract+ , contractCode = seqOrSingleOp $ instrToOpsImpl opts $ unContractCode contract , entriesOrder = U.canonicalEntriesOrder , contractViews = def } convertView :: forall arg store ret. View arg store ret -> U.View-convertView View{..} =+convertView = convertView' Readable++convertView' :: forall arg store ret. UntypingOptions -> View arg store ret -> U.View+convertView' opts View{..} = U.View { viewName = vName , viewArgument = untypeDemoteT @arg , viewReturn = untypeDemoteT @ret- , viewCode = instrToOps vCode+ , viewCode = seqOrSingleOp $ instrToOpsImpl opts vCode } +seqOrSingleOp :: [U.ExpandedOp] -> U.ExpandedOp+seqOrSingleOp = \case+ [x] -> x+ xs -> U.SeqEx xs+ convertSomeView :: SomeView st -> U.View-convertSomeView (SomeView v) = convertView v+convertSomeView = convertSomeView' Readable +convertSomeView' :: UntypingOptions -> SomeView st -> U.View+convertSomeView' opts (SomeView v) = convertView' opts v+ -- | Convert typed t'Contract' to an untyped t'U.Contract'. convertContract :: Contract param store -> U.Contract-convertContract Contract{..} =- let c = convertContractCode cCode+convertContract = convertContract' Readable++-- | Convert typed t'Contract' to untyped t'U.Contract' using optimized+-- representation.+convertContractOptimized :: Contract param store -> U.Contract+convertContractOptimized = convertContract' Optimized++convertContract' :: UntypingOptions -> Contract param store -> U.Contract+convertContract' opts Contract{..} =+ let c = convertContractCode' opts cCode in c { U.contractParameter = convertParamNotes cParamNotes , U.contractStorage = mkUType cStoreNotes , U.entriesOrder = cEntriesOrder- , U.contractViews = U.UnsafeViewsSet $ convertSomeView <$> unViewsSet cViews+ , U.contractViews = U.ViewsSet $ convertSomeView' opts <$> unViewsSet cViews } -- Note: if you change this type, check 'untypeValueImpl' wildcard patterns.@@ -113,21 +145,21 @@ deriving stock (Eq, Show) -- | Convert a typed value to an untyped human-readable representation-untypeValue :: HasNoOp t => Value' Instr t -> U.Value+untypeValue :: ForbidOp t => Value' Instr t -> U.Value untypeValue = untypeValueImpl' Readable -- | Like 'untypeValueOptimized', but without list notation for pairs. -- -- Created to match @octez-client hash data@ behaviour for typed values.-untypeValueHashable :: HasNoOp t => Value' Instr t -> U.Value+untypeValueHashable :: ForbidOp t => Value' Instr t -> U.Value untypeValueHashable = untypeValueImpl' Hashable -- | Convert a typed value to an untyped optimized representation-untypeValueOptimized :: HasNoOp t => Value' Instr t -> U.Value+untypeValueOptimized :: ForbidOp t => Value' Instr t -> U.Value untypeValueOptimized = untypeValueImpl' Optimized untypeValueImpl'- :: HasNoOp t+ :: ForbidOp t => UntypingOptions -> Value' Instr t -> U.Value@@ -139,72 +171,70 @@ -- 'TOperation' - a compile error will be raised otherwise. -- You can analyse its presence with 'checkOpPresence' function. untypeValueImpl- :: HasNoOp t+ :: ForbidOp t => UntypingOptions -> Sing t -> Value' Instr t -> U.Value-untypeValueImpl opts sng val = case (val, sng) of- (VInt i, _) -> U.ValueInt i- (VNat i, _) -> U.ValueInt $ toInteger i- (VString s, _) -> U.ValueString s- (VBytes b, _) -> U.ValueBytes $ U.InternalByteString b- (VMutez m, _) -> U.ValueInt $ toInteger $ unMutez m- (VBool True, _) -> U.ValueTrue- (VBool False, _) -> U.ValueFalse- (VKeyHash h, _) ->+untypeValueImpl opts sng val = case val of+ VInt i -> U.ValueInt i+ VNat i -> U.ValueInt $ toInteger i+ VString s -> U.ValueString s+ VBytes b -> U.ValueBytes $ U.InternalByteString b+ VMutez m -> U.ValueInt $ toInteger $ unMutez m+ VBool True -> U.ValueTrue+ VBool False -> U.ValueFalse+ VKeyHash h -> case opts of Readable -> U.ValueString $ mformatHash h _ -> U.ValueBytes $ U.InternalByteString $ hashToBytes h- (VBls12381Fr v, _) ->+ VBls12381Fr v -> case opts of Readable -> U.ValueInt $ toInteger v _ -> U.ValueBytes . U.InternalByteString $ BLS.toMichelsonBytes v- (VBls12381G1 v, _) ->+ VBls12381G1 v -> U.ValueBytes . U.InternalByteString $ BLS.toMichelsonBytes v- (VBls12381G2 v, _) ->+ VBls12381G2 v -> U.ValueBytes . U.InternalByteString $ BLS.toMichelsonBytes v- (VTimestamp t, _) ->+ VTimestamp t -> case opts of Readable -> U.ValueString . unsafe . mkMText $ pretty t _ -> U.ValueInt $ timestampToSeconds t- (VAddress a, _) ->+ VAddress a -> case opts of Readable -> U.ValueString $ mformatEpAddress a _ -> U.ValueBytes . U.InternalByteString $ encodeEpAddress a- (VKey b, _) ->+ VKey b -> case opts of Readable -> U.ValueString $ mformatPublicKey b _ -> U.ValueBytes . U.InternalByteString $ keyToBytes b- (VUnit, _) ->+ VUnit -> U.ValueUnit- (VSignature b, _) ->+ VSignature b -> case opts of Readable -> U.ValueString $ mformatSignature b _ -> U.ValueBytes . U.InternalByteString $ signatureToBytes b- (VChainId b, _) ->+ VChainId b -> case opts of Readable -> U.ValueString $ mformatChainId b _ -> U.ValueBytes . U.InternalByteString $ ByteArray.convert (unChainId b)- (VOption (Just x), STOption op) ->+ VOption (Just x) | STOption op <- sng -> U.ValueSome (untypeValueImpl opts op x)- (VOption Nothing, STOption _) ->- U.ValueNone- (VList l, STList lt) ->+ VOption Nothing -> U.ValueNone+ VList l | STList lt <- sng -> vList U.ValueSeq $ map (untypeValueImpl opts lt) l- (VSet s, STSet st) ->- case checkOpPresence st of- OpAbsent -> vList U.ValueSeq $ map (untypeValueImpl opts st) $ toList s- (VContract addr sepc, _) ->+ VSet s | STSet st <- sng ->+ vList U.ValueSeq $ map (untypeValueImpl opts st) $ toList s+ VContract addr sepc -> case opts of Readable -> U.ValueString . mformatEpAddress $ EpAddress' addr (sepcName sepc) _ -> U.ValueBytes . U.InternalByteString . encodeEpAddress $ EpAddress' addr (sepcName sepc)- (VChest c, _) -> U.ValueBytes . U.InternalByteString $ chestBytes c- (VChestKey c, _) -> U.ValueBytes . U.InternalByteString $ chestKeyBytes c- (VTicket s v a, STTicket vt) ->+ VChest c -> U.ValueBytes . U.InternalByteString $ chestBytes c+ VChestKey c -> U.ValueBytes . U.InternalByteString $ chestKeyBytes c+ VTicket s v a | STTicket vt <- sng -> case valueTypeSanity v of Dict -> let us = untypeValueImpl opts STAddress $ VAddress (EpAddress' s DefEpName)@@ -213,46 +243,39 @@ in case opts of Optimized -> U.ValueSeq $ us :| [uv, ua] _ -> U.ValuePair us (U.ValuePair uv ua)- p@(VPair (l, r), STPair lt rt) ->- case checkOpPresence lt of- OpAbsent -> case opts of- Optimized -> U.ValueSeq $ pairToSeq p- _ -> U.ValuePair (untypeValueImpl opts lt l) (untypeValueImpl opts rt r)+ VPair (l, r) -> case opts of+ Optimized -> U.ValueSeq $ pairToSeq (val, sng)+ _ | STPair lt rt <- sng -> deMorganForbidT SPSOp lt rt $+ U.ValuePair (untypeValueImpl opts lt l) (untypeValueImpl opts rt r) - (VOr (Left x), STOr lt _) ->- case checkOpPresence lt of- OpAbsent -> U.ValueLeft (untypeValueImpl opts lt x)+ VOr (Left x) | STOr lt rt <- sng -> deMorganForbidT SPSOp lt rt $+ U.ValueLeft (untypeValueImpl opts lt x) - (VOr (Right x), STOr lt rt) ->- case checkOpPresence lt of- OpAbsent -> U.ValueRight (untypeValueImpl opts rt x)+ VOr (Right x) | STOr lt rt <- sng -> deMorganForbidT SPSOp lt rt $+ U.ValueRight (untypeValueImpl opts rt x) - (VLam (LambdaCode (rfAnyInstr -> ops)), _) ->- vList U.ValueLambda $ instrToOpsImpl opts ops+ VLam (LambdaCode (rfAnyInstr -> ops)) ->+ vList (U.ValueLambda . toList) $ instrToOpsImpl opts ops - (VLam (LambdaCodeRec (rfAnyInstr -> ops)), _) ->- vList U.ValueLamRec $ instrToOpsImpl opts ops+ VLam (LambdaCodeRec (rfAnyInstr -> ops)) ->+ vList (U.ValueLamRec . toList) $ instrToOpsImpl opts ops - (VMap m, STMap kt vt) ->- case (checkOpPresence kt, checkOpPresence vt) of- (OpAbsent, OpAbsent) ->- vList U.ValueMap $ Map.toList m <&> \(k, v) ->- U.Elt (untypeValueImpl opts kt k) (untypeValueImpl opts vt v)+ VMap m | STMap kt vt <- sng -> deMorganForbidT SPSOp kt vt $+ vList U.ValueMap $ Map.toList m <&> \(k, v) ->+ U.Elt (untypeValueImpl opts kt k) (untypeValueImpl opts vt v) - (VBigMap _ m, STBigMap kt vt) ->- case (checkOpPresence kt, checkOpPresence vt) of- (OpAbsent, OpAbsent) ->- vList U.ValueMap $ Map.toList m <&> \(k, v) ->- U.Elt (untypeValueImpl opts kt k) (untypeValueImpl opts vt v)+ VBigMap _ m | STBigMap kt vt <- sng -> deMorganForbidT SPSOp kt vt $+ vList U.ValueMap $ Map.toList m <&> \(k, v) ->+ U.Elt (untypeValueImpl opts kt k) (untypeValueImpl opts vt v) where vList ctor = maybe U.ValueNil ctor . nonEmpty - pairToSeq :: HasNoOp ty+ pairToSeq :: ForbidOp ty => (Value ty, Sing ty) -> NonEmpty U.Value pairToSeq = \case- (VPair (a, b), STPair l r) -> case checkOpPresence l of- OpAbsent -> untypeValueImpl opts l a <| pairToSeq (b, r)+ (VPair (a, b), STPair l r) -> deMorganForbidT SPSOp l r $+ untypeValueImpl opts l a <| pairToSeq (b, r) (v, vt) -> untypeValueImpl opts vt v :| [] hashToBytes :: Hash kind -> ByteString@@ -305,7 +328,7 @@ instrToOpsImpl opts = \case Nop -> [] Seq i1 i2 -> instrToOpsImpl opts i1 <> instrToOpsImpl opts i2- Nested sq -> one $ U.SeqEx $ instrToOps sq+ Nested sq -> one $ U.SeqEx $ instrToOpsImpl opts sq DocGroup _ sq -> instrToOpsImpl opts sq Ext (ext :: ExtInstr inp) -> (U.PrimEx . U.EXT) <$> extInstrToOps ext -- TODO [#283]: After representation of locations is polished,@@ -419,7 +442,7 @@ ': g ': s) ('TOperation ': 'TAddress ': s) <- i ->- annotateInstr ann U.CREATE_CONTRACT (convertContract contract)+ annotateInstr ann U.CREATE_CONTRACT (convertContract' opts contract) AnnIMPLICIT_ACCOUNT ann -> annotateInstr ann U.IMPLICIT_ACCOUNT AnnNOW ann -> annotateInstr ann U.NOW AnnAMOUNT ann -> annotateInstr ann U.AMOUNT@@ -459,12 +482,12 @@ untypePrintComment :: PrintComment s -> U.PrintComment untypePrintComment (PrintComment pc) = U.PrintComment $ map (second untypeStackRef) pc -extInstrToOps :: ExtInstr s -> [U.ExtInstrAbstract U.ExpandedOp]+extInstrToOps :: ExtInstr s -> [U.ExpandedExtInstr] extInstrToOps = \case PRINT pc -> one $ U.UPRINT (untypePrintComment pc) TEST_ASSERT (TestAssert nm pc i) -> one $ U.UTEST_ASSERT $- U.TestAssert nm (untypePrintComment pc) (instrToOps i)+ U.TestAssert nm (untypePrintComment pc) (instrToOpsImpl Readable i) DOC_ITEM{} -> [] COMMENT_ITEM tp -> case tp of@@ -500,15 +523,12 @@ , instr1 `eqInstrExt` instr2 ] -instance HasNoOp t => RenderDoc (Value' Instr t) where+instance ForbidOp t => RenderDoc (Value' Instr t) where renderDoc pn = renderDoc pn . untypeValue instance Buildable (Value' Instr t) where- build val = printDocB True $ let tv = withValueTypeSanity val sing- in renderDocSing doesntNeedParens (checkOpPresence tv) (val, tv)--instance Buildable (Instr inp out) where- build = buildRenderDocExtended+ build val = let tv = withValueTypeSanity val sing+ in renderDocSing doesntNeedParens (checkTPresence SPSOp tv) (val, tv) instance RenderDoc (Instr inp out) where renderDoc context = renderDocList context . instrToOps@@ -590,50 +610,50 @@ -- | An extended version of renderDoc for typed values that handles VOp -- accepts explicit singleton-renderDocSing :: RenderContext -> OpPresence t -> (Value' Instr t, Sing t) -> Doc+renderDocSing :: RenderContext -> TPresence 'PSOp t -> (Value' Instr t, Sing t) -> Doc renderDocSing pn = \case- OpAbsent -> renderDoc pn . untypeValue . fst- OpPresent -> \case- (VOp op, _) -> renderAnyBuildable op+ TAbsent -> renderDoc pn . untypeValue . fst+ TPresent -> \case+ (VOp op, _) -> build op -- other cases try to mimic instance RenderDoc U.Value, see "Michelson.Untyped.Value" (VOption Nothing, _) -> U.renderNone- (VOption (Just x), STOption tx) -> U.renderSome pn $ \ctx -> renderDocSing ctx OpPresent (x, tx)- (VList xs, STList txs) -> renderList OpPresent txs xs- (VSet ss, STSet tss) -> renderList OpPresent tss $ toList ss- (VTicket s v a, STTicket tv) -> renderDocSing- needsParens- OpPresent- (VPair (VAddress (EpAddress' s DefEpName), VPair (v, VNat a))- , STPair STAddress (STPair tv STNat))+ (VOption (Just x), STOption tx) -> U.renderSome pn $ \ctx -> renderDocSing ctx TPresent (x, tx)+ (VList xs, STList txs) -> renderList TPresent txs xs val@(VPair (_, (VPair (_, _))), _) -> U.renderValuesList id $ renderLinearizedRightCombValuePair val (VPair (l, r), STPair tl tr) -> U.renderPair pn (render tl l) (render tr r) (VOr (Left l), STOr tl _) -> U.renderLeft pn $ render tl l (VOr (Right r), STOr _ tr) -> U.renderRight pn $ render tr r- (VMap m, STMap tk tv) -> renderMap (tk, tv, checkOpPresence tk, checkOpPresence tv) m- (VBigMap _ m, STBigMap tk tv) -> renderMap (tk, tv, checkOpPresence tk, checkOpPresence tv) m- where render sg v ctx = renderDocSing ctx (checkOpPresence sg) (v, sg)+ (VMap m, STMap tk tv) -> renderMap (tk, tv, TPresent) m \\ comparableImplies tk+ (VBigMap _ m, STBigMap tk tv) -> renderMap (tk, tv, TPresent) m \\ comparableImplies tk+ (VSet{}, STSet tv) -> case checkComparability tv of+ (VTicket{}, STTicket tv) -> case checkComparability tv of+ where render sg v ctx = renderDocSing ctx (checkTPresence SPSOp sg) (v, sg) -renderList :: OpPresence t -> Sing t -> [Value' Instr t] -> Doc+renderList :: TPresence 'PSOp t -> Sing t -> [Value' Instr t] -> Doc renderList osg sg = renderList' $ renderDocSing doesntNeedParens osg . (, sg) -renderMap :: (Sing tk, Sing tv, OpPresence tk, OpPresence tv)- -> Map (Value' Instr tk) (Value' Instr tv) -> Doc+renderMap+ :: ForbidOp tk+ => (Sing tk, Sing tv, TPresence 'PSOp tv)+ -> Map (Value' Instr tk) (Value' Instr tv) -> Doc renderMap ctx = renderList' (renderElt ctx) . Map.toList renderList' :: (a -> Doc) -> [a] -> Doc renderList' f = maybe "{ }" (U.renderValuesList f) . nonEmpty -renderElt :: (Sing tk, Sing tv, OpPresence tk, OpPresence tv)- -> (Value' Instr tk, Value' Instr tv) -> Doc-renderElt (tk, tv, otk, otv) (k, v) =- U.renderElt' (render otk k tk) (render otv v tv)+renderElt+ :: ForbidOp tk+ => (Sing tk, Sing tv, TPresence 'PSOp tv)+ -> (Value' Instr tk, Value' Instr tv) -> Doc+renderElt (tk, tv, otv) (k, v) =+ U.renderElt' (render TAbsent k tk) (render otv v tv) where render o x tx ctx = renderDocSing ctx o (x, tx) -- | Mimics U.linearizeRightCombValuePair, but for typed values; -- however, unlike U.linearizeRightCombValuePair renders values on-the-fly. renderLinearizedRightCombValuePair :: (Value' Instr t, Sing t) -> NonEmpty Doc renderLinearizedRightCombValuePair = \case- (VPair (l, r), STPair tl tr) -> renderDocSing doesntNeedParens (checkOpPresence tl) (l, tl)+ (VPair (l, r), STPair tl tr) -> renderDocSing doesntNeedParens (checkTPresence SPSOp tl) (l, tl) <| renderLinearizedRightCombValuePair (r, tr)- val@(_, tv) -> renderDocSing doesntNeedParens (checkOpPresence tv) val :| []+ val@(_, tv) -> renderDocSing doesntNeedParens (checkTPresence SPSOp tv) val :| []
src/Morley/Michelson/Typed/Entrypoints.hs view
@@ -46,12 +46,10 @@ import Data.ByteString qualified as BS import Data.Constraint (Dict(..)) import Data.List.NonEmpty qualified as NE-import Data.Singletons (withSingI) import Data.Text qualified as T-import Fmt (Buildable(..), hexF, pretty, (+|), (|+))-import Text.PrettyPrint.Leijen.Text (int, punctuate, squotes, textStrict, (<+>))+import Fmt (Buildable(..), hexF, pretty, (+|), (<+>), (|+))+import Prettyprinter (punctuate, squotes) -import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDoc, renderAnyBuildable) import Morley.Michelson.Text import Morley.Michelson.Typed.Annotation import Morley.Michelson.Typed.Scope@@ -62,8 +60,8 @@ import Morley.Tezos.Address import Morley.Tezos.Crypto (hashLengthBytes) import Morley.Util.TH-import Morley.Util.TypeLits import Morley.Util.Typeable+import Morley.Util.TypeLits ---------------------------------------------------------------------------- -- Primitives@@ -114,19 +112,16 @@ instance NFData ParseEpAddressError instance Buildable ParseEpAddressError where- build = buildRenderDoc--instance RenderDoc ParseEpAddressError where- renderDoc context = \case- ParseEpAddressBadAddress err -> renderDoc context err- ParseEpAddressRawBadAddress err -> renderDoc context err+ build = \case+ ParseEpAddressBadAddress err -> build err+ ParseEpAddressRawBadAddress err -> build err ParseEpAddressBadEntryopint addr exception ->- "Invalid entrypoint given for raw adddress" <+> (renderAnyBuildable $ hexF addr)<>- " and failed with" <+> (textStrict (show @Text exception))- ParseEpAddressBadRefAnn txt -> "Invalid reference annotation:" <+> (textStrict txt)- ParseEpAddressRefAnnError err -> renderDoc context err+ "Invalid entrypoint given for raw adddress" <+> hexF addr <>+ " and failed with" <+> build (displayException exception)+ ParseEpAddressBadRefAnn txt -> "Invalid reference annotation:" <+> build txt+ ParseEpAddressRefAnnError err -> build err ParseEpAddressInvalidLength len ->- "Given raw entrypoint address has invalid length:" <+> int len+ "Given raw entrypoint address has invalid length:" <+> build len -- | Parse an address which can be suffixed with entrypoint name -- (e.g. "tz1faswCTDciRzE4oJ9jn2Vm2dvjeyA9fUzU%entrypoint").@@ -200,10 +195,7 @@ instance NFData ArmCoord instance Buildable ArmCoord where- build = buildRenderDoc--instance RenderDoc ArmCoord where- renderDoc _ = \case+ build = \case AcLeft -> "left" AcRight -> "right" @@ -217,18 +209,15 @@ instance NFData ParamEpError instance Buildable ParamEpError where- build = buildRenderDoc--instance RenderDoc ParamEpError where- renderDoc context = \case+ build = \case ParamEpDuplicatedNames names -> mconcat [ "Duplicated entrypoint names: "- , mconcat $ punctuate ", " . map (squotes . renderAnyBuildable) $ toList names+ , mconcat $ punctuate ", " $ squotes . build <$> toList names ] ParamEpUncallableArm arm -> mconcat [ "Due to presence of 'default' entrypoint, one of contract \"arms\" \ \cannot be called: \""- , mconcat . intersperse " - " $ map (renderDoc context) arm+ , mconcat . intersperse " - " $ map build arm , "\"" , if length arm > 1 then " (in top-to-bottom order)" else "" ]@@ -432,19 +421,17 @@ -> Notes param -> (forall arg. (ParameterScope arg) => (Notes arg, EpLiftSequence arg param) -> r) -> Maybe r-withEpLiftSequence epName@(epNameToParamAnn -> epAnn) param cont =- case (sing @param, param) of- (STOr lSing rSing, NTOr _ lFieldAnn rFieldAnn lNotes rNotes) ->- withSingI lSing $- withSingI rSing $- case (checkOpPresence lSing, checkNestedBigMapsPresence lSing) of- (OpAbsent, NestedBigMapsAbsent) -> asum- [ guard (lFieldAnn == epAnn) $> cont (lNotes, EplWrapLeft EplArgHere)- , guard (rFieldAnn == epAnn) $> cont (rNotes, EplWrapRight EplArgHere)- , withEpLiftSequence epName lNotes (cont . fmap @((,) _) EplWrapLeft)- , withEpLiftSequence epName rNotes (cont . fmap @((,) _) EplWrapRight)- ]- _ -> Nothing+withEpLiftSequence epName@(epNameToParamAnn -> epAnn) param cont = case param of+ NTOr _ lFieldAnn rFieldAnn (lNotes :: Notes a) (rNotes :: Notes b) ->+ withDeMorganScope @ForbidOp @'TOr @a @b $+ withDeMorganScope @ForbidNestedBigMaps @'TOr @a @b $+ asum+ [ guard (lFieldAnn == epAnn) $> cont (lNotes, EplWrapLeft EplArgHere)+ , guard (rFieldAnn == epAnn) $> cont (rNotes, EplWrapRight EplArgHere)+ , withEpLiftSequence epName lNotes (cont . fmap @((,) _) EplWrapLeft)+ , withEpLiftSequence epName rNotes (cont . fmap @((,) _) EplWrapRight)+ ]+ _ -> Nothing -- Helper datatype for 'mkEntrypointCall'. data MkEntrypointCallRes param where
src/Morley/Michelson/Typed/Existential.hs view
@@ -37,7 +37,7 @@ pattern SomeConstrainedValue v = Constrained v {-# COMPLETE SomeConstrainedValue #-} -instance (forall t. cs t => HasNoOp t) => RenderDoc (SomeConstrainedValue cs) where+instance (forall t. cs t => ForbidOp t) => RenderDoc (SomeConstrainedValue cs) where renderDoc pn (Constrained v) = renderDoc pn v ----------------------------------------------------------------------------
src/Morley/Michelson/Typed/Haskell/Doc.hs view
@@ -36,7 +36,6 @@ , unsafeConcreteTypeDocHaskellRep , haskellAddNewtypeField , haskellRepNoFields- , haskellRepStripFieldPrefix , haskellRepMap , haskellRepAdjust , homomorphicTypeDocMichelsonRep@@ -59,7 +58,7 @@ import Data.List (lookup) import Data.Singletons (SingI, demote) import Data.Typeable (typeRep, typeRepArgs)-import Fmt (Buildable, Builder, build, (+|), (|+))+import Fmt (Buildable, Doc, build, singleLineF, (+|), (|+)) import GHC.Generics ((:*:)(..), (:+:)(..)) import GHC.Generics qualified as G import GHC.TypeLits (ErrorMessage(..), KnownSymbol, TypeError, symbolVal)@@ -82,6 +81,10 @@ import Morley.Util.Text import Morley.Util.Typeable +{- $setup+>>> import Morley.Michelson.Typed+-}+ -- | Stands for representation of some Haskell ADT corresponding to -- Michelson value. Type parameter @a@ is what you put in place of -- each field of the datatype, e.g. information about field type.@@ -411,11 +414,19 @@ docItemToToc lvl d@(DType ap') = mdTocFromRef lvl (build $ typeDocName ap') d --- | Fully render Michelson representation of a type.-typeDocBuiltMichelsonRep :: TypeHasDoc a => Proxy a -> Builder+{- | Fully render Michelson representation of a type.++Since this will be used in markdown, the type is forced to a single line.++>>> data Foo = Foo () () () () () () () () () () () () deriving (Generic, IsoValue)+>>> instance TypeHasDoc Foo where typeDocMdDescription = "Foo type"+>>> typeDocBuiltMichelsonRep $ Proxy @Foo+**Final Michelson representation:** `pair (pair (pair unit unit unit) unit unit unit) (pair unit unit unit) unit unit unit`+-}+typeDocBuiltMichelsonRep :: TypeHasDoc a => Proxy a -> Doc typeDocBuiltMichelsonRep ap' = let (mlhs, rep) = typeDocMichelsonRep ap'- renderedRep = mdTicked (build rep)+ renderedRep = mdTicked $ singleLineF rep in case mlhs of Nothing -> mdSubsection "Final Michelson representation"@@ -607,13 +618,6 @@ -- | Like 'haskellRepAdjust', but can't add or remove field names. haskellRepMap :: (Text -> Text) -> TypeDocHaskellRep a -> TypeDocHaskellRep a haskellRepMap = haskellRepAdjust . fmap---- | Map over fields with 'stripFieldPrefix'. Equivalent to @haskellRepMap--- stripFieldPrefix@. Left for compatibility.-haskellRepStripFieldPrefix :: TypeDocHaskellRep a -> TypeDocHaskellRep a-haskellRepStripFieldPrefix = haskellRepMap stripFieldPrefix-{-# DEPRECATED haskellRepStripFieldPrefix- "Use 'haskellRepMap' with utilities from \"Morley.Util.Text\" instead" #-} -- | Add field name for @newtype@. --
src/Morley/Michelson/Typed/Haskell/Value.hs view
@@ -267,8 +267,8 @@ type SomeEntrypointCall arg = SomeEntrypointCallT (ToT arg) type WellTypedToT a = (IsoValue a, WellTyped (ToT a))-type HasNoOpToT a = (IsoValue a, HasNoOp (ToT a))-type HasNoBigMapToT a = (IsoValue a, HasNoBigMap (ToT a))+type HasNoOpToT a = (IsoValue a, ForbidOp (ToT a))+type HasNoBigMapToT a = (IsoValue a, ForbidBigMap (ToT a)) -- | Since @Contract@ name is used to designate contract code, lets call -- analogy of 'TContract' type as follows.@@ -285,7 +285,7 @@ instance (IsoValue (ContractRef arg)) => Buildable (ContractRef arg) where build = buildVContract . toVal -instance (HasNoOpToT arg, HasNoNestedBigMaps (ToT arg), WellTypedToT arg)+instance (HasNoOpToT arg, ForbidNestedBigMaps (ToT arg), WellTypedToT arg) => IsoValue (ContractRef arg) where type ToT (ContractRef arg) = 'TContract (ToT arg) toVal ContractRef{..} = VContract crAddress crEntrypoint
src/Morley/Michelson/Typed/Instr.hs view
@@ -323,9 +323,15 @@ -> Instr s s' -> Instr ('TList a ': s) s' AnnSIZE :: SizeOp c => AnnVar -> Instr (c ': s) ('TNat ': s)- AnnEMPTY_SET :: (SingI e, Comparable e) => Anns '[TypeAnn, VarAnn, Notes e] -> Instr s ('TSet e ': s)- AnnEMPTY_MAP :: (SingI a, SingI b, Comparable a) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TMap a b ': s)- AnnEMPTY_BIG_MAP :: (SingI a, SingI b, Comparable a, HasNoBigMap b) => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TBigMap a b ': s)+ AnnEMPTY_SET+ :: Comparable e+ => Anns '[TypeAnn, VarAnn, Notes e] -> Instr s ('TSet e ': s)+ AnnEMPTY_MAP+ :: (SingI b, Comparable a)+ => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TMap a b ': s)+ AnnEMPTY_BIG_MAP+ :: (SingI b, Comparable a, ForbidBigMap b)+ => Anns '[TypeAnn, VarAnn, Notes a, Notes b] -> Instr s ('TBigMap a b ': s) AnnMAP :: (MapOp c, SingI b) => AnnVar -> Instr (MapOpInp c ': s) (b ': s)@@ -515,7 +521,7 @@ => AnnVar -> Instr (n ': s) (UnaryArithRes Not n ': s) AnnCOMPARE- :: (Comparable n, SingI n)+ :: Comparable n => AnnVar -> Instr (n ': n ': s) ('TInt ': s) AnnEQ@@ -622,11 +628,11 @@ AnnSELF_ADDRESS :: AnnVar -> Instr s ('TAddress ': s) NEVER :: Instr ('TNever ': s) t AnnTICKET_DEPRECATED- :: (Comparable a)+ :: Comparable a => AnnVar -> Instr (a ': 'TNat ': s) ('TTicket a ': s) AnnTICKET- :: (Comparable a)+ :: Comparable a => AnnVar -> Instr (a ': 'TNat ': s) ('TOption ('TTicket a) ': s) AnnREAD_TICKET
src/Morley/Michelson/Typed/Operation.hs view
@@ -17,22 +17,34 @@ import Data.Binary.Builder qualified as Bi import Data.Binary.Put (putWord64be, runPut) import Data.ByteString.Lazy qualified as BSL+import Fmt (Buildable(..), Doc, quoteF, quoteOrIndentF, (++|), (|++), (|++^)) import Morley.Micheline.Binary.Internal (buildInteger) import Morley.Michelson.Interpret.Pack (toBinary, toBinary') import Morley.Michelson.Runtime.GState (TicketKey(..))-import Morley.Michelson.Runtime.TxData (TxData)-import Morley.Michelson.Typed (Emit, EpName(..), Instr, unContractCode)+import Morley.Michelson.Runtime.TxData (TxData(..))+import Morley.Michelson.Typed (Emit(..), EpName(..), Instr, cCode, convertContractCodeOptimized) import Morley.Michelson.Typed.Aliases (Contract, Value)-import Morley.Michelson.Typed.Contract (cCode) import Morley.Michelson.Typed.Entrypoints (EpAddress(..)) import Morley.Michelson.Typed.Haskell.Value (IsoValue(..)) import Morley.Michelson.Typed.Scope (PackedValScope, ParameterScope, StorageScope)+import Morley.Michelson.Untyped qualified as U import Morley.Tezos.Address import Morley.Tezos.Address.Alias import Morley.Tezos.Core (Mutez(..)) import Morley.Tezos.Crypto (Hash(..), HashTag(..), KeyHash, blake2b, blake2b160) +{- $setup+>>> import Morley.Tezos.Core+>>> import Morley.Tezos.Address+>>> import Morley.Tezos.Address.Alias+>>> import Morley.Michelson.Typed+>>> import Morley.Michelson.Parser+>>> import Morley.Michelson.Typed.Operation+>>> import Morley.Michelson.Runtime.TxData+>>> import Fmt (pretty)+-}+ newtype OperationHash = OperationHash { unOperationHash :: ByteString }@@ -81,6 +93,51 @@ deriving stock instance Show OriginationOperation +{- | Prettyprinter for 'OriginationOperation'++>>> :{+contract+ :: (StorageScope storage, ConstantScope storage)+ => Contract TUnit storage+contract = defaultContract FAILWITH+:}++>>> let ia = [ta|tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH|]+>>> pretty $ OriginationOperation ia Nothing [tz|123u|] VUnit contract 1 Nothing+Originate a contract with delegate <nobody> initial storage 'Unit' and balance+123 μꜩ++>>> :{+pretty $ OriginationOperation ia (Just $ unImplicitAddress ia)+ [tz|123u|] VUnit contract 1 Nothing+:}+Originate a contract with delegate tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH initial+storage 'Unit' and balance 123 μꜩ++>>> :{+pretty $ OriginationOperation ia Nothing+ [tz|123u|] VUnit contract 1 (Just $ mkAlias "some_alias")+:}+Originate contract some_alias with delegate <nobody> initial storage 'Unit' and+balance 123 μꜩ++>>> let storage = toVal (((), ()), ((), ()))+>>> :{+pretty $ OriginationOperation ia Nothing [tz|123u|] storage contract 1 Nothing+:}+Originate a contract with delegate <nobody> initial storage+ Pair (Pair Unit Unit) (Pair Unit Unit)+and balance 123 μꜩ+-}+instance Buildable OriginationOperation where+ build OriginationOperation{..} =+ "Originate" ++| alias |++ "with delegate" ++| delegate+ |++ "initial storage" ++| quoteOrIndentF ooStorage+ |++^ "and balance" ++| ooBalance |++ ""+ where+ alias = maybe ("a contract" :: Doc) (("contract" ++|) . (|++ "")) ooAlias+ delegate = maybe "<nobody>" build ooDelegate+ -- | Construct 'OperationHash' for an 'OriginationOperation'. mkOriginationOperationHash :: OriginationOperation -> OperationHash mkOriginationOperationHash OriginationOperation{..} =@@ -94,7 +151,9 @@ packedOperation = BSL.toStrict (runPut $ putWord64be $ fromIntegral @Word63 @Word64 $ unMutez ooBalance) <> packMaybe (toBinary' . toVal) ooDelegate- <> toBinary' (unContractCode $ cCode ooContract)+ -- NB: we don't use typed code directly because there is some mismatch on+ -- when it's a sequence vs a single instruction.+ <> toBinary' (U.contractCode $ convertContractCodeOptimized $ cCode ooContract) <> toBinary' ooStorage -- | Compute address of a contract from its origination operation and global counter.@@ -111,7 +170,7 @@ -- to generate contract addresses in a simplified manner. -- -- Namely, we encode 'OriginationOperation' as we can and concat it with the global counter.-+-- -- Then we take 'blake2b160' hash of the resulting bytes and consider it to be the contract's -- address. mkContractAddress@@ -136,6 +195,44 @@ , toCounter :: GlobalCounter } deriving stock (Show) +{- | Prettyprinter for 'TransferOperation'++>>> let ia = [ta|tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH|]+>>> let ca = [ta|KT19upy4rX95WF5R3aCNgrtYA8926GP6fuJz|]+>>> :{+transfer+ :: (IsoValue p, ParameterScope (ToT p))+ => KindedAddress kind -> p -> TransferOperation+transfer dest param =+ TransferOperation (Constrained dest) (TxData (Constrained ia)+ (TxTypedParam $ toVal param) DefEpName [tz|123u|]) 1+:}++>>> pretty $ transfer ia ()+Transfer 123 μꜩ tokens from tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH to+tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH++>>> pretty $ transfer ca ()+Transfer to KT19upy4rX95WF5R3aCNgrtYA8926GP6fuJz entrypoint <default> from+tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH with parameter 'Unit' and amount 123 μꜩ++>>> pretty $ transfer ca (MkAddress ca, MkAddress ia)+Transfer to KT19upy4rX95WF5R3aCNgrtYA8926GP6fuJz entrypoint <default> from+tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH with parameter+ Pair+ "KT19upy4rX95WF5R3aCNgrtYA8926GP6fuJz"+ "tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH"+and amount 123 μꜩ+-}+instance Buildable TransferOperation where+ build (TransferOperation (Constrained dest) TxData{..} _) = case dest of+ ImplicitAddress{} ->+ -- Implicit address' entrypoint and parameter are fixed, so omit them.+ "Transfer" ++| tdAmount |++ "tokens from" ++| tdSenderAddress |++ "to" ++| dest |++ ""+ _ -> "Transfer to" ++| dest |++ "entrypoint" ++| tdEntrypoint+ |++ "from" ++| tdSenderAddress |++ "with parameter" ++| quoteOrIndentF tdParameter+ |++^ "and amount" ++| tdAmount |++ ""+ mkTransferOperationHash :: ParameterScope t => KindedAddress kind@@ -190,6 +287,23 @@ , sdoCounter :: GlobalCounter } deriving stock Show +{- | Prettyprinter for 'SetDelegateOperation'++>>> let ia = [ta|tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH|]+>>> pretty $ SetDelegateOperation (Constrained ia) Nothing 1+Set delegate of contract tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH to <nobody>++>>> :{+pretty $ SetDelegateOperation (Constrained ia) (Just $ unImplicitAddress ia) 1+:}+Set delegate of contract tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH to+tz29EDhZ4D3XueHxm5RGZsJLHRtj3qSA2MzH+-}+instance Buildable SetDelegateOperation where+ build SetDelegateOperation{..} =+ "Set delegate of contract" ++| sdoContract+ |++ "to" ++| maybe "<nobody>" build sdoDelegate |++ ""+ -- | Construct 'OperationHash' for a 'SetDelegateOperation'. mkDelegationOperationHash :: SetDelegateOperation -> OperationHash mkDelegationOperationHash SetDelegateOperation{..} =@@ -206,3 +320,34 @@ } deriving stock instance Show EmitOperation++{- | Prettyprinter for 'EmitOperation'++>>> let ca = [ta|KT19upy4rX95WF5R3aCNgrtYA8926GP6fuJz|]+>>> :{+emit :: (IsoValue a, PackedValScope (ToT a)) => a -> EmitOperation+emit val = EmitOperation ca $ Emit "tag" starNotes (toVal val) 1+:}++>>> pretty $ emit ()+Emit event 'tag' with type 'unit' and value 'Unit' from contract+KT19upy4rX95WF5R3aCNgrtYA8926GP6fuJz++>>> let tup = (((), ()), ((), ()))+>>> let largeTup = (tup, tup)+>>> pretty $ emit largeTup+Emit event 'tag' with type+ pair (pair (pair unit unit) unit unit) (pair unit unit) unit unit+and value+ Pair+ (Pair (Pair Unit Unit) (Pair Unit Unit))+ (Pair (Pair Unit Unit) (Pair Unit Unit))+from contract KT19upy4rX95WF5R3aCNgrtYA8926GP6fuJz+-}+instance Buildable EmitOperation where+ build (EmitOperation source Emit{..}) =+ "Emit event" ++| quoteF "'" emTag+ |++ "with type" ++| quoteOrIndentF emNotes+ |++^ "and value" ++| quoteOrIndentF emValue+ |++^ "from contract" ++| source+ |++ ""
src/Morley/Michelson/Typed/Polymorphic.hs view
@@ -182,7 +182,7 @@ -> str -> Maybe str sliceImpl dropF takeF offset l s- | offset >= Unsafe.fromIntegral @Int @Natural (length s) || offset + l > Unsafe.fromIntegral @Int @Natural (length s) =+ | let len = length s, offset >= len || offset + l > len = Nothing | otherwise -- Drop offset and then take requested number of items.
src/Morley/Michelson/Typed/Scope.hs view
@@ -1,1416 +1,137 @@ -- SPDX-FileCopyrightText: 2021 Oxhead Alpha -- SPDX-License-Identifier: LicenseRef-MIT-OA -{-# LANGUAGE UndecidableSuperClasses #-}-{-# OPTIONS_GHC -Wno-redundant-constraints #-}--{- | Module, containing restrictions imposed by instruction or value scope.--Michelson have multiple restrictions on values, examples:--* @operation@ type cannot appear in parameter.-* @big_map@ type cannot appear in @PUSH@-able constants.-* @contract@ type cannot appear in type we @UNPACK@ to.--Thus we declare multiple "scopes" - constraints applied in corresponding-situations, for instance--* 'ParameterScope';-* 'StorageScope';-* 'ConstantScope'.--Also we separate multiple "classes" of scope-related constraints.--* 'ParameterScope' and similar ones are used within Michelson engine,-they are understandable by GHC but produce not very clarifying errors.--* 'ProperParameterBetterErrors' and similar ones are middle-layer constraints,-they produce human-readable errors but GHC cannot make conclusions from them.-They are supposed to be used only by eDSLs to define their own high-level-constraints.--* Lorentz and other eDSLs may declare their own constraints, in most cases-you should use them. For example see @Lorentz.Constraints@ module.---}--module Morley.Michelson.Typed.Scope- ( -- * Scopes- ConstantScope- , DupableScope- , StorageScope- , PackedValScope- , ParameterScope- , UntypedValScope- , UnpackedValScope- , ViewableScope- , ComparabilityScope-- , ProperParameterBetterErrors- , ProperStorageBetterErrors- , ProperConstantBetterErrors- , ProperDupableBetterErrors- , ProperPackedValBetterErrors- , ProperUnpackedValBetterErrors- , ProperUntypedValBetterErrors- , ProperViewableBetterErrors- , ProperNonComparableValBetterErrors-- , IsDupableScope- , (:-)(..)-- , BadTypeForScope (..)- , CheckScope (..)- , WithDeMorganScope (..)- , Comparable (..)- , WellTyped (..)- , NotWellTyped (..)-- -- * Implementation internals- , HasNoBigMap- , HasNoNestedBigMaps- , HasNoOp- , HasNoContract- , HasNoTicket- , ContainsBigMap- , ContainsContract- , ContainsNestedBigMaps- , ContainsOp- , ContainsTicket- , IsComparable-- , ForbidOp- , ForbidContract- , ForbidTicket- , ForbidBigMap- , ForbidNestedBigMaps- , ForbidNonComparable-- , OpPresence (..)- , ContractPresence (..)- , TicketPresence (..)- , BigMapPresence (..)- , NestedBigMapsPresence (..)- , checkOpPresence- , checkContractTypePresence- , checkTicketPresence- , checkBigMapPresence- , checkNestedBigMapsPresence- , comparabilityPresence- , opAbsense- , contractTypeAbsense- , bigMapAbsense- , nestedBigMapsAbsense-- , Comparability(..)- , checkComparability- , getComparableProofS-- , comparabilityImpliesNoNestedBigMaps- , comparabilityImpliesNoOp-- , getWTP- , getWTP'- -- * Re-exports- , withDict- , SingI (..)- ) where--import Data.Bool.Singletons (SBool(..))-import Data.Constraint (Dict(..), withDict, (:-)(..), (\\))-import Data.Singletons- (SLambda(..), Sing, SingI(..), fromSing, type (@@), type (~>), type Apply, withSingI, (@@))-import Data.Type.Bool (Not, type (&&), type (||))-import Fmt (Buildable(..))-import GHC.TypeLits (ErrorMessage(..))--import Data.Type.Equality ((:~:)(..))-import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDoc)-import Morley.Michelson.Typed.Sing (SingT(..))-import Morley.Michelson.Typed.T (T(..))-import Morley.Util.StubbedProof (stubProof)-import Morley.Util.Type (FailUnless, FailWhen)-import Unsafe.Coerce (unsafeCoerce)--------------------------------------------------------------------------------- Constraints-------------------------------------------------------------------------------- | Whether a value of this type _may_ contain an operation.------ In some scopes (constants, parameters, storage) appearing for operation type--- is prohibited.--- Operations in input/output of lambdas are allowed without limits though.-type family ContainsOp (t :: T) :: Bool where- ContainsOp 'TKey = 'False- ContainsOp 'TUnit = 'False- ContainsOp 'TSignature = 'False- ContainsOp 'TChainId = 'False- ContainsOp ('TOption t) = ContainsOp t- ContainsOp ('TList t) = ContainsOp t- ContainsOp ('TSet t) = ContainsOp t- ContainsOp 'TOperation = 'True- ContainsOp ('TContract _) = 'False- ContainsOp ('TTicket t) = ContainsOp t- ContainsOp ('TPair a b) = ContainsOp a || ContainsOp b- ContainsOp ('TOr a b) = ContainsOp a || ContainsOp b- ContainsOp ('TLambda _ _) = 'False- ContainsOp ('TMap k v) = ContainsOp k || ContainsOp v- ContainsOp ('TBigMap k v) = ContainsOp k || ContainsOp v- ContainsOp _ = 'False---- | Whether a value of this type _may_ contain a @contract@ value.------ In some scopes (constants, storage) appearing for contract type--- is prohibited.--- Contracts in input/output of lambdas are allowed without limits though.-type family ContainsContract (t :: T) :: Bool where- ContainsContract 'TKey = 'False- ContainsContract 'TUnit = 'False- ContainsContract 'TSignature = 'False- ContainsContract 'TChainId = 'False- ContainsContract ('TOption t) = ContainsContract t- ContainsContract ('TList t) = ContainsContract t- ContainsContract ('TSet _) = 'False- ContainsContract 'TOperation = 'False- ContainsContract ('TContract _) = 'True- ContainsContract ('TPair a b) = ContainsContract a || ContainsContract b- ContainsContract ('TOr a b) = ContainsContract a || ContainsContract b- ContainsContract ('TLambda _ _) = 'False- ContainsContract ('TMap _ v) = ContainsContract v- ContainsContract ('TBigMap _ v) = ContainsContract v- ContainsContract _ = 'False---- | Whether a value of this type _may_ contain a @ticket@ value.-type family ContainsTicket (t :: T) :: Bool where- ContainsTicket ('TOption t) = ContainsTicket t- ContainsTicket ('TList t) = ContainsTicket t- ContainsTicket ('TSet _) = 'False- ContainsTicket ('TTicket _) = 'True- ContainsTicket ('TPair a b) = ContainsTicket a || ContainsTicket b- ContainsTicket ('TOr a b) = ContainsTicket a || ContainsTicket b- ContainsTicket ('TLambda _ _) = 'False- ContainsTicket ('TMap _ v) = ContainsTicket v- ContainsTicket ('TBigMap _ v) = ContainsTicket v- ContainsTicket _ = 'False---- | Whether a value of this type _may_ contain a @big_map@ value.-type family ContainsBigMap (t :: T) :: Bool where- ContainsBigMap 'TKey = 'False- ContainsBigMap 'TUnit = 'False- ContainsBigMap 'TSignature = 'False- ContainsBigMap 'TChainId = 'False- ContainsBigMap ('TOption t) = ContainsBigMap t- ContainsBigMap ('TList t) = ContainsBigMap t- ContainsBigMap ('TSet _) = 'False- ContainsBigMap 'TOperation = 'False- ContainsBigMap ('TContract _) = 'False- ContainsBigMap ('TPair a b) = ContainsBigMap a || ContainsBigMap b- ContainsBigMap ('TOr a b) = ContainsBigMap a || ContainsBigMap b- ContainsBigMap ('TLambda _ _) = 'False- ContainsBigMap ('TMap _ v) = ContainsBigMap v- ContainsBigMap ('TBigMap _ _) = 'True- ContainsBigMap _ = 'False---- | Whether a value of this type _may_ contain nested @big_map@s.------ Nested big_maps (i.e. big_map which contains another big_map inside of it's value type) are--- prohibited in all contexts. Some context such as PUSH, APPLY, PACK/UNPACK instructions are more--- strict because they don't work with big_map at all.-type family ContainsNestedBigMaps (t :: T) :: Bool where- ContainsNestedBigMaps 'TKey = 'False- ContainsNestedBigMaps 'TUnit = 'False- ContainsNestedBigMaps 'TSignature = 'False- ContainsNestedBigMaps 'TChainId = 'False- ContainsNestedBigMaps ('TOption t) = ContainsNestedBigMaps t- ContainsNestedBigMaps ('TList t) = ContainsNestedBigMaps t- ContainsNestedBigMaps ('TSet _) = 'False- ContainsNestedBigMaps 'TOperation = 'False- ContainsNestedBigMaps ('TContract _) = 'False- ContainsNestedBigMaps ('TPair a b) = ContainsNestedBigMaps a || ContainsNestedBigMaps b- ContainsNestedBigMaps ('TOr a b) = ContainsNestedBigMaps a || ContainsNestedBigMaps b- ContainsNestedBigMaps ('TLambda _ _) = 'False- ContainsNestedBigMaps ('TMap _ v) = ContainsNestedBigMaps v- ContainsNestedBigMaps ('TBigMap _ v) = ContainsBigMap v- ContainsNestedBigMaps _ = 'False---- | Whether a value of this type _may_ contain a @samping_state@ value.-type family ContainsSaplingState (t :: T) :: Bool where- ContainsSaplingState ('TOption t) = ContainsSaplingState t- ContainsSaplingState ('TList t) = ContainsSaplingState t- ContainsSaplingState ('TPair a b) = ContainsSaplingState a || ContainsSaplingState b- ContainsSaplingState ('TOr a b) = ContainsSaplingState a || ContainsSaplingState b- ContainsSaplingState ('TMap _ v) = ContainsSaplingState v- ContainsSaplingState ('TBigMap _ v) = ContainsSaplingState v- ContainsSaplingState ('TSaplingState _) = 'True- ContainsSaplingState _ = 'False---- | Constraint which ensures that type is comparable.-type family IsComparable (t :: T) :: Bool where- IsComparable ('TPair a b) = IsComparable a && IsComparable b- IsComparable ('TOption t) = IsComparable t- IsComparable 'TBls12381Fr = 'False- IsComparable 'TBls12381G1 = 'False- IsComparable 'TBls12381G2 = 'False- IsComparable ('TList _) = 'False- IsComparable ('TSet _) = 'False- IsComparable 'TOperation = 'False- IsComparable ('TContract _) = 'False- IsComparable ('TTicket _) = 'False- IsComparable ('TOr a b) = IsComparable a && IsComparable b- IsComparable ('TLambda _ _) = 'False- IsComparable ('TMap _ _) = 'False- IsComparable ('TBigMap _ _) = 'False- IsComparable 'TChest = 'False- IsComparable 'TChestKey = 'False- IsComparable ('TSaplingState _) = 'False- IsComparable ('TSaplingTransaction _) = 'False- IsComparable _ = 'True---- | Constraint which ensures that a value of type @t@ does not contain operations.------ Not just a type alias in order to be able to partially apply it--- (e.g. in 'Each').-class (ContainsOp t ~ 'False) => HasNoOp t-instance (ContainsOp t ~ 'False) => HasNoOp t---- | Constraint which ensures that a value of type @t@ does not contain @contract@ values.-class (ContainsContract t ~ 'False) => HasNoContract t-instance (ContainsContract t ~ 'False) => HasNoContract t---- | Constraint which ensures that a value of type @t@ does not contain @ticket@ values.-class (ContainsTicket t ~ 'False) => HasNoTicket t-instance (ContainsTicket t ~ 'False) => HasNoTicket t---- | Constraint which ensures that a value of type @t@ does not contain @big_map@ values.-class (ContainsBigMap t ~ 'False) => HasNoBigMap t-instance (ContainsBigMap t ~ 'False) => HasNoBigMap t---- | Constraint which ensures that a value of type @t@ does not contain @sapling_state@ values.-class (ContainsSaplingState t ~ 'False) => HasNoSaplingState t-instance (ContainsSaplingState t ~ 'False) => HasNoSaplingState t---- | Constraint which ensures that there are no nested bigmaps.-class (ContainsNestedBigMaps t ~ 'False) => HasNoNestedBigMaps t-instance (ContainsNestedBigMaps t ~ 'False) => HasNoNestedBigMaps t---- | This is like 'HasNoOp', it raises a more human-readable error--- when @t@ type is concrete, and also imposes an equality constraint.------ Use this constraint in our eDSL.-type ForbidOp t =- FailWhen- (ContainsOp t)- ('Text "Operations are not allowed in this scope")--type ForbidContract t =- FailWhen- (ContainsContract t)- ('Text "Type `contract` is not allowed in this scope")--type ForbidTicket t =- FailWhen- (ContainsTicket t)- ('Text "Type `ticket` is not allowed in this scope")--type ForbidSaplingState t =- FailWhen- (ContainsSaplingState t)- ('Text "Type `sapling_state` is not allowed in this scope")--type ForbidBigMap t =- FailWhen- (ContainsBigMap t)- ('Text "BigMaps are not allowed in this scope")--type ForbidNestedBigMaps t =- FailWhen- (ContainsNestedBigMaps t)- ('Text "Nested BigMaps are not allowed")---- | Constraint that rises human-readable error message, in case given value--- can't be compared-type ForbidNonComparable t =- FailUnless- (IsComparable t)- ('Text "Only comparable types are allowed here")---- | Whether a value of this type _may_ contain an operation.-data OpPresence (t :: T)- = ContainsOp t ~ 'True => OpPresent- -- ^ A value of type @t@ may or may not contain an operation.- | ContainsOp t ~ 'False => OpAbsent- -- ^ A value of type @t@ cannot contain @big_map@ values.---- | Whether a value of this type _may_ contain a @contract@ value.-data ContractPresence (t :: T)- = ContainsContract t ~ 'True => ContractPresent- -- ^ A value of type @t@ may or may not contain a @contract@ value.- | ContainsContract t ~ 'False => ContractAbsent- -- ^ A value of type @t@ cannot contain @contract@ values.---- | Whether a value of this type _may_ contain a @ticket@ value.-data TicketPresence (t :: T)- = ContainsTicket t ~ 'True => TicketPresent- -- ^ A value of type @t@ may or may not contain a @ticket@ value.- | ContainsTicket t ~ 'False => TicketAbsent- -- ^ A value of type @t@ cannot contain @ticket@ values.---- | Whether a value of this type _may_ contain a @big_map@ value.-data BigMapPresence (t :: T)- = ContainsBigMap t ~ 'True => BigMapPresent- -- ^ A value of type @t@ may or may not contain a @big_map@ value.- | ContainsBigMap t ~ 'False => BigMapAbsent- -- ^ A value of type @t@ cannot contain @big_map@ values.---- | Whether a value of this type _may_ contain nested @big_map@s.-data NestedBigMapsPresence (t :: T)- = ContainsNestedBigMaps t ~ 'True => NestedBigMapsPresent- -- ^ A value of type @t@ may or may not contain nested @big_map@s.- | ContainsNestedBigMaps t ~ 'False => NestedBigMapsAbsent- -- ^ A value of type @t@ cannot contain nested @big_map@s.---- | Whether a value of this type _may_ contain a @sapling_state@ value.-data SaplingStatePresence (t :: T)- = ContainsSaplingState t ~ 'True => SaplingStatePresent- -- ^ A value of type @t@ may or may not contain a @sapling_state@ value.- | ContainsSaplingState t ~ 'False => SaplingStateAbsent- -- ^ A value of type @t@ cannot contain @sapling_state@ values.---- @rvem: IMO, generalization of OpPresence and BigMapPresence to--- TPresence is not worth it, due to the fact that--- it will require more boilerplate in checkTPresence implementation--- than it is already done in checkOpPresence and checkBigMapPresence---- | Check at runtime whether a value of the given type _may_ contain an operation.-checkOpPresence :: Sing (ty :: T) -> OpPresence ty-checkOpPresence = \case- -- This is a sad amount of boilerplate, but at least- -- there is no chance to make a mistake in it.- -- We can't do in a simpler way while requiring only @Sing ty@ / @SingI ty@,- -- and a more complex constraint would be too unpleasant and confusing to- -- propagate everywhere.- STKey -> OpAbsent- STSignature -> OpAbsent- STChainId -> OpAbsent- STUnit -> OpAbsent- STOption t -> case checkOpPresence t of- OpPresent -> OpPresent- OpAbsent -> OpAbsent- STList t -> case checkOpPresence t of- OpPresent -> OpPresent- OpAbsent -> OpAbsent- STSet a -> case checkOpPresence a of- OpPresent -> OpPresent- OpAbsent -> OpAbsent- STOperation -> OpPresent- STContract _ -> OpAbsent- STTicket t -> case checkOpPresence t of- OpPresent -> OpPresent- OpAbsent -> OpAbsent- STPair a b -> case (checkOpPresence a, checkOpPresence b) of- (OpPresent, _) -> OpPresent- (_, OpPresent) -> OpPresent- (OpAbsent, OpAbsent) -> OpAbsent- STOr a b -> case (checkOpPresence a, checkOpPresence b) of- (OpPresent, _) -> OpPresent- (_, OpPresent) -> OpPresent- (OpAbsent, OpAbsent) -> OpAbsent- STLambda _ _ -> OpAbsent- STMap k v -> case (checkOpPresence k, checkOpPresence v) of- (OpAbsent, OpAbsent) -> OpAbsent- (OpPresent, _) -> OpPresent- (_, OpPresent) -> OpPresent- STBigMap k v -> case (checkOpPresence k, checkOpPresence v) of- (OpAbsent, OpAbsent) -> OpAbsent- (OpPresent, _) -> OpPresent- (_, OpPresent) -> OpPresent- STInt -> OpAbsent- STNat -> OpAbsent- STString -> OpAbsent- STBytes -> OpAbsent- STMutez -> OpAbsent- STBool -> OpAbsent- STKeyHash -> OpAbsent- STBls12381Fr -> OpAbsent- STBls12381G1 -> OpAbsent- STBls12381G2 -> OpAbsent- STTimestamp -> OpAbsent- STAddress -> OpAbsent- STChest -> OpAbsent- STChestKey -> OpAbsent- STNever -> OpAbsent- STSaplingState _ -> OpAbsent- STSaplingTransaction _ -> OpAbsent---- | Check at runtime whether a value of the given type _may_ contain a @contract@ value.-checkContractTypePresence :: Sing (ty :: T) -> ContractPresence ty-checkContractTypePresence = \case- STKey -> ContractAbsent- STSignature -> ContractAbsent- STChainId -> ContractAbsent- STUnit -> ContractAbsent- STOption t -> case checkContractTypePresence t of- ContractPresent -> ContractPresent- ContractAbsent -> ContractAbsent- STList t -> case checkContractTypePresence t of- ContractPresent -> ContractPresent- ContractAbsent -> ContractAbsent- STSet _ -> ContractAbsent- STOperation -> ContractAbsent- STContract _ -> ContractPresent- STTicket _ -> ContractAbsent -- contract type is not allowed in tickets at all- STPair a b -> case (checkContractTypePresence a, checkContractTypePresence b) of- (ContractPresent, _) -> ContractPresent- (_, ContractPresent) -> ContractPresent- (ContractAbsent, ContractAbsent) -> ContractAbsent- STOr a b -> case (checkContractTypePresence a, checkContractTypePresence b) of- (ContractPresent, _) -> ContractPresent- (_, ContractPresent) -> ContractPresent- (ContractAbsent, ContractAbsent) -> ContractAbsent- STLambda _ _ -> ContractAbsent- STMap _ v -> case checkContractTypePresence v of- ContractPresent -> ContractPresent- ContractAbsent -> ContractAbsent- STBigMap _ v -> case checkContractTypePresence v of- ContractPresent -> ContractPresent- ContractAbsent -> ContractAbsent- STInt -> ContractAbsent- STNat -> ContractAbsent- STString -> ContractAbsent- STBytes -> ContractAbsent- STMutez -> ContractAbsent- STBool -> ContractAbsent- STKeyHash -> ContractAbsent- STBls12381Fr -> ContractAbsent- STBls12381G1 -> ContractAbsent- STBls12381G2 -> ContractAbsent- STTimestamp -> ContractAbsent- STAddress -> ContractAbsent- STChest -> ContractAbsent- STChestKey -> ContractAbsent- STNever -> ContractAbsent- STSaplingState _ -> ContractAbsent- STSaplingTransaction _ -> ContractAbsent---- | Check at runtime whether a value of the given type _may_ contain a @ticket@ value.-checkTicketPresence :: Sing (ty :: T) -> TicketPresence ty-checkTicketPresence = \case- STKey -> TicketAbsent- STSignature -> TicketAbsent- STChainId -> TicketAbsent- STUnit -> TicketAbsent- STOption t -> case checkTicketPresence t of- TicketPresent -> TicketPresent- TicketAbsent -> TicketAbsent- STList t -> case checkTicketPresence t of- TicketPresent -> TicketPresent- TicketAbsent -> TicketAbsent- STSet _ -> TicketAbsent- STOperation -> TicketAbsent- STContract _ -> TicketAbsent- STTicket _ -> TicketPresent- STPair a b -> case (checkTicketPresence a, checkTicketPresence b) of- (TicketPresent, _) -> TicketPresent- (_, TicketPresent) -> TicketPresent- (TicketAbsent, TicketAbsent) -> TicketAbsent- STOr a b -> case (checkTicketPresence a, checkTicketPresence b) of- (TicketPresent, _) -> TicketPresent- (_, TicketPresent) -> TicketPresent- (TicketAbsent, TicketAbsent) -> TicketAbsent- STLambda _ _ -> TicketAbsent- STMap _ v -> case checkTicketPresence v of- TicketPresent -> TicketPresent- TicketAbsent -> TicketAbsent- STBigMap _ v -> case checkTicketPresence v of- TicketPresent -> TicketPresent- TicketAbsent -> TicketAbsent- STInt -> TicketAbsent- STNat -> TicketAbsent- STString -> TicketAbsent- STBytes -> TicketAbsent- STMutez -> TicketAbsent- STBool -> TicketAbsent- STKeyHash -> TicketAbsent- STBls12381Fr -> TicketAbsent- STBls12381G1 -> TicketAbsent- STBls12381G2 -> TicketAbsent- STTimestamp -> TicketAbsent- STAddress -> TicketAbsent- STChest -> TicketAbsent- STChestKey -> TicketAbsent- STNever -> TicketAbsent- STSaplingState _ -> TicketAbsent- STSaplingTransaction _ -> TicketAbsent---- | Check at runtime whether a value of the given type _may_ contain a @big_map@ value.-checkBigMapPresence :: Sing (ty :: T) -> BigMapPresence ty-checkBigMapPresence = \case- -- More boilerplate to boilerplate god.- STKey -> BigMapAbsent- STSignature -> BigMapAbsent- STChainId -> BigMapAbsent- STUnit -> BigMapAbsent- STOption t -> case checkBigMapPresence t of- BigMapPresent -> BigMapPresent- BigMapAbsent -> BigMapAbsent- STList t -> case checkBigMapPresence t of- BigMapPresent -> BigMapPresent- BigMapAbsent -> BigMapAbsent- STSet _ -> BigMapAbsent- STOperation -> BigMapAbsent- STContract _ -> BigMapAbsent- STTicket _ -> BigMapAbsent -- big_maps are not allowed in tickets at all- STPair a b -> case (checkBigMapPresence a, checkBigMapPresence b) of- (BigMapPresent, _) -> BigMapPresent- (_, BigMapPresent) -> BigMapPresent- (BigMapAbsent, BigMapAbsent) -> BigMapAbsent- STOr a b -> case (checkBigMapPresence a, checkBigMapPresence b) of- (BigMapPresent, _) -> BigMapPresent- (_, BigMapPresent) -> BigMapPresent- (BigMapAbsent, BigMapAbsent) -> BigMapAbsent- STLambda _ _ -> BigMapAbsent- STMap _ v -> case checkBigMapPresence v of- BigMapPresent -> BigMapPresent- BigMapAbsent -> BigMapAbsent- STBigMap _ _ ->- BigMapPresent- STInt -> BigMapAbsent- STNat -> BigMapAbsent- STString -> BigMapAbsent- STBytes -> BigMapAbsent- STMutez -> BigMapAbsent- STBool -> BigMapAbsent- STKeyHash -> BigMapAbsent- STBls12381Fr -> BigMapAbsent- STBls12381G1 -> BigMapAbsent- STBls12381G2 -> BigMapAbsent- STTimestamp -> BigMapAbsent- STAddress -> BigMapAbsent- STChest -> BigMapAbsent- STChestKey -> BigMapAbsent- STNever -> BigMapAbsent- STSaplingState _ -> BigMapAbsent- STSaplingTransaction _ -> BigMapAbsent---- | Check at runtime whether a value of the given type _may_ contain nested @big_map@s.-checkNestedBigMapsPresence :: Sing (ty :: T) -> NestedBigMapsPresence ty-checkNestedBigMapsPresence = \case- -- More boilerplate to boilerplate god.- STKey -> NestedBigMapsAbsent- STSignature -> NestedBigMapsAbsent- STChainId -> NestedBigMapsAbsent- STUnit -> NestedBigMapsAbsent- STOption t -> case checkNestedBigMapsPresence t of- NestedBigMapsPresent -> NestedBigMapsPresent- NestedBigMapsAbsent -> NestedBigMapsAbsent- STList t -> case checkNestedBigMapsPresence t of- NestedBigMapsPresent -> NestedBigMapsPresent- NestedBigMapsAbsent -> NestedBigMapsAbsent- STSet _ -> NestedBigMapsAbsent- STOperation -> NestedBigMapsAbsent- STContract _ -> NestedBigMapsAbsent- STTicket _ -> NestedBigMapsAbsent- STPair a b -> case (checkNestedBigMapsPresence a, checkNestedBigMapsPresence b) of- (NestedBigMapsPresent, _) -> NestedBigMapsPresent- (_, NestedBigMapsPresent) -> NestedBigMapsPresent- (NestedBigMapsAbsent, NestedBigMapsAbsent) -> NestedBigMapsAbsent- STOr a b -> case (checkNestedBigMapsPresence a, checkNestedBigMapsPresence b) of- (NestedBigMapsPresent, _) -> NestedBigMapsPresent- (_, NestedBigMapsPresent) -> NestedBigMapsPresent- (NestedBigMapsAbsent, NestedBigMapsAbsent) -> NestedBigMapsAbsent- STLambda _ _ -> NestedBigMapsAbsent- STMap _ v -> case checkNestedBigMapsPresence v of- NestedBigMapsPresent -> NestedBigMapsPresent- NestedBigMapsAbsent -> NestedBigMapsAbsent- STBigMap _ v -> case checkBigMapPresence v of- BigMapPresent -> NestedBigMapsPresent- BigMapAbsent -> NestedBigMapsAbsent- STInt -> NestedBigMapsAbsent- STNat -> NestedBigMapsAbsent- STString -> NestedBigMapsAbsent- STBytes -> NestedBigMapsAbsent- STMutez -> NestedBigMapsAbsent- STBool -> NestedBigMapsAbsent- STKeyHash -> NestedBigMapsAbsent- STBls12381Fr -> NestedBigMapsAbsent- STBls12381G1 -> NestedBigMapsAbsent- STBls12381G2 -> NestedBigMapsAbsent- STTimestamp -> NestedBigMapsAbsent- STAddress -> NestedBigMapsAbsent- STChest -> NestedBigMapsAbsent- STChestKey -> NestedBigMapsAbsent- STNever -> NestedBigMapsAbsent- STSaplingState _ -> NestedBigMapsAbsent- STSaplingTransaction _ -> NestedBigMapsAbsent----- | Check at runtime whether a value of the given type _may_ contain a @sapling_state@ value.-checkSaplingStatePresence :: Sing (ty :: T) -> SaplingStatePresence ty-checkSaplingStatePresence = \case- STKey -> SaplingStateAbsent- STSignature -> SaplingStateAbsent- STChainId -> SaplingStateAbsent- STUnit -> SaplingStateAbsent- STOption t -> case checkSaplingStatePresence t of- SaplingStatePresent -> SaplingStatePresent- SaplingStateAbsent -> SaplingStateAbsent- STList t -> case checkSaplingStatePresence t of- SaplingStatePresent -> SaplingStatePresent- SaplingStateAbsent -> SaplingStateAbsent- STSet _ -> SaplingStateAbsent- STOperation -> SaplingStateAbsent- STContract _ -> SaplingStateAbsent- STTicket _ -> SaplingStateAbsent- STPair a b -> case (checkSaplingStatePresence a, checkSaplingStatePresence b) of- (SaplingStatePresent, _) -> SaplingStatePresent- (_, SaplingStatePresent) -> SaplingStatePresent- (SaplingStateAbsent, SaplingStateAbsent) -> SaplingStateAbsent- STOr a b -> case (checkSaplingStatePresence a, checkSaplingStatePresence b) of- (SaplingStatePresent, _) -> SaplingStatePresent- (_, SaplingStatePresent) -> SaplingStatePresent- (SaplingStateAbsent, SaplingStateAbsent) -> SaplingStateAbsent- STLambda _ _ -> SaplingStateAbsent- STMap _ v -> case checkSaplingStatePresence v of- SaplingStatePresent -> SaplingStatePresent- SaplingStateAbsent -> SaplingStateAbsent- STBigMap _ v -> case checkSaplingStatePresence v of- SaplingStatePresent -> SaplingStatePresent- SaplingStateAbsent -> SaplingStateAbsent- STInt -> SaplingStateAbsent- STNat -> SaplingStateAbsent- STString -> SaplingStateAbsent- STBytes -> SaplingStateAbsent- STMutez -> SaplingStateAbsent- STBool -> SaplingStateAbsent- STKeyHash -> SaplingStateAbsent- STBls12381Fr -> SaplingStateAbsent- STBls12381G1 -> SaplingStateAbsent- STBls12381G2 -> SaplingStateAbsent- STTimestamp -> SaplingStateAbsent- STAddress -> SaplingStateAbsent- STChest -> SaplingStateAbsent- STChestKey -> SaplingStateAbsent- STNever -> SaplingStateAbsent- STSaplingState _ -> SaplingStatePresent- STSaplingTransaction _ -> SaplingStateAbsent---- | Check at runtime that a value of the given type cannot contain operations.-opAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoOp t)-opAbsense s = case checkOpPresence s of- OpPresent -> Nothing- OpAbsent -> Just Dict---- | Check at runtime that a value of the given type cannot contain @contract@ values.-contractTypeAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoContract t)-contractTypeAbsense s = case checkContractTypePresence s of- ContractPresent -> Nothing- ContractAbsent -> Just Dict---- | Check at runtime that a value of the given type cannot contain @ticket@ values.-ticketAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoTicket t)-ticketAbsense s = case checkTicketPresence s of- TicketPresent -> Nothing- TicketAbsent -> Just Dict---- | Check at runtime that a value of the given type cannot containt @big_map@ values-bigMapAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoBigMap t)-bigMapAbsense s = case checkBigMapPresence s of- BigMapPresent -> Nothing- BigMapAbsent -> Just Dict---- | Check at runtime that a value of the given type cannot containt @sapling_state@ values-saplingStateAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoSaplingState t)-saplingStateAbsense s = case checkSaplingStatePresence s of- SaplingStatePresent -> Nothing- SaplingStateAbsent -> Just Dict---- | Check at runtime that a value of the given type cannot contain nested @big_map@s.-nestedBigMapsAbsense :: Sing (t :: T) -> Maybe (Dict $ HasNoNestedBigMaps t)-nestedBigMapsAbsense s = case checkNestedBigMapsPresence s of- NestedBigMapsPresent -> Nothing- NestedBigMapsAbsent -> Just Dict--------------------------------------------------------------------------------- Scopes-------------------------------------------------------------------------------data BadTypeForScope- = BtNotComparable- | BtIsOperation- | BtHasBigMap- | BtHasNestedBigMap- | BtHasContract- | BtHasTicket- | BtHasSaplingState- deriving stock (Show, Eq, Generic)- deriving anyclass (NFData)--instance Buildable BadTypeForScope where- build = buildRenderDoc--instance RenderDoc BadTypeForScope where- renderDoc _ = \case- BtNotComparable -> "is not comparable"- BtIsOperation -> "has 'operation' type"- BtHasBigMap -> "has 'big_map'"- BtHasNestedBigMap -> "has nested 'big_map'"- BtHasContract -> "has 'contract' type"- BtHasTicket -> "has 'ticket' type"- BtHasSaplingState -> "has 'sapling_state' type"---- | Set of constraints that Michelson applies to parameters.------ Not just a type alias in order to be able to partially apply it-class (SingI t, WellTyped t, HasNoOp t, HasNoNestedBigMaps t) => ParameterScope t-instance (SingI t, WellTyped t, HasNoOp t, HasNoNestedBigMaps t) => ParameterScope t---- | Set of constraints that Michelson applies to contract storage.------ Not just a type alias in order to be able to partially apply it-class (SingI t, WellTyped t, HasNoOp t, HasNoNestedBigMaps t, HasNoContract t) => StorageScope t-instance (SingI t, WellTyped t, HasNoOp t, HasNoNestedBigMaps t, HasNoContract t) => StorageScope t---- | Set of constraints that Michelson applies to pushed constants.------ Not just a type alias in order to be able to partially apply it-class (SingI t, WellTyped t, HasNoOp t, HasNoBigMap t, HasNoContract t, HasNoTicket t, HasNoSaplingState t) => ConstantScope t-instance (SingI t, WellTyped t, HasNoOp t, HasNoBigMap t, HasNoContract t, HasNoTicket t, HasNoSaplingState t) => ConstantScope t---- | Alias for constraints which Michelson requires in @DUP@ instruction.-class (SingI t, HasNoTicket t) => DupableScope t-instance (SingI t, HasNoTicket t) => DupableScope t---- | Returns whether the type is dupable.-type family IsDupableScope (t :: T) :: Bool where- IsDupableScope t = Not (ContainsTicket t)---- | Set of constraints that Michelson applies to packed values.------ Not just a type alias in order to be able to partially apply it-class (SingI t, WellTyped t, HasNoOp t, HasNoBigMap t, HasNoTicket t, HasNoSaplingState t) => PackedValScope t-instance (SingI t, WellTyped t, HasNoOp t, HasNoBigMap t, HasNoTicket t, HasNoSaplingState t ) => PackedValScope t---- | Set of constraints that Michelson applies to unpacked values.------ It is different from 'PackedValScope', e.g. @contract@ type cannot appear--- in a value we unpack to.------ Not just a type alias in order to be able to partially apply it-class (WellTyped t, PackedValScope t, ConstantScope t) => UnpackedValScope t-instance (WellTyped t, PackedValScope t, ConstantScope t) => UnpackedValScope t---- | Set of constraints that Michelson applies to argument type and--- return type of views.--- All info related to views can be found in--- [TZIP](https://gitlab.com/tezos/tzip/-/blob/master/drafts/current/draft_views.md).------ Not just a type alias in order to be able to partially apply it-class (SingI t, HasNoOp t, HasNoBigMap t, HasNoTicket t) => ViewableScope t-instance (SingI t, HasNoOp t, HasNoBigMap t, HasNoTicket t) => ViewableScope t---- | Alias for constraints which are required for untyped representation.-type UntypedValScope t = (SingI t, HasNoOp t)--------------------------------------------------------------------------------- Conveniences--------------------------------------------------------------------------------- | Should be present for common scopes.-class CheckScope (c :: Constraint) where- -- | Check that constraint hold for a given type.- checkScope :: Either BadTypeForScope (Dict c)--instance SingI t => CheckScope (WellTyped t) where- checkScope = first nwtCause $ getWTP @t-instance SingI t => CheckScope (HasNoOp t) where- checkScope = maybeToRight BtIsOperation $ opAbsense sing-instance SingI t => CheckScope (HasNoBigMap t) where- checkScope = maybeToRight BtHasBigMap $ bigMapAbsense sing-instance SingI t => CheckScope (HasNoNestedBigMaps t) where- checkScope = maybeToRight BtHasNestedBigMap $ nestedBigMapsAbsense sing-instance SingI t => CheckScope (HasNoContract t) where- checkScope = maybeToRight BtHasContract $ contractTypeAbsense sing-instance SingI t => CheckScope (HasNoTicket t) where- checkScope = maybeToRight BtHasTicket $ ticketAbsense sing-instance SingI t => CheckScope (HasNoSaplingState t) where- checkScope = maybeToRight BtHasSaplingState $ saplingStateAbsense sing-instance SingI t => CheckScope (Comparable t) where- checkScope = maybeToRight BtNotComparable $ comparabilityPresence sing---- | Alias for comparable types.-class (SingI t, Comparable t) => ComparabilityScope t-instance (SingI t, Comparable t) => ComparabilityScope t--comparabilityPresence :: Sing t -> Maybe (Dict (Comparable t))-comparabilityPresence s = case checkComparability s of- CanBeCompared -> Just Dict- CannotBeCompared -> Nothing--instance SingI t => CheckScope (ParameterScope t) where- checkScope =- (\Dict Dict Dict -> Dict)- <$> checkScope @(WellTyped t)- <*> checkScope @(HasNoOp t)- <*> checkScope @(HasNoNestedBigMaps t)--instance SingI t => CheckScope (StorageScope t) where- checkScope =- (\Dict Dict Dict Dict -> Dict)- <$> checkScope @(WellTyped t)- <*> checkScope @(HasNoOp t)- <*> checkScope @(HasNoNestedBigMaps t)- <*> checkScope @(HasNoContract t)--instance SingI t => CheckScope (ConstantScope t) where- checkScope =- (\Dict Dict Dict Dict Dict Dict -> Dict)- <$> checkScope @(WellTyped t)- <*> checkScope @(HasNoOp t)- <*> checkScope @(HasNoBigMap t)- <*> checkScope @(HasNoContract t)- <*> checkScope @(HasNoTicket t)- <*> checkScope @(HasNoSaplingState t)--instance SingI t => CheckScope (DupableScope t) where- checkScope =- (\Dict -> Dict)- <$> checkScope @(HasNoTicket t)--instance SingI t => CheckScope (PackedValScope t) where- checkScope =- (\Dict Dict Dict Dict Dict -> Dict)- <$> checkScope @(WellTyped t)- <*> checkScope @(HasNoOp t)- <*> checkScope @(HasNoBigMap t)- <*> checkScope @(HasNoTicket t)- <*> checkScope @(HasNoSaplingState t)--instance SingI t => CheckScope (UnpackedValScope t) where- checkScope =- (\Dict Dict Dict -> Dict)- <$> checkScope @(WellTyped t)- <*> checkScope @(PackedValScope t)- <*> checkScope @(ConstantScope t)--instance SingI t => CheckScope (ViewableScope t) where- checkScope =- (\Dict Dict Dict -> Dict)- <$> checkScope @(HasNoOp t)- <*> checkScope @(HasNoBigMap t)- <*> checkScope @(HasNoTicket t)--instance SingI t => CheckScope (ComparabilityScope t) where- checkScope =- (\Dict -> Dict) <$> checkScope @(Comparable t)--instance (CheckScope a, CheckScope b) => CheckScope (a, b) where- checkScope = do- Dict <- checkScope @a- Dict <- checkScope @b- pure Dict---- | Allows using a scope that can be proven true with a De Morgan law.------ Many scopes are defined as @not a@ (or rather @a ~ 'False@) where @a@ is a--- negative property we want to avoid as a 'Constraint'.--- The negative constraints are implemented with a type family that for some--- combination types resolves to itself applied to the type arguments in an @or@,--- e.g. A @pair l r@ has @x@ if @l@ or @r@ contain @x@.------ Because of the De Morgan laws @not (a or b)@ implies @(not a) and (not b)@--- or in our case: @pair@ does not contain @x@ -> @a@ and @b@ don't contain @x@.-class WithDeMorganScope (c :: T -> Constraint) t a b where- withDeMorganScope :: c (t a b) => ((c a, c b) => ret) -> ret---- | Produce evidence that the first argument of a disjunction--- is false if the whole disjunction is false.-orL :: forall a b. (a || b) ~ 'False => Sing a -> a :~: 'False-orL SFalse = Refl-{-# NOINLINE [1] orL #-}---- This rule is *slightly* illegitimate, because the right hand side is lazier--- than the left hand side. In context, this is fine, and we really *want* to--- do it so we have at least some hope of avoiding building singletons that we--- don't end up using. We'd get a totally legitimate rule if we used a SingI--- constraint instead of a Sing argument, but then we'd need to use withSingI,--- which for some reason doesn't use the newfangled GHC machinery for such and--- therefore risks gumming up optimization. Of course, we could roll our own--- withSingI, but that's very hairy and GHC version dependent (the--- never-really-documented magicDict was recently replaced by withDict, which--- is documented in ... the type checker source code, apparently).-{-# RULES-"orL" forall s. orL s = unsafeCoerce Refl- #-}---- | When a class looks like------ @--- class (SomeTypeFamily t ~ 'False, ...) => TheClass t--- instance (SomeTypeFamily t ~ 'False, ...) => TheClass t--- @------ and the additional constraints are satisfied by the instance constraints of--- the 'WithDeMorganScope' instance for @TheClass@, we can use--- `simpleWithDeMorgan` to define 'withDeMorganScope' for the instance.-simpleWithDeMorgan- :: forall sym a b ret.- ((sym @@ a || sym @@ b) ~ 'False, SingI sym, SingI a)- => (((sym @@ a) ~ 'False, (sym @@ b) ~ 'False) => ret) -> ret--- Note: If the "orL" rule fires (which it should), we won't actually calculate--- the (likely recursive) `sing @sym @@ sing @a` at all. If we're lucky, GHC--- might not build the `SingI a` dictionary either.-simpleWithDeMorgan f- | Refl <- orL @(sym @@ a) @(sym @@ b) (sing @sym @@ sing @a)- = f--data ContainsOpSym :: T ~> Bool-type instance Apply ContainsOpSym x = ContainsOp x-instance SingI ContainsOpSym where- sing = SLambda $ \t -> case checkOpPresence t of- OpPresent -> STrue- OpAbsent -> SFalse-instance SingI a => WithDeMorganScope HasNoOp 'TPair a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsOpSym @a @b f-instance SingI a => WithDeMorganScope HasNoOp 'TOr a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsOpSym @a @b f-instance SingI k => WithDeMorganScope HasNoOp 'TMap k v where- withDeMorganScope f = simpleWithDeMorgan @ContainsOpSym @k @v f-instance SingI k => WithDeMorganScope HasNoOp 'TBigMap k v where- withDeMorganScope f = simpleWithDeMorgan @ContainsOpSym @k @v f--data ContainsContractSym :: T ~> Bool-type instance Apply ContainsContractSym x = ContainsContract x-instance SingI ContainsContractSym where- sing = SLambda $ \t -> case checkContractTypePresence t of- ContractPresent -> STrue- ContractAbsent -> SFalse-instance SingI a => WithDeMorganScope HasNoContract 'TPair a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsContractSym @a @b f-instance SingI a => WithDeMorganScope HasNoContract 'TOr a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsContractSym @a @b f--data ContainsTicketSym :: T ~> Bool-type instance Apply ContainsTicketSym x = ContainsTicket x-instance SingI ContainsTicketSym where- sing = SLambda $ \t -> case checkTicketPresence t of- TicketPresent -> STrue- TicketAbsent -> SFalse-instance SingI a => WithDeMorganScope HasNoTicket 'TPair a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsTicketSym @a @b f-instance SingI a => WithDeMorganScope HasNoTicket 'TOr a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsTicketSym @a @b f--data ContainsBigMapSym :: T ~> Bool-type instance Apply ContainsBigMapSym x = ContainsBigMap x-instance SingI ContainsBigMapSym where- sing = SLambda $ \t -> case checkBigMapPresence t of- BigMapPresent -> STrue- BigMapAbsent -> SFalse-instance SingI a => WithDeMorganScope HasNoBigMap 'TPair a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsBigMapSym @a @b f-instance SingI a => WithDeMorganScope HasNoBigMap 'TOr a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsBigMapSym @a @b f--data ContainsNestedBigMapsSym :: T ~> Bool-type instance Apply ContainsNestedBigMapsSym x = ContainsNestedBigMaps x-instance SingI ContainsNestedBigMapsSym where- sing = SLambda $ \t -> case checkNestedBigMapsPresence t of- NestedBigMapsPresent -> STrue- NestedBigMapsAbsent -> SFalse-instance SingI a => WithDeMorganScope HasNoNestedBigMaps 'TPair a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsNestedBigMapsSym @a @b f-instance SingI a => WithDeMorganScope HasNoNestedBigMaps 'TOr a b where- withDeMorganScope f = simpleWithDeMorgan @ContainsNestedBigMapsSym @a @b f--instance- ( WithDeMorganScope HasNoOp t a b- , WithDeMorganScope HasNoNestedBigMaps t a b- , WellTyped a, WellTyped b- ) => WithDeMorganScope ParameterScope t a b where- withDeMorganScope f =- withDeMorganScope @HasNoOp @t @a @b $- withDeMorganScope @HasNoNestedBigMaps @t @a @b f--instance- ( WithDeMorganScope HasNoOp t a b- , WithDeMorganScope HasNoNestedBigMaps t a b- , WithDeMorganScope HasNoContract t a b- , WellTyped a, WellTyped b- ) => WithDeMorganScope StorageScope t a b where- withDeMorganScope f =- withDeMorganScope @HasNoOp @t @a @b $- withDeMorganScope @HasNoNestedBigMaps @t @a @b $- withDeMorganScope @HasNoContract @t @a @b f--instance- ( WithDeMorganScope HasNoOp t a b- , WithDeMorganScope HasNoBigMap t a b- , WithDeMorganScope HasNoContract t a b- , WithDeMorganScope HasNoTicket t a b- , WithDeMorganScope HasNoSaplingState t a b- , WellTyped a, WellTyped b- ) => WithDeMorganScope ConstantScope t a b where- withDeMorganScope f =- withDeMorganScope @HasNoOp @t @a @b $- withDeMorganScope @HasNoBigMap @t @a @b $- withDeMorganScope @HasNoContract @t @a @b $- withDeMorganScope @HasNoTicket @t @a @b $- withDeMorganScope @HasNoSaplingState @t @a @b f--instance- ( WithDeMorganScope HasNoOp t a b- , WithDeMorganScope HasNoBigMap t a b- , WithDeMorganScope HasNoTicket t a b- , WithDeMorganScope HasNoSaplingState t a b- , WellTyped a, WellTyped b- ) => WithDeMorganScope PackedValScope t a b where- withDeMorganScope f =- withDeMorganScope @HasNoOp @t @a @b $- withDeMorganScope @HasNoBigMap @t @a @b $- withDeMorganScope @HasNoTicket @t @a @b $- withDeMorganScope @HasNoSaplingState @t @a @b f--instance- ( WithDeMorganScope PackedValScope t a b- , WithDeMorganScope ConstantScope t a b- , WellTyped a, WellTyped b- ) => WithDeMorganScope UnpackedValScope t a b where- withDeMorganScope f =- withDeMorganScope @PackedValScope @t @a @b $- withDeMorganScope @ConstantScope @t @a @b f---- Versions for eDSL-------------------------------------------------------------------------------{- These constraints are supposed to be used only in eDSL code and eDSL should-define its own wrapers over it.--}--type ProperParameterBetterErrors t =- (SingI t, WellTyped t, ForbidOp t, ForbidNestedBigMaps t)--type ProperStorageBetterErrors t =- (SingI t, WellTyped t, ForbidOp t, ForbidNestedBigMaps t, ForbidContract t)--type ProperConstantBetterErrors t =- (SingI t, WellTyped t, ForbidOp t, ForbidBigMap t, ForbidContract t, ForbidTicket t, ForbidSaplingState t)--type ProperDupableBetterErrors t =- (SingI t, ForbidTicket t)--type ProperPackedValBetterErrors t =- (SingI t, WellTyped t, ForbidOp t, ForbidBigMap t, ForbidTicket t, ForbidSaplingState t)--type ProperUnpackedValBetterErrors t =- (ProperPackedValBetterErrors t, ProperConstantBetterErrors t)--type ProperViewableBetterErrors t =- (SingI t, ForbidOp t, ForbidBigMap t, ForbidTicket t)--type ProperUntypedValBetterErrors t =- (SingI t, ForbidOp t)--type ProperNonComparableValBetterErrors t =- (SingI t, ForbidNonComparable t)--class (IsComparable t ~ 'True, SingI t, ComparableSuperC t) => Comparable t where- -- | Constraints required for instance of a given type.- type ComparableSuperC t :: Constraint- type ComparableSuperC _ = ()--instance ComparableSuperC ('TPair t1 t2) => Comparable ('TPair t1 t2) where- type ComparableSuperC ('TPair t1 t2) =- (Comparable t1, Comparable t2, ForbidNonComparable t1, ForbidNonComparable t2)--instance ComparableSuperC ('TOr t1 t2) => Comparable ('TOr t1 t2) where- type ComparableSuperC ('TOr t1 t2) =- (Comparable t1, Comparable t2, ForbidNonComparable t1, ForbidNonComparable t2)--instance ComparableSuperC ('TOption t) => Comparable ('TOption t) where- type ComparableSuperC ('TOption t) = (Comparable t, ForbidNonComparable t)--instance Comparable 'TUnit-instance Comparable 'TInt-instance Comparable 'TNat-instance Comparable 'TString-instance Comparable 'TBytes-instance Comparable 'TMutez-instance Comparable 'TBool-instance Comparable 'TKeyHash-instance Comparable 'TTimestamp-instance Comparable 'TAddress-instance Comparable 'TNever-instance Comparable 'TChainId-instance Comparable 'TSignature-instance Comparable 'TKey---- | This class encodes Michelson rules w.r.t where it requires comparable--- types. Earlier we had a dedicated type for representing comparable types @CT@.--- But then we integreated those types into @T@. This meant that some of the--- types that could be formed with various combinations of @T@ would be--- illegal as per Michelson typing rule. Using this class, we inductively--- enforce that a type and all types it contains are well typed as per--- Michelson's rules.-class (SingI t, WellTypedSuperC t) => WellTyped (t :: T) where- -- | Constraints required for instance of a given type.- type WellTypedSuperC t :: Constraint- type WellTypedSuperC _ = ()--instance WellTyped 'TKey-instance WellTyped 'TUnit-instance WellTyped 'TNever-instance WellTyped 'TSignature-instance WellTyped 'TChainId-instance WellTyped 'TChest-instance WellTyped 'TChestKey--instance WellTypedSuperC ('TOption t) => WellTyped ('TOption t) where- type WellTypedSuperC ('TOption t) = WellTyped t--instance WellTypedSuperC ('TList t) => WellTyped ('TList t) where- type WellTypedSuperC ('TList t) = WellTyped t--instance WellTypedSuperC ('TSet t) => WellTyped ('TSet t) where- type WellTypedSuperC ('TSet t) = (Comparable t, WellTyped t)--instance WellTyped 'TOperation--instance WellTypedSuperC ('TContract t) => WellTyped ('TContract t) where- type WellTypedSuperC ('TContract t) = (WellTyped t, HasNoOp t, HasNoNestedBigMaps t)--instance WellTypedSuperC ('TTicket t) => WellTyped ('TTicket t) where- type WellTypedSuperC ('TTicket t) = (WellTyped t, Comparable t)--instance WellTypedSuperC ('TPair t1 t2) => WellTyped ('TPair t1 t2) where- type WellTypedSuperC ('TPair t1 t2) = (WellTyped t1, WellTyped t2)--instance WellTypedSuperC ('TOr t1 t2) => WellTyped ('TOr t1 t2) where- type WellTypedSuperC ('TOr t1 t2) = (WellTyped t1, WellTyped t2)--instance WellTypedSuperC ('TLambda t1 t2) => WellTyped ('TLambda t1 t2) where- type WellTypedSuperC ('TLambda t1 t2) = (WellTyped t1, WellTyped t2)--instance WellTypedSuperC ('TMap k v) => WellTyped ('TMap k v) where- type WellTypedSuperC ('TMap k v) = (Comparable k, WellTyped k, WellTyped v)--instance WellTypedSuperC ('TBigMap k v) => WellTyped ('TBigMap k v) where- type WellTypedSuperC ('TBigMap k v) = ( Comparable k, WellTyped k, WellTyped v- , HasNoBigMap v, HasNoOp v)--instance WellTyped 'TInt-instance WellTyped 'TNat-instance WellTyped 'TString-instance WellTyped 'TBytes-instance WellTyped 'TMutez-instance WellTyped 'TBool-instance WellTyped 'TKeyHash-instance WellTyped 'TBls12381Fr-instance WellTyped 'TBls12381G1-instance WellTyped 'TBls12381G2-instance WellTyped 'TTimestamp-instance WellTyped 'TAddress--instance (SingI n) => WellTyped ('TSaplingState n) where- type WellTypedSuperC ('TSaplingState n) = (SingI n)--instance (SingI n) => WellTyped ('TSaplingTransaction n) where- type WellTypedSuperC ('TSaplingTransaction n) = (SingI n)---- | Error type for when a value is not well-typed.-data NotWellTyped = NotWellTyped- { nwtBadType :: T- , nwtCause :: BadTypeForScope- }--instance Buildable NotWellTyped where- build (NotWellTyped t c) =- "Given type is not well typed because '" <> (build t) <> "' " <> (build c)--data Comparability t where- CanBeCompared :: (Comparable t) => Comparability t- CannotBeCompared :: (IsComparable t ~ 'False) => Comparability t---- | Given a type, provide evidence that it is well typed w.r.t to the--- Michelson rules regarding where comparable types are required.-getWTP :: forall t. (SingI t) => Either NotWellTyped (Dict (WellTyped t))-getWTP = getWTP' sing---- | Version of 'getWTP' that accepts 'Sing' at term-level.-getWTP' :: Sing t -> Either NotWellTyped (Dict (WellTyped t))-getWTP' = \case- STKey -> Right Dict- STUnit -> Right Dict- STSignature -> Right Dict- STChainId -> Right Dict- STOption s -> do- Dict <- getWTP' s- pure Dict- STList s -> do- Dict <- getWTP' s- pure Dict- STSet s -> do- Dict <- getWTP' s- Dict <- eitherWellTyped BtNotComparable getComparableProofS s- pure Dict- STOperation -> Right Dict- STContract s -> do- Dict <- getWTP' s- Dict <- eitherWellTyped BtIsOperation opAbsense s- Dict <- eitherWellTyped BtHasNestedBigMap nestedBigMapsAbsense s- pure Dict- STTicket s -> do- Dict <- getWTP' s- Dict <- eitherWellTyped BtNotComparable getComparableProofS s- pure Dict- STPair s1 s2 -> do- Dict <- getWTP' s1- Dict <- getWTP' s2- pure Dict- STOr s1 s2 -> do- Dict <- getWTP' s1- Dict <- getWTP' s2- pure Dict- STLambda s1 s2 -> do- Dict <- getWTP' s1- Dict <- getWTP' s2- pure Dict- STMap s1 s2 -> do- Dict <- getWTP' s1- Dict <- getWTP' s2- Dict <- eitherWellTyped BtNotComparable getComparableProofS s1- pure Dict- STBigMap s1 s2 -> do- Dict <- getWTP' s1- Dict <- getWTP' s2- Dict <- eitherWellTyped BtNotComparable getComparableProofS s1- Dict <- eitherWellTyped BtIsOperation opAbsense s2- Dict <- eitherWellTyped BtHasBigMap bigMapAbsense s2- pure Dict- STInt -> Right Dict- STNat -> Right Dict- STString -> Right Dict- STBytes -> Right Dict- STMutez -> Right Dict- STBool -> Right Dict- STKeyHash -> Right Dict- STBls12381Fr -> Right Dict- STBls12381G1 -> Right Dict- STBls12381G2 -> Right Dict- STTimestamp -> Right Dict- STAddress -> Right Dict- STChest -> Right Dict- STChestKey -> Right Dict- STNever -> Right Dict- STSaplingState s -> withSingI s $ Right Dict- STSaplingTransaction s -> withSingI s $ Right Dict- where- eitherWellTyped- :: BadTypeForScope- -> (Sing (ty :: T) -> Maybe a)- -> Sing (ty :: T)- -> Either NotWellTyped a- eitherWellTyped bt sf sng = maybeToRight (NotWellTyped (fromSing sng) bt) $ sf sng--getComparableProofS :: Sing (a :: T) -> Maybe (Dict (Comparable a))-getComparableProofS s = case checkComparability s of- CanBeCompared -> Just Dict- CannotBeCompared -> Nothing--checkComparability :: Sing t -> Comparability t-checkComparability = \case- STPair a b -> case (checkComparability a, checkComparability b) of- (CanBeCompared, CanBeCompared) -> CanBeCompared- (CannotBeCompared, _) -> CannotBeCompared- (_, CannotBeCompared) -> CannotBeCompared- STOr a b -> case (checkComparability a, checkComparability b) of- (CanBeCompared, CanBeCompared) -> CanBeCompared- (CannotBeCompared, _) -> CannotBeCompared- (_, CannotBeCompared) -> CannotBeCompared- STOption t -> case checkComparability t of- CanBeCompared -> CanBeCompared- CannotBeCompared -> CannotBeCompared- STList _ -> CannotBeCompared- STSet _ -> CannotBeCompared- STOperation -> CannotBeCompared- STContract _ -> CannotBeCompared- STTicket _ -> CannotBeCompared- STLambda _ _ -> CannotBeCompared- STMap _ _ -> CannotBeCompared- STBigMap _ _ -> CannotBeCompared- STNever -> CanBeCompared- STUnit -> CanBeCompared- STInt -> CanBeCompared- STNat -> CanBeCompared- STString -> CanBeCompared- STBytes -> CanBeCompared- STMutez -> CanBeCompared- STBool -> CanBeCompared- STKeyHash -> CanBeCompared- STBls12381Fr -> CannotBeCompared- STBls12381G1 -> CannotBeCompared- STBls12381G2 -> CannotBeCompared- STTimestamp -> CanBeCompared- STAddress -> CanBeCompared- STKey -> CanBeCompared- STSignature -> CanBeCompared- STChainId -> CanBeCompared- STChest -> CannotBeCompared- STChestKey -> CannotBeCompared- STSaplingState _ -> CannotBeCompared- STSaplingTransaction _ -> CannotBeCompared---- | Inductive proof that 'Comparable' implies 'HasNoNestedBigMaps'. This is--- stubbed with an @unsafeCoerce Refl@ at runtime to avoid runtime traversals.-comparabilityImpliesNoNestedBigMaps- :: forall t. (SingI t, IsComparable t ~ 'True) => ContainsNestedBigMaps t :~: 'False-comparabilityImpliesNoNestedBigMaps = stubProof $ go (sing @t)- where- go :: IsComparable a ~ 'True => Sing a -> ContainsNestedBigMaps a :~: 'False- go = \case- STPair (a :: Sing a) (b :: Sing b) -> case (checkComparability a, checkComparability b) of- (CanBeCompared, CanBeCompared) -> Refl \\ go a \\ go b- STOr a b -> case (checkComparability a, checkComparability b) of- (CanBeCompared, CanBeCompared) -> Refl \\ go a \\ go b- STOption t -> Refl \\ go t- STNever -> Refl- STUnit -> Refl- STInt -> Refl- STNat -> Refl- STString -> Refl- STBytes -> Refl- STMutez -> Refl- STBool -> Refl- STKeyHash -> Refl- STTimestamp -> Refl- STAddress -> Refl- STKey -> Refl- STSignature -> Refl- STChainId -> Refl---- | Inductive proof that 'Comparable' implies 'HasNoOp'. This is--- stubbed with an @unsafeCoerce Refl@ at runtime to avoid runtime traversals.-comparabilityImpliesNoOp- :: forall t. (SingI t, IsComparable t ~ 'True) => ContainsOp t :~: 'False-comparabilityImpliesNoOp = stubProof $ go (sing @t)- where- go :: IsComparable a ~ 'True => Sing a -> ContainsOp a :~: 'False- go = \case- STPair (a :: Sing a) (b :: Sing b) -> case (checkComparability a, checkComparability b) of- (CanBeCompared, CanBeCompared) -> Refl \\ go a \\ go b- STOr a b -> case (checkComparability a, checkComparability b) of- (CanBeCompared, CanBeCompared) -> Refl \\ go a \\ go b- STOption t -> Refl \\ go t- STNever -> Refl- STUnit -> Refl- STInt -> Refl- STNat -> Refl- STString -> Refl- STBytes -> Refl- STMutez -> Refl- STBool -> Refl- STKeyHash -> Refl- STTimestamp -> Refl- STAddress -> Refl- STKey -> Refl- STSignature -> Refl- STChainId -> Refl+{- | Module, containing restrictions imposed by instruction or value scope.++Michelson have multiple restrictions on values, examples:++* @operation@ type cannot appear in parameter.+* @big_map@ type cannot appear in @PUSH@-able constants.+* @contract@ type cannot appear in type we @UNPACK@ to.++Thus we declare multiple "scopes" - constraints applied in corresponding+situations, for instance++* 'ParameterScope';+* 'StorageScope';+* 'ConstantScope'.++Also we separate multiple "classes" of scope-related constraints.++* 'ParameterScope' and similar ones are used within Michelson engine,+they are understandable by GHC and produce human-readable errors.++* Lorentz and other eDSLs may declare their own constraints, in most cases+you should use them. For example see @Lorentz.Constraints@ module.++-}++module Morley.Michelson.Typed.Scope+ ( -- * Scopes+ ConstantScope+ , DupableScope+ , StorageScope+ , PackedValScope+ , ParameterScope+ , UntypedValScope+ , UnpackedValScope+ , ViewableScope+ , ComparabilityScope++ , IsDupableScope++ , BadTypeForScope (..)+ , CheckScope (..)+ , WithDeMorganScope (..)+ , deMorganForbidT+ , Comparable+ , comparableImplies+ , WellTyped+ , NotWellTyped (..)++ -- * Implementation internals+ , ContainsT+ , IsComparable++ , ForbidT+ , ForbidOp+ , ForbidContract+ , ForbidTicket+ , ForbidBigMap+ , ForbidNestedBigMaps+ , ForbidNonComparable++ , TPresence(..+ , OpPresent, OpAbsent+ , ContractPresent, ContractAbsent+ , TicketPresent, TicketAbsent+ , BigMapPresent, BigMapAbsent+ , NestedBigMapsPresent, NestedBigMapsAbsent+ , SaplingStatePresent, SaplingStateAbsent+ )+ , TPredicateSym(..)+ , SingTPredicateSym(..)+ , checkTPresence+ , tPresence+ , tAbsence++ , Comparability(..)+ , checkComparability+ , comparabilityPresence++ , getWTP+ , getWTP'+ -- * Re-exports+ , withDict+ , SingI (..)+ , (:-)(..)+ -- * Deprecated+ , OpPresence+ , ContractPresence+ , TicketPresence+ , BigMapPresence+ , NestedBigMapsPresence+ , ProperParameterBetterErrors+ , ProperStorageBetterErrors+ , ProperConstantBetterErrors+ , ProperDupableBetterErrors+ , ProperPackedValBetterErrors+ , ProperUnpackedValBetterErrors+ , ProperUntypedValBetterErrors+ , ProperViewableBetterErrors+ , ProperNonComparableValBetterErrors+ , opAbsense+ , contractTypeAbsense+ , bigMapAbsense+ , nestedBigMapsAbsense+ , checkOpPresence+ , checkContractTypePresence+ , checkTicketPresence+ , checkBigMapPresence+ , checkNestedBigMapsPresence+ , HasNoBigMap+ , HasNoNestedBigMaps+ , HasNoOp+ , HasNoContract+ , HasNoTicket+ , ContainsBigMap+ , ContainsContract+ , ContainsNestedBigMaps+ , ContainsOp+ , ContainsTicket+ , comparabilityImpliesNoNestedBigMaps+ , comparabilityImpliesNoOp+ , getComparableProofS+ ) where++import Data.Constraint (withDict, (:-)(..))+import Data.Singletons (SingI(..))++import Morley.Michelson.Typed.Scope.Internal.CheckScope+import Morley.Michelson.Typed.Scope.Internal.Comparable+import Morley.Michelson.Typed.Scope.Internal.Deprecated+import Morley.Michelson.Typed.Scope.Internal.ForbidT+import Morley.Michelson.Typed.Scope.Internal.Presence+import Morley.Michelson.Typed.Scope.Internal.Scopes+import Morley.Michelson.Typed.Scope.Internal.WellTyped+import Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope
+ src/Morley/Michelson/Typed/Scope/Internal/CheckScope.hs view
@@ -0,0 +1,102 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++module Morley.Michelson.Typed.Scope.Internal.CheckScope+ ( module Morley.Michelson.Typed.Scope.Internal.CheckScope+ ) where++import Data.Constraint (Dict(..))+import Data.Singletons (SingI(..))++import Data.Type.Equality ((:~:)(..))+import Morley.Michelson.Typed.Scope.Internal.Comparable+import Morley.Michelson.Typed.Scope.Internal.ForbidT+import Morley.Michelson.Typed.Scope.Internal.Presence+import Morley.Michelson.Typed.Scope.Internal.Scopes+import Morley.Michelson.Typed.Scope.Internal.WellTyped++-- | Should be present for common scopes.+class CheckScope (c :: Constraint) where+ -- | Check that constraint hold for a given type.+ checkScope :: Either BadTypeForScope (Dict c)++instance SingI t => CheckScope (WellTyped t) where+ checkScope = first nwtCause $ getWTP @t+instance SingI t => CheckScope (ForbidOp t) where+ checkScope = maybeToRight BtIsOperation $ fmap (\Refl -> Dict) $ tAbsence SPSOp $ sing @t+instance SingI t => CheckScope (ForbidBigMap t) where+ checkScope = maybeToRight BtHasBigMap $ fmap (\Refl -> Dict) $ tAbsence SPSBigMap $ sing @t+instance SingI t => CheckScope (ForbidNestedBigMaps t) where+ checkScope = maybeToRight BtHasNestedBigMap $ fmap (\Refl -> Dict) $ tAbsence SPSNestedBigMaps $ sing @t+instance SingI t => CheckScope (ForbidContract t) where+ checkScope = maybeToRight BtHasContract $ fmap (\Refl -> Dict) $ tAbsence SPSContract $ sing @t+instance SingI t => CheckScope (ForbidTicket t) where+ checkScope = maybeToRight BtHasTicket $ fmap (\Refl -> Dict) $ tAbsence SPSTicket $ sing @t+instance SingI t => CheckScope (ForbidSaplingState t) where+ checkScope = maybeToRight BtHasSaplingState $ fmap (\Refl -> Dict) $ tAbsence SPSSaplingState $ sing @t+instance SingI t => CheckScope (Comparable t) where+ checkScope = maybeToRight BtNotComparable $ comparabilityPresence sing++instance SingI t => CheckScope (ParameterScope t) where+ checkScope = do+ Dict <- checkScope @(WellTyped t)+ Dict <- checkScope @(ForbidOp t)+ Dict <- checkScope @(ForbidNestedBigMaps t)+ pure Dict++instance SingI t => CheckScope (StorageScope t) where+ checkScope = do+ Dict <- checkScope @(WellTyped t)+ Dict <- checkScope @(ForbidOp t)+ Dict <- checkScope @(ForbidNestedBigMaps t)+ Dict <- checkScope @(ForbidContract t)+ pure Dict++instance SingI t => CheckScope (ConstantScope t) where+ checkScope = do+ Dict <- checkScope @(WellTyped t)+ Dict <- checkScope @(ForbidOp t)+ Dict <- checkScope @(ForbidBigMap t)+ Dict <- checkScope @(ForbidContract t)+ Dict <- checkScope @(ForbidTicket t)+ Dict <- checkScope @(ForbidSaplingState t)+ pure Dict++instance SingI t => CheckScope (DupableScope t) where+ checkScope = do+ Dict <- checkScope @(ForbidTicket t)+ pure Dict++instance SingI t => CheckScope (PackedValScope t) where+ checkScope = do+ Dict <- checkScope @(WellTyped t)+ Dict <- checkScope @(ForbidOp t)+ Dict <- checkScope @(ForbidBigMap t)+ Dict <- checkScope @(ForbidTicket t)+ Dict <- checkScope @(ForbidSaplingState t)+ pure Dict++instance SingI t => CheckScope (UnpackedValScope t) where+ checkScope = do+ Dict <- checkScope @(ConstantScope t)+ pure Dict++instance SingI t => CheckScope (ViewableScope t) where+ checkScope = do+ Dict <- checkScope @(ForbidOp t)+ Dict <- checkScope @(ForbidBigMap t)+ Dict <- checkScope @(ForbidTicket t)+ pure Dict++instance SingI t => CheckScope (ComparabilityScope t) where+ checkScope = do+ Dict <- checkScope @(Comparable t)+ pure Dict++instance (CheckScope a, CheckScope b) => CheckScope (a, b) where+ checkScope = do+ Dict <- checkScope @a+ Dict <- checkScope @b+ pure Dict
+ src/Morley/Michelson/Typed/Scope/Internal/Comparable.hs view
@@ -0,0 +1,146 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++module Morley.Michelson.Typed.Scope.Internal.Comparable+ ( module Morley.Michelson.Typed.Scope.Internal.Comparable+ ) where++import Data.Constraint (Dict(..), (\\))+import Data.Singletons (Sing, SingI(..))+import Data.Type.Equality ((:~:)(..))++import Morley.Michelson.Typed.Scope.Internal.ForbidT+import Morley.Michelson.Typed.Sing (SingT(..))+import Morley.Michelson.Typed.T (T(..))+import Morley.Util.StubbedProof++{- $setup+>>> import Morley.Michelson.Typed+-}++data Comparability t where+ CanBeCompared :: (Comparable t, ComparabilityImplies t) => Comparability t+ CannotBeCompared :: (ContainsT 'PSNonComparable t ~ 'True) => Comparability t+deriving stock instance Show (Comparability t)++-- | Constraints implied by 'Comparable'. This is a little expensive to carry as+-- the superclass of 'Comparable', hence these can be brought into scope on+-- demand using 'comparableImplies'.+type ComparabilityImplies t =+ ( ForbidOp t+ , ForbidNestedBigMaps t+ , ForbidTicket t+ , ForbidSaplingState t+ , ForbidBigMap t+ , ForbidContract t+ , ForbidNonComparable t+ )++-- | Produce 'ComparabilityImplies' on demand. Carrying it as 'Comparable'+-- superclasses turns out to be a little expensive, considering we can produce+-- evidence on demand in O(1).+comparableImplies+ :: forall t proxy. ForbidNonComparable t+ => proxy t -> Dict (ComparabilityImplies t)+comparableImplies _ = Dict+ \\ proofImplOne SPSOp+ \\ proofImplOne SPSNestedBigMaps+ \\ proofImplOne SPSBigMap+ \\ proofImplOne SPSTicket+ \\ proofImplOne SPSSaplingState+ \\ proofImplOne SPSContract+ where+ proofImplOne :: Sing p -> ContainsT p t :~: 'False+ proofImplOne sp = stubProof $ case checkComparability (assumeSing @t) of+ -- NB: using assumeSing isn't strictly safe in the sense that one can get+ -- unsafeCoerce out of an ill-behaved t and assumeSing, but+ -- ForbidNonComparable traverses t. So if it's not stuck, t is+ -- well-behaved enough for our purposes here, and we can get by witout+ -- requiring SingI.+ CanBeCompared -> case sp of+ SPSOp -> Refl+ SPSContract -> Refl+ SPSTicket -> Refl+ SPSBigMap -> Refl+ SPSNestedBigMaps -> Refl+ SPSSaplingState -> Refl+ SPSNonComparable -> Refl++-- | Enforce recursive superclass constraints.+type RecSuperC :: (T -> Constraint) -> T -> Constraint+type family RecSuperC c t where+ RecSuperC c (_ t1 t2) = (c t1, c t2)+ RecSuperC c (_ t) = c t+ RecSuperC _ _ = ()++type Comparable :: T -> Constraint+class (SingI t, RecSuperC Comparable t, ForbidNonComparable t) => Comparable t+instance (SingI t, RecSuperC Comparable t, ForbidNonComparable t) => Comparable t++{- | Check if type is comparable or not at runtime. This traverses the+singleton, so it has a considerable runtime cost. If you just need to convince+GHC, you may be looking for 'comparableImplies', or perhaps+@withDeMorganScope@.++>>> checkComparability STOperation+CannotBeCompared+>>> checkComparability STAddress+CanBeCompared+-}+checkComparability :: Sing t -> Comparability t+checkComparability = \case+ STPair a b -> case (checkComparability a, checkComparability b) of+ (CanBeCompared, CanBeCompared) -> CanBeCompared+ (CannotBeCompared, _) -> CannotBeCompared+ (_, CannotBeCompared) -> CannotBeCompared+ STOr a b -> case (checkComparability a, checkComparability b) of+ (CanBeCompared, CanBeCompared) -> CanBeCompared+ (CannotBeCompared, _) -> CannotBeCompared+ (_, CannotBeCompared) -> CannotBeCompared+ STOption t -> case checkComparability t of+ CanBeCompared -> CanBeCompared+ CannotBeCompared -> CannotBeCompared+ STList _ -> CannotBeCompared+ STSet _ -> CannotBeCompared+ STOperation -> CannotBeCompared+ STContract _ -> CannotBeCompared+ STTicket _ -> CannotBeCompared+ STLambda _ _ -> CannotBeCompared+ STMap _ _ -> CannotBeCompared+ STBigMap _ _ -> CannotBeCompared+ STNever -> CanBeCompared+ STUnit -> CanBeCompared+ STInt -> CanBeCompared+ STNat -> CanBeCompared+ STString -> CanBeCompared+ STBytes -> CanBeCompared+ STMutez -> CanBeCompared+ STBool -> CanBeCompared+ STKeyHash -> CanBeCompared+ STBls12381Fr -> CannotBeCompared+ STBls12381G1 -> CannotBeCompared+ STBls12381G2 -> CannotBeCompared+ STTimestamp -> CanBeCompared+ STAddress -> CanBeCompared+ STKey -> CanBeCompared+ STSignature -> CanBeCompared+ STChainId -> CanBeCompared+ STChest -> CannotBeCompared+ STChestKey -> CannotBeCompared+ STSaplingState _ -> CannotBeCompared+ STSaplingTransaction _ -> CannotBeCompared++{- | Check if type is comparable or not at runtime. This is a @Dict@ version of+'checkComparability', so the same caveats apply.++>>> comparabilityPresence STOperation+Nothing+>>> comparabilityPresence STAddress+Just Dict+-}+comparabilityPresence :: Sing t -> Maybe (Dict (Comparable t))+comparabilityPresence s = case checkComparability s of+ CanBeCompared -> Just Dict+ CannotBeCompared -> Nothing
+ src/Morley/Michelson/Typed/Scope/Internal/Deprecated.hs view
@@ -0,0 +1,299 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++module Morley.Michelson.Typed.Scope.Internal.Deprecated+ ( module Morley.Michelson.Typed.Scope.Internal.Deprecated+ ) where++import Data.Constraint (Dict(..), (\\))+import Data.Singletons (Sing, SingI(..))+import Data.Type.Bool (Not)+import Data.Type.Equality ((:~:)(..))++import Morley.Michelson.Typed.Scope.Internal.Comparable+import Morley.Michelson.Typed.Scope.Internal.ForbidT+import Morley.Michelson.Typed.Scope.Internal.Presence+import Morley.Michelson.Typed.Scope.Internal.WellTyped+import Morley.Michelson.Typed.Sing (SingT(..))+import Morley.Michelson.Typed.T (T(..))+import Morley.Util.StubbedProof (stubProof)++-- | Whether a value of this type _may_ contain an operation.+--+-- In some scopes (constants, parameters, storage) appearing for operation type+-- is prohibited.+-- Operations in input/output of lambdas are allowed without limits though.+type ContainsOp t = ContainsT 'PSOp t++-- | Whether a value of this type _may_ contain a @contract@ value.+--+-- In some scopes (constants, storage) appearing for contract type+-- is prohibited.+-- Contracts in input/output of lambdas are allowed without limits though.+type ContainsContract t = ContainsT 'PSContract t++-- | Whether a value of this type _may_ contain a @ticket@ value.+type ContainsTicket t = ContainsT 'PSTicket t++-- | Whether a value of this type _may_ contain a @big_map@ value.+type ContainsBigMap t = ContainsT 'PSBigMap t++-- | Whether a value of this type _may_ contain nested @big_map@s.+--+-- Nested big_maps (i.e. big_map which contains another big_map inside of it's value type) are+-- prohibited in all contexts. Some context such as PUSH, APPLY, PACK/UNPACK instructions are more+-- strict because they don't work with big_map at all.+type ContainsNestedBigMaps t = ContainsT 'PSNestedBigMaps t++-- | Whether a value of this type _may_ contain a @samping_state@ value.+type ContainsSaplingState t = ContainsT 'PSSaplingState t++{-# DEPRECATED+ ContainsOp+ , ContainsContract+ , ContainsTicket+ , ContainsBigMap+ , ContainsNestedBigMaps+ , ContainsSaplingState+ "Use 'ContainsT' with the corresponding type marker, e.g. \+ \'ContainsT PSOp', 'ContainsT PSTicket', etc"+ #-}+++-- | Constraint which ensures that a value of type @t@ does not contain operations.+--+-- Not just a type alias in order to be able to partially apply it+-- (e.g. in 'Each').+class (ContainsOp t ~ 'False) => HasNoOp t+instance (ContainsOp t ~ 'False) => HasNoOp t++-- | Constraint which ensures that a value of type @t@ does not contain @contract@ values.+class (ContainsContract t ~ 'False) => HasNoContract t+instance (ContainsContract t ~ 'False) => HasNoContract t++-- | Constraint which ensures that a value of type @t@ does not contain @ticket@ values.+class (ContainsTicket t ~ 'False) => HasNoTicket t+instance (ContainsTicket t ~ 'False) => HasNoTicket t++-- | Constraint which ensures that a value of type @t@ does not contain @big_map@ values.+class (ContainsBigMap t ~ 'False) => HasNoBigMap t+instance (ContainsBigMap t ~ 'False) => HasNoBigMap t++-- | Constraint which ensures that a value of type @t@ does not contain @sapling_state@ values.+class (ContainsSaplingState t ~ 'False) => HasNoSaplingState t+instance (ContainsSaplingState t ~ 'False) => HasNoSaplingState t++-- | Constraint which ensures that there are no nested bigmaps.+class (ContainsNestedBigMaps t ~ 'False) => HasNoNestedBigMaps t+instance (ContainsNestedBigMaps t ~ 'False) => HasNoNestedBigMaps t++{-# DEPRECATED HasNoOp, HasNoContract, HasNoTicket, HasNoBigMap, HasNoSaplingState, HasNoNestedBigMaps+ "Use Forbid* instead" #-}+++-- | Whether a value of this type _may_ contain an operation.+type OpPresence (t :: T) = TPresence 'PSOp t+pattern OpPresent :: () => ContainsOp t ~ 'True => OpPresence t+pattern OpPresent = TPresent+pattern OpAbsent :: () => ContainsOp t ~ 'False => OpPresence t+pattern OpAbsent = TAbsent+{-# COMPLETE OpPresent, OpAbsent #-}++-- | Whether a value of this type _may_ contain a @contract@ value.+type ContractPresence (t :: T) = TPresence 'PSContract t+pattern ContractPresent :: () => ContainsContract t ~ 'True => ContractPresence t+pattern ContractPresent = TPresent+pattern ContractAbsent :: () => ContainsContract t ~ 'False => ContractPresence t+pattern ContractAbsent = TAbsent+{-# COMPLETE ContractPresent, ContractAbsent #-}++-- | Whether a value of this type _may_ contain a @ticket@ value.+type TicketPresence (t :: T) = TPresence 'PSTicket t+pattern TicketPresent :: () => ContainsTicket t ~ 'True => TicketPresence t+pattern TicketPresent = TPresent+pattern TicketAbsent :: () => ContainsTicket t ~ 'False => TicketPresence t+pattern TicketAbsent = TAbsent+{-# COMPLETE TicketPresent, TicketAbsent #-}++-- | Whether a value of this type _may_ contain a @big_map@ value.+type BigMapPresence (t :: T) = TPresence 'PSBigMap t+pattern BigMapPresent :: () => ContainsBigMap t ~ 'True => BigMapPresence t+pattern BigMapPresent = TPresent+pattern BigMapAbsent :: () => ContainsBigMap t ~ 'False => BigMapPresence t+pattern BigMapAbsent = TAbsent+{-# COMPLETE BigMapPresent, BigMapAbsent #-}++-- | Whether a value of this type _may_ contain nested @big_map@s.+type NestedBigMapsPresence (t :: T) = TPresence 'PSNestedBigMaps t+pattern NestedBigMapsPresent :: () => ContainsNestedBigMaps t ~ 'True => NestedBigMapsPresence t+pattern NestedBigMapsPresent = TPresent+pattern NestedBigMapsAbsent :: () => ContainsNestedBigMaps t ~ 'False => NestedBigMapsPresence t+pattern NestedBigMapsAbsent = TAbsent+{-# COMPLETE NestedBigMapsPresent, NestedBigMapsAbsent #-}++-- | Whether a value of this type _may_ contain a @sapling_state@ value.+type SaplingStatePresence (t :: T) = TPresence 'PSSaplingState t+pattern SaplingStatePresent :: () => ContainsSaplingState t ~ 'True => SaplingStatePresence t+pattern SaplingStatePresent = TPresent+pattern SaplingStateAbsent :: () => ContainsSaplingState t ~ 'False => SaplingStatePresence t+pattern SaplingStateAbsent = TAbsent+{-# COMPLETE SaplingStatePresent, SaplingStateAbsent #-}++{-# DEPRECATED+ OpPresence, OpPresent, OpAbsent+ , ContractPresence, ContractPresent, ContractAbsent+ , TicketPresence, TicketPresent, TicketAbsent+ , BigMapPresence, BigMapPresent, BigMapAbsent+ , NestedBigMapsPresence, NestedBigMapsPresent, NestedBigMapsAbsent+ , SaplingStatePresence, SaplingStatePresent, SaplingStateAbsent+ "Use TPresence instead" #-}++type ProperParameterBetterErrors t =+ (SingI t, WellTyped t, ForbidOp t, ForbidNestedBigMaps t)++type ProperStorageBetterErrors t =+ (SingI t, WellTyped t, ForbidOp t, ForbidNestedBigMaps t, ForbidContract t)++type ProperConstantBetterErrors t =+ (SingI t, WellTyped t, ForbidOp t, ForbidBigMap t, ForbidContract t, ForbidTicket t, ForbidSaplingState t)++type ProperDupableBetterErrors t =+ (SingI t, ForbidTicket t)++type ProperPackedValBetterErrors t =+ (SingI t, WellTyped t, ForbidOp t, ForbidBigMap t, ForbidTicket t, ForbidSaplingState t)++type ProperUnpackedValBetterErrors t =+ (ProperPackedValBetterErrors t, ProperConstantBetterErrors t)++type ProperViewableBetterErrors t =+ (SingI t, ForbidOp t, ForbidBigMap t, ForbidTicket t)++type ProperUntypedValBetterErrors t =+ (SingI t, ForbidOp t)++type ProperNonComparableValBetterErrors t =+ (SingI t, ForbidNonComparable t)++{-# DEPRECATED ProperParameterBetterErrors+ , ProperStorageBetterErrors+ , ProperConstantBetterErrors+ , ProperDupableBetterErrors+ , ProperPackedValBetterErrors+ , ProperUnpackedValBetterErrors+ , ProperViewableBetterErrors+ , ProperUntypedValBetterErrors+ , ProperNonComparableValBetterErrors+ "Use *Scope instead"+ #-}++-- | Check at runtime whether a value of the given type _may_ contain an operation.+checkOpPresence :: Sing (ty :: T) -> TPresence 'PSOp ty+checkOpPresence = checkTPresence SPSOp++-- | Check at runtime whether a value of the given type _may_ contain a @contract@ value.+checkContractTypePresence :: Sing (ty :: T) -> TPresence 'PSContract ty+checkContractTypePresence = checkTPresence SPSContract++-- | Check at runtime whether a value of the given type _may_ contain a @ticket@ value.+checkTicketPresence :: Sing (ty :: T) -> TPresence 'PSTicket ty+checkTicketPresence = checkTPresence SPSTicket++-- | Check at runtime whether a value of the given type _may_ contain a @big_map@ value.+checkBigMapPresence :: Sing (ty :: T) -> TPresence 'PSBigMap ty+checkBigMapPresence = checkTPresence SPSBigMap++-- | Check at runtime whether a value of the given type _may_ contain nested @big_map@s.+checkNestedBigMapsPresence :: Sing (ty :: T) -> TPresence 'PSNestedBigMaps ty+checkNestedBigMapsPresence = checkTPresence SPSNestedBigMaps++{-# DEPRECATED checkOpPresence, checkContractTypePresence, checkTicketPresence, checkBigMapPresence, checkNestedBigMapsPresence+ "Use checkTPresence instead" #-}++-- | Check at runtime that a value of the given type cannot contain operations.+opAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidOp t)+opAbsense = fmap (\Refl -> Dict) . tAbsence SPSOp++-- | Check at runtime that a value of the given type cannot contain @contract@ values.+contractTypeAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidContract t)+contractTypeAbsense = fmap (\Refl -> Dict) . tAbsence SPSContract++-- | Check at runtime that a value of the given type cannot containt @big_map@ values+bigMapAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidBigMap t)+bigMapAbsense = fmap (\Refl -> Dict) . tAbsence SPSBigMap++-- | Check at runtime that a value of the given type cannot contain nested @big_map@s.+nestedBigMapsAbsense :: Sing (t :: T) -> Maybe (Dict $ ForbidNestedBigMaps t)+nestedBigMapsAbsense = fmap (\Refl -> Dict) . tAbsence SPSNestedBigMaps++{-# DEPRECATED opAbsense, contractTypeAbsense, bigMapAbsense, nestedBigMapsAbsense+ "Use tAbsence instead"+ #-}++-- | Inductive proof that 'Comparable' implies 'HasNoNestedBigMaps'. This is+-- stubbed with an @unsafeCoerce Refl@ at runtime to avoid runtime traversals.+comparabilityImpliesNoNestedBigMaps+ :: forall t. (SingI t, IsComparable t ~ 'True) => ContainsNestedBigMaps t :~: 'False+comparabilityImpliesNoNestedBigMaps = stubProof $ go (sing @t)+ where+ go :: IsComparable a ~ 'True => Sing a -> ContainsNestedBigMaps a :~: 'False+ go = \case+ STPair (a :: Sing a) (b :: Sing b) -> case (checkComparability a, checkComparability b) of+ (CanBeCompared, CanBeCompared) -> Refl \\ go a \\ go b+ STOr a b -> case (checkComparability a, checkComparability b) of+ (CanBeCompared, CanBeCompared) -> Refl \\ go a \\ go b+ STOption t -> Refl \\ go t+ STNever -> Refl+ STUnit -> Refl+ STInt -> Refl+ STNat -> Refl+ STString -> Refl+ STBytes -> Refl+ STMutez -> Refl+ STBool -> Refl+ STKeyHash -> Refl+ STTimestamp -> Refl+ STAddress -> Refl+ STKey -> Refl+ STSignature -> Refl+ STChainId -> Refl++-- | Inductive proof that 'Comparable' implies 'HasNoOp'. This is+-- stubbed with an @unsafeCoerce Refl@ at runtime to avoid runtime traversals.+comparabilityImpliesNoOp+ :: forall t. (SingI t, IsComparable t ~ 'True) => ContainsOp t :~: 'False+comparabilityImpliesNoOp = stubProof $ go (sing @t)+ where+ go :: IsComparable a ~ 'True => Sing a -> ContainsOp a :~: 'False+ go = \case+ STPair (a :: Sing a) (b :: Sing b) -> case (checkComparability a, checkComparability b) of+ (CanBeCompared, CanBeCompared) -> Refl \\ go a \\ go b+ STOr a b -> case (checkComparability a, checkComparability b) of+ (CanBeCompared, CanBeCompared) -> Refl \\ go a \\ go b+ STOption t -> Refl \\ go t+ STNever -> Refl+ STUnit -> Refl+ STInt -> Refl+ STNat -> Refl+ STString -> Refl+ STBytes -> Refl+ STMutez -> Refl+ STBool -> Refl+ STKeyHash -> Refl+ STTimestamp -> Refl+ STAddress -> Refl+ STKey -> Refl+ STSignature -> Refl+ STChainId -> Refl++{-# DEPRECATED comparabilityImpliesNoNestedBigMaps, comparabilityImpliesNoOp+ "Already implied by Comparable constraint" #-}++getComparableProofS :: Sing (a :: T) -> Maybe (Dict (Comparable a))+getComparableProofS = comparabilityPresence+{-# DEPRECATED getComparableProofS "Use comparabilityPresence" #-}++type IsComparable t = Not (ContainsT 'PSNonComparable t)+{-# DEPRECATED IsComparable "Use 'Not (ContainsT PSNonComparable t)' instead" #-}
+ src/Morley/Michelson/Typed/Scope/Internal/ForbidT.hs view
@@ -0,0 +1,225 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++module Morley.Michelson.Typed.Scope.Internal.ForbidT+ ( module Morley.Michelson.Typed.Scope.Internal.ForbidT+ ) where++import Data.Type.Bool (type (||))+import Fcf (Pure)+import GHC.TypeLits (Symbol)+import Type.Errors (DelayError, ErrorMessage(..), IfStuck)++import Morley.Michelson.Typed.T (T(..))+import Morley.Util.Sing+import Morley.Util.Type (FailWhen)++{- $setup+>>> import Morley.Michelson.Typed (T(..), SingT(..))+>>> import Morley.Util.Peano (pattern S, pattern Z)+>>> import Data.Type.Equality ((:~:)(..))+-}++-- | Type-level symbol for type predicates used in 'ContainsT'+data TPredicateSym+ = PSOp -- ^ Contains @operation@+ | PSContract -- ^ Contains @contract 'a@+ | PSTicket -- ^ Contains @ticket 'a@+ | PSBigMap -- ^ Contains @big_map 'k 'v@+ | PSNestedBigMaps -- ^ Contains @big_map 'k (big_map 'k 'v)@+ | PSSaplingState -- ^ Contains @sapling_state 'n@+ | PSNonComparable -- ^ Contains non-comparable types++genSingletonsType ''TPredicateSym++type TPredicateSymTypeName :: TPredicateSym -> Symbol+type family TPredicateSymTypeName p where+ TPredicateSymTypeName 'PSOp = "`operation`"+ TPredicateSymTypeName 'PSContract = "`contract`"+ TPredicateSymTypeName 'PSTicket = "`ticket`"+ TPredicateSymTypeName 'PSBigMap = "`big_map`"+ TPredicateSymTypeName 'PSNestedBigMaps = "nested `big_map`s"+ TPredicateSymTypeName 'PSSaplingState = "`sapling_state`"+ TPredicateSymTypeName 'PSNonComparable = "non-comparable types"++type ContainsT :: TPredicateSym -> T -> Bool+type family ContainsT p t where+ ContainsT 'PSOp 'TOperation = 'True+ ContainsT 'PSContract ('TContract _) = 'True+ ContainsT 'PSTicket ('TTicket _) = 'True+ ContainsT 'PSBigMap ('TBigMap _ _) = 'True+ ContainsT 'PSSaplingState ('TSaplingState _) = 'True+ ContainsT 'PSNestedBigMaps ('TBigMap _ v) = ContainsT 'PSBigMap v+ -- non-comparable+ ContainsT 'PSNonComparable 'TBls12381Fr = 'True+ ContainsT 'PSNonComparable 'TBls12381G1 = 'True+ ContainsT 'PSNonComparable 'TBls12381G2 = 'True+ ContainsT 'PSNonComparable ('TList _) = 'True+ ContainsT 'PSNonComparable ('TSet _) = 'True+ ContainsT 'PSNonComparable 'TOperation = 'True+ ContainsT 'PSNonComparable ('TContract _) = 'True+ ContainsT 'PSNonComparable ('TTicket _) = 'True+ ContainsT 'PSNonComparable ('TLambda _ _) = 'True+ ContainsT 'PSNonComparable ('TMap _ _) = 'True+ ContainsT 'PSNonComparable ('TBigMap _ _) = 'True+ ContainsT 'PSNonComparable 'TChest = 'True+ ContainsT 'PSNonComparable 'TChestKey = 'True+ ContainsT 'PSNonComparable ('TSaplingState _) = 'True+ ContainsT 'PSNonComparable ('TSaplingTransaction _) = 'True+ -- recursion+ ContainsT p ('TOption t) = ContainsT p t+ ContainsT p ('TList t) = ContainsT p t+ ContainsT p ('TSet t) = ContainsT p t+ ContainsT p ('TTicket t) = ContainsT p t+ ContainsT p ('TPair a b) = ContainsT p a || ContainsT p b+ ContainsT p ('TOr a b) = ContainsT p a || ContainsT p b+ ContainsT p ('TBigMap k v) = ContainsT p k || ContainsT p v+ ContainsT p ('TMap k v) = ContainsT p k || ContainsT p v+ -- rest+ ContainsT _ _ = 'False++type ForbidTErrorMsg :: TPredicateSym -> T -> ErrorMessage+type family ForbidTErrorMsg p t where+ ForbidTErrorMsg 'PSNestedBigMaps t =+ 'Text "Nested `big_map`s found in" ':$$: 'ShowType t ':$$: 'Text "are not allowed"+ ForbidTErrorMsg 'PSNonComparable t =+ 'Text "Non-comparable type"+ ':$$: 'ShowType t+ ':$$: 'Text "is not allowed in this scope"+ ForbidTErrorMsg p t =+ 'Text "Type " ':<>: 'Text (TPredicateSymTypeName p) ':<>: 'Text " found in"+ ':$$: 'ShowType t+ ':$$: 'Text "is not allowed in this scope"++{- | Constraint for classes forbidding type presence based on predicate defined+by 'TPredicateSym'.++Not just a type alias in order to be able to partially apply it (e.g. in+'Each').++Reports errors when a type does not satisfy predicate:++>>> () :: ForbidT PSOp TOperation => ()+...+... Type `operation` found in+... 'TOperation+... is not allowed in this scope+...+>>> () :: ForbidT PSContract (TContract TUnit) => ()+...+... Type `contract` found in+... 'TContract 'TUnit+... is not allowed in this scope+...+>>> () :: ForbidT PSTicket (TTicket TUnit) => ()+...+... Type `ticket` found in+... 'TTicket 'TUnit+... is not allowed in this scope+...+>>> () :: ForbidT PSBigMap (TBigMap TUnit TUnit) => ()+...+... Type `big_map` found in+... 'TBigMap 'TUnit 'TUnit+... is not allowed in this scope+...+>>> () :: ForbidT PSSaplingState (TSaplingState Z) => ()+...+... Type `sapling_state` found in+... 'TSaplingState 'Z+... is not allowed in this scope+...+>>> () :: ForbidT PSNestedBigMaps (TBigMap TUnit (TBigMap TUnit TUnit)) => ()+...+... Nested `big_map`s found in+... 'TBigMap 'TUnit ('TBigMap 'TUnit 'TUnit)+... are not allowed+...++When the type is ambiguous or polymorphic, suggests adding the corresponding+constraint:++>>> (const () :: ForbidOp t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains `operation`. Perhaps you need to add+... ForbidT 'PSOp t0+... constraint? You can also try adding a type annotation.+...++This constraint implies @ContainsT ~ False@:++>>> :{+foo :: ForbidT p t => ContainsT p t :~: False+foo = Refl+:}+-}+type ForbidT :: TPredicateSym -> T -> Constraint+class ForbidManyT (ForbidT p t) '[p] t => ForbidT p t+instance ForbidManyT (ForbidT p t) '[p] t => ForbidT p t++type ForbidOp = ForbidT 'PSOp -- ^ Convenience synonym+type ForbidContract = ForbidT 'PSContract -- ^ Convenience synonym+type ForbidTicket = ForbidT 'PSTicket -- ^ Convenience synonym+type ForbidSaplingState = ForbidT 'PSSaplingState -- ^ Convenience synonym+type ForbidBigMap = ForbidT 'PSBigMap -- ^ Convenience synonym+type ForbidNestedBigMaps = ForbidT 'PSNestedBigMaps -- ^ Convenience synonym+type ForbidNonComparable = ForbidT 'PSNonComparable -- ^ Convenience synonym++{- | Class abstracting multiple 'ForbidT' constraints.++This version accepts a custom error message displayed if 'ContainsT' gets stuck.+You likely want to use 'ForbidManyT', which sets this message.++It's a class and not a recursive type family because recursive type families+take noticeably longer to compile.+-}+type ForbidManyT' :: Constraint -> [TPredicateSym] -> [TPredicateSym] -> T -> Constraint+class ForbidManySuperC ps t => ForbidManyT' c ps' ps t where+ type ForbidManySuperC ps t :: Constraint++instance ForbidManyT' c ps' '[] t where+ type ForbidManySuperC '[] _ = ()+instance+ ( IfStuck (ContainsT p t) (DelayError (ForbidManyTStuckErr c ps' t)) (Pure (ForbidManyT' c ps' ps t))+ , FailWhen (ContainsT p t) (ForbidTErrorMsg p t)+ ) => ForbidManyT' c ps' (p : ps) t where+ type ForbidManySuperC (p : ps) t =+ -- NB: WhenStuck isn't in the superclass constraints by design, as+ -- FailWhen unifies it with False.+ ( ContainsT p t ~ 'False+ , ForbidManySuperC ps t+ )++{- | Abstracts multiple 'ForbidT' constraints. Accepts a constraint that will be+suggested in an error message in case 'ContainsT' gets stuck. This is used with+scope constraints in "Morley.Michelson.Typed.Scope.Internal.Scopes".+-}+type ForbidManyT c ps = ForbidManyT' c ps ps++-- | Given a list of 'TPredicateSym', pretty-print a list of corresponding type+-- names. Uses 'TPredicateSymTypeName' for a single type, separates the last two+-- types with @or@, others with @,@.+--+-- Doesn't do the oxford comma, because it's rather tricky to implement, and+-- compilation types aren't great already.+type TPredicateSymTypeNames :: [TPredicateSym] -> ErrorMessage+type family TPredicateSymTypeNames ps where+ TPredicateSymTypeNames '[] = 'Text ""+ TPredicateSymTypeNames '[p] = 'Text (TPredicateSymTypeName p)+ TPredicateSymTypeNames '[p, q] =+ 'Text (TPredicateSymTypeName p) ':<>: 'Text " or " ':<>: 'Text (TPredicateSymTypeName q)+ TPredicateSymTypeNames (p : ps) =+ 'Text (TPredicateSymTypeName p) ':<>: 'Text ", " ':<>: TPredicateSymTypeNames ps++type ForbidManyTStuckErr :: Constraint -> [TPredicateSym] -> T -> ErrorMessage+type ForbidManyTStuckErr c ps t =+ 'Text "Can't check if type" ':$$:+ 'ShowType t ':$$:+ 'Text "contains " ':<>: TPredicateSymTypeNames ps ':<>:+ 'Text ". Perhaps you need to add" ':$$:+ 'ShowType c ':$$:+ 'Text "constraint? You can also try adding a type annotation."
+ src/Morley/Michelson/Typed/Scope/Internal/Presence.hs view
@@ -0,0 +1,152 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++module Morley.Michelson.Typed.Scope.Internal.Presence+ ( module Morley.Michelson.Typed.Scope.Internal.Presence+ ) where++import Data.Singletons (Sing)++import Data.Type.Equality ((:~:)(..))+import Morley.Michelson.Typed.Scope.Internal.ForbidT+import Morley.Michelson.Typed.Scope.Internal.TH+import Morley.Michelson.Typed.Sing (SingT(..))+import Morley.Michelson.Typed.T (T(..))++{- $setup+>>> import Morley.Michelson.Typed (T(..), SingT(..), SingTPredicateSym(..))+>>> import Morley.Util.Peano (pattern S, pattern Z)+>>> import Data.Type.Equality ((:~:)(..))+-}++-- | Whether a value of this type _may_ contain a type defined by 'TPredicateSym'.+type TPresence :: TPredicateSym -> T -> Type+data TPresence p t where+ TPresent :: ContainsT p t ~ 'True => TPresence p t+ TAbsent :: ContainsT p t ~ 'False => TPresence p t++deriving stock instance Show (TPresence t p)++{- | Check for presence of type defined by 'TPredicateSym' at runtime. Use+'TPredicateSym' singletons (i.e. 'SingTPredicateSym') as the first parameter,+e.g.:++>>> checkTPresence SPSOp STOperation+TPresent+>>> checkTPresence SPSOp STUnit+TAbsent++To only prove absence of some type, it is more efficient to use+@deMorganForbidT@ or @withDeMorganScope@.+-}+checkTPresence+ :: forall p ty. Sing p+ -> Sing ty+ -> TPresence p ty+checkTPresence sp = \case+ STOption t -> case checkTPresence sp t of+ TPresent -> TPresent+ TAbsent -> TAbsent+ STList t -> $(byTPredicateSymCases [|sp|]+ [ ('SPSNonComparable, [|TPresent|]) ]+ [|case checkTPresence sp t of+ TPresent -> TPresent+ TAbsent -> TAbsent+ |])+ STSet t -> $(byTPredicateSymCases [|sp|]+ [ ('SPSNonComparable, [|TPresent|]) ]+ [|case checkTPresence sp t of+ TPresent -> TPresent+ TAbsent -> TAbsent+ |])+ STTicket t -> $(byTPredicateSymCases [|sp|]+ [ ('SPSTicket, [|TPresent|])+ , ('SPSNonComparable, [|TPresent|])+ ]+ [|case checkTPresence sp t of+ TPresent -> TPresent+ TAbsent -> TAbsent+ |]+ )+ STPair a b -> case checkTPresence sp a of+ TPresent -> TPresent+ TAbsent -> case checkTPresence sp b of+ TPresent -> TPresent+ TAbsent -> TAbsent+ STOr a b -> case checkTPresence sp a of+ TPresent -> TPresent+ TAbsent -> case checkTPresence sp b of+ TPresent -> TPresent+ TAbsent -> TAbsent+ STMap a b -> $(byTPredicateSymCases [|sp|]+ [ ('SPSNonComparable, [|TPresent|])]+ [|case checkTPresence sp a of+ TPresent -> TPresent+ TAbsent -> case checkTPresence sp b of+ TPresent -> TPresent+ TAbsent -> TAbsent+ |])+ STBigMap a b -> $(byTPredicateSymCases [|sp|]+ [ ('SPSBigMap, [|TPresent|])+ , ('SPSNonComparable, [|TPresent|])+ , ('SPSNestedBigMaps, [|+ case checkTPresence SPSBigMap b of+ TPresent -> TPresent+ TAbsent -> TAbsent+ |])+ ]+ [|case checkTPresence sp a of+ TPresent -> TPresent+ TAbsent -> case checkTPresence sp b of+ TPresent -> TPresent+ TAbsent -> TAbsent+ |]+ )+ -- special cases+ STOperation ->+ $(byTPredicateSymCases [|sp|]+ [('SPSOp, [|TPresent|]), ('SPSNonComparable, [|TPresent|])]+ [|TAbsent|])+ STContract{} ->+ $(byTPredicateSymCases [|sp|]+ [('SPSContract, [|TPresent|]), ('SPSNonComparable, [|TPresent|])]+ [|TAbsent|])+ STSaplingState{} ->+ $(byTPredicateSymCases [|sp|]+ [('SPSSaplingState, [|TPresent|]), ('SPSNonComparable, [|TPresent|])]+ [|TAbsent|])+ -- rest+ STKey -> TAbsent+ STUnit -> TAbsent+ STSignature -> TAbsent+ STChainId -> TAbsent+ STInt -> TAbsent+ STNat -> TAbsent+ STString -> TAbsent+ STBytes -> TAbsent+ STMutez -> TAbsent+ STBool -> TAbsent+ STKeyHash -> TAbsent+ STBls12381Fr -> $(byTPredicateSymCases [|sp|] [('SPSNonComparable, [|TPresent|])] [|TAbsent|])+ STBls12381G1 -> $(byTPredicateSymCases [|sp|] [('SPSNonComparable, [|TPresent|])] [|TAbsent|])+ STBls12381G2 -> $(byTPredicateSymCases [|sp|] [('SPSNonComparable, [|TPresent|])] [|TAbsent|])+ STTimestamp -> TAbsent+ STAddress -> TAbsent+ STChest -> $(byTPredicateSymCases [|sp|] [('SPSNonComparable, [|TPresent|])] [|TAbsent|])+ STChestKey -> $(byTPredicateSymCases [|sp|] [('SPSNonComparable, [|TPresent|])] [|TAbsent|])+ STSaplingTransaction _ ->+ $(byTPredicateSymCases [|sp|] [('SPSNonComparable, [|TPresent|])] [|TAbsent|])+ STNever -> TAbsent+ STLambda{} -> $(byTPredicateSymCases [|sp|] [('SPSNonComparable, [|TPresent|])] [|TAbsent|])++tPresence :: Sing p -> Sing t -> Maybe (ContainsT p t :~: 'True)+tPresence p t = case checkTPresence p t of+ TPresent -> Just Refl+ TAbsent -> Nothing++tAbsence :: Sing p -> Sing t -> Maybe (ContainsT p t :~: 'False)+tAbsence p t = case checkTPresence p t of+ TPresent -> Nothing+ TAbsent -> Just Refl
+ src/Morley/Michelson/Typed/Scope/Internal/Scopes.hs view
@@ -0,0 +1,244 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++module Morley.Michelson.Typed.Scope.Internal.Scopes+ ( module Morley.Michelson.Typed.Scope.Internal.Scopes+ ) where++import Data.Singletons (SingI)+import Data.Type.Bool (Not)++import Morley.Michelson.Typed.Scope.Internal.Comparable+import Morley.Michelson.Typed.Scope.Internal.ForbidT+import Morley.Michelson.Typed.Scope.Internal.WellTyped+import Morley.Michelson.Typed.T (T(..))++{- $setup+>>> import Morley.Michelson.Typed.Scope+>>> import Morley.Michelson.Typed (T(..), SingT(..))+>>> import Morley.Util.Peano (pattern S, pattern Z)+>>> import Data.Type.Equality ((:~:)(..))+-}++{-+Note [WellTyped constraint]+~~~~~~~~~~~~~~~~~~~~~~~~~~~++Try to put WellTyped constraint at the end of instance constraints. Because+WellTyped is a recursive type class, it loses context when it recurses, unlike+ForbidT constraints which do a type-family based check. The consequence is,+ForbidT constraints produce error messages with more context. The intention is+to show more informative errors first.++-- @lierdakil+-}++-- | Common constraints used for scopes defined below.+type CommonScopeC c ps t = (SingI t, ForbidManyT c ps t, WellTyped t)++{- | Set of constraints that Michelson applies to parameters.++Not just a type alias in order to be able to partially apply it++Produces human-readable error messages:++>>> () :: ParameterScope (TBigMap TUnit (TBigMap TUnit TOperation)) => ()+...+... Nested `big_map`s found in+... 'TBigMap 'TUnit ('TBigMap 'TUnit 'TOperation)+... are not allowed+...+... Type `operation` found in+... 'TBigMap 'TUnit ('TBigMap 'TUnit 'TOperation)+... is not allowed in this scope+...+>>> () :: ParameterScope (TBigMap TInt TNat) => ()+()++On ambiguous or polymorphic types, suggests adding the constraint:++>>> (const () :: ParameterScope t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains `operation` or nested `big_map`s. Perhaps you need to add+... ParameterScope t0+... constraint? You can also try adding a type annotation.+...+-}+class ParameterScopeC (ParameterScope t) t => ParameterScope t+instance ParameterScopeC (ParameterScope t) t => ParameterScope t+type ParameterScopeC c t = CommonScopeC c ['PSOp, 'PSNestedBigMaps] t++{- | Set of constraints that Michelson applies to contract storage.++Not just a type alias in order to be able to partially apply it++Produces human-readable error messages:++>>> () :: StorageScope (TContract TOperation) => ()+...+... Type `contract` found in+... 'TContract 'TOperation+... is not allowed in this scope+...+... Type `operation` found in+... 'TOperation+... is not allowed in this scope+...+>>> () :: StorageScope TUnit => ()+()++On ambiguous or polymorphic types, suggests adding the constraint:++>>> (const () :: StorageScope t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains `operation`, nested `big_map`s or `contract`. Perhaps you need to add+... StorageScope t0+... constraint? You can also try adding a type annotation.+...+-}+class StorageScopeC (StorageScope t) t => StorageScope t+instance StorageScopeC (StorageScope t) t => StorageScope t+type StorageScopeC c t = CommonScopeC c ['PSOp, 'PSNestedBigMaps, 'PSContract] t++{- | Set of constraints that Michelson applies to pushed constants.++Not just a type alias in order to be able to partially apply it++On ambiguous or polymorphic types, suggests adding the constraint:++>>> (const () :: ConstantScope t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains `operation`, `big_map`, `contract`, `ticket` or `sapling_state`. Perhaps you need to add+... ConstantScope t0+... constraint? You can also try adding a type annotation.+...+-}+class ConstantScopeC (ConstantScope t) t => ConstantScope t+instance ConstantScopeC (ConstantScope t) t => ConstantScope t+type ConstantScopeC c t =+ CommonScopeC c ['PSOp, 'PSBigMap, 'PSContract, 'PSTicket, 'PSSaplingState] t++{- | Alias for constraints which Michelson requires in @DUP@ instruction.++On ambiguous or polymorphic types, suggests adding the constraint:++>>> (const () :: DupableScope t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains `ticket`. Perhaps you need to add+... DupableScope t0+... constraint? You can also try adding a type annotation.+...+-}+class DupableScopeC (DupableScope t) t => DupableScope t+instance DupableScopeC (DupableScope t) t => DupableScope t+type DupableScopeC c t = (SingI t, ForbidManyT c '[ 'PSTicket] t)++-- | Returns whether the type is dupable.+type family IsDupableScope (t :: T) :: Bool where+ IsDupableScope t = Not (ContainsT 'PSTicket t)++{- | Set of constraints that Michelson applies to packed values.++Not just a type alias in order to be able to partially apply it.++On ambiguous or polymorphic types, suggests adding the constraint:++>>> (const () :: PackedValScope t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains `operation`, `big_map`, `ticket` or `sapling_state`. Perhaps you need to add+... PackedValScope t0+... constraint? You can also try adding a type annotation.+...+-}+class PackedValScopeC (PackedValScope t) t => PackedValScope t+instance PackedValScopeC (PackedValScope t) t => PackedValScope t+type PackedValScopeC c t =+ CommonScopeC c ['PSOp, 'PSBigMap, 'PSTicket, 'PSSaplingState] t++{- | Set of constraints that Michelson applies to unpacked values.+Same as 'ConstantScope'.++Not just a type alias in order to show better errors on ambiguity or missing+constraint.++On ambiguous or polymorphic types, suggests adding the constraint:++>>> (const () :: UnpackedValScope t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains `operation`, `big_map`, `contract`, `ticket` or `sapling_state`. Perhaps you need to add+... UnpackedValScope t0+... constraint? You can also try adding a type annotation.+...+-}+class UnpackedValScopeC (UnpackedValScope t) t => UnpackedValScope t+instance UnpackedValScopeC (UnpackedValScope t) t => UnpackedValScope t+type UnpackedValScopeC c t = ConstantScopeC c t++{- | Set of constraints that Michelson applies to argument type and return type+of views. All info related to views can be found in+[TZIP](https://gitlab.com/tezos/tzip/-/blob/master/drafts/current/draft_views.md).++Not just a type alias in order to be able to partially apply it.++On ambiguous or polymorphic types, suggests adding the constraint:++>>> (const () :: ViewableScope t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains `operation`, `big_map` or `ticket`. Perhaps you need to add+... ViewableScope t0+... constraint? You can also try adding a type annotation.+...+-}+class ViewableScopeC (ViewableScope t) t => ViewableScope t+instance ViewableScopeC (ViewableScope t) t => ViewableScope t+type ViewableScopeC c t = (SingI t, ForbidManyT c ['PSOp, 'PSBigMap, 'PSTicket] t)++{- | Alias for constraints which are required for untyped representation.++On ambiguous or polymorphic types, suggests adding the constraint:++>>> (const () :: UntypedValScope t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains `operation`. Perhaps you need to add+... UntypedValScope t0+... constraint? You can also try adding a type annotation.+...+-}+class UntypedValScopeC (UntypedValScope t) t => UntypedValScope t+instance UntypedValScopeC (UntypedValScope t) t => UntypedValScope t+type UntypedValScopeC c t = (SingI t, ForbidManyT c '[ 'PSOp] t)++{- | Alias for comparable types.++On ambiguous or polymorphic types, suggests adding the constraint:++>>> (const () :: ComparabilityScope t => f t -> ()) undefined+...+... Can't check if type+... t0+... contains non-comparable types. Perhaps you need to add+... ComparabilityScope t0+... constraint? You can also try adding a type annotation.+...+-}+class ComparabilityScopeC (ComparabilityScope t) t => ComparabilityScope t+instance ComparabilityScopeC (ComparabilityScope t) t => ComparabilityScope t+type ComparabilityScopeC c t = (SingI t, ForbidManyT c '[ 'PSNonComparable ] t, Comparable t)
+ src/Morley/Michelson/Typed/Scope/Internal/TH.hs view
@@ -0,0 +1,26 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++module Morley.Michelson.Typed.Scope.Internal.TH+ (module Morley.Michelson.Typed.Scope.Internal.TH+ ) where++import Debug qualified++import Language.Haskell.TH qualified as TH+import Morley.Michelson.Typed.Scope.Internal.ForbidT++byTPredicateSymCases :: TH.ExpQ -> [(TH.Name, TH.ExpQ)] -> TH.ExpQ -> TH.ExpQ+byTPredicateSymCases sp specific rest = do+ TH.TyConI (TH.DataD _ _ _ _ cons' _) <- TH.reify ''SingTPredicateSym+ let cons = cons' <&> \case+ TH.NormalC nm _ -> nm+ TH.GadtC [nm] _ _ -> nm+ c -> error $ "unexpected constructor " <> Debug.show c+ specCons = map fst specific+ restCons = filter (`notElem` specCons) cons+ cases = specific <> (restCons <&> (, rest))+ matches = first (flip TH.conP []) <$> cases+ TH.caseE sp [ TH.match pat (TH.normalB expr) [] | (pat, expr) <- matches ]
+ src/Morley/Michelson/Typed/Scope/Internal/WellTyped.hs view
@@ -0,0 +1,169 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++module Morley.Michelson.Typed.Scope.Internal.WellTyped+ ( module Morley.Michelson.Typed.Scope.Internal.WellTyped+ ) where++import Data.Constraint (Dict(..))+import Data.Singletons (Sing, SingI(..), fromSing, withSingI)+import Data.Type.Equality ((:~:)(..))+import Fmt (Buildable(..), quoteOrIndentF, (++|), (|++^))++import Morley.Michelson.Typed.Scope.Internal.Comparable+import Morley.Michelson.Typed.Scope.Internal.ForbidT+import Morley.Michelson.Typed.Scope.Internal.Presence+import Morley.Michelson.Typed.Sing (SingT(..))+import Morley.Michelson.Typed.T (T(..))++{-$setup+>>> import Morley.Michelson.Typed+>>> import Fmt (pretty)+-}++data BadTypeForScope+ = BtNotComparable+ | BtIsOperation+ | BtHasBigMap+ | BtHasNestedBigMap+ | BtHasContract+ | BtHasTicket+ | BtHasSaplingState+ deriving stock (Show, Eq, Generic)+ deriving anyclass (NFData)++instance Buildable BadTypeForScope where+ build = \case+ BtNotComparable -> "is not comparable"+ BtIsOperation -> "has 'operation' type"+ BtHasBigMap -> "has 'big_map'"+ BtHasNestedBigMap -> "has nested 'big_map'"+ BtHasContract -> "has 'contract' type"+ BtHasTicket -> "has 'ticket' type"+ BtHasSaplingState -> "has 'sapling_state' type"++-- | This class encodes Michelson rules w.r.t where it requires comparable+-- types. Earlier we had a dedicated type for representing comparable types @CT@.+-- But then we integreated those types into @T@. This meant that some of the+-- types that could be formed with various combinations of @T@ would be+-- illegal as per Michelson typing rule. Using this class, we inductively+-- enforce that a type and all types it contains are well typed as per+-- Michelson's rules.+type WellTyped :: T -> Constraint+class (SingI t, RecSuperC WellTyped t, WellTypedConstraints t) => WellTyped t+instance (SingI t, RecSuperC WellTyped t, WellTypedConstraints t) => WellTyped t++-- | Additional (non-recursive) constraints on type arguments for specific types+type WellTypedConstraints :: T -> Constraint+type family WellTypedConstraints t where+ WellTypedConstraints ('TSet t) = Comparable t+ WellTypedConstraints ('TContract t) = (ForbidOp t, ForbidNestedBigMaps t)+ WellTypedConstraints ('TTicket t) = Comparable t+ WellTypedConstraints ('TMap k _) = Comparable k+ WellTypedConstraints ('TBigMap k v) = (Comparable k, ForbidBigMap v, ForbidOp v)+ WellTypedConstraints _ = ()++-- | Error type for when a value is not well-typed.+data NotWellTyped = NotWellTyped+ { nwtBadType :: T+ , nwtCause :: BadTypeForScope+ }++instance Buildable NotWellTyped where+ build (NotWellTyped t c) =+ "Given type is not well typed because" ++| quoteOrIndentF t |++^ build c++{- | Given a type, provide evidence that it is well typed w.r.t to the Michelson+rules regarding where comparable types are required.++>>> either pretty print $ getWTP @'TUnit+Dict+>>> either pretty print $ getWTP @('TSet 'TOperation)+Given type is not well typed because 'operation' is not comparable+>>> type Pairs a = 'TPair a a+>>> type Pairs2 = Pairs (Pairs 'TUnit)+>>> either pretty print $ getWTP @('TSet ('TPair Pairs2 'TOperation))+Given type is not well typed because+ pair (pair (pair unit unit) unit unit) operation+is not comparable+-}+getWTP :: forall t. (SingI t) => Either NotWellTyped (Dict (WellTyped t))+getWTP = getWTP' sing++-- | Version of 'getWTP' that accepts 'Sing' at term-level.+getWTP' :: Sing t -> Either NotWellTyped (Dict (WellTyped t))+getWTP' = \case+ STKey -> Right Dict+ STUnit -> Right Dict+ STSignature -> Right Dict+ STChainId -> Right Dict+ STOption s -> do+ Dict <- getWTP' s+ pure Dict+ STList s -> do+ Dict <- getWTP' s+ pure Dict+ STSet s -> do+ Dict <- getWTP' s+ Dict <- eitherWellTyped BtNotComparable s comparabilityPresence+ pure Dict+ STOperation -> Right Dict+ STContract s -> do+ Dict <- getWTP' s+ Refl <- eitherWellTyped BtIsOperation s $ tAbsence SPSOp+ Refl <- eitherWellTyped BtHasNestedBigMap s $ tAbsence SPSNestedBigMaps+ pure Dict+ STTicket s -> do+ Dict <- getWTP' s+ Dict <- eitherWellTyped BtNotComparable s comparabilityPresence+ pure Dict+ STPair s1 s2 -> do+ Dict <- getWTP' s1+ Dict <- getWTP' s2+ pure Dict+ STOr s1 s2 -> do+ Dict <- getWTP' s1+ Dict <- getWTP' s2+ pure Dict+ STLambda s1 s2 -> do+ Dict <- getWTP' s1+ Dict <- getWTP' s2+ pure Dict+ STMap s1 s2 -> do+ Dict <- getWTP' s1+ Dict <- getWTP' s2+ Dict <- eitherWellTyped BtNotComparable s1 comparabilityPresence+ pure Dict+ STBigMap s1 s2 -> do+ Dict <- getWTP' s1+ Dict <- getWTP' s2+ Dict <- eitherWellTyped BtNotComparable s1 $ comparabilityPresence+ Refl <- eitherWellTyped BtIsOperation s2 $ tAbsence SPSOp+ Refl <- eitherWellTyped BtHasBigMap s2 $ tAbsence SPSBigMap+ pure Dict+ STInt -> Right Dict+ STNat -> Right Dict+ STString -> Right Dict+ STBytes -> Right Dict+ STMutez -> Right Dict+ STBool -> Right Dict+ STKeyHash -> Right Dict+ STBls12381Fr -> Right Dict+ STBls12381G1 -> Right Dict+ STBls12381G2 -> Right Dict+ STTimestamp -> Right Dict+ STAddress -> Right Dict+ STChest -> Right Dict+ STChestKey -> Right Dict+ STNever -> Right Dict+ STSaplingState s -> withSingI s $ Right Dict+ STSaplingTransaction s -> withSingI s $ Right Dict+ where+ eitherWellTyped+ :: BadTypeForScope+ -> SingT t+ -> (SingT t -> Maybe a)+ -> Either NotWellTyped a+ eitherWellTyped bt sng f = maybeToRight (NotWellTyped (fromSing sng) bt) $ f sng
+ src/Morley/Michelson/Typed/Scope/Internal/WithDeMorganScope.hs view
@@ -0,0 +1,147 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++{-# OPTIONS_HADDOCK not-home #-}++module Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope+ ( module Morley.Michelson.Typed.Scope.Internal.WithDeMorganScope+ ) where++import Data.Constraint ((\\))+import Data.Singletons (Sing, SingI(..))+import Data.Type.Bool (type (||))++import Data.Type.Equality ((:~:)(..))+import Morley.Michelson.Typed.Scope.Internal.ForbidT+import Morley.Michelson.Typed.Scope.Internal.Presence+import Morley.Michelson.Typed.Scope.Internal.Scopes+import Morley.Michelson.Typed.Scope.Internal.WellTyped+import Morley.Michelson.Typed.T (T(..))+import Morley.Util.StubbedProof (stubProof)++-- | Allows using a scope that can be proven true with a De Morgan law.+--+-- Many scopes are defined as @not a@ (or rather @a ~ 'False@) where @a@ is a+-- negative property we want to avoid as a 'Constraint'.+-- The negative constraints are implemented with a type family that for some+-- combination types resolves to itself applied to the type arguments in an @or@,+-- e.g. A @pair l r@ has @x@ if @l@ or @r@ contain @x@.+--+-- Because of the De Morgan laws @not (a or b)@ implies @(not a) and (not b)@+-- or in our case: @pair@ does not contain @x@ -> @a@ and @b@ don't contain @x@.+class WithDeMorganScope (c :: T -> Constraint) t a b where+ withDeMorganScope :: c (t a b) => ((c a, c b) => ret) -> ret++-- | When a class looks like+--+-- @+-- class (SomeTypeFamily t ~ 'False, ...) => TheClass t+-- instance (SomeTypeFamily t ~ 'False, ...) => TheClass t+-- @+--+-- and the additional constraints are satisfied by the instance constraints of+-- the 'WithDeMorganScope' instance for @TheClass@, we can use+-- `simpleWithDeMorgan` to define 'withDeMorganScope' for the instance.+simpleWithDeMorgan+ :: forall a b ret op.+ ((ContainsT op a || ContainsT op b) ~ 'False, SingI a)+ => Sing op+ -> ((ContainsT op a ~ 'False, ContainsT op b ~ 'False) => ret)+ -> ret+-- Note: If we're lucky, GHC might not build `SingI a` and `SingI op` dictionaries.+simpleWithDeMorgan sop = simpleWithDeMorgan' @b sop (sing @a)++simpleWithDeMorgan'+ :: forall b ret op a.+ ((ContainsT op a || ContainsT op b) ~ 'False)+ => Sing op+ -> Sing a+ -> ((ContainsT op a ~ 'False, ContainsT op b ~ 'False) => ret)+ -> ret+simpleWithDeMorgan' sop sa f = f \\+ stubProof @(ContainsT op b) @'False+ case checkTPresence sop sa of+ TAbsent -> Refl++-- | Simpler version of 'withDeMorganScope' for 'ForbidT' constraints.+deMorganForbidT+ :: forall a b r p. (ContainsT p a || ContainsT p b) ~ 'False+ => Sing p+ -> Sing a+ -> Sing b+ -> ((ForbidT p a, ForbidT p b) => r)+ -> r+deMorganForbidT p a _ f = simpleWithDeMorgan' @b p a f++instance (SingI a, SingI p) => WithDeMorganScope (ForbidT p) 'TPair a b where+ withDeMorganScope f = simpleWithDeMorgan @a @b (sing @p) f+instance (SingI a, SingI p) => WithDeMorganScope (ForbidT p) 'TOr a b where+ withDeMorganScope f = simpleWithDeMorgan @a @b (sing @p) f+instance (SingI k, SingI p) => WithDeMorganScope (ForbidT p) 'TMap k v where+ withDeMorganScope f = case sp of+ SPSOp -> simpleWithDeMorgan @k @v sp f+ SPSContract -> simpleWithDeMorgan @k @v sp f+ SPSTicket -> simpleWithDeMorgan @k @v sp f+ SPSBigMap -> simpleWithDeMorgan @k @v sp f+ SPSNestedBigMaps -> simpleWithDeMorgan @k @v sp f+ SPSSaplingState -> simpleWithDeMorgan @k @v sp f+ where sp = sing @p++-- NB: BigMap is special because de Morgan rule not applicable to NestedBigMaps+-- here.+instance (SingI k) => WithDeMorganScope ForbidOp 'TBigMap k v where+ withDeMorganScope f = simpleWithDeMorgan @k @v SPSOp f+instance (SingI k) => WithDeMorganScope ForbidContract 'TBigMap k v where+ withDeMorganScope f = simpleWithDeMorgan @k @v SPSContract f+instance (SingI k) => WithDeMorganScope ForbidTicket 'TBigMap k v where+ withDeMorganScope f = simpleWithDeMorgan @k @v SPSTicket f+instance (SingI k) => WithDeMorganScope ForbidSaplingState 'TBigMap k v where+ withDeMorganScope f = simpleWithDeMorgan @k @v SPSSaplingState f++instance+ ( WithDeMorganScope ForbidOp t a b+ , WithDeMorganScope ForbidNestedBigMaps t a b+ , WellTyped a, WellTyped b+ ) => WithDeMorganScope ParameterScope t a b where+ withDeMorganScope f =+ withDeMorganScope @ForbidOp @t @a @b $+ withDeMorganScope @ForbidNestedBigMaps @t @a @b f++instance+ ( WithDeMorganScope ForbidOp t a b+ , WithDeMorganScope ForbidNestedBigMaps t a b+ , WithDeMorganScope ForbidContract t a b+ , WellTyped a, WellTyped b+ ) => WithDeMorganScope StorageScope t a b where+ withDeMorganScope f =+ withDeMorganScope @ForbidOp @t @a @b $+ withDeMorganScope @ForbidNestedBigMaps @t @a @b $+ withDeMorganScope @ForbidContract @t @a @b f++instance+ ( WithDeMorganScope ForbidOp t a b+ , WithDeMorganScope ForbidBigMap t a b+ , WithDeMorganScope ForbidContract t a b+ , WithDeMorganScope ForbidTicket t a b+ , WithDeMorganScope ForbidSaplingState t a b+ , WellTyped a, WellTyped b+ ) => WithDeMorganScope ConstantScope t a b where+ withDeMorganScope f =+ withDeMorganScope @ForbidOp @t @a @b $+ withDeMorganScope @ForbidBigMap @t @a @b $+ withDeMorganScope @ForbidContract @t @a @b $+ withDeMorganScope @ForbidTicket @t @a @b $+ withDeMorganScope @ForbidSaplingState @t @a @b f++instance+ ( WithDeMorganScope ForbidOp t a b+ , WithDeMorganScope ForbidBigMap t a b+ , WithDeMorganScope ForbidTicket t a b+ , WithDeMorganScope ForbidSaplingState t a b+ , WellTyped a, WellTyped b+ ) => WithDeMorganScope PackedValScope t a b where+ withDeMorganScope f =+ withDeMorganScope @ForbidOp @t @a @b $+ withDeMorganScope @ForbidBigMap @t @a @b $+ withDeMorganScope @ForbidTicket @t @a @b $+ withDeMorganScope @ForbidSaplingState @t @a @b f
src/Morley/Michelson/Typed/Sing.hs view
@@ -20,9 +20,8 @@ import Data.Singletons (SingI(..), demote, fromSing) import Data.Type.Equality ((:~:)(..))-import Fmt ((+|), (|+))+import Fmt (Buildable(..), fmt, nameF) -import Morley.Michelson.Printer.Util (RenderDoc(..)) import Morley.Michelson.Typed.T (T(..)) import Morley.Util.MismatchError import Morley.Util.Sing (castSing, eqI, genSingletonsType)@@ -50,8 +49,9 @@ => t a -> Either Text (t b) castSingE = maybeToRight errMsg . castSing where- errMsg = "Type mismatch: expected '" +| demote @a |+- "', but got '" +| demote @b |+ "'"+ errMsg = fmt+ $ nameF "Type mismatch"+ $ build MkMismatchError{ meExpected = demote @a, meActual = demote @b } -- | Monadic version of 'castSing'. -- Throws an error using the given function if the cast fails.@@ -86,5 +86,5 @@ deriveGADTNFData ''SingT -instance RenderDoc (SingT t) where- renderDoc pn s = renderDoc pn $ fromSing s+instance Buildable (SingT t) where+ build = build . fromSing
src/Morley/Michelson/Typed/T.hs view
@@ -10,9 +10,9 @@ ) where import Data.Data (Data)-import Fmt (Buildable(..), Builder, listF)+import Fmt (Buildable(..), Doc, listF) -import Morley.Michelson.Printer.Util (Prettier(..), RenderDoc(..), buildRenderDocExtended)+import Morley.Michelson.Printer.Util (RenderDoc(..)) import Morley.Michelson.Untyped.Annotation qualified as Un import Morley.Michelson.Untyped.Type qualified as Un import Morley.Util.MismatchError@@ -103,23 +103,14 @@ build = build . toUType instance Buildable (MismatchError T) where- build = buildRenderDocExtended+ build = buildDocDiff instance Buildable (MismatchError [T]) where- build = buildRenderDocExtended+ build = buildDocDiffList instance RenderDoc T where renderDoc context = renderDoc context . toUType -instance RenderDoc (Prettier T) where- renderDoc context = renderDoc context . fmap toUType--instance RenderDoc (MismatchError T) where- renderDoc ctx = renderDocDiff ctx . fmap Prettier--instance RenderDoc (MismatchError [T]) where- renderDoc ctx = renderDocDiffList ctx . (fmap . fmap) Prettier- -- | Format type stack in a pretty way.-buildStack :: [T] -> Builder+buildStack :: [T] -> Doc buildStack = listF
src/Morley/Michelson/Typed/Util.hs view
@@ -41,12 +41,11 @@ import Prelude hiding (Ordering(..)) import Control.Monad.Writer.Strict (Writer, execWriterT, runWriter, tell, writer)-import Data.Constraint (Dict(..))+import Data.Constraint (Dict(..), (\\)) import Data.Default (Default(..)) import Data.Generics (listify) import Data.Map qualified as M import Data.Set qualified as S-import Data.Text.Internal.Builder (fromText) import Fmt (Buildable(..)) import Language.Haskell.TH qualified as TH @@ -93,7 +92,7 @@ } instance Buildable (CtorEffectsApp x) where- build CtorEffectsApp{..} = fromText ceaName+ build CtorEffectsApp{..} = build ceaName instance (Applicative x) => Default (DfsSettings x) where def = DfsSettings@@ -161,7 +160,7 @@ pure $ SomeView v{ vCode = code } dsInstrStep $ AnnCREATE_CONTRACT ann $ contract { cCode = ContractCode codeI- , cViews = UnsafeViewsSet viewsI+ , cViews = ViewsSet viewsI } | otherwise -> const $ recursion0 i SNoChildren -> const $ recursion0 i@@ -528,7 +527,7 @@ in maybe (PartlyPushableStorage v Nop) PushableValueStorage $ foldM handleList NIL vals - VSet{} -> ConstantStorage v+ VSet (_ :: Set (Value t)) -> ConstantStorage v \\ comparableImplies (Proxy @t) VPair (v1 :: Value t1, v2 :: Value t2) -> withValueTypeSanity v1 $ withValueTypeSanity v2 $@@ -577,17 +576,10 @@ PushableValueStorage instr -> PushableValueStorage $ instr `Seq` RIGHT PartlyPushableStorage val instr -> PartlyPushableStorage val $ instr `Seq` RIGHT - VMap (vMap :: (Map (Value tk) (Value tv))) -> case checkScope @(ConstantScope tk) of- Left _ ->- -- NOTE: all keys for a map need to be comparable and (even tho it's- -- not a superclass) that means they have to be constants.- -- I (@pasqu4le) found no exception to this rule, perhaps it should be- -- enforced in the type system as well, but it may have more- -- downsides than it's worth accepting.- error "impossible: all map keys should be PUSHable"- Right Dict -> case checkScope @(ConstantScope tv) of+ VMap (vMap :: (Map (Value tk) (Value tv))) | Dict <- comparableImplies (Proxy @tk) ->+ case checkScope @(ConstantScope tv) of Right Dict -> ConstantStorage v- _ -> withDeMorganScope @HasNoOp @'T.TMap @tk @tv $+ _ -> withDeMorganScope @ForbidOp @'T.TMap @tk @tv $ -- Similarly as for lists, here we check that even tho the value type -- contains a big_map, we actually have big_maps in (one or more of) them. let handleMap
src/Morley/Michelson/Typed/Value.hs view
@@ -32,7 +32,7 @@ import Control.Lens (At(..), Index, IxValue, Ixed(..)) import Data.Constraint (Dict(..), (\\)) import Data.GADT.Compare (GEq(..))-import Fmt (Buildable(build), Builder, (+|), (|+))+import Fmt (Buildable(build), Doc, (+|), (|+)) import Morley.Michelson.Text (MText) import Morley.Michelson.Typed.Annotation (Notes)@@ -210,11 +210,21 @@ instance (Comparable t) => Ord (Value' instr t) where compare = tcompare @t --- | Representation of Michelson value.------ Type parameter @instr@ stands for Michelson instruction--- type, i.e. data type to represent an instruction of language.+{- | Representation of a Michelson value. +Since values (i.e. lambdas, operations) can include instructions, this type+depends on the type used to represent instructions, which is the parameter+@instr@. It is itself a polymorphic type, parametrized by the Michelson types of+its input and output stacks.++The primary motivator for polymorphism is breaking cyclic dependencies between+this module and "Morley.Michelson.Typed.Instr". In principle @instr@ can also be+used as an extension point, but at the time of writing it isn't used as such, it+is always eventually unified with @Instr@.++@t@ is the value's Michelson type.+-}+type Value' :: ([T] -> [T] -> Type) -> T -> Type data Value' instr t where VKey :: PublicKey -> Value' instr 'TKey VUnit :: Value' instr 'TUnit@@ -230,13 +240,13 @@ => [Value' instr t] -> Value' instr ('TList t) VSet :: forall t instr.- (SingI t, Comparable t)+ Comparable t => Set (Value' instr t) -> Value' instr ('TSet t) VOp :: Operation' instr -> Value' instr 'TOperation VContract :: forall arg instr.- (SingI arg, HasNoOp arg)+ (SingI arg, ForbidOp arg) => Address -> SomeEntrypointCallT arg -> Value' instr ('TContract arg) VTicket :: forall arg instr.@@ -250,21 +260,16 @@ (SingI l, SingI r) => Either (Value' instr l) (Value' instr r) -> Value' instr ('TOr l r) VLam- :: forall inp out instr.- ( SingI inp, SingI out- , forall i o. Show (instr i o)- , forall i o. Eq (instr i o)- , forall i o. NFData (instr i o)- )+ :: forall inp out instr. (SingI inp, SingI out) => LambdaCode' instr inp out -> Value' instr ('TLambda inp out) VMap :: forall k v instr.- (SingI k, SingI v, Comparable k)+ (SingI v, Comparable k) => Map (Value' instr k) (Value' instr v) -> Value' instr ('TMap k v) VBigMap :: forall k v instr.- (SingI k, SingI v, Comparable k, HasNoBigMap v)+ (SingI v, Comparable k, ForbidBigMap v) => Maybe Natural -- ^ The big_map's ID. This is only used in the interpreter. -> Map (Value' instr k) (Value' instr v) -> Value' instr ('TBigMap k v)@@ -286,6 +291,13 @@ deriving stock instance Show (Value' instr t) deriving stock instance Eq (Value' instr t) +{- | Code of a lambda value, either recursive or non-recursive.++Note the quantified constraints on the constructors. We opt to carry those here+and not on the respective instances for the sake of simplifying downstream+instance definitions. Constraining each instance with quantified constraints+gets very long-winded very fast, and it wouldn't work with 'deriveGADTNFData'.+-} data LambdaCode' instr inp out where LambdaCode :: ( forall i o. Show (instr i o)@@ -314,7 +326,7 @@ => KindedAddress kind -> Value' instr ('TContract t) addressToVContract addr = VContract (MkAddress addr) sepcPrimitive -buildVContract :: Value' instr ('TContract arg) -> Builder+buildVContract :: Value' instr ('TContract arg) -> Doc buildVContract = \case VContract addr epc -> "Contract " +| addr |+ " call " +| epc |+ ""
src/Morley/Michelson/Typed/View.hs view
@@ -18,7 +18,7 @@ , someViewName -- * Views set- , ViewsSet' (.., ViewsList)+ , ViewsSet' (.., ViewsList, UnsafeViewsSet) , VS.ViewsSetError (..) , mkViewsSet , emptyViewsSet@@ -80,9 +80,14 @@ ---------------------------------------------------------------------------- -- | Views that belong to one contract.-newtype ViewsSet' instr st = UnsafeViewsSet { unViewsSet :: Map ViewName (SomeView' instr st) }+newtype ViewsSet' instr st = ViewsSet { unViewsSet :: Map ViewName (SomeView' instr st) } deriving newtype (Default, Container) +pattern UnsafeViewsSet :: Map ViewName (SomeView' instr st) -> ViewsSet' instr st+pattern UnsafeViewsSet x = ViewsSet x+{-# COMPLETE UnsafeViewsSet #-}+{-# DEPRECATED UnsafeViewsSet "Use ViewsSet instead" #-}+ deriving stock instance (forall i o. Show (instr i o)) => Show (ViewsSet' instr st)@@ -92,10 +97,10 @@ instance (forall i o. NFData (instr i o)) => NFData (ViewsSet' instr st) where- rnf (UnsafeViewsSet vs) = rnf vs+ rnf (ViewsSet vs) = rnf vs pattern ViewsList :: [SomeView' instr st] -> ViewsSet' instr st-pattern ViewsList views <- UnsafeViewsSet (toList -> views)+pattern ViewsList views <- ViewsSet (toList -> views) {-# COMPLETE ViewsList #-} -- | Construct views set.
src/Morley/Michelson/Untyped/Aliases.hs view
@@ -15,7 +15,7 @@ import Morley.Michelson.Untyped.Instr qualified as Untyped import Morley.Michelson.Untyped.Value qualified as Untyped -type Value = Untyped.Value' Untyped.ExpandedOp+type Value = Untyped.Value' [] Untyped.ExpandedOp type View = Untyped.View' Untyped.ExpandedOp type Contract = Untyped.Contract' Untyped.ExpandedOp-type ExpandedExtInstr = Untyped.ExtInstrAbstract Untyped.ExpandedOp+type ExpandedExtInstr = Untyped.ExtInstrAbstract [] Untyped.ExpandedOp
src/Morley/Michelson/Untyped/Annotation.hs view
@@ -54,16 +54,16 @@ import Data.Default (Default(..)) import Data.Text qualified as T import Data.Typeable (eqT, (:~:)(..))-import Fmt (Buildable(build))+import Fmt (Doc, build, (<+>)) import Instances.TH.Lift () import Language.Haskell.TH qualified as TH import Language.Haskell.TH.Quote qualified as TH import Language.Haskell.TH.Syntax (Lift)-import Text.PrettyPrint.Leijen.Text (Doc, hsep, textStrict, (<+>))+import Prettyprinter (hsep) import Text.Show qualified as T import Type.Reflection (tyConName, typeRep, typeRepTyCon) -import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDoc)+import Morley.Michelson.Printer.Util (RenderDoc(..)) import Morley.Util.Aeson -- | Generic Type/Field/Variable Annotation@@ -253,22 +253,16 @@ instance RenderDoc AnyAnn where renderDoc _ = renderAnyAnn -instance KnownAnnTag tag => Buildable (Annotation tag) where- build = buildRenderDoc- instance RenderDoc AnnotationSet where renderDoc _ (AnnotationSet {..}) = renderAnnGroup asTypes <+> renderAnnGroup asFields <+> renderAnnGroup asVars -instance Buildable AnnotationSet where- build = buildRenderDoc- -- | Renders a single t'Annotation', this is used in every rendering instance of it. -- Note that this also renders empty ones/'noAnn's because a single t'Annotation' -- does not have enough context to know if it can be omitted, use 'singleAnnSet' -- if you want to hide it instead. renderAnn :: forall tag. KnownAnnTag tag => Annotation tag -> Doc-renderAnn (Annotation text) = textStrict $ annPrefix @tag <> text+renderAnn (Annotation text) = build $ annPrefix @tag <> text renderAnyAnn :: AnyAnn -> Doc renderAnyAnn = \case
src/Morley/Michelson/Untyped/Contract.hs view
@@ -11,28 +11,29 @@ , mkEntriesOrder , ContractBlock (..)+ , ContractBlockError (..) , orderContractBlock , Contract' (..) , View' (..) , Storage- , mapContractCode ) where -import Control.Lens (folded, makePrisms)+import Control.Lens (Prism', makePrisms) import Data.Aeson (FromJSON, FromJSONKey(..), ToJSON, ToJSONKey(..)) import Data.Aeson.TH (deriveJSON) import Data.Aeson.Types qualified as AesonTypes+import Data.Bitraversable (bitraverse) import Data.Data (Data(..)) import Data.Default (Default(..)) import Data.Map qualified as Map import Data.Text (stripPrefix)-import Fmt (Buildable(build), pretty)-import Text.PrettyPrint.Leijen.Text (nest, semi, text, (<$$>), (<+>))-import Text.PrettyPrint.Leijen.Text qualified as PP+import Fmt (Buildable(build), listF, nameF, pretty, (<$$>), (<+>))+import Fmt.Operators qualified as PP+import Prettyprinter (semi)+import Prettyprinter qualified as PP import Morley.Michelson.Printer.Util- (Prettier(..), RenderDoc(..), assertParensNotNeeded, buildRenderDoc, needsParens, renderOpsList) import Morley.Michelson.Untyped.Type (ParameterType(..), Ty(..)) import Morley.Michelson.Untyped.View import Morley.Util.Aeson@@ -44,6 +45,13 @@ | EntryView ViewName deriving stock (Eq, Ord, Show, Data, Generic) +instance Buildable Entry where+ build = \case+ EntryParameter -> "parameter"+ EntryStorage -> "storage"+ EntryCode -> "code"+ EntryView name -> nameF "view" $ build name+ deriveJSON morleyAesonOptions ''Entry instance ToJSONKey Entry where@@ -88,34 +96,71 @@ data ContractBlock op = CBParam ParameterType | CBStorage Ty- | CBCode [op]+ | CBCode op | CBView (View' op) deriving stock (Eq, Show, Functor) makePrisms ''ContractBlock+makePrisms ''Entry +data ContractBlockError+ = CBEDuplicate (NonEmpty Entry)+ | CBEMissing Entry+ deriving stock (Eq, Show)++instance Buildable ContractBlockError where+ build = \case+ CBEDuplicate (b :| []) -> nameF "Duplicate contract field" $ build b+ CBEDuplicate bs -> nameF "Duplicate contract fields" $ listF bs+ CBEMissing entry -> nameF "Missing contract field" $ build entry++newtype Validation e a = Validation { unValidation :: Either e a }+ deriving stock (Show, Eq)+ deriving newtype (Functor)++instance Semigroup e => Applicative (Validation e) where+ pure = Validation . Right+ Validation (Left e1) <*> Validation r = Validation $ Left $ either (e1 <>) (const e1) r+ Validation (Right f) <*> x = f <$> x+ -- | Construct a contract representation from the contract blocks (i.e. parameters, -- storage, code blocks, etc.) in arbitrary order. -- This makes sure that unique blocks like @code@ do not duplicate, and saves the -- order in the contract so that it can print the contract blocks in the same -- order it was parsed.-orderContractBlock :: [ContractBlock op] -> Maybe (Contract' op)+orderContractBlock+ :: forall op. [ContractBlock op]+ -> Either (NonEmpty ContractBlockError) (Contract' op) orderContractBlock blocks = let- -- we are sure there are no duplicate view names due to the guard below, so- -- we can construct a Map right away- contractViews = unsafe . mkViewsSet $ blocks ^.. folded . _CBView- blockTypes = blocks <&> \case+ blockToBlockType = \case CBParam{} -> EntryParameter CBStorage{} -> EntryStorage CBCode{} -> EntryCode CBView View{..} -> EntryView viewName- entriesOrder = mkEntriesOrder blockTypes- in do- guard $ blockTypes == ordNub blockTypes -- must have no duplicates- contractParameter <- blocks ^? folded . _CBParam- contractStorage <- blocks ^? folded . _CBStorage- contractCode <- blocks ^? folded . _CBCode+ duplicates :: [Entry]+ blockMap :: Map Entry (Word, ContractBlock op)+ (duplicates, blockMap) =+ foldr go (mempty, mempty) (zip blocks [0..])+ where+ go (b, n) (!dups, !seen) =+ let blockType = blockToBlockType b+ dups' | Map.member blockType seen = blockType:dups+ | otherwise = dups+ in (dups', Map.insert blockType (n, b) seen)+ entriesOrder = EntriesOrder $ fst <$> blockMap+ getBlock :: Entry -> Prism' (ContractBlock op) a -> Validation (NonEmpty ContractBlockError) a+ getBlock ty prism = Validation $ maybeToRight (one $ CBEMissing ty) $+ Map.lookup ty blockMap >>= preview (_2 . prism)+ contractViews = ViewsSet+ . Map.fromDistinctAscList -- we know that keys are still unique and sorted+ . mapMaybe (bitraverse (preview _EntryView) (preview $ _2 . _CBView))+ $ toPairs blockMap+ in unValidation do+ Validation $ nonEmpty duplicates & maybeToLeft () . fmap (one . CBEDuplicate)+ contractParameter <- getBlock EntryParameter _CBParam+ contractStorage <- getBlock EntryStorage _CBStorage+ contractCode <- getBlock EntryCode _CBCode pure Contract{..} instance Buildable (ContractBlock op) where@@ -130,7 +175,7 @@ :: Contract' op -> (ParameterType -> a) -> (Storage -> a)- -> ([op] -> a)+ -> (op -> a) -> (View' op -> a) -> [a] mapEntriesOrdered Contract{..} fParam fStorage fCode fView = snd <$> sortWith fst elements@@ -152,7 +197,7 @@ -- ^ Contract parameter type , contractStorage :: Storage -- ^ Contract storage type- , contractCode :: [op]+ , contractCode :: op -- ^ Contract code as a list of operations , entriesOrder :: EntriesOrder -- ^ Original order of contract blocks, so that we can print them@@ -166,26 +211,18 @@ instance (RenderDoc op) => RenderDoc (Contract' op) where renderDoc pn contract = assertParensNotNeeded pn- $ foldr (<$$>) (text "")+ $ foldr (<$$>) mempty $ mapEntriesOrdered contract- (\parameter -> "parameter" <+> renderDoc needsParens (Prettier parameter) <> semi)- (\storage -> "storage" <+> renderDoc needsParens (Prettier storage) <> semi)- (\code -> "code" <+> nest (length ("code {" :: Text)) (renderOpsList False code <> semi))+ (\parameter -> "parameter" <+> renderDoc needsParens parameter <> semi)+ (\storage -> "storage" <+> renderDoc needsParens storage <> semi)+ (\code -> "code" <+> PP.align (renderDoc doesntNeedParens code <> semi)) (\View{..} -> PP.group $ "view" <+> PP.align ( PP.sep [ renderViewName viewName , renderDoc needsParens viewArgument , renderDoc needsParens viewReturn ]- PP.<$> renderOpsList False viewCode <> semi- ))--instance RenderDoc op => Buildable (Contract' op) where- build = buildRenderDoc---- | Map all the instructions appearing in the contract.-mapContractCode :: (op -> op) -> Contract' op -> Contract' op-mapContractCode f = fmap f-{-# DEPRECATED mapContractCode "Use fmap instead" #-}+ PP.<$> renderDoc doesntNeedParens viewCode <> semi+ )) deriveJSON morleyAesonOptions ''Contract'
src/Morley/Michelson/Untyped/Entrypoints.hs view
@@ -18,14 +18,13 @@ import Data.Aeson.TH (deriveJSON) import Data.Map qualified as Map-import Fmt (Buildable(..), pretty)+import Fmt (Buildable(..), pretty, (<+>))+import Prettyprinter (enclose) -import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDoc, renderAnyBuildable) import Morley.Michelson.Untyped.Annotation import Morley.Michelson.Untyped.Type import Morley.Util.Aeson import Morley.Util.CLI-import Text.PrettyPrint.Leijen.Text (enclose, (<+>)) -- | Entrypoint name. --@@ -109,12 +108,9 @@ instance NFData EpNameFromRefAnnError instance Buildable EpNameFromRefAnnError where- build = buildRenderDoc--instance RenderDoc EpNameFromRefAnnError where- renderDoc _ = \case+ build = \case InEpNameBadAnnotation (Annotation an) ->- "Invalid entrypoint reference" <+> (enclose "`" "`" $ renderAnyBuildable an)+ "Invalid entrypoint reference" <+> enclose "`" "`" (build an) -- | Make up 'EpName' from annotation which is reference to an entrypoint. -- Note that it's more common for Michelson to prohibit explicit @default@
src/Morley/Michelson/Untyped/Ext.hs view
@@ -15,13 +15,16 @@ ) where import Data.Aeson.TH (deriveJSON)+import Data.Aeson.Types+ (FromJSON(..), ToJSON(..), genericParseJSON, genericToEncoding, genericToJSON) import Data.Data (Data(..)) import Data.Set qualified as Set import Data.Text qualified as T-import Fmt (Buildable(build), Builder, GenericBuildable(..), listF)-import Text.PrettyPrint.Leijen.Text (textStrict)+import Fmt (Buildable(build), Doc, blockListF, blockMapF, listF, nameF)+import Prettyprinter (align, enclose) import Morley.Michelson.Printer.Util (RenderDoc(..))+import Morley.Michelson.Untyped.HoistInstr import Morley.Michelson.Untyped.Type import Morley.Util.Aeson @@ -35,21 +38,28 @@ -- Additionaly, some implementation-specific language features such as -- type-checking of @LetMacro@s are implemented using this mechanism -- (specifically @FN@ and @FN_END@).-data ExtInstrAbstract op =+data ExtInstrAbstract f op = STACKTYPE StackTypePattern -- ^ Matches current stack against a type-pattern- | UTEST_ASSERT (TestAssert op) -- ^ Copy the current stack and run an inline assertion on it+ | UTEST_ASSERT (TestAssert f op) -- ^ Copy the current stack and run an inline assertion on it | UPRINT PrintComment -- ^ Print a comment with optional embedded @StackRef@s | UCOMMENT Text -- ^ A comment in Michelson code deriving stock (Eq, Show, Data, Generic, Functor) -deriving via GenericBuildable (ExtInstrAbstract op) instance Buildable op => Buildable (ExtInstrAbstract op)+instance HoistInstr ExtInstrAbstract where+ hoistInstr f = \case+ STACKTYPE x -> STACKTYPE x+ UTEST_ASSERT x -> UTEST_ASSERT $ hoistInstr f x+ UPRINT x -> UPRINT x+ UCOMMENT x -> UCOMMENT x -instance NFData op => NFData (ExtInstrAbstract op)+instance (Foldable f, Buildable op) => Buildable (ExtInstrAbstract f op) -instance RenderDoc (ExtInstrAbstract op) where+instance NFData (f op) => NFData (ExtInstrAbstract f op)++instance RenderDoc (ExtInstrAbstract f op) where renderDoc _ = \case- UCOMMENT t -> textStrict ("/* " <> t <> " */")+ UCOMMENT t -> enclose "/* " " */" $ align $ build t _ -> mempty isRenderable = \case@@ -68,7 +78,7 @@ -- | A (named) type variable newtype Var = Var T.Text deriving stock (Eq, Show, Ord, Data, Generic)- deriving Buildable via GenericBuildable Var+ deriving anyclass Buildable instance NFData Var @@ -77,7 +87,7 @@ VarID Var | TyCon Ty deriving stock (Eq, Show, Data, Generic)- deriving Buildable via GenericBuildable TyVar+ deriving anyclass Buildable instance NFData TyVar @@ -102,7 +112,7 @@ instance Buildable StackTypePattern where build = listF . pairToList . stackTypePatternToList where- pairToList :: ([TyVar], Bool) -> [Builder]+ pairToList :: ([TyVar], Bool) -> [Doc] pairToList (types, fixed) | fixed = map build types | otherwise = map build types ++ ["..."]@@ -126,25 +136,45 @@ build = foldMap (either build build) . unUPrintComment -- | An inline test assertion-data TestAssert op = TestAssert+data TestAssert f (op :: Type) = TestAssert { tassName :: T.Text , tassComment :: PrintComment- , tassInstrs :: [op]+ , tassInstrs :: f op } deriving stock (Eq, Show, Functor, Data, Generic) -instance NFData op => NFData (TestAssert op)+instance HoistInstr TestAssert where+ hoistInstr f TestAssert{..} = TestAssert{tassInstrs = f tassInstrs, ..} -deriving via GenericBuildable (TestAssert op) instance Buildable op => Buildable (TestAssert op)+instance NFData (f op) => NFData (TestAssert f op) +instance (Foldable f, Buildable op) => Buildable (TestAssert f op) where+ build (TestAssert name comment instrs) =+ nameF "TestAssert" $ blockMapF+ [ ("Name" :: Text, build name)+ , ("Comment", build comment)+ , ("Instrs", blockListF instrs)+ ] + ------------------------------------- -- Aeson instances ------------------------------------- deriveJSON morleyAesonOptions ''StackRef deriveJSON morleyAesonOptions ''PrintComment-deriveJSON morleyAesonOptions ''TestAssert++instance FromJSON (f op) => FromJSON (TestAssert f op) where+ parseJSON = genericParseJSON morleyAesonOptions+instance ToJSON (f op) => ToJSON (TestAssert f op) where+ toJSON = genericToJSON morleyAesonOptions+ toEncoding = genericToEncoding morleyAesonOptions+ deriveJSON morleyAesonOptions ''Var deriveJSON morleyAesonOptions ''TyVar deriveJSON morleyAesonOptions ''StackTypePattern-deriveJSON morleyAesonOptions ''ExtInstrAbstract++instance FromJSON (f op) => FromJSON (ExtInstrAbstract f op) where+ parseJSON = genericParseJSON morleyAesonOptions+instance ToJSON (f op) => ToJSON (ExtInstrAbstract f op) where+ toJSON = genericToJSON morleyAesonOptions+ toEncoding = genericToEncoding morleyAesonOptions
+ src/Morley/Michelson/Untyped/HoistInstr.hs view
@@ -0,0 +1,10 @@+-- SPDX-FileCopyrightText: 2023 Oxhead Alpha+-- SPDX-License-Identifier: LicenseRef-MIT-OA++module Morley.Michelson.Untyped.HoistInstr+ ( HoistInstr(..)+ ) where++-- | Helper class used to change underlying sequence functor in instructions.+class HoistInstr n where+ hoistInstr :: (f a -> g a) -> n f a -> n g a
src/Morley/Michelson/Untyped/Instr.hs view
@@ -13,20 +13,22 @@ import Prelude hiding (EQ, GT, LT, group) import Data.Aeson.TH (deriveJSON)+import Data.Aeson.Types+ (FromJSON(..), ToJSON(..), genericParseJSON, genericToEncoding, genericToJSON) import Data.Data (Data(..))-import Fmt (Buildable(build), (+|), (|+))+import Fmt (Buildable(build), Doc, isEmpty, (+|), (<+>), (|+)) import Generics.SYB (everywhere, mkT)-import Text.PrettyPrint.Leijen.Text (Doc, align, braces, enclose, group, integer, space, (<+>))-import Text.PrettyPrint.Leijen.Text qualified as PP+import Prettyprinter (align, braces, enclose, group, space)+import Prettyprinter qualified as PP import Morley.Michelson.ErrorPos (ErrorSrcPos)-import Morley.Michelson.Printer.Util- (RenderDoc(..), buildRenderDoc, doesntNeedParens, needsParens, renderOpsList)+import Morley.Michelson.Printer.Util (RenderDoc(..), doesntNeedParens, needsParens, renderOpsList) import Morley.Michelson.Untyped.Annotation (Annotation, AnyAnn, FieldAnn, KnownAnnTag, TypeAnn, VarAnn, fullAnnSet, renderAnyAnns, singleAnnSet) import Morley.Michelson.Untyped.Contract (Contract'(..))-import Morley.Michelson.Untyped.Ext (ExtInstrAbstract)+import Morley.Michelson.Untyped.Ext+import Morley.Michelson.Untyped.HoistInstr import Morley.Michelson.Untyped.Type (Ty) import Morley.Michelson.Untyped.Value (Value'(..)) import Morley.Michelson.Untyped.View@@ -36,7 +38,7 @@ -- Types after macroexpander ------------------------------------- -type ExpandedInstr = InstrAbstract ExpandedOp+type ExpandedInstr = InstrAbstract [] ExpandedOp data ExpandedOp = PrimEx ExpandedInstr@@ -85,13 +87,131 @@ -- Abstract instruction ------------------------------------- +instance HoistInstr InstrAbstract where+ hoistInstr f = \case+ EXT x -> EXT $ hoistInstr f x+ IF_NONE l r -> IF_NONE (f l) (f r)+ IF_LEFT l r -> IF_LEFT (f l) (f r)+ IF_CONS l r -> IF_CONS (f l) (f r)+ MAP ann r -> MAP ann (f r)+ ITER l -> ITER (f l)+ IF l r -> IF (f l) (f r)+ LOOP l -> LOOP (f l)+ LOOP_LEFT l -> LOOP_LEFT (f l)+ LAMBDA ann tl tr r -> LAMBDA ann tl tr (f r)+ LAMBDA_REC ann tl tr r -> LAMBDA_REC ann tl tr (f r)+ DIP l -> DIP (f l)+ DIPN w r -> DIPN w (f r)+ PUSH va x y -> PUSH va x $ hoistInstr f y+ ---+ DROPN va -> DROPN va+ DROP -> DROP+ DUP va -> DUP va+ DUPN va x -> DUPN va x+ SWAP -> SWAP+ DIG va -> DIG va+ DUG va -> DUG va+ SOME va x -> SOME va x+ NONE va x y -> NONE va x y+ UNIT va x -> UNIT va x+ PAIR va x y z -> PAIR va x y z+ UNPAIR va x y z -> UNPAIR va x y z+ PAIRN va x -> PAIRN va x+ UNPAIRN va -> UNPAIRN va+ CAR va x -> CAR va x+ CDR va x -> CDR va x+ LEFT va x y z w -> LEFT va x y z w+ RIGHT va x y z w -> RIGHT va x y z w+ NIL va x y -> NIL va x y+ CONS va -> CONS va+ SIZE va -> SIZE va+ EMPTY_SET va x y -> EMPTY_SET va x y+ EMPTY_MAP va x y z -> EMPTY_MAP va x y z+ EMPTY_BIG_MAP va x y z -> EMPTY_BIG_MAP va x y z+ MEM va -> MEM va+ GET va -> GET va+ GETN va x -> GETN va x+ UPDATE va -> UPDATE va+ UPDATEN va x -> UPDATEN va x+ GET_AND_UPDATE va -> GET_AND_UPDATE va+ EXEC va -> EXEC va+ APPLY va -> APPLY va+ FAILWITH -> FAILWITH+ CAST va x -> CAST va x+ RENAME va -> RENAME va+ PACK va -> PACK va+ UNPACK va x y -> UNPACK va x y+ CONCAT va -> CONCAT va+ SLICE va -> SLICE va+ ISNAT va -> ISNAT va+ ADD va -> ADD va+ SUB va -> SUB va+ SUB_MUTEZ va -> SUB_MUTEZ va+ MUL va -> MUL va+ EDIV va -> EDIV va+ ABS va -> ABS va+ NEG va -> NEG va+ LSL va -> LSL va+ LSR va -> LSR va+ OR va -> OR va+ AND va -> AND va+ XOR va -> XOR va+ NOT va -> NOT va+ COMPARE va -> COMPARE va+ EQ va -> EQ va+ NEQ va -> NEQ va+ LT va -> LT va+ GT va -> GT va+ LE va -> LE va+ GE va -> GE va+ INT va -> INT va+ VIEW va x y -> VIEW va x y+ SELF va x -> SELF va x+ CONTRACT va x y -> CONTRACT va x y+ TRANSFER_TOKENS va -> TRANSFER_TOKENS va+ SET_DELEGATE va -> SET_DELEGATE va+ CREATE_CONTRACT va x y -> CREATE_CONTRACT va x y+ IMPLICIT_ACCOUNT va -> IMPLICIT_ACCOUNT va+ NOW va -> NOW va+ AMOUNT va -> AMOUNT va+ BALANCE va -> BALANCE va+ VOTING_POWER va -> VOTING_POWER va+ TOTAL_VOTING_POWER va -> TOTAL_VOTING_POWER va+ CHECK_SIGNATURE va -> CHECK_SIGNATURE va+ SHA256 va -> SHA256 va+ SHA512 va -> SHA512 va+ BLAKE2B va -> BLAKE2B va+ SHA3 va -> SHA3 va+ KECCAK va -> KECCAK va+ HASH_KEY va -> HASH_KEY va+ PAIRING_CHECK va -> PAIRING_CHECK va+ SOURCE va -> SOURCE va+ SENDER va -> SENDER va+ ADDRESS va -> ADDRESS va+ CHAIN_ID va -> CHAIN_ID va+ LEVEL va -> LEVEL va+ SELF_ADDRESS va -> SELF_ADDRESS va+ NEVER -> NEVER+ TICKET va -> TICKET va+ TICKET_DEPRECATED va -> TICKET_DEPRECATED va+ READ_TICKET va -> READ_TICKET va+ SPLIT_TICKET va -> SPLIT_TICKET va+ JOIN_TICKETS va -> JOIN_TICKETS va+ OPEN_CHEST va -> OPEN_CHEST va+ SAPLING_EMPTY_STATE va x -> SAPLING_EMPTY_STATE va x+ SAPLING_VERIFY_UPDATE va -> SAPLING_VERIFY_UPDATE va+ MIN_BLOCK_TIME va -> MIN_BLOCK_TIME va+ EMIT va x y -> EMIT va x y+ BYTES va -> BYTES va+ NAT va -> NAT va+ -- | Michelson instruction with abstract parameter @op@. This -- parameter is necessary, because at different stages of our pipeline -- it will be different. Initially it can contain macros and -- non-flattened instructions, but then it contains only vanilla -- Michelson instructions.-data InstrAbstract op- = EXT (ExtInstrAbstract op)+data InstrAbstract f op+ = EXT (ExtInstrAbstract f op) | DROPN Word -- ^ "DROP n" instruction. -- Note: reference implementation permits int16 here.@@ -111,11 +231,11 @@ | SWAP | DIG Word | DUG Word- | PUSH VarAnn Ty (Value' op)+ | PUSH VarAnn Ty (Value' f op) | SOME TypeAnn VarAnn | NONE TypeAnn VarAnn Ty | UNIT TypeAnn VarAnn- | IF_NONE [op] [op]+ | IF_NONE (f op) (f op) | PAIR TypeAnn VarAnn FieldAnn FieldAnn | UNPAIR VarAnn VarAnn FieldAnn FieldAnn | PAIRN VarAnn Word@@ -124,31 +244,31 @@ | CDR VarAnn FieldAnn | LEFT TypeAnn VarAnn FieldAnn FieldAnn Ty | RIGHT TypeAnn VarAnn FieldAnn FieldAnn Ty- | IF_LEFT [op] [op]+ | IF_LEFT (f op) (f op) | NIL TypeAnn VarAnn Ty | CONS VarAnn- | IF_CONS [op] [op]+ | IF_CONS (f op) (f op) | SIZE VarAnn | EMPTY_SET TypeAnn VarAnn Ty | EMPTY_MAP TypeAnn VarAnn Ty Ty | EMPTY_BIG_MAP TypeAnn VarAnn Ty Ty- | MAP VarAnn [op]- | ITER [op]+ | MAP VarAnn (f op)+ | ITER (f op) | MEM VarAnn | GET VarAnn | GETN VarAnn Word | UPDATE VarAnn | UPDATEN VarAnn Word | GET_AND_UPDATE VarAnn- | IF [op] [op]- | LOOP [op]- | LOOP_LEFT [op]- | LAMBDA VarAnn Ty Ty [op]- | LAMBDA_REC VarAnn Ty Ty [op]+ | IF (f op) (f op)+ | LOOP (f op)+ | LOOP_LEFT (f op)+ | LAMBDA VarAnn Ty Ty (f op)+ | LAMBDA_REC VarAnn Ty Ty (f op) | EXEC VarAnn | APPLY VarAnn- | DIP [op]- | DIPN Word [op]+ | DIP (f op)+ | DIPN Word (f op) | FAILWITH | CAST VarAnn Ty | RENAME VarAnn@@ -219,18 +339,18 @@ | NAT VarAnn deriving stock (Eq, Functor, Data, Generic, Show) -instance NFData op => NFData (InstrAbstract op)+instance (NFData op, NFData (f op)) => NFData (InstrAbstract f op) -instance (RenderDoc op) => RenderDoc (InstrAbstract op) where+instance (RenderDoc op, Foldable f) => RenderDoc (InstrAbstract f op) where renderDoc pn = \case EXT extInstr -> renderDoc pn extInstr DROP -> "DROP"- DROPN n -> "DROP" <+> integral n+ DROPN n -> "DROP" <+> build n DUP va -> "DUP" <+> renderAnnot va- DUPN va n -> "DUP" <+> renderAnnot va <+> integral n+ DUPN va n -> "DUP" <+> renderAnnot va <+> build n SWAP -> "SWAP"- DIG n -> "DIG" <+> integral n- DUG n -> "DUG" <+> integral n+ DIG n -> "DIG" <+> build n+ DUG n -> "DUG" <+> build n PUSH va t v -> renderArgs "PUSH" (renderAnnot va) [renderTy t, renderDoc needsParens v] SOME ta va -> "SOME" <+> renderAnnots [ta] [] [va]@@ -239,8 +359,8 @@ IF_NONE x y -> renderArgs "IF_NONE" mempty [renderOps x, renderOps y] PAIR ta va fa1 fa2 -> "PAIR" <+> renderAnnots [ta] [fa1, fa2] [va] UNPAIR va1 va2 fa1 fa2 -> "UNPAIR" <+> renderAnnots [] [fa1, fa2] [va1, va2]- PAIRN va n -> "PAIR" <+> renderAnnots [] [] [va] <+> integral n- UNPAIRN n -> "UNPAIR" <+> integral n+ PAIRN va n -> "PAIR" <+> renderAnnots [] [] [va] <+> build n+ UNPAIRN n -> "UNPAIR" <+> build n CAR va fa -> "CAR" <+> renderAnnots [] [fa] [va] CDR va fa -> "CDR" <+> renderAnnots [] [fa] [va] LEFT ta va fa1 fa2 t -> renderArgs "LEFT" (renderAnnots [ta] [fa1, fa2] [va]) [renderTy t]@@ -259,9 +379,9 @@ ITER s -> renderArgs "ITER" mempty [renderOps s] MEM va -> "MEM" <+> renderAnnot va GET va -> "GET" <+> renderAnnot va- GETN va n -> "GET" <+> renderAnnot va <+> integral n+ GETN va n -> "GET" <+> renderAnnot va <+> build n UPDATE va -> "UPDATE" <+> renderAnnot va- UPDATEN va n -> "UPDATE" <+> renderAnnot va <+> integral n+ UPDATEN va n -> "UPDATE" <+> renderAnnot va <+> build n GET_AND_UPDATE va -> "GET_AND_UPDATE" <+> renderAnnot va IF x y -> renderArgs "IF" mempty [renderOps x, renderOps y] LOOP s -> renderArgs "LOOP" mempty [renderOps s]@@ -273,7 +393,7 @@ EXEC va -> "EXEC" <+> renderAnnot va APPLY va -> "APPLY" <+> renderAnnot va DIP s -> renderArgs "DIP" mempty [renderOps s]- DIPN n s -> renderArgs "DIP" mempty [integral n, renderOps s]+ DIPN n s -> renderArgs "DIP" mempty [build n, renderOps s] FAILWITH -> "FAILWITH" CAST va t -> renderArgs "CAST" (renderAnnot va) [renderTy t] RENAME va -> "RENAME" <+> renderAnnot va@@ -341,7 +461,7 @@ OPEN_CHEST va -> "OPEN_CHEST" <+> renderAnnot va EMIT va fa ty -> renderArgs "EMIT" (renderAnnots [] [fa] [va]) $ maybeToList $ renderTy <$> ty- SAPLING_EMPTY_STATE va n -> "SAPLING_EMPTY_STATE" <+> renderAnnot va <+> integral n+ SAPLING_EMPTY_STATE va n -> "SAPLING_EMPTY_STATE" <+> renderAnnot va <+> build n SAPLING_VERIFY_UPDATE va -> "SAPLING_VERIFY_UPDATE" <+> renderAnnot va MIN_BLOCK_TIME anns -> "MIN_BLOCK_TIME" <+> renderAnyAnns anns BYTES va -> "BYTES" <+> renderAnnot va@@ -357,28 +477,31 @@ renderAnnots :: [TypeAnn] -> [FieldAnn] -> [VarAnn] -> Doc renderAnnots ts fs vs = renderDoc doesntNeedParens $ fullAnnSet ts fs vs - integral :: Integral a => a -> Doc- integral = integer . toInteger- renderArgs :: Text -> Doc -> [Doc] -> Doc renderArgs name annots args- | PP.isEmpty annots && length name <= 3- = group $ PP.textStrict name <+> annots <+> PP.align (PP.vsep args)+ | isEmpty annots && length name <= 3+ = group $ build name <+> annots <+> PP.align (PP.vsep args) | otherwise- = group $ PP.hang 2 $ PP.vsep $ PP.textStrict name <+> annots : args+ = group $ PP.hang 2 $ PP.vsep $ build name <+> annots : args isRenderable = \case EXT extInstr -> isRenderable extInstr _ -> True -instance (RenderDoc op, Buildable op) => Buildable (InstrAbstract op) where+instance (Foldable f, RenderDoc op, Buildable op)+ => Buildable (InstrAbstract f op) where build = \case EXT ext -> build ext- mi -> buildRenderDoc mi+ mi -> group $ renderDoc doesntNeedParens mi ---------------------------------------------------------------------------- -- JSON serialization ---------------------------------------------------------------------------- -deriveJSON morleyAesonOptions ''InstrAbstract+instance (FromJSON op, FromJSON (f op)) => FromJSON (InstrAbstract f op) where+ parseJSON = genericParseJSON morleyAesonOptions+instance (ToJSON op, ToJSON (f op)) => ToJSON (InstrAbstract f op) where+ toJSON = genericToJSON morleyAesonOptions+ toEncoding = genericToEncoding morleyAesonOptions+ deriveJSON morleyAesonOptions ''ExpandedOp
src/Morley/Michelson/Untyped/Type.hs view
@@ -39,15 +39,12 @@ import Data.Aeson.TH (deriveJSON) import Data.Data (Data(..)) import Data.List.NonEmpty ((<|))-import Fmt (Buildable(build))+import Fmt (Buildable(..), Doc, isEmpty, (<+>)) import Language.Haskell.TH.Syntax (Lift) import Prelude hiding ((<$>))-import Text.PrettyPrint.Leijen.Text (Doc, integer, (<+>))-import Text.PrettyPrint.Leijen.Text qualified as PP+import Prettyprinter qualified as PP import Morley.Michelson.Printer.Util- (Prettier(..), RenderContext, RenderDoc(..), addParens, buildRenderDoc, buildRenderDocExtended,- doesntNeedParens, needsParens, wrapInParens) import Morley.Michelson.Untyped.Annotation (AnnotationSet, FieldAnn, RootAnn, TypeAnn, VarAnn, emptyAnnSet, fullAnnSet, noAnn, pattern Annotation, singleAnnSet)@@ -59,25 +56,20 @@ data Ty = Ty ~T TypeAnn deriving stock (Eq, Show, Data, Generic, Lift)+ deriving anyclass NFData -- | Extract a raw Michelson type from an annotated one unwrapT :: Ty -> T unwrapT (Ty t _) = t -instance NFData Ty--instance RenderDoc (Prettier Ty) where- renderDoc pn (Prettier w) = case w of- (Ty t ta) -> renderType t False pn (singleAnnSet ta)- instance RenderDoc Ty where- renderDoc pn (Ty t ta) = renderType t True pn (singleAnnSet ta)+ renderDoc pn (Ty t ta) = renderType t pn (singleAnnSet ta) -instance RenderDoc (MismatchError Ty) where- renderDoc ctx = renderDocDiff ctx . fmap Prettier+instance Buildable (MismatchError Ty) where+ build = buildDocDiff instance RenderDoc T where- renderDoc pn t = renderType t True pn emptyAnnSet+ renderDoc pn t = renderType t pn emptyAnnSet -- | Since Babylon parameter type can have special root annotation. data ParameterType = ParameterType Ty RootAnn@@ -85,14 +77,9 @@ instance NFData ParameterType -instance RenderDoc (Prettier ParameterType) where- renderDoc pn (Prettier w) = case w of- ParameterType (Ty t ta) ra ->- renderType t False pn (fullAnnSet [ta] [ra] [])- instance RenderDoc ParameterType where renderDoc pn (ParameterType (Ty t ta) ra) =- renderType t True pn (fullAnnSet [ta] [ra] [])+ renderType t pn (fullAnnSet [ta] [ra] []) -- | Render a type representation --@@ -108,18 +95,17 @@ -- > PAIR %x %y :t @my_pair renderType :: T- -> Bool -> RenderContext -> AnnotationSet -> Doc-renderType t forceSingleLine pn annSet =+renderType t pn annSet = let annDoc = renderDoc doesntNeedParens annSet- recRenderer t' annSet' = renderType t' forceSingleLine needsParens annSet'+ recRenderer t' annSet' = renderType t' needsParens annSet' renderParametric :: Text -> [Doc] -> Doc renderParametric name args = PP.group $- if PP.isEmpty annDoc && length name < 3- then addParens pn $ PP.textStrict name <+> PP.align (PP.vsep args)- else PP.hang 2 $ addParens pn $ PP.vsep $ PP.textStrict name <+> annDoc : args+ if isEmpty annDoc && length name < 3+ then addParens pn $ build name <+> PP.align (PP.vsep args)+ else PP.hang 2 $ addParens pn $ PP.vsep $ build name <+> annDoc : args collectBranches :: T -> TypeAnn -> FieldAnn -> NonEmpty Doc collectBranches (TPair fa1 fa2 va1 _ (Ty t1 ta1) (Ty t2 ta2)) _ (Annotation "")@@ -148,8 +134,8 @@ TChest -> wrapInParens pn $ "chest" :| [annDoc] TChestKey -> wrapInParens pn $ "chest_key" :| [annDoc] TNever -> wrapInParens pn $ "never" :| [annDoc]- TSaplingState n -> addParens pn $ "sapling_state" <+> annDoc <+> (integer $ toInteger n)- TSaplingTransaction n -> addParens pn $ "sapling_transaction" <+> annDoc <+> (integer $ toInteger n)+ TSaplingState n -> addParens pn $ "sapling_state" <+> annDoc <+> build n+ TSaplingTransaction n -> addParens pn $ "sapling_transaction" <+> annDoc <+> build n TOption (Ty t1 ta1) -> renderParametric "option" [recRenderer t1 (singleAnnSet ta1)]@@ -201,15 +187,6 @@ , recRenderer t2 $ singleAnnSet ta2 ] -instance Buildable Ty where- build = buildRenderDoc--instance Buildable (MismatchError Ty) where- build = buildRenderDocExtended--instance Buildable ParameterType where- build = buildRenderDoc- -- | Michelson Type data T = TKey@@ -245,11 +222,7 @@ | TSaplingTransaction Natural | TNever deriving stock (Eq, Show, Data, Generic, Lift)--instance Buildable T where- build = buildRenderDoc--instance NFData T+ deriving anyclass NFData -- | Construct non-annotated @option@ type from an annotated type toption :: Ty -> T
src/Morley/Michelson/Untyped/Value.hs view
@@ -9,7 +9,6 @@ -- Internal types to avoid orphan instances , InternalByteString(..) , unInternalByteString- , linearizeRightCombValuePair , renderValuesList , renderSome , renderNone@@ -22,50 +21,71 @@ import Prelude hiding (group) import Data.Aeson (FromJSON(..), ToJSON(..), withText)-import Data.Aeson.TH (deriveJSON)+import Data.Aeson.Types (genericParseJSON, genericToEncoding, genericToJSON) import Data.Data (Data(..))-import Data.List.NonEmpty ((<|))-import Fmt (Buildable(build))+import Fmt (Doc, build, hexF, (<+>))+import Fmt qualified as PP ((<$>))+import Prettyprinter+ (align, dquotes, encloseSep, group, hang, lbrace, rbrace, semi, sep, softline, space) import Text.Hex (decodeHex, encodeHex)-import Text.PrettyPrint.Leijen.Text- (Doc, align, dquotes, encloseSep, group, hang, lbrace, rbrace, semi, sep, softline, space, text,- textStrict, (<+>))-import Text.PrettyPrint.Leijen.Text qualified as PP import Morley.Michelson.Printer.Util- (RenderContext, RenderDoc(..), addParensMultiline, buildRenderDoc, doesntNeedParens, needsParens,- renderOps) import Morley.Michelson.Text+import Morley.Michelson.Untyped.HoistInstr import Morley.Util.Aeson -data Value' op =+data Value' f op = ValueInt Integer | ValueString MText | ValueBytes InternalByteString | ValueUnit | ValueTrue | ValueFalse- | ValuePair (Value' op) (Value' op)- | ValueLeft (Value' op)- | ValueRight (Value' op)- | ValueSome (Value' op)+ | ValuePair (Value' f op) (Value' f op)+ | ValueLeft (Value' f op)+ | ValueRight (Value' f op)+ | ValueSome (Value' f op) | ValueNone | ValueNil- | ValueSeq (NonEmpty $ Value' op)+ | ValueSeq (NonEmpty $ Value' f op) -- ^ A sequence of elements: can be a list, a set or a pair. -- We can't distinguish lists and sets during parsing.- | ValueMap (NonEmpty $ Elt op)- | ValueLambda (NonEmpty op)- | ValueLamRec (NonEmpty op)+ | ValueMap (NonEmpty $ Elt f op)+ | ValueLambda (f op)+ -- ^ Invariant: contains non-empty list of instructions. For an empty list,+ -- use 'ValueNil'.+ | ValueLamRec (f op) deriving stock (Eq, Show, Functor, Data, Generic) -instance NFData op => NFData (Value' op)+instance HoistInstr Value' where+ hoistInstr f = \case+ ValueInt n -> ValueInt n+ ValueString t -> ValueString t+ ValueBytes bs -> ValueBytes bs+ ValueUnit -> ValueUnit+ ValueTrue -> ValueTrue+ ValueFalse -> ValueFalse+ ValueNone -> ValueNone+ ValueNil -> ValueNil+ ValuePair l r -> ValuePair (hoistInstr f l) (hoistInstr f r)+ ValueLeft l -> ValueLeft $ hoistInstr f l+ ValueRight l -> ValueRight $ hoistInstr f l+ ValueSome l -> ValueSome $ hoistInstr f l+ ValueSeq vs -> ValueSeq $ hoistInstr f <$> vs+ ValueMap els -> ValueMap $ hoistInstr f <$> els+ ValueLambda ops -> ValueLambda $ f ops+ ValueLamRec ops -> ValueLamRec $ f ops -data Elt op = Elt (Value' op) (Value' op)+instance NFData (f op) => NFData (Value' f op)++data Elt f op = Elt (Value' f op) (Value' f op) deriving stock (Eq, Show, Functor, Data, Generic) -instance NFData op => NFData (Elt op)+instance HoistInstr Elt where+ hoistInstr f (Elt l r) = Elt (hoistInstr f l) (hoistInstr f r) +instance NFData (f op) => NFData (Elt f op)+ -- | ByteString does not have an instance for ToJSON and FromJSON, to -- avoid orphan type class instances, make a new type wrapper around it. newtype InternalByteString = InternalByteString ByteString@@ -76,13 +96,13 @@ unInternalByteString :: InternalByteString -> ByteString unInternalByteString (InternalByteString bs) = bs -instance RenderDoc op => RenderDoc (Value' op) where+instance (Foldable f, RenderDoc op) => RenderDoc (Value' f op) where renderDoc pn = \case ValueNil -> "{ }"- ValueInt x -> text . show $ x- ValueString x -> dquotes (textStrict $ writeMText x)- ValueBytes xs -> "0x" <> (textStrict . encodeHex . unInternalByteString $ xs)+ ValueInt x -> build x+ ValueString x -> dquotes (build $ writeMText x)+ ValueBytes xs -> "0x" <> (hexF . unInternalByteString $ xs) ValueUnit -> "Unit" ValueTrue -> "True" ValueFalse -> "False"@@ -93,8 +113,8 @@ ValueNone -> renderNone ValueSeq xs -> renderValuesList (renderDoc doesntNeedParens) xs ValueMap xs -> renderValuesList renderElt xs- ValueLambda xs -> renderOps False xs- ValueLamRec xs -> "Lambda_rec" <+> PP.align (renderOps False xs)+ ValueLambda xs -> renderOpsList False xs+ ValueLamRec xs -> "Lambda_rec" <+> align (renderOpsList False xs) -- | Helper function to render @None@ @Value@ renderNone :: Doc@@ -119,18 +139,10 @@ renderElt' :: (RenderContext -> Doc) -> (RenderContext -> Doc) -> Doc renderElt' l r = "Elt" <+> l needsParens <+> r needsParens --- | Converts @Pair a (Pair b c)@ to @[a, b, c]@.-linearizeRightCombValuePair :: (Value' op) -> NonEmpty (Value' op)-linearizeRightCombValuePair (ValuePair l r) = l <| linearizeRightCombValuePair r-linearizeRightCombValuePair v = v :| []-{-# DEPRECATED linearizeRightCombValuePair- "This transformation is not necessarily valid. \- \The correct way to go about this is typecheck then print optimized representation." #-}--renderElt :: RenderDoc op => Elt op -> Doc+renderElt :: (Foldable f, RenderDoc op) => Elt f op -> Doc renderElt (Elt k v) = renderElt' (flip renderDoc k) (flip renderDoc v) -instance RenderDoc op => RenderDoc (Elt op) where+instance (Foldable f, RenderDoc op) => RenderDoc (Elt f op) where renderDoc _ = renderElt -- | A helper function that renders a 'NonEmpty' list of items in Michelson-readable format,@@ -140,12 +152,6 @@ align $ encloseSep (lbrace <> space) (softline <> rbrace) (semi <> space) $ renderElem <$> es -instance (RenderDoc op) => Buildable (Value' op) where- build = buildRenderDoc--instance (RenderDoc op) => Buildable (Elt op) where- build = buildRenderDoc- ---------------------------------------------------------------------------- -- JSON serialization ----------------------------------------------------------------------------@@ -163,7 +169,15 @@ Nothing -> fail "Invalid hex encoding" Just res -> pure (InternalByteString res) -$(mconcat- [ deriveJSON morleyAesonOptions ''Value'- , deriveJSON morleyAesonOptions ''Elt- ])++instance FromJSON (f op) => FromJSON (Value' f op) where+ parseJSON = genericParseJSON morleyAesonOptions+instance ToJSON (f op) => ToJSON (Value' f op) where+ toJSON = genericToJSON morleyAesonOptions+ toEncoding = genericToEncoding morleyAesonOptions++instance FromJSON (f op) => FromJSON (Elt f op) where+ parseJSON = genericParseJSON morleyAesonOptions+instance ToJSON (f op) => ToJSON (Elt f op) where+ toJSON = genericToJSON morleyAesonOptions+ toEncoding = genericToEncoding morleyAesonOptions
src/Morley/Michelson/Untyped/View.hs view
@@ -12,7 +12,7 @@ , viewNameToMText , View' (..)- , ViewsSet (..)+ , ViewsSet (.., UnsafeViewsSet) , mkViewsSet , VS.ViewsSetError (..) @@ -42,7 +42,7 @@ -- ^ View argument type , viewReturn :: Ty -- ^ View return type- , viewCode :: [op]+ , viewCode :: op -- ^ View code } deriving stock (Eq, Show, Functor, Data, Generic) @@ -50,9 +50,14 @@ deriveJSON morleyAesonOptions ''View' -newtype ViewsSet instr = UnsafeViewsSet { unViewsSet :: Map ViewName (View' instr) }+newtype ViewsSet instr = ViewsSet { unViewsSet :: Map ViewName (View' instr) } deriving newtype (FromJSON, ToJSON, Default, NFData, Container) deriving stock (Eq, Show, Data, Functor)++pattern UnsafeViewsSet :: Map ViewName (View' instr) -> ViewsSet instr+pattern UnsafeViewsSet x = ViewsSet x+{-# COMPLETE UnsafeViewsSet #-}+{-# DEPRECATED UnsafeViewsSet "Use ViewsSet instead" #-} mkViewsSet :: [View' instr] -> Either VS.ViewsSetError (ViewsSet instr) mkViewsSet = coerce ... VS.mkViewsSet viewName
src/Morley/Tezos/Address.hs view
@@ -60,15 +60,14 @@ import Data.Some (Some(..)) import Data.Text (strip) import Data.Type.Equality (testEquality, (:~:)(..))-import Fmt (Buildable(build), hexF, pretty)+import Fmt (Buildable(build), hexF, nameF, pretty, unwordsF, (<+>)) import Instances.TH.Lift () import Language.Haskell.TH.Quote qualified as TH import Language.Haskell.TH.Syntax (Lift) import Language.Haskell.TH.Syntax qualified as TH import Options.Applicative (ReadM)-import Text.PrettyPrint.Leijen.Text (backslash, dquotes, int, (<+>))+import Prettyprinter (backslash, dquotes) -import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDoc, renderAnyBuildable) import Morley.Michelson.Text import Morley.Tezos.Address.Kinds import Morley.Tezos.Crypto@@ -240,18 +239,14 @@ instance NFData ParseAddressError instance Buildable ParseAddressError where- build = buildRenderDoc--instance RenderDoc ParseAddressError where- renderDoc context =- \case- ParseAddressCryptoError pkErr -> "Address failed to parse: " <> renderDoc context pkErr- ParseAddressWrongKind expected (Constrained a) -> mconcat- [ "Expected address of kind ", renderAddressKinds expected- , ", but got ", renderAnyBuildable a- ]+ build = \case+ ParseAddressCryptoError pkErr -> nameF "Address failed to parse" $ build pkErr+ ParseAddressWrongKind expected (Constrained a) -> unwordsF+ [ "Expected address of kind", renderAddressKinds expected+ , ", but got", build a+ ] where- renderAddressKinds as = mconcat $ intersperse ", " (renderAnyBuildable <$> as)+ renderAddressKinds as = mconcat $ intersperse ", " (build <$> as) -- | Parse an address of a particular kind from its human-readable textual -- representation used by Tezos (e. g. "tz1faswCTDciRzE4oJ9jn2Vm2dvjeyA9fUzU").@@ -322,23 +317,20 @@ instance NFData ParseAddressRawError -instance RenderDoc ParseAddressRawError where- renderDoc _ =+instance Buildable ParseAddressRawError where+ build = \case ParseAddressRawInvalidPrefix prefix ->- "Invalid prefix for raw address" <+> (dquotes $ renderAnyBuildable $ hexF prefix) <+> "provided"+ "Invalid prefix for raw address" <+> dquotes (hexF prefix) <+> "provided" ParseAddressRawUnsupportedPrefix name prefix ->- "Unsupported raw address prefix type" <+> renderAnyBuildable name- <+> (dquotes $ renderAnyBuildable $ hexF prefix) <+> "found"+ "Unsupported raw address prefix type" <+> build name+ <+> dquotes (hexF prefix) <+> "found" ParseAddressRawWrongSize addr -> "Given raw address+" <+>- (renderAnyBuildable $ hexF addr) <+> "has invalid length" <+> int (length addr)- ParseAddressRawMalformedSeparator addr -> "Given raw address" <+> (renderAnyBuildable $ hexF addr) <+>+ hexF addr <+> "has invalid length" <+> build (length addr)+ ParseAddressRawMalformedSeparator addr -> "Given raw address" <+> dquotes (hexF addr) <+> "does not end with" <+> dquotes (backslash <> "00")- ParseAddressRawBinaryError err -> "Binary error during decoding address:" <+> renderAnyBuildable err- ParseAddressRawCryptoError err -> "Key hash decoding error:" <+> renderAnyBuildable err--instance Buildable ParseAddressRawError where- build = buildRenderDoc+ ParseAddressRawBinaryError err -> "Binary error during decoding address:" <+> build err+ ParseAddressRawCryptoError err -> "Key hash decoding error:" <+> build err -- | Parse the given address in its raw byte form used by Tezos -- (e.g "01521139f84791537d54575df0c74a8084cc68861c00")) . Or fail otherwise
src/Morley/Tezos/Address/Alias.hs view
@@ -28,7 +28,7 @@ import Data.GADT.Compare.TH (deriveGCompare, deriveGEq) import Data.Singletons (SingI(..), demote) import Data.Text qualified as T-import Fmt (Buildable(..), Builder, pretty)+import Fmt (Buildable(..), Doc, pretty) import Options.Applicative qualified as Opt import Data.Char qualified as Char@@ -241,11 +241,11 @@ SAOAKindSpecified $ AddressAlias $ mkAlias @kind alias -- | The prefix used to specify whether an alias belongs to a contract or an implicit account.-aliasPrefix :: forall addressKind. (L1AddressKind addressKind, SingI addressKind) => Builder+aliasPrefix :: forall addressKind. (L1AddressKind addressKind, SingI addressKind) => Doc aliasPrefix = usingImplicitOrContractKind @addressKind $ build $ demote @addressKind -contractPrefix, implicitPrefix :: Builder+contractPrefix, implicitPrefix :: Doc contractPrefix = aliasPrefix @'AddressKindContract implicitPrefix = aliasPrefix @'AddressKindImplicit
src/Morley/Tezos/Crypto.hs view
@@ -133,7 +133,6 @@ import Data.ByteString.Lazy qualified as LBS import Data.Some (Some(..), mapSome) import Data.Text qualified as T-import Data.Text.Internal.Builder (Builder) import Fmt (Buildable, build, hexF, pretty) import Instances.TH.Lift () import Language.Haskell.TH.Syntax (Lift)@@ -621,7 +620,7 @@ parseKeyHashHelper :: Int- -> Builder+ -> LText -> ExceptT CryptoParseError Get.Get a -> ByteString -> Either CryptoParseError a
src/Morley/Tezos/Crypto/BLS.hs view
@@ -39,7 +39,7 @@ import Crypto.Random (MonadRandom(getRandomBytes)) import Data.ByteArray (ByteArray, ByteArrayAccess, Bytes, convert) import Data.ByteArray.Sized (SizedByteArray(..), sizedByteArray)-import Fmt (Buildable, Builder, build)+import Fmt (Buildable, build) import Morley.Michelson.Text import Morley.Tezos.Crypto.Util@@ -105,7 +105,7 @@ toSized :: forall n a. (KnownNat n, ByteArrayAccess a)- => Builder -> a -> Either CryptoParseError (SizedByteArray n a)+ => LText -> a -> Either CryptoParseError (SizedByteArray n a) toSized what = maybeToRight (CryptoParseUnexpectedLength what $ fromIntegralOverflowing $ natVal @n Proxy) . sizedByteArray
src/Morley/Tezos/Crypto/BLS12381.hs view
@@ -37,13 +37,11 @@ import Data.Curve.Weierstrass.BLS12381 qualified as CW.BLS import Data.Field.Galois qualified as GF import Data.Pairing.BLS12381 qualified as BLS-import Fmt (Buildable(..))+import Fmt (Buildable(..), hexF, (<+>)) import Morley.Util.Instances () import Morley.Util.Named-import Text.Hex (decodeHex, encodeHex)-import Text.PrettyPrint.Leijen.Text (int, integer, (<+>))+import Text.Hex (decodeHex) -import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDoc, renderAnyBuildable) -- | Methods common for all BLS12-381 primitives. class CurveObject a where@@ -184,22 +182,19 @@ deriving anyclass (NFData) instance Buildable DeserializationError where- build = buildRenderDoc--instance RenderDoc DeserializationError where- renderDoc _ = \case+ build = \case CompressedFormIsNotSupported -> "Compressed form of BLS12-381 point is not supported by Tezos" UnexpectedLength (arg #expected -> expected) (arg #given -> given) -> "Unexpected length of BLS12-381 primitive: \- \expected" <+> (int expected) <> ", but given" <+> (int given)+ \expected" <+> build expected <> ", but given" <+> build given TooLargeLength (arg #limit -> limit) (arg #given -> given) -> "Too large length of BLS12-381 primitive: \- \limit is" <+> (int limit) <+> ", but given" <+> (int given)+ \limit is" <+> build limit <+> ", but given" <+> build given ValueOutsideOfField v ->- "Value is too large for the given field of values:" <+> (integer v)+ "Value is too large for the given field of values:" <+> build v PointNotOnCurve bs ->- "Point is not on curve: 0x" <> (renderAnyBuildable $ encodeHex bs)+ "Point is not on curve: 0x" <> hexF bs {- Note on serialization:
src/Morley/Tezos/Crypto/Util.hs view
@@ -42,10 +42,8 @@ import Data.ByteString qualified as BS import Data.ByteString.Base58 qualified as Base58 import Data.ByteString.Lazy qualified as LBS-import Fmt (Buildable, Builder, build, hexF)-import Text.PrettyPrint.Leijen.Text (int, textStrict, (<+>))+import Fmt (Buildable, build, hexF, (<+>)) -import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDocExtended, renderAnyBuildable) import Morley.Tezos.Crypto.Hash import Morley.Util.Binary (getRemainingByteStringCopy) @@ -54,10 +52,10 @@ data CryptoParseError = CryptoParseWrongBase58Check | CryptoParseWrongTag ByteString- | CryptoParseUnsupportedTag Builder ByteString+ | CryptoParseUnsupportedTag LText ByteString | CryptoParseCryptoError CryptoError | CryptoParseBLSTError BlstError- | CryptoParseUnexpectedLength Builder Int+ | CryptoParseUnexpectedLength LText Int | CryptoParseBinaryError Text deriving stock (Show, Eq) @@ -65,21 +63,18 @@ rnf = rnf @String . Debug.show instance Buildable CryptoParseError where- build = buildRenderDocExtended--instance RenderDoc CryptoParseError where- renderDoc _ = \case+ build = \case CryptoParseWrongBase58Check -> "Wrong base58check encoding of bytes"- CryptoParseWrongTag tag -> "Prefix is wrong tag:" <+> renderAnyBuildable (hexF tag)+ CryptoParseWrongTag tag -> "Prefix is wrong tag:" <+> hexF tag CryptoParseUnsupportedTag name tag ->- "Unsupported hash" <+> renderAnyBuildable name <> ":" <+> renderAnyBuildable (hexF tag)+ "Unsupported hash" <+> build name <> ":" <+> hexF tag CryptoParseCryptoError err ->- "Cryptographic library reported an error:" <+> renderAnyBuildable (displayException err)+ "Cryptographic library reported an error:" <+> build (displayException err) CryptoParseBLSTError err ->- "Cryptographic library reported an error:" <+> renderAnyBuildable (displayException err)+ "Cryptographic library reported an error:" <+> build (displayException err) CryptoParseUnexpectedLength what l ->- "Unexpected length of" <+> renderAnyBuildable what <> ":" <+> int l- CryptoParseBinaryError err -> textStrict err+ "Unexpected length of" <+> build what <> ":" <+> build l+ CryptoParseBinaryError err -> build err -- | Encode a bytestring in Base58Check format. encodeBase58Check :: ByteString -> Text
src/Morley/Util/Instances.hs view
@@ -7,13 +7,6 @@ module Morley.Util.Instances () where import Data.Default (Default(..))-import Fmt (Buildable(..)) instance Default Natural where def = 0--instance Buildable Natural where- build = build @Integer . fromIntegral--instance Buildable a => (Buildable (Identity a)) where- build (Identity x) = build x
src/Morley/Util/Interpolate.hs view
@@ -3,11 +3,11 @@ {- | String interpolation quasi-quoters. The most basic version is 'i', it returns anything that-has a 'Fmt.FromBuilder' instance: 'Text', 'ByteString', 'String', @Builder@.+has a 'Fmt.FromDoc' instance: 'Text', 'ByteString', 'String', etc. -In some cases, it is more convenient to return a lazy @Text@ @Builder@, in that case 'ib', which-returns a non-polymorphic result, can be helpful, for instance, if you want to use one interpolated-string inside another one. Using @Builder@ is also more efficient in this case.+In some cases, it is more convenient to return a @Doc@, in that case 'ib', which returns a+non-polymorphic result, can be helpful, for instance, if you want to use one interpolated string+inside another one. Using @Doc@ is also more efficient in this case. >>> let splice = [i|some text|] >>> [i|larger text with #{splice}|] :: Text@@ -25,7 +25,7 @@ those that remove whitespace-only lines from beginning and end of the quote. The mnemonic is @i@nterpolate @t@rimming @u@nindenting returning @b@uilder, i.e. 'itub' is-the trimming, unindenting version returning @Builder@.+the trimming, unindenting version returning @Doc@. Versions not interpreting Haskell escape sequences additionally start with @l@, e.g. 'litu' is @l@iteral @i@nterpolation @t@trimming @u@nindenting.@@ -57,8 +57,7 @@ line trailing text If you wish to avoid that, either include the final newline in the splice explicitly (but be aware-that indentation of the trailing text won't be auto-adjusted, not even the leading spaces are-removed!), or include it in the quote:+that leading spaces of the trailing text are not removed!), or include it in the quote: >>> let splice = "multi\nline" :: Text >>> :{@@ -81,7 +80,7 @@ Some text Some indented text multi line- trailing text+ trailing text Empty lines are never indented:
src/Morley/Util/Interpolate/Internal.hs view
@@ -13,11 +13,11 @@ import Data.Char (isSpace) import Data.List qualified as List import Data.Set qualified as S-import Data.Text.Internal.Builder (Builder, fromLazyText, toLazyText) import Data.Text.Lazy qualified as TL import Fmt (build, fmt) import Language.Haskell.TH (Exp, Name, Q, lookupValueName, mkName, reportWarning, varE) import Language.Haskell.TH.Quote (QuasiQuoter(..))+import Prettyprinter (align) import Text.ParserCombinators.ReadP (readP_to_S) import Text.Read.Lex (lexChar) @@ -77,24 +77,12 @@ | (expr, '}':ys) <- List.span (/='}') xs = lookupValueName expr >>= \case Just valueName ->- let txt = fmt tacc- ls = splitTextLazy (=='\n') txt- indent = length . last $ ls- in [| build txt <> indentF'' indent (build $(varE valueName)) <> $(go mempty ys) |]+ let txt = fmt tacc :: Text+ in [| build txt <> align (build $(varE valueName)) <> $(go mempty ys) |] Nothing -> fail $ "Variable '" ++ expr ++ "' is not in scope" go tacc (c:cs) = case List.span (`notElem` ['\\', '#']) cs of (str, rest) -> go (tacc <> build (c:str)) rest go tacc [] = let txt = fmt @Text tacc in [| build txt |]---- | A version of @Fmt.indentF'@ that doesn't indent the first line, and keeps the final line break--- intact.-indentF'' :: Int -> Builder -> Builder-indentF'' indent bld = case splitTextLazy (=='\n') $ toLazyText bld of- (x :| xs) -> fromLazyText . TL.intercalate "\n" $ x : map addIndent xs- where- addIndent str | null str = str- | otherwise = spaces <> str- spaces = TL.replicate (fromIntegral indent) " " splitTextLazy :: (Char -> Bool) -> TL.Text -> NonEmpty TL.Text splitTextLazy p t = case nonEmpty $ TL.split p t of
src/Morley/Util/Markdown.hs view
@@ -28,7 +28,7 @@ import Prelude hiding (try) import Data.Char (isAscii)-import Fmt (Builder, build, (+|), (|+))+import Fmt (Doc, build, (+|), (|+)) import Language.Haskell.TH.Quote (QuasiQuoter) import Morley.Util.Interpolate (iub)@@ -37,7 +37,7 @@ -- -- This is opposed to 'Text' type, which in turn is not supposed to contain -- markup elements.-type Markdown = Builder+type Markdown = Doc -- | Level of header, starting from 1. newtype HeaderLevel = HeaderLevel Int@@ -141,7 +141,7 @@ -- Markdown's bold does not always work within spoiler header htmlBold txt = "<b>" <> txt <> "</b>" -mdComment :: Builder -> Builder+mdComment :: Doc -> Doc mdComment commentText = "<!---\n" +| commentText |+ "\n-->"
src/Morley/Util/MismatchError.hs view
@@ -33,16 +33,16 @@ -} module Morley.Util.MismatchError ( MismatchError(..)- , renderDocDiff- , renderDocDiffList+ , buildDocDiff+ , buildDocDiffList ) where import Prelude hiding (First, (<$>)) import Data.Algorithm.Diff (PolyDiff(..), getDiffBy) import Data.Text.Lazy as LT (lines, strip)-import Fmt (Buildable(..), nameF)-import Text.PrettyPrint.Leijen.Text (Doc, align, fill, indent, text, vcat, (<$>), (<+>))+import Fmt (Buildable(..), Doc, unlessF, (<+>))+import Prettyprinter (align, fill, hardline, indent, line, vcat) import Morley.Michelson.Printer.Util @@ -56,66 +56,61 @@ deriving anyclass (NFData, Container) instance {-# OVERLAPPABLE #-} Buildable a => Buildable (MismatchError a) where- build MkMismatchError{..} =- nameF "Expected" (build meExpected) <> nameF "Actual" (build meActual)+ build = buildStandard -instance {-# OVERLAPPABLE #-} RenderDoc a => RenderDoc (MismatchError a) where- renderDoc = renderDocStandard+buildStandard :: Buildable a => MismatchError a -> Doc+buildStandard = buildDoc . fmap build -renderDocStandard :: RenderDoc a => RenderContext -> MismatchError a -> Doc-renderDocStandard _ (fmap (align . renderDoc doesntNeedParens) -> MkMismatchError{..})- = fill 9 "Expected:" <+> meExpected- <$> fill 9 "Actual:" <+> meActual+buildStandardList :: Buildable a => MismatchError [a] -> Doc+buildStandardList = buildDoc . fmap buildList -renderDocStandardList :: RenderDoc a => RenderContext -> MismatchError [a] -> Doc-renderDocStandardList _ (fmap (align . renderDocList doesntNeedParens) -> MkMismatchError{..})- = fill 9 "Expected:" <+> meExpected- <$> fill 9 "Actual:" <+> meActual+buildDoc :: MismatchError Doc -> Doc+buildDoc MkMismatchError{..}+ = fill 9 "Expected:" <+> align meExpected <> hardline+ <> fill 9 "Actual:" <+> align meActual +renderMismatch :: MismatchError Doc -> Doc+renderMismatch errText+ = hardline <> "Mismatch:" <> hardline+ <> indent 2 "--- expected +++ actual" <> hardline+ <> align (diff errText)+ -- | Render a mismatch error with a diff. -- -- This is intended to be used with types for which 'RenderDoc' outputs--- multiline 'Doc'. Generally those are types wrapped in 'Prettier'.-renderDocDiff :: RenderDoc a => RenderContext -> MismatchError a -> Doc-renderDocDiff ctx err = renderDocStandard ctx err- <$> if expectedAndActualBothSingleLine- then mempty- else "Mismatch:"- <$> indent 2 "--- expected +++ actual"- <$> align (diff errText)+-- multiline 'Doc'.+buildDocDiff :: Buildable a => MismatchError a -> Doc+buildDocDiff err = buildStandard err+ <> unlessF expectedAndActualBothSingleLine (renderMismatch errText) where- errText = fmap (renderDoc doesntNeedParens) err- expectedAndActualBothSingleLine = all (null . drop 1 . LT.lines . printDoc False) errText+ errText = fmap build err+ expectedAndActualBothSingleLine = all (null . drop 1 . LT.lines . printRenderDoc False) errText -- | Render a mismatch error of lists with a diff. -- -- This is intended to be used with types for which 'RenderDoc' outputs--- multiline 'Doc'. Generally those are types wrapped in 'Prettier'.-renderDocDiffList :: RenderDoc a => RenderContext -> MismatchError [a] -> Doc-renderDocDiffList ctx err = renderDocStandardList ctx err- <$> if simple- then mempty- else "Mismatch:"- <$> indent 2 "--- expected +++ actual"- <$> align (diff errText)+-- multiline 'Doc'.+buildDocDiffList :: Buildable a => MismatchError [a] -> Doc+buildDocDiffList err = buildStandardList err+ <> unlessF simple (renderMismatch errText) where- errText = fmap (renderList' . map (align . renderDoc doesntNeedParens)) err+ errText = fmap (renderList' . map (align . build)) err -- "simple" here means that at least one is true: -- -- * one of the lists is empty -- * rendered representation for both expected and actual types are single-line- simple = any null err || all (null . drop 1 . LT.lines . printDoc False) errText+ simple = any null err || all (null . drop 1 . LT.lines . printRenderDoc False) errText renderList' ds = case ds of [] -> "[]" [d] -> align $ "[ " <> d <> " ]"- _ -> align $ vcat (zipWith (<>) ("[ " : repeat ", ") ds) <$> "]"+ _ -> align $ vcat (zipWith (<>) ("[ " : repeat ", ") ds) <> line <> "]" diff :: MismatchError Doc -> Doc-diff (fmap $ LT.lines . printDoc False -> MkMismatchError{..}) = vcat $+diff (fmap $ LT.lines . printRenderDoc False -> MkMismatchError{..}) = vcat $ showLine `fmap` getDiffBy ((==) `on` LT.strip) meExpected meActual where showLine = \case- (Both _ b) -> indent 2 $ text b- (First x) -> "-" <+> text x- (Second x) -> "+" <+> text x+ (Both _ b) -> indent 2 $ build b+ (First x) -> "-" <+> build x+ (Second x) -> "+" <+> build x
src/Morley/Util/Peano.hs view
@@ -79,7 +79,6 @@ , minIdempotency , commutativity , transitivity- , (|-) -- * Helpers , toNatural@@ -89,7 +88,7 @@ import Data.Constraint (Dict(..), (\\)) import Data.Data (Data(..)) import Data.Singletons (Sing, SingI(..), SomeSing(..))-import Data.Type.Equality (gcastWith, type (:~:)(..))+import Data.Type.Equality (type (:~:)(..)) import Data.Vinyl (Rec(..)) import Data.Vinyl.Core (Head, Tail) import Data.Vinyl.TypeLevel (Nat(..), RLength)@@ -101,7 +100,7 @@ import Morley.Util.Sing (genSingletonsType) import Morley.Util.StubbedProof-import Morley.Util.Type (FailUnless, MockableConstraint(..))+import Morley.Util.Type (FailUnless) -- This is very obviously a false positive. {-# ANN module ("HLint: ignore Use 'natVal' from Universum" :: Text) #-}@@ -411,12 +410,6 @@ instance (RequireLongerOrSameLength' l a, LongerOrSameLength l a) => RequireLongerOrSameLength l a -instance MockableConstraint (RequireLongerOrSameLength l a) where- unsafeProvideConstraint = unsafeCoerce $ Dict @(RequireLongerOrSameLength '[] 'Z)--instance MockableConstraint (RequireLongerThan l a) where- unsafeProvideConstraint = unsafeCoerce $ Dict @(RequireLongerThan '[()] 'Z)- ---------------------------------------------------------------------------- -- Length constraints 'Dict'ionaries ----------------------------------------------------------------------------@@ -462,12 +455,6 @@ ---------------------------------------------------------------------------- -- Inductive proofs -------------------------------------------------------------------------------- | Convenience synonym for 'gcastWith'-(|-) :: forall k (a :: k) (b :: k) r. (a :~: b) -> ((a ~ b) => r) -> r-(|-) = gcastWith-infixr 1 |--{-# DEPRECATED (|-) "Just use (\\\\) from Data.Constraint." #-} -- | Proof that for naturals, @k + (m + 1) = n@ entails @n > k@ additivity :: forall k m n. AddPeano k ('S m) ~ n
src/Morley/Util/PeanoNatural.hs view
@@ -21,11 +21,11 @@ import Data.Singletons (SingI(..)) import Data.Type.Equality (TestEquality(..), (:~:))+import Fmt (build) import GHC.TypeNats (Nat)-import Morley.Util.Peano-import Text.PrettyPrint.Leijen.Text (integer) import Morley.Michelson.Printer.Util+import Morley.Util.Peano -- | PeanoNatural data type --@@ -40,7 +40,7 @@ deriving stock instance Eq (PeanoNatural n) instance RenderDoc (PeanoNatural n) where- renderDoc _ = integer . toInteger . fromPeanoNatural+ renderDoc _ = build . fromPeanoNatural instance NFData (PeanoNatural n) where rnf (PN s _) = rnf s
src/Morley/Util/StubbedProof.hs view
@@ -33,3 +33,4 @@ -- assumed that the first argument constitutes a semi-proper proof. stubProof :: forall a b. (Stubbed => a :~: b) -> a :~: b stubProof _ = unsafeCoerce Refl+{-# INLINE stubProof #-}
src/Morley/Util/Type.hs view
@@ -18,8 +18,6 @@ , FailUnless , FailUnlessElse , FailUnlessElsePoly- , failUnlessEvi- , failWhenEvi , AllUnique , RequireAllUnique , ReifyList (..)@@ -32,16 +30,11 @@ , Some1 (..) , recordToSomeList - , ConcatListOfTypesAssociativity- , listOfTypesConcatAssociativityAxiom-- , MockableConstraint (..)- , onFirst , knownListFromSingI ) where -import Data.Constraint (Dict(..), (:-)(..), (\\))+import Data.Constraint (Dict(..), (\\)) import Data.Eq.Singletons (DefaultEq) import Data.Singletons (SingI(sing)) import Data.Type.Bool (If, Not, type (&&))@@ -52,7 +45,6 @@ import Data.Vinyl.TypeLevel qualified as Vinyl import GHC.TypeLits (ErrorMessage(..), Symbol, TypeError) import Prelude.Singletons (SList(..))-import Unsafe.Coerce (unsafeCoerce) -- $setup -- >>> import GHC.TypeLits (TypeError, ErrorMessage (..))@@ -242,15 +234,6 @@ type FailWhen :: Bool -> ErrorMessage -> Constraint type FailWhen cond msg = FailWhenElse cond msg () --- | A natural conclusion from the fact that an error has not occurred.-failUnlessEvi :: forall cond msg. FailUnless cond msg :- (cond ~ 'True)-failUnlessEvi = Sub unsafeProvideConstraint-{-# DEPRECATED failUnlessEvi "FailUnless should carry the corresponding type equality already" #-}--failWhenEvi :: forall cond msg. FailWhen cond msg :- (cond ~ 'False)-failWhenEvi = Sub unsafeProvideConstraint-{-# DEPRECATED failWhenEvi "FailWhen should carry the corresponding type equality already" #-}- type family AllUnique (l :: [k]) :: Bool where AllUnique '[] = 'True AllUnique (x : xs) = Not (IsElem x xs) && AllUnique xs@@ -336,82 +319,6 @@ recordToSomeList :: Rec f l -> [Some1 f] recordToSomeList = recordToList . rmap (Vinyl.Const . Some1)--type ConcatListOfTypesAssociativity a b c = ((a ++ b) ++ c) ~ (a ++ (b ++ c))-{-# DEPRECATED ConcatListOfTypesAssociativity "Unused; use the definition instead" #-}---- | GHC can't deduce this itself because--- in general a type family might be not associative,--- what brings extra difficulties and redundant constraints,--- especially if you have complex types.--- But (++) type family is associative, so let's define this small hack.-listOfTypesConcatAssociativityAxiom :: forall a b c . Dict (ConcatListOfTypesAssociativity a b c)-listOfTypesConcatAssociativityAxiom = unsafeProvideConstraint-{-# DEPRECATED listOfTypesConcatAssociativityAxiom- "Unused; a less ad-hoc version is available from \- \Morley.Michelson.Typed.Instr.Internal.Proofs.assocThm" #-}---- | Constaints that can be provided on demand.------ Needless to say, this is a pretty unsafe operation. This typeclass makes--- using it safer in a sense that getting a segfault becomes harder, but still--- it deceives the type system and should be used only if providing a proper--- proof would be too difficult.-class MockableConstraint (c :: Constraint) where- -- | Produce a constraint out of thin air.- unsafeProvideConstraint :: Dict c-{-# DEPRECATED unsafeProvideConstraint- "Apparently unused, and turns out to be very unsafe in practice." #-}--instance MockableConstraint (a ~ b) where- unsafeProvideConstraint = unsafeCoerce $ Dict @(Int ~ Int)---- | In majority of the cases we don't want to mock typeclass constraints--- since coercing instances of typeclasses with methods is utterly unsafe.-instance {-# OVERLAPPABLE #-} c a => MockableConstraint (c a) where- unsafeProvideConstraint = Dict--instance ( MockableConstraint c1- , MockableConstraint c2- ) => MockableConstraint (c1, c2) where- unsafeProvideConstraint = runIdentity $ do- Dict <- pure $ unsafeProvideConstraint @c1- Dict <- pure $ unsafeProvideConstraint @c2- return Dict- {-# INLINE unsafeProvideConstraint #-}--instance ( MockableConstraint c1- , MockableConstraint c2- , MockableConstraint c3- ) => MockableConstraint (c1, c2, c3) where- unsafeProvideConstraint = runIdentity $ do- Dict <- pure $ unsafeProvideConstraint @(c1, c2)- Dict <- pure $ unsafeProvideConstraint @c3- return Dict- {-# INLINE unsafeProvideConstraint #-}--instance ( MockableConstraint c1- , MockableConstraint c2- , MockableConstraint c3- , MockableConstraint c4- ) => MockableConstraint (c1, c2, c3, c4) where- unsafeProvideConstraint = runIdentity $ do- Dict <- pure $ unsafeProvideConstraint @(c1, c2, c3)- Dict <- pure $ unsafeProvideConstraint @c4- return Dict- {-# INLINE unsafeProvideConstraint #-}--instance ( MockableConstraint c1- , MockableConstraint c2- , MockableConstraint c3- , MockableConstraint c4- , MockableConstraint c5- ) => MockableConstraint (c1, c2, c3, c4, c5) where- unsafeProvideConstraint = runIdentity $ do- Dict <- pure $ unsafeProvideConstraint @(c1, c2, c3, c4)- Dict <- pure $ unsafeProvideConstraint @c5- return Dict- {-# INLINE unsafeProvideConstraint #-} -- | Utility function to help transform the first argument of a binfunctor. onFirst :: Bifunctor p => p a c -> (a -> b) -> p b c