Safe Haskell | None |
---|---|
Language | Haskell2010 |
Executor and typechecker of a contract in Morley language.
Synopsis
- originateContract :: FilePath -> Address -> Maybe KeyHash -> Mutez -> Value -> Contract -> ("verbose" :! Bool) -> IO Address
- runContract :: Maybe Timestamp -> Maybe Natural -> Word64 -> Mutez -> FilePath -> Value -> Contract -> TxData -> ("verbose" :! Bool) -> ("dryRun" :! Bool) -> IO Value
- transfer :: Maybe Timestamp -> Maybe Natural -> Word64 -> FilePath -> Address -> TxData -> ("verbose" :! Bool) -> ("dryRun" :? Bool) -> IO ()
- parseContract :: Maybe FilePath -> Text -> Either ParserException (Contract' ParsedOp)
- parseExpandContract :: Maybe FilePath -> Text -> Either ParserException Contract
- readAndParseContract :: Maybe FilePath -> IO (Contract' ParsedOp)
- prepareContract :: Maybe FilePath -> IO Contract
- data ContractState = forall cp st.(ParameterScope cp, StorageScope st) => ContractState {}
- data AddressState
- data TxData = TxData {}
- data TxParam where
- TxTypedParam :: forall t. ParameterScope t => Value t -> TxParam
- TxUntypedParam :: Value -> TxParam
- data ExecutorOp
- data ExecutorRes = ExecutorRes {}
- data ExecutorError' a
- = EEUnknownContract a
- | EEInterpreterFailed a InterpretError
- | EEAlreadyOriginated a ContractState
- | EEUnknownSender a
- | EEUnknownManager a
- | EENotEnoughFunds a Mutez
- | EEZeroTransaction a
- | EEFailedToApplyUpdates GStateUpdateError
- | EEIllTypedParameter TCError
- | EEUnexpectedParameterType T T
- | EEUnknownEntrypoint EpName
- | EETransactionFromContract a Mutez
- type ExecutorError = ExecutorError' Address
- type ExecutorM = ReaderT ExecutorEnv (StateT ExecutorState (Except ExecutorError))
- runExecutorM :: Timestamp -> Natural -> RemainingSteps -> GState -> ExecutorM a -> Either ExecutorError (ExecutorRes, a)
- runExecutorMWithDB :: Maybe Timestamp -> Maybe Natural -> FilePath -> RemainingSteps -> ("verbose" :! Bool) -> ("dryRun" :? Bool) -> ExecutorM a -> IO (ExecutorRes, a)
- executeGlobalOperations :: [ExecutorOp] -> ExecutorM ()
- executeGlobalOrigination :: OriginationOperation -> ExecutorM Address
- executeOrigination :: ("isGlobalOp" :! Bool) -> OriginationOperation -> ExecutorM Address
- executeTransfer :: ("isGlobalOp" :! Bool) -> Address -> TxData -> ExecutorM [ExecutorOp]
- erInterpretResults :: Lens' ExecutorRes [(Address, InterpretResult)]
- erUpdates :: Lens' ExecutorRes [GStateUpdate]
- erGState :: Lens' ExecutorRes GState
- erRemainingSteps :: Lens' ExecutorRes RemainingSteps
- elInterpreterResults :: Lens' ExecutorLog [(Address, InterpretResult)]
- elUpdates :: Lens' ExecutorLog [GStateUpdate]
High level interface for end user
originateContract :: FilePath -> Address -> Maybe KeyHash -> Mutez -> Value -> Contract -> ("verbose" :! Bool) -> IO Address Source #
Originate a contract. Returns the address of the originated contract.
runContract :: Maybe Timestamp -> Maybe Natural -> Word64 -> Mutez -> FilePath -> Value -> Contract -> TxData -> ("verbose" :! Bool) -> ("dryRun" :! Bool) -> IO Value Source #
Run a contract. The contract is originated first (if it's not already) and then we pretend that we send a transaction to it.
transfer :: Maybe Timestamp -> Maybe Natural -> Word64 -> FilePath -> Address -> TxData -> ("verbose" :! Bool) -> ("dryRun" :? Bool) -> IO () Source #
Send a transaction to given address with given parameters.
Other helpers
parseContract :: Maybe FilePath -> Text -> Either ParserException (Contract' ParsedOp) Source #
Parse a contract from Text
.
parseExpandContract :: Maybe FilePath -> Text -> Either ParserException Contract Source #
Parse a contract from Text
and expand macros.
prepareContract :: Maybe FilePath -> IO Contract Source #
Read a contract using readAndParseContract
, expand and
flatten. The contract is not type checked.
Re-exports
data ContractState Source #
State of a contract with code.
forall cp st.(ParameterScope cp, StorageScope st) => ContractState | |
Instances
Show ContractState Source # | |
Defined in Michelson.Runtime.GState showsPrec :: Int -> ContractState -> ShowS # show :: ContractState -> String # showList :: [ContractState] -> ShowS # | |
ToJSON ContractState Source # | |
Defined in Michelson.Runtime.GState toJSON :: ContractState -> Value # toEncoding :: ContractState -> Encoding # toJSONList :: [ContractState] -> Value # toEncodingList :: [ContractState] -> Encoding # | |
FromJSON ContractState Source # | |
Defined in Michelson.Runtime.GState parseJSON :: Value -> Parser ContractState # parseJSONList :: Value -> Parser [ContractState] # | |
Buildable ContractState Source # | |
Defined in Michelson.Runtime.GState build :: ContractState -> Builder # |
data AddressState Source #
State of an arbitrary address.
ASSimple Mutez | For contracts without code we store only its balance. |
ASContract ContractState | For contracts with code we store more state represented by
|
Instances
Data associated with a particular transaction.
TxData | |
|
A parameter associated with a particular transaction.
TxTypedParam :: forall t. ParameterScope t => Value t -> TxParam | |
TxUntypedParam :: Value -> TxParam |
For testing
data ExecutorOp Source #
Operations executed by interpreter.
In our model one Michelson's operation (operation
type in Michelson)
corresponds to 0 or 1 interpreter operation.
Note: Address
is not part of TxData
, because TxData
is
supposed to be provided by the user, while Address
can be
computed by our code.
OriginateOp OriginationOperation | Originate a contract. |
TransferOp Address TxData | Send a transaction to given address which is assumed to be the address of an originated contract. |
Instances
Show ExecutorOp Source # | |
Defined in Michelson.Runtime showsPrec :: Int -> ExecutorOp -> ShowS # show :: ExecutorOp -> String # showList :: [ExecutorOp] -> ShowS # |
data ExecutorRes Source #
Result of a single execution of interpreter.
ExecutorRes | |
|
Instances
Show ExecutorRes Source # | |
Defined in Michelson.Runtime showsPrec :: Int -> ExecutorRes -> ShowS # show :: ExecutorRes -> String # showList :: [ExecutorRes] -> ShowS # |
data ExecutorError' a Source #
Errors that can happen during contract interpreting.
Type parameter a
determines how contracts will be represented
in these errors, e.g. Address
.
EEUnknownContract a | The interpreted contract hasn't been originated. |
EEInterpreterFailed a InterpretError | Interpretation of Michelson contract failed. |
EEAlreadyOriginated a ContractState | A contract is already originated. |
EEUnknownSender a | Sender address is unknown. |
EEUnknownManager a | Manager address is unknown. |
EENotEnoughFunds a Mutez | Sender doesn't have enough funds. |
EEZeroTransaction a | Sending 0tz towards an address. |
EEFailedToApplyUpdates GStateUpdateError | Failed to apply updates to GState. |
EEIllTypedParameter TCError | Contract parameter is ill-typed. |
EEUnexpectedParameterType T T | Contract parameter is well-typed, but its type does not match the entrypoint's type. |
EEUnknownEntrypoint EpName | Specified entrypoint to run is not found. |
EETransactionFromContract a Mutez | A transaction from an originated contract was attempted as a global operation. |
Instances
Functor ExecutorError' Source # | |
Defined in Michelson.Runtime fmap :: (a -> b) -> ExecutorError' a -> ExecutorError' b # (<$) :: a -> ExecutorError' b -> ExecutorError' a # | |
Show a => Show (ExecutorError' a) Source # | |
Defined in Michelson.Runtime showsPrec :: Int -> ExecutorError' a -> ShowS # show :: ExecutorError' a -> String # showList :: [ExecutorError' a] -> ShowS # | |
(Typeable a, Show a, Buildable a) => Exception (ExecutorError' a) Source # | |
Defined in Michelson.Runtime toException :: ExecutorError' a -> SomeException # fromException :: SomeException -> Maybe (ExecutorError' a) # displayException :: ExecutorError' a -> String # | |
Buildable a => Buildable (ExecutorError' a) Source # | |
Defined in Michelson.Runtime build :: ExecutorError' a -> Builder # |
type ExecutorError = ExecutorError' Address Source #
type ExecutorM = ReaderT ExecutorEnv (StateT ExecutorState (Except ExecutorError)) Source #
A monad in which contract executor runs.
runExecutorM :: Timestamp -> Natural -> RemainingSteps -> GState -> ExecutorM a -> Either ExecutorError (ExecutorRes, a) Source #
Run some executor action, returning its result and final executor state in ExecutorRes
.
The action has access to the hash of currently executed global operation, in order to construct
addresses of originated contracts. It is expected that the action uses #isGlobalOp .! True
to specify this hash. Otherwise it is initialized with error
.
runExecutorMWithDB :: Maybe Timestamp -> Maybe Natural -> FilePath -> RemainingSteps -> ("verbose" :! Bool) -> ("dryRun" :? Bool) -> ExecutorM a -> IO (ExecutorRes, a) Source #
Run some executor action, reading state from the DB on disk.
Unless dryRun
is False
, the final state is written back to the disk.
If the executor fails with ExecutorError
it will be thrown as an exception.
executeGlobalOperations :: [ExecutorOp] -> ExecutorM () Source #
Execute a list of global operations, discarding their results.
executeGlobalOrigination :: OriginationOperation -> ExecutorM Address Source #
Execute a global origination operation.
executeOrigination :: ("isGlobalOp" :! Bool) -> OriginationOperation -> ExecutorM Address Source #
Execute an origination operation.
executeTransfer :: ("isGlobalOp" :! Bool) -> Address -> TxData -> ExecutorM [ExecutorOp] Source #
Execute a transfer operation.
To avoid warnings (can't generate lenses only for some fields)
elInterpreterResults :: Lens' ExecutorLog [(Address, InterpretResult)] Source #
elUpdates :: Lens' ExecutorLog [GStateUpdate] Source #