hevm-0.53.0: Symbolic EVM Evaluator
Safe HaskellSafe-Inferred
LanguageGHC2021

EVM

Synopsis

Documentation

bytecode :: Getter Contract (Maybe (Expr Buf)) Source #

An "external" view of a contract's bytecode, appropriate for e.g. EXTCODEHASH.

Data accessors

Data constructors

makeVm :: VMOps t => VMOpts t -> ST s (VM t s) Source #

unknownContract :: Expr EAddr -> Contract Source #

Initialize an abstract contract with unknown code

abstractContract :: ContractCode -> Expr EAddr -> Contract Source #

Initialize an abstract contract with known code

emptyContract :: Contract Source #

Initialize an empty contract without code

initialContract :: ContractCode -> Contract Source #

Initialize empty contract with given code

Opcode dispatch (exec1)

next :: (?op :: Word8) => EVM t s () Source #

Update program counter

exec1 :: forall (t :: VMType) s. VMOps t => EVM t s () Source #

Executes the EVM one step

transfer :: VMOps t => Expr EAddr -> Expr EAddr -> Expr EWord -> EVM t s () Source #

callChecks :: forall (t :: VMType) s. (?op :: Word8, VMOps t) => Contract -> Gas t -> Expr EAddr -> Expr EAddr -> Expr EWord -> Expr EWord -> Expr EWord -> Expr EWord -> Expr EWord -> [Expr EWord] -> (Gas t -> EVM t s ()) -> EVM t s () Source #

Checks a *CALL for failure; OOG, too many callframes, memory access etc.

precompiledContract :: (?op :: Word8, VMOps t) => Contract -> Gas t -> Addr -> Addr -> Expr EWord -> Expr EWord -> Expr EWord -> Expr EWord -> Expr EWord -> [Expr EWord] -> EVM t s () Source #

executePrecompile :: (?op :: Word8, VMOps t) => Addr -> Gas t -> Expr EWord -> Expr EWord -> Expr EWord -> Expr EWord -> [Expr EWord] -> EVM t s () Source #

Opcode helper actions

noop :: Monad m => m () Source #

pushTo :: MonadState s m => Lens s s [a] [a] -> a -> m () Source #

pushToSequence :: MonadState s m => Setter s s (Seq a) (Seq a) -> a -> m () Source #

query :: Query t s -> EVM t s () Source #

fetchAccount :: VMOps t => Expr EAddr -> (Contract -> EVM t s ()) -> EVM t s () Source #

Construct RPC Query and halt execution until resolved

accessStorage :: VMOps t => Expr EAddr -> Expr EWord -> (Expr EWord -> EVM t s ()) -> EVM t s () Source #

How to finalize a transaction

finalize :: VMOps t => EVM t s () Source #

loadContract :: Expr EAddr -> State (VM t s) () Source #

Loads the selected contract as the current contract to execute

limitStack :: VMOps t => Int -> EVM (t :: VMType) s () -> EVM t s () Source #

notStatic :: VMOps t => EVM t s () -> EVM t s () Source #

forceAddr :: VMOps t => Expr EWord -> String -> (Expr EAddr -> EVM t s ()) -> EVM t s () Source #

forceConcrete :: VMOps t => Expr EWord -> String -> (W256 -> EVM t s ()) -> EVM t s () Source #

forceConcreteAddr :: VMOps t => Expr EAddr -> String -> (Addr -> EVM t s ()) -> EVM t s () Source #

forceConcreteAddr2 :: VMOps t => (Expr EAddr, Expr EAddr) -> String -> ((Addr, Addr) -> EVM t s ()) -> EVM t s () Source #

forceConcrete2 :: VMOps t => (Expr EWord, Expr EWord) -> String -> ((W256, W256) -> EVM t s ()) -> EVM t s () Source #

forceConcreteBuf :: VMOps t => Expr Buf -> String -> (ByteString -> EVM t s ()) -> EVM t s () Source #

Substate manipulation

refund :: Word64 -> EVM t s () Source #

unRefund :: Word64 -> EVM t s () Source #

accessAndBurn :: VMOps t => Expr EAddr -> EVM t s () -> EVM t s () Source #

accessAccountForGas :: Expr EAddr -> EVM t s Bool Source #

returns a wrapped boolean- if true, this address has been touched before in the txn (warm gas cost as in EIP 2929) otherwise cold

accessStorageForGas :: Expr EAddr -> Expr EWord -> EVM t s Bool Source #

returns a wrapped boolean- if true, this slot has been touched before in the txn (warm gas cost as in EIP 2929) otherwise cold

Cheat codes

cheat :: (?op :: Word8, VMOps t) => (Expr EWord, Expr EWord) -> (Expr EWord, Expr EWord) -> EVM t s () Source #

type CheatAction t s = Expr EWord -> Expr EWord -> Expr Buf -> EVM t s () Source #

General call implementation ("delegateCall")

delegateCall :: (VMOps t, ?op :: Word8) => Contract -> Gas t -> Expr EAddr -> Expr EAddr -> Expr EWord -> Expr EWord -> Expr EWord -> Expr EWord -> Expr EWord -> [Expr EWord] -> (Expr EAddr -> EVM t s ()) -> EVM t s () Source #

create :: forall t s. (?op :: Word8, VMOps t) => Expr EAddr -> Contract -> Expr EWord -> Gas t -> Expr EWord -> [Expr EWord] -> Expr EAddr -> Expr Buf -> EVM t s () Source #

parseInitCode :: Expr Buf -> Maybe ContractCode Source #

Parses a raw Buf into an InitCode

solidity implements constructor args by appending them to the end of the initcode. we support this internally by treating initCode as a concrete region (initCode) followed by a potentially symbolic region (arguments).

when constructing a contract that has symbolic constructor args, we need to apply some heuristics to convert the (unstructured) initcode in memory into this structured representation. The (unsound, bad, hacky) way that we do this, is by: looking for the first potentially symbolic byte in the input buffer and then splitting it there into code / data.

replaceCode :: Expr EAddr -> ContractCode -> EVM t s () Source #

Replace a contract's code, like when CREATE returns from the constructor code.

resetState :: VMOps t => EVM t s () Source #

VM error implementation

vmError :: VMOps t => EvmError -> EVM t s () Source #

wrap :: Typeable a => [Expr a] -> [SomeExpr] Source #

underrun :: VMOps t => EVM t s () Source #

data FrameResult Source #

A stack frame can be popped in three ways.

Constructors

FrameReturned (Expr Buf)

STOP, RETURN, or no more code

FrameReverted (Expr Buf)

REVERT

FrameErrored EvmError

Any other error

Instances

Instances details
Show FrameResult Source # 
Instance details

Defined in EVM

finishFrame :: VMOps t => FrameResult -> EVM t s () Source #

This function defines how to pop the current stack frame in either of the ways specified by FrameResult.

It also handles the case when the current stack frame is the only one; in this case, we set the final _result of the VM execution.

Memory helpers

accessUnboundedMemoryRange :: VMOps t => Word64 -> Word64 -> EVM t s () -> EVM t s () Source #

accessMemoryRange :: VMOps t => Expr EWord -> Expr EWord -> EVM t s () -> EVM t s () Source #

accessMemoryWord :: VMOps t => Expr EWord -> EVM t s () -> EVM t s () Source #

Tracing

popTrace :: EVM t s () Source #

traceTopLog :: [Expr Log] -> EVM t s () Source #

Stack manipulation

push :: W256 -> EVM t s () Source #

pushSym :: Expr EWord -> EVM t s () Source #

pushAddr :: Expr EAddr -> EVM t s () Source #

stackOp1 :: (?op :: Word8, VMOps t) => Word64 -> (Expr EWord -> Expr EWord) -> EVM t s () Source #

stackOp2 :: (?op :: Word8, VMOps t) => Word64 -> (Expr EWord -> Expr EWord -> Expr EWord) -> EVM t s () Source #

stackOp3 :: (?op :: Word8, VMOps t) => Word64 -> (Expr EWord -> Expr EWord -> Expr EWord -> Expr EWord) -> EVM t s () Source #

Bytecode data functions

checkJump :: VMOps t => Int -> [Expr EWord] -> EVM t s () Source #

noJumpIntoInitData :: VMOps t => Int -> EVM t s () -> EVM t s () Source #

vmOp :: VM t s -> Maybe Op Source #

Gas cost calculation helpers

opslen :: ContractCode -> Int Source #

The length of the code ignoring any constructor args. This represents the region that can contain executable opcodes

codelen :: ContractCode -> Expr EWord Source #

The length of the code including any constructor args. This can return an abstract value

Arithmetic

ceilDiv :: (Num a, Integral a) => a -> a -> a Source #

allButOne64th :: (Num a, Integral a) => a -> a Source #

log2 :: FiniteBits b => b -> Int Source #

burn :: VMOps t => Word64 -> EVM t s () -> EVM t s () Source #

Orphan instances

VMOps 'Concrete Source # 
Instance details

Methods

burn' :: Gas 'Concrete -> EVM 'Concrete s () -> EVM 'Concrete s () Source #

burnExp :: Expr 'EWord -> EVM 'Concrete s () -> EVM 'Concrete s () Source #

burnSha3 :: Expr 'EWord -> EVM 'Concrete s () -> EVM 'Concrete s () Source #

burnCalldatacopy :: Expr 'EWord -> EVM 'Concrete s () -> EVM 'Concrete s () Source #

burnCodecopy :: Expr 'EWord -> EVM 'Concrete s () -> EVM 'Concrete s () Source #

burnExtcodecopy :: Expr 'EAddr -> Expr 'EWord -> EVM 'Concrete s () -> EVM 'Concrete s () Source #

burnReturndatacopy :: Expr 'EWord -> EVM 'Concrete s () -> EVM 'Concrete s () Source #

burnLog :: Expr 'EWord -> Word8 -> EVM 'Concrete s () -> EVM 'Concrete s () Source #

initialGas :: Gas 'Concrete Source #

ensureGas :: Word64 -> EVM 'Concrete s () -> EVM 'Concrete s () Source #

gasTryFrom :: Expr 'EWord -> Either () (Gas 'Concrete) Source #

costOfCreate :: FeeSchedule Word64 -> Gas 'Concrete -> Expr 'EWord -> Bool -> (Gas 'Concrete, Gas 'Concrete) Source #

costOfCall :: FeeSchedule Word64 -> Bool -> Expr 'EWord -> Gas 'Concrete -> Gas 'Concrete -> Expr 'EAddr -> (Word64 -> Word64 -> EVM 'Concrete s ()) -> EVM 'Concrete s () Source #

reclaimRemainingGasAllowance :: VM 'Concrete s -> EVM 'Concrete s () Source #

payRefunds :: EVM 'Concrete s () Source #

pushGas :: EVM 'Concrete s () Source #

enoughGas :: Word64 -> Gas 'Concrete -> Bool Source #

subGas :: Gas 'Concrete -> Word64 -> Gas 'Concrete Source #

toGas :: Word64 -> Gas 'Concrete Source #

whenSymbolicElse :: EVM 'Concrete s a -> EVM 'Concrete s a -> EVM 'Concrete s a Source #

partial :: PartialExec -> EVM 'Concrete s () Source #

branch :: Expr 'EWord -> (Bool -> EVM 'Concrete s ()) -> EVM 'Concrete s () Source #

VMOps 'Symbolic Source # 
Instance details

Methods

burn' :: Gas 'Symbolic -> EVM 'Symbolic s () -> EVM 'Symbolic s () Source #

burnExp :: Expr 'EWord -> EVM 'Symbolic s () -> EVM 'Symbolic s () Source #

burnSha3 :: Expr 'EWord -> EVM 'Symbolic s () -> EVM 'Symbolic s () Source #

burnCalldatacopy :: Expr 'EWord -> EVM 'Symbolic s () -> EVM 'Symbolic s () Source #

burnCodecopy :: Expr 'EWord -> EVM 'Symbolic s () -> EVM 'Symbolic s () Source #

burnExtcodecopy :: Expr 'EAddr -> Expr 'EWord -> EVM 'Symbolic s () -> EVM 'Symbolic s () Source #

burnReturndatacopy :: Expr 'EWord -> EVM 'Symbolic s () -> EVM 'Symbolic s () Source #

burnLog :: Expr 'EWord -> Word8 -> EVM 'Symbolic s () -> EVM 'Symbolic s () Source #

initialGas :: Gas 'Symbolic Source #

ensureGas :: Word64 -> EVM 'Symbolic s () -> EVM 'Symbolic s () Source #

gasTryFrom :: Expr 'EWord -> Either () (Gas 'Symbolic) Source #

costOfCreate :: FeeSchedule Word64 -> Gas 'Symbolic -> Expr 'EWord -> Bool -> (Gas 'Symbolic, Gas 'Symbolic) Source #

costOfCall :: FeeSchedule Word64 -> Bool -> Expr 'EWord -> Gas 'Symbolic -> Gas 'Symbolic -> Expr 'EAddr -> (Word64 -> Word64 -> EVM 'Symbolic s ()) -> EVM 'Symbolic s () Source #

reclaimRemainingGasAllowance :: VM 'Symbolic s -> EVM 'Symbolic s () Source #

payRefunds :: EVM 'Symbolic s () Source #

pushGas :: EVM 'Symbolic s () Source #

enoughGas :: Word64 -> Gas 'Symbolic -> Bool Source #

subGas :: Gas 'Symbolic -> Word64 -> Gas 'Symbolic Source #

toGas :: Word64 -> Gas 'Symbolic Source #

whenSymbolicElse :: EVM 'Symbolic s a -> EVM 'Symbolic s a -> EVM 'Symbolic s a Source #

partial :: PartialExec -> EVM 'Symbolic s () Source #

branch :: Expr 'EWord -> (Bool -> EVM 'Symbolic s ()) -> EVM 'Symbolic s () Source #