ethpector.data package

Submodules

ethpector.data.base module

class ethpector.data.base.DataProvider[source]

Bases: object

Base class for ethpector data-providers

account_summary(address: str) AccountSummary[source]

Default implementation to acquire an address summary

Parameters:

address (str) – Hex-string of an address.

Returns:

Summary of the account state.

Return type:

AccountSummary

address_tag(address)[source]
event_name(sign)[source]
function_name(sign)[source]
get_balance(address)[source]
get_code(address)[source]
get_storage_at(address, slot)[source]
provider_name()[source]
source_abi(address)[source]
source_code(address)[source]
source_metadata(address)[source]

ethpector.data.datatypes module

class ethpector.data.datatypes.AccountSummary(is_contract: bool, balance: int, ens_name: str)[source]

Bases: object

Basic summary of current account state of an address.

balance: int
ens_name: str
is_contract: bool
class ethpector.data.datatypes.AnnotationBase[source]

Bases: object

set_tag(key: str, tag: object)[source]
tags: dict
valid_at(pc) bool[source]
class ethpector.data.datatypes.AssemblySummary(constants, function_entrypoints, jump_targets, jumps, jumpdests, meta_data, unique_instructions_visited, total_instructions)[source]

Bases: AnnotationBase

constants: list[ethpector.data.datatypes.ConstantSummary]
function_entrypoints: list[ethpector.data.datatypes.FunctionEntrypoint]
get_annotations_valid_at(pc)[source]
jump_targets: list[ethpector.data.datatypes.JumpTarget]
jumpdests: set[int]
jumps: set[int]
meta_data: MetaDataString
total_instructions: int
unique_instructions_visited: int
class ethpector.data.datatypes.Call(state, _type, to, gas, value=0x0, data=None)[source]

Bases: SymbolicAnnotation

data: SymbolicMemorySlice
classmethod from_statespace(state: GlobalState)[source]
gas: SymbolicVariable
get_calldata()[source]
get_calldata_hex()[source]
is_call_to_precompile()[source]
to: SymbolicVariable
type: SymbolicVariable
value: SymbolicVariable
class ethpector.data.datatypes.Calldatacopy(state, offset, mem_addr, length)[source]

Bases: SymbolicAnnotation

classmethod from_statespace(state: GlobalState)[source]
length: SymbolicVariable
mem_addr: SymbolicVariable
offset: SymbolicVariable
class ethpector.data.datatypes.Calldataload(state, offset)[source]

Bases: SymbolicAnnotation

classmethod from_statespace(state: GlobalState)[source]
offset: SymbolicVariable
class ethpector.data.datatypes.ConditionalJump(state, to, condition)[source]

Bases: SymbolicAnnotation

condition: object
classmethod from_statespace(state: GlobalState)[source]
target_int() Optional[int][source]
to: SymbolicVariable
class ethpector.data.datatypes.ConstantSummary(length, value, introduced_at)[source]

Bases: AnnotationBase

add_introduced_at(pc)[source]
hex_value(leading0x=True) str[source]
introduced_at: set[int]
length: int
valid_at(pc)[source]
value: int
class ethpector.data.datatypes.Create(state, value, data)[source]

Bases: SymbolicAnnotation

data: SymbolicMemorySlice
classmethod from_statespace(state: GlobalState)[source]
value: SymbolicVariable
class ethpector.data.datatypes.Create2(state, salt, value, data)[source]

Bases: SymbolicAnnotation

data: SymbolicMemorySlice
classmethod from_statespace(state: GlobalState)[source]
salt: SymbolicVariable
value: SymbolicVariable
class ethpector.data.datatypes.FunctionEntrypoint(pc, function_name)[source]

Bases: PCAnnotation

function_name: str
functions()[source]
functions_string()[source]
class ethpector.data.datatypes.FunctionSummary(name)[source]

Bases: AnnotationBase

functions()[source]
functions_string()[source]
has_calls: bool = False
has_create2s: bool = False
has_creates: bool = False
has_delegate: bool = False
has_logs: bool = False
has_reads: bool = False
has_selfdestructs: bool = False
has_writes: bool = False
name: str
pcs: set[int]
update(state: GlobalState)[source]
valid_at(pc)[source]
class ethpector.data.datatypes.JumpTarget(pc, target)[source]

Bases: PCAnnotation

target: int
target_int() int[source]
class ethpector.data.datatypes.Log(state, n, topic0, topic1, topic2, topic3, data)[source]

Bases: SymbolicAnnotation

data: SymbolicMemorySlice
classmethod from_statespace(state: GlobalState)[source]
n: int
topic0: SymbolicVariable
topic1: SymbolicVariable
topic2: SymbolicVariable
topic3: SymbolicVariable
try_get_selector()[source]
class ethpector.data.datatypes.MemoryLoad(state, slot)[source]

Bases: SymbolicAnnotation

classmethod from_statespace(state: GlobalState)[source]
slot: SymbolicVariable
class ethpector.data.datatypes.MemoryWrite(state, slot, value)[source]

Bases: SymbolicAnnotation

classmethod from_statespace(state: GlobalState)[source]
slot: SymbolicVariable
value: SymbolicVariable
class ethpector.data.datatypes.MetaDataString(raw, index, data, url)[source]

Bases: AnnotationBase

data: object
index: int
raw: object
url: str
valid_at(pc) bool[source]
class ethpector.data.datatypes.PCAnnotation(pc)[source]

Bases: AnnotationBase

get_pc() int[source]
pc: int
valid_at(pc) bool[source]
class ethpector.data.datatypes.Push(state, value)[source]

Bases: SymbolicAnnotation

classmethod from_statespace(state: GlobalState)[source]
value: int
class ethpector.data.datatypes.Return(state, data)[source]

Bases: SymbolicAnnotation

data: SymbolicMemorySlice
classmethod from_statespace(state: GlobalState)[source]
class ethpector.data.datatypes.Revert(state, data)[source]

Bases: SymbolicAnnotation

data: SymbolicMemorySlice
classmethod from_statespace(state: GlobalState)[source]
class ethpector.data.datatypes.Selfdestruct(state, address)[source]

Bases: SymbolicAnnotation

address: SymbolicVariable
classmethod from_statespace(state: GlobalState)[source]
class ethpector.data.datatypes.SenderConstraintFunction(state, address, condition, model, true_branch_reachable=None, false_branch_reachable=None, is_storage_address=True, probably_mapping=False)[source]

Bases: SymbolicAnnotation

address: SymbolicVariable
condition: SymbolicExpression
false_branch_reachable: bool = False
classmethod from_statespace(state: GlobalState, address, condition, model, true_branch_reachable=None, false_branch_reachable=None, is_storage_address=True, probably_mapping=False)[source]
is_probably_mapping: bool = False
is_storage_address: bool = True
model: object
true_branch_reachable: bool = False
class ethpector.data.datatypes.StorageLoad(state, slot)[source]

Bases: SymbolicAnnotation

classmethod from_statespace(state: GlobalState)[source]
slot: SymbolicVariable
class ethpector.data.datatypes.StorageWrite(state, slot, value)[source]

Bases: SymbolicAnnotation

classmethod from_statespace(state: GlobalState)[source]
slot: SymbolicVariable
value: SymbolicVariable
class ethpector.data.datatypes.SymbolicAnnotation(state)[source]

Bases: PCAnnotation

argument()[source]
functions()[source]
functions_string()[source]
opcode()[source]
pc: int
stack()[source]
tags: dict
class ethpector.data.datatypes.SymbolicExecSummary(functions: list[ethpector.data.datatypes.FunctionSummary], calls: list[ethpector.data.datatypes.Call], storage_reads: list[ethpector.data.datatypes.StorageLoad], storage_writes: list[ethpector.data.datatypes.StorageWrite], memory_reads: list[ethpector.data.datatypes.MemoryLoad], memory_writes: list[ethpector.data.datatypes.MemoryWrite], logs: list[ethpector.data.datatypes.Log], returns: list[ethpector.data.datatypes.Return], reverts: list[ethpector.data.datatypes.Revert], calldataloads: list[ethpector.data.datatypes.Calldataload], calldatacopies: list[ethpector.data.datatypes.Calldatacopy], selfdestructs: list[ethpector.data.datatypes.Selfdestruct], conditional_jumps: list[ethpector.data.datatypes.ConditionalJump], unconditional_jumps: list[ethpector.data.datatypes.UnconditionalJump], pushes: list[ethpector.data.datatypes.Push], creates: list[ethpector.data.datatypes.Push], create2s: list[ethpector.data.datatypes.Push], sender_constraint_functions: list[ethpector.data.datatypes.SenderConstraintFunction], unique_instructions_visited: int)[source]

Bases: object

calldatacopies: list[ethpector.data.datatypes.Calldatacopy]
calldataloads: list[ethpector.data.datatypes.Calldataload]
calls: list[ethpector.data.datatypes.Call]
conditional_jumps: list[ethpector.data.datatypes.ConditionalJump]
create2s: list[ethpector.data.datatypes.Push]
creates: list[ethpector.data.datatypes.Push]
functions: list[ethpector.data.datatypes.FunctionSummary]
get_annotations_valid_at(pc)[source]
logs: list[ethpector.data.datatypes.Log]
memory_reads: list[ethpector.data.datatypes.MemoryLoad]
memory_writes: list[ethpector.data.datatypes.MemoryWrite]
pushes: list[ethpector.data.datatypes.Push]
returns: list[ethpector.data.datatypes.Return]
reverts: list[ethpector.data.datatypes.Revert]
selfdestructs: list[ethpector.data.datatypes.Selfdestruct]
sender_constraint_functions: list[ethpector.data.datatypes.SenderConstraintFunction]
storage_reads: list[ethpector.data.datatypes.StorageLoad]
storage_writes: list[ethpector.data.datatypes.StorageWrite]
unconditional_jumps: list[ethpector.data.datatypes.UnconditionalJump]
unique_instructions_visited: int
class ethpector.data.datatypes.SymbolicExpression(condition)[source]

Bases: object

condition: object
class ethpector.data.datatypes.SymbolicMemorySlice(mem, start, length)[source]

Bases: object

Representation of a slice of memory in sym-exec. Data can be symbolic.

Parameters:
  • length (SymbolicVariable) – Length of the slice

  • mem (object) – The slice itself, can be none if length or start are symbolic

  • start (SymbolicVariable) – Start position of the memory slice

concrete_val()[source]
is_concrete()[source]
is_symbolic()[source]
length: object
mem: object
start: object
try_decode_abi(types=['bool', 'string'])[source]
class ethpector.data.datatypes.SymbolicVariable(variable)[source]

Bases: object

concrete_val()[source]
is_symbolic()[source]
val()[source]
var: Variable
class ethpector.data.datatypes.ToJsonDecorator(c)[source]

Bases: object

class ethpector.data.datatypes.UnconditionalJump(state, to)[source]

Bases: SymbolicAnnotation

classmethod from_statespace(state: GlobalState)[source]
target_int() Optional[int][source]
to: SymbolicVariable
ethpector.data.datatypes.decode_memory(state: GlobalState, meminstart: SymbolicVariable, meminsz: SymbolicVariable) SymbolicMemorySlice[source]

Tries to decode a slice of memory extracted during symbolic execution.

Parameters:
  • state (GlobalState) – State of we are in in sym-exec

  • meminstart (SymbolicVariable) – Representation of the start index

  • concrete) ((symbolic or) –

  • meminsz (SymbolicVariable) – Representation of the length of the slice

  • concrete)

Returns:

Slice of data.

Return type:

SymbolicMemorySlice

ethpector.data.datatypes.decompose_inst(state: GlobalState, enforce_instruction=None)[source]

Helper to extract the current state and instruction for a sym-exec state

Parameters:
  • state (GlobalState) – Sym-exec state we are in

  • enforce_instruction (None, optional) – If set to Instruction name,

  • instruction. (throws if called in a state with a different) –

Returns:

(op, address, instruction, stack, function, last_op)

Return type:

tuple

Raises:
  • Exception – If called in the wrong context and enforce_instruction is

  • set

ethpector.data.datatypes.default_json_encoder(o)[source]
ethpector.data.datatypes.to_json(obj, encoder=<function default_json_encoder>)[source]

ethpector.data.etherscan module

class ethpector.data.etherscan.EtherscanProvider(etherscan_token)[source]

Bases: DataProvider

Etherscan data-provider. Supports fetching source-code, bytecode, ABI files, balances etc. for addresses.

address_tag(address)[source]
get_balance(address)[source]
get_code(address)[source]
get_contract_source_code(address)[source]
get_storage_at(address, slot)[source]
provider_name()[source]
source_abi(address)[source]
source_code(address)[source]
source_metadata(address)[source]

ethpector.data.ipfs module

class ethpector.data.ipfs.IpfsProvider[source]

Bases: DataProvider

CURRENTLY not implemented.

provider_name()[source]

ethpector.data.node module

class ethpector.data.node.NodeProvider(rpc_url)[source]

Bases: DataProvider

Uses the Ethereum RPC interface to fetch code, balances, storage state etc. for a particular address

address_tag(address)[source]
call(address: str, payload: str)[source]

Calls implementation() on the contract for standardized proxies this should return the implementation

Parameters:
  • address (str) – Hex-string of the address

  • payload (str) – Hex-string of the payload (data-field)

Returns:

return of the call

Return type:

object

get_balance(address, block_identifier=None)[source]
get_code(address, block_identifier=None)[source]
get_implementation(address: str, additional_storage_slots=[])[source]

Calls implementation() on the contract for standardized proxies this should return the implementation

Parameters:
  • address (str) – Hex-string address

  • additional_storage_slots (list, optional) – Description

Returns:

call result

Return type:

object

get_storage_at(address, slot, block_identifier=None)[source]
provider_name()[source]
ethpector.data.node.to_checksum(address)[source]

ethpector.data.provider module

class ethpector.data.provider.AggregateProvider(config)[source]

Bases: DataProvider

The aggregate provider provides a simple way to query all available data-sources for a piece of information. The return value is always a dict where keys are the unique name provided by provider_name.

account_summary(address)[source]

Default implementation to acquire an address summary

Parameters:

address (str) – Hex-string of an address.

Returns:

Summary of the account state.

Return type:

AccountSummary

address_tag(*args)[source]
event_name(*args)[source]
first_of(name_list, fail=True)[source]
function_name(*args)[source]
get_balance(*args)[source]
get_code(*args)[source]
get_mythril_rpc_lookup()[source]
get_provider(name)[source]
get_storage_at(*args)[source]
provider_name()[source]
source_abi(*args)[source]
source_code(*args)[source]
source_metadata(*args)[source]

ethpector.data.signatures module

class ethpector.data.signatures.SignatureProvider(enable_online_lookup=True)[source]

Bases: DataProvider

Queries function and event signatures from local and online sources. Function signatures are first resolved via mythrils offline db. If enable_online_lookup is set to true the 4bytes API is called if a function signature is not found.

Event signatures are directly queried from 4bytes and then stored in a local on disk cache.

sigdb

Description

Type:

TYPE

event_name(selector: str) str[source]

Get a event signature for a selector:

Parameters:

selector (str) – hex-string 32 bytes

Returns:

Event signature (name with parameter)

Return type:

str

function_name(selector: str) str[source]

Get a function signature for a selector.

Parameters:

selector (str) – hex-string 4 bytes eg. 0xffffffff

Returns:

function signature e.g. test266151307()

Return type:

str

lookup_event(sign)[source]
lookup_function(sign)[source]
provider_name() str[source]

Unique identifier of this data-provider

Returns:

identifier

Return type:

str

ethpector.data.signatures.add_to_signature_db(signature_str: str)[source]

Allows to add new function signatures to the local Mythril db.

Parameters:
  • signature_str (str) – String representation of the signature

  • type. (as supported by the FunctionDefinition) –

ethpector.data.sourcify module

class ethpector.data.sourcify.SourcifyProvider(base_url, chain_id)[source]

Bases: DataProvider

Provides source-code from the distributed source-code verification service sourcify.

get_common_query_str(address)[source]
get_file(address, filename, json=True)[source]
get_metadata(address)[source]
provider_name()[source]
source_abi(address)[source]
source_code(address)[source]
source_metadata(address)[source]

ethpector.data.swarm module

class ethpector.data.swarm.SwarmProvider[source]

Bases: DataProvider

CURRENTLY not implemented.

provider_name()[source]

Module contents