# ethereum-dasm
ethereum evm bytecode disassembler with static- and dynamic-analysis and function signature lookup
[https://github.com/ethereum/] [https://www.ethereum.org/]
![windows](https://user-images.githubusercontent.com/2865694/42905736-28e71672-8ad9-11e8-9a2d-baa6f4260dbc.png)
**disassembles evm bytecode**
[![asciicast](https://asciinema.org/a/256036.png)](https://asciinema.org/a/256036)
**decompile a contract to pseudocode**
[![asciicast](https://asciinema.org/a/0xJvR55Zr7svqibS0oLHA2vY5.png)](https://asciinema.org/a/0xJvR55Zr7svqibS0oLHA2vY5)
## install
```
#> python3 -m pip install -r requirements*.txt
#> python3 -m pip install ethereum-dasm[mythril,abidecoder]
#> python3 -m ethereum-dasm # verify installation
```
```
#> python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf # jusst to verify installation
```
## usage
```
Usage: ethereum_dasm.py [options]
example: ethereum_dasm.py [-L -F -v] <file_or_bytecode>
ethereum_dasm.py [-L -F -v] # read from stdin
ethereum_dasm.py [-L -F -a <address>] # fetch contract code from infura.io
Options:
-h, --help show this help message and exit
-v VERBOSITY, --verbosity=VERBOSITY
available loglevels:
critical,fatal,error,warning,warn,info,debug,notset
[default: critical]
-L, --listing disables table mode, outputs assembly only
-F, --no-online-lookup
disable online function signature lookup
-a ADDRESS, --address=ADDRESS
fetch contract bytecode from address
-C, --no-color disable color mode (requires pip install colorama)
-A, --guess-abi guess the ABI for that contract
-D, --no-dynamic-analysis
disable dynamic analysis / symolic execution
-S, --no-static-analysis
disable static analysis
-s, --simplify simplify disassembly to human readable code
-x, --simplify-show-asm
simplify: show or hide asm annotations in simplified
code
-y, --simplify-show-unreachable
simplify: show or hide annotations for unreachable
instructions in simplified code
-n NETWORK, --network=NETWORK
network for address lookup (default: mainnet, ropsten,
rinkeby, kovan
```
#> echo "0x12345678" | python3 -m ethereum_dasm
#> python3 -m ethereum_dasm 0x12345678
#> python3 -m ethereum_dasm ether_contract.evm
#> python3 -m ethereum_dasm -a <contract address>
#> python3 -m ethereum_dasm -a <contract address> -A
#> python3 -m ethereum_dasm -a <contract address> --simplify [--simplify-show-asm, --simplify-show-unreachable]
## features
* disassemble evm bytecode
* decompile evm bytecode to pseudocode
* provide the path to the ethereum vm bytecode or the bytecode as an argument to evmdasm. Tries to read from stdin by default.
* returns !=0 on errors
* various output modes (`-L` to switch from table to listing mode)
* color-mode
* invalid opcodes are prefixed with `UNKNOWN_`
* gas consumption for instruction
* return value and arguments for instruction
* basic jump/xref analysis
* basicblocking
* online function signature and method name lookup, operand annotations
* payable modifier detection
* dynamic analysis based on symbolic execution (depends on mythril)
* ABI.json download (from etherchain.org)
* ABI.json reconstruction from static analysis of the evm bytecode
* main interface `Contract()`.
## examples
**abi online lookup or reconstruction**
```#>python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf -A```
```python
# [....]
[{'stateMutability': 'nonpayable', 'constant': False, 'type': 'function', 'name': 'enter', 'signature': '0x124c32a1', 'outputs': [{'type': 'bool', 'name': ''}], 'inputs': [{'type': 'bytes32', 'name': '_passcode'
}, {'type': 'bytes8', 'name': '_gateKey'}], 'payable': False}, {'stateMutability': 'pure', 'constant': True, 'type': 'function', 'name': 'maxEntrants', 'signature': '0x60643652', 'outputs': [{'type': 'uint8', 'n
ame': ''}], 'inputs': [], 'payable': False}, {'stateMutability': 'view', 'constant': True, 'type': 'function', 'name': 'totalEntrants', 'signature': '0x694463a2', 'outputs': [{'type': 'uint8', 'name': ''}], 'inp
uts': [], 'payable': False}, {'stateMutability': 'nonpayable', 'constant': False, 'type': 'function', 'name': 'assignAll', 'signature': '0x90ae631d', 'outputs': [{'type': 'bool', 'name': ''}], 'inputs': [], 'pay
able': False}, {'inputs': [], 'stateMutability': 'nonpayable', 'payable': False, 'type': 'constructor'}]
```
**abi reconstruction from dasm if abi is not available**
`#> python3 -m ethereum_dasm -a 0x8f8bed23a644f3bbb4e227e28704c050e67c35be -A`
```
[{'signature': '0x95d89b41', 'outputs': [], 'stateMutability': None, 'name': 'symbol', 'constant': None, 'inputs': [], 'payable': True, 'type': 'function', 'address': 598}, {'signature': '0x095ea7b3', 'outputs':
[], 'stateMutability': None, 'name': 'approve', 'constant': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 328}, {'signature': '0x313ce567', 'outputs': [], 'stateMutab
ility': None, 'name': 'decimals', 'constant': None, 'inputs': [], 'payable': True, 'type': 'function', 'address': 486}, {'signature': '0xdd62ed3e', 'outputs': [], 'stateMutability': None, 'name': 'allowance', 'c
onstant': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 691}, {'signature': '0x66188463', 'outputs': [], 'stateMutability': None, 'name': 'decreaseApproval', 'constant
': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 529}, {'signature': '0x23b872dd', 'outputs': [], 'stateMutability': None, 'name': 'transferFrom', 'constant': None, 'i
nputs': ['bytes32', 'bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 423}, {'signature': '0x2ff2e9dc', 'outputs': [], 'stateMutability': None, 'name': 'INITIAL_SUPPLY', 'constant': None,
'inputs': [], 'payable': True, 'type': 'function', 'address': 465}, {'signature': '0x06fdde03', 'outputs': [], 'stateMutability': None, 'name': 'name', 'constant': None, 'inputs': [], 'payable': True, 'type': 'f
unction', 'address': 190}, {'signature': '0x18160ddd', 'outputs': [], 'stateMutability': None, 'name': 'totalSupply', 'constant': None, 'inputs': [], 'payable': True, 'type': 'function', 'address': 384}, {'signa
ture': '0x70a08231', 'outputs': [], 'stateMutability': None, 'name': 'balanceOf', 'constant': None, 'inputs': ['<bytes??>'], 'payable': True, 'type': 'function', 'address': 565}, {'signature': '0xa9059cbb', 'out
puts': [], 'stateMutability': None, 'name': 'transfer', 'constant': None, 'inputs': [{'type': 'address', 'name': 'arg0'}, {'type': 'uint256', 'name': 'arg1'}], 'payable': True, 'type': 'function', 'address': 619
}, {'signature': '0xd73dd623', 'outputs': [], 'stateMutability': None, 'name': 'increaseApproval', 'constant': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 655}]
```
**detailed listing**
```python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf -A --no-color ```
```python
Inst addr hex gas | mnemonic operand xrefs description retval args
------------------------------------------------------------------------------------------------ ----------- -------------------------------------------------------------------- --------------- --------------------
:loc_0x0
0 [ 0 0x0000 ] 3 | PUSH1 0x60 # Place 1 byte item on stack. item
1 [ 2 0x0002 ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item
2 [ 4 0x0004 ] 3 | MSTORE # Save word to memory. value, offset
3 [ 5 0x0005 ] 3 | PUSH1 0x04 # Place 1 byte item on stack. item
4 [ 7 0x0007 ] 2 | CALLDATASIZE # Get size of input data in current environment. msg.data.length
5 [ 8 0x0008 ] 3 | LT # Lesser-than comparison flag a, b
6 [ 9 0x0009 ] 3 | PUSH2 0x0048 # Place 2-byte item on stack. item
7 [ 12 0x000c ] 10 | JUMPI @0x48 # Conditionally alter the program counter. evm.pc, condition
8 [ 13 0x000d ] 3 | PUSH4 0xffffffff # Place 4-byte item on stack. item
9 [ 18 0x0012 ] 3 | PUSH1 0xe0 # Place 1 byte item on stack. item
10 [ 20 0x0014 ] 3 | PUSH1 0x02 # Place 1 byte item on stack. item
11 [ 22 0x0016 ] 10 | EXP # Exponential operation. result base, exponent
12 [ 23 0x0017 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item
13 [ 25 0x0019 ] 3 | CALLDATALOAD # Get input data of current environment. msg.data unknown
14 [ 26 0x001a ] 5 | DIV # Integer division operation. result a, b
15 [ 27 0x001b ] 3 | AND # Bitwise AND operation. result a, b
16 [ 28 0x001c ] 3 | PUSH4 0x124c32a1 --> 'function enter(bytes32,bytes8)' # Place 4-byte item on stack. item
17 [ 33 0x0021 ] 3 | DUP2 # Duplicate 2nd stack item.
18 [ 34 0x0022 ] 3 | EQ # Equality comparison flag a, b
19 [ 35 0x0023 ] 3 | PUSH2 0x004d # Place 2-byte item on stack. item
20 [ 38 0x0026 ] 10 | JUMPI @0x4d # Conditionally alter the program counter. evm.pc, condition
21 [ 39 0x0027 ] 3 | DUP1 # Duplicate 1st stack item.
22 [ 40 0x0028 ] 3 | PUSH4 0x60643652 --> 'function maxEntrants()' # Place 4-byte item on stack. item
23 [ 45 0x002d ] 3 | EQ # Equality comparison flag a, b
24 [ 46 0x002e ] 3 | PUSH2 0x0095 # Place 2-byte item on stack. item
25 [ 49 0x0031 ] 10 | JUMPI @0x95 # Conditionally alter the program counter. evm.pc, condition
26 [ 50 0x0032 ] 3 | DUP1 # Duplicate 1st stack item.
27 [ 51 0x0033 ] 3 | PUSH4 0x694463a2 --> 'function totalEntrants()' # Place 4-byte item on stack. item
28 [ 56 0x0038 ] 3 | EQ # Equality comparison flag a, b
29 [ 57 0x0039 ] 3 | PUSH2 0x00be # Place 2-byte item on stack. item
30 [ 60 0x003c ] 10 | JUMPI @0xbe # Conditionally alter the program counter. evm.pc, condition
31 [ 61 0x003d ] 3 | DUP1 # Duplicate 1st stack item.
32 [ 62 0x003e ] 3 | PUSH4 0x90ae631d --> 'function assignAll()' # Place 4-byte item on stack. item
33 [ 67 0x0043 ] 3 | EQ # Equality comparison flag a, b
34 [ 68 0x0044 ] 3 | PUSH2 0x00d1 # Place 2-byte item on stack. item
35 [ 71 0x0047 ] 10 | JUMPI @0xd1 # Conditionally alter the program counter. evm.pc, condition
:loc_0x48
36 [ 72 0x0048 ] 1 | JUMPDEST JUMPI@0xc # Mark a valid destination for jumps.
37 [ 73 0x0049 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item
38 [ 75 0x004b ] 3 | DUP1 # Duplicate 1st stack item.
39 [ 76 0x004c ] 0 | REVERT # throw an error offset, size
:loc_0x4d
/*******************************************************************
function enter(bytes32,bytes8)
payable: False
inputs: (2) ['bytes32', '<bytes??>']
potential signatures: ['enter(bytes32,bytes8)']
*******************************************************************/
40 [ 77 0x004d ] 1 | JUMPDEST JUMPI@0x26 # Mark a valid destination for jumps.
41 [ 78 0x004e ] 2 | CALLVALUE # Get deposited value by the instruction/transaction responsible for msg.value
this execution.
42 [ 79 0x004f ] 3 | ISZERO # Simple not operator flag a
43 [ 80 0x0050 ] 3 | PUSH2 0x0058 # Place 2-byte item on stack. item
44 [ 83 0x0053 ] 10 | JUMPI @0x58 # Conditionally alter the program counter. evm.pc, condition
45 [ 84 0x0054 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item
46 [ 86 0x0056 ] 3 | DUP1 # Duplicate 1st stack item.
47 [ 87 0x0057 ] 0 | REVERT # throw an error offset, size
:loc_0x58
48 [ 88 0x0058 ] 1 | JUMPDEST JUMPI@0x53 # Mark a valid destination for jumps.
49 [ 89 0x0059 ] 3 | PUSH2 0x0081 # Place 2-byte item on stack. item
50 [ 92 0x005c ] 3 | PUSH1 0x04 # Place 1 byte item on stack. item
51 [ 94 0x005e ] 3 | CALLDATALOAD # Get input data of current environment. msg.data unknown
52 [ 95 0x005f ] 3 | PUSH24 0xffffffffffffffffffffffffffffffffffffffffffffffff # Place 24-byte item on stack. item
53 [ 120 0x0078 ] 3 | NOT # Bitwise NOT operation. result a, b
54 [ 121 0x0079 ] 3 | PUSH1 0x24 # Place 1 byte item on stack. item
55 [ 123 0x007b ] 3 | CALLDATALOAD # Get input data of current environment. msg.data unknown
56 [ 124 0x007c ] 3 | AND # Bitwise AND operation. result a, b
57 [ 125 0x007d ] 3 | PUSH2 0x00e4 # Place 2-byte item on stack. item
58 [ 128 0x0080 ] 8 | JUMP @0xe4 # Alter the program counter. evm.pc
:loc_0x81
59 [ 129 0x0081 ] 1 | JUMPDEST # Mark a valid destination for jumps.
60 [ 130 0x0082 ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item
61 [ 132 0x0084 ] 3 | MLOAD # Load word from memory. offset
62 [ 133 0x0085 ] 3 | SWAP1 # Exchange 1st and 2nd stack items.
63 [ 134 0x0086 ] 3 | ISZERO # Simple not operator flag a
64 [ 135 0x0087 ] 3 | ISZERO # Simple not operator flag a
65 [ 136 0x0088 ] 3 | DUP2 # Duplicate 2nd stack item.
66 [ 137 0x0089 ] 3 | MSTORE # Save word to memory. value, offset
67 [ 138 0x008a ] 3 | PUSH1 0x20 # Place 1 byte item on stack. item
68 [ 140 0x008c ] 3 | ADD # Addition operation. result a, b
69 [ 141 0x008d ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item
70 [ 143 0x008f ] 3 | MLOAD # Load word from memory. offset
71 [ 144 0x0090 ] 3 | DUP1 # Duplicate 1st stack item.
72 [ 145 0x0091 ] 3 | SWAP2 # Exchange 1st and 3rd stack items.
73 [ 146 0x0092 ] 3 | SUB # Subtraction operation. result a, b
74 [ 147 0x0093 ] 3 | SWAP1 # Exchange 1st and 2nd stack items.
75 [ 148 0x0094 ] 0 | RETURN # Halt execution returning output data. offset, size
:loc_0x95
/*******************************************************************
function maxEntrants()
payable: False
inputs: (0) []
potential signatures: ['maxEntrants()']
*******************************************************************/
76 [ 149 0x0095 ] 1 | JUMPDEST JUMPI@0x31 # Mark a valid destination for jumps.
77 [ 150 0x0096 ] 2 | CALLVALUE # Get deposited value by the instruction/transaction responsible for msg.value
this execution.
78 [ 151 0x0097 ] 3 | ISZERO # Simple not operator flag a
79 [ 152 0x0098 ] 3 | PUSH2 0x00a0 # Place 2-byte item on stack. item
80 [ 155 0x009b ] 10 | JUMPI @0xa0 # Conditionally alter the program counter. evm.pc, condition
81 [ 156 0x009c ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item
82 [ 158 0x009e ] 3 | DUP1 # Duplicate 1st stack item.
83 [ 159 0x009f ] 0 | REVERT # throw an error offset, size
:loc_0xa0
84 [ 160 0x00a0 ] 1 | JUMPDEST JUMPI@0x9b # Mark a valid destination for jumps.
85 [ 161 0x00a1 ] 3 | PUSH2 0x00a8 # Place 2-byte item on stack. item
86 [ 164 0x00a4 ] 3 | PUSH2 0x0314 # Place 2-byte item on stack. item
87 [ 167 0x00a7 ] 8 | JUMP @0x314 # Alter the program counter. evm.pc
:loc_0xa8
88 [ 168 0x00a8 ] 1 | JUMPDEST # Mark a valid destination for jumps.
89 [ 169 0x00a9 ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item
90 [ 171 0x00ab ] 3 | MLOAD # Load word from memory. offset
91 [ 172 0x00ac ] 3 | PUSH1 0xff # Place 1 byte item on stack. item
92 [ 174 0x00ae ] 3 | SWAP1 # Exchange 1st and 2nd stack items.
93 [ 175 0x00af ] 3 | SWAP2 # Exchange 1st and 3rd stack items.
94 [ 176 0x00b0 ] 3 | AND # Bitwise AND operation. result a, b
95 [ 177 0x00b1 ] 3 | DUP2 # Duplicate 2nd stack item.
96 [ 178 0x00b2 ] 3 | MSTORE # Save word to memory. value, offset
97 [ 179 0x00b3 ] 3 | PUSH1 0x20 # Place 1 byte item on stack. item
98 [ 181 0x00b5 ] 3 | ADD # Addition operation. result a, b
99 [ 182 0x00b6 ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item
100 [ 184 0x00b8 ] 3 | MLOAD # Load word from memory. offset
101 [ 185 0x00b9 ] 3 | DUP1 # Duplicate 1st stack item.
102 [ 186 0x00ba ] 3 | SWAP2 # Exchange 1st and 3rd stack items.
103 [ 187 0x00bb ] 3 | SUB # Subtraction operation. result a, b
104 [ 188 0x00bc ] 3 | SWAP1 # Exchange 1st and 2nd stack items.
105 [ 189 0x00bd ] 0 | RETURN # Halt execution returning output data. offset, size
:loc_0xbe
/*******************************************************************
function totalEntrants()
payable: False
inputs: (0) []
potential signatures: ['totalEntrants()']
*******************************************************************/
106 [ 190 0x00be ] 1 | JUMPDEST JUMPI@0x3c # Mark a valid destination for jumps.
107 [ 191 0x00bf ] 2 | CALLVALUE # Get deposited value by the instruction/transaction responsible for msg.value
this execution.
108 [ 192 0x00c0 ] 3 | ISZERO # Simple not operator flag a
109 [ 193 0x00c1 ] 3 | PUSH2 0x00c9 # Place 2-byte item on stack. item
110 [ 196 0x00c4 ] 10 | JUMPI @0xc9 # Conditionally alter the program counter. evm.pc, condition
111 [ 197 0x00c5 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item
112 [ 199 0x00c7 ] 3 | DUP1 # Duplicate 1st stack item.
113 [ 200 0x00c8 ] 0 | REVERT # throw an error offset, size
:loc_0xc9
114 [ 201 0x00c9 ] 1 | JUMPDEST JUMPI@0xc4 # Mark a valid destination for jumps.
115 [ 202 0x00ca ] 3 | PUSH2 0x00a8 # Place 2-byte item on stack. item
116 [ 205 0x00cd ] 3 | PUSH2 0x031a # Place 2-byte item on stack. item
117 [ 208 0x00d0 ] 8 | JUMP @0x31a # Alter the program counter. evm.pc
:loc_0xd1
/*******************************************************************
function assignAll()
payable: False
inputs: (0) []
potential signatures: ['assignAll()']
*******************************************************************/
118 [ 209 0x00d1 ] 1 | JUMPDEST JUMPI@0x47 # Mark a valid destination for jumps.
119 [ 210 0x00d2 ] 2 | CALLVALUE # Get deposited value by the instruction/transaction responsible for msg.value
this execution.
120 [ 211 0x00d3 ] 3 | ISZERO # Simple not operator flag a
121 [ 212 0x00d4 ] 3 | PUSH2 0x00dc # Place 2-byte item on stack. item
122 [ 215 0x00d7 ] 10 | JUMPI @0xdc # Conditionally alter the program counter. evm.pc, condition
123 [ 216 0x00d8 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item
124 [ 218 0x00da ] 3 | DUP1 # Duplicate 1st stack item.
125 [ 219 0x00db ] 0 | REVERT # throw an error offset, size
:loc_0xdc
126 [ 220 0x00dc ] 1 | JUMPDEST JUMPI@0xd7 # Mark a valid destination for jumps.
127 [ 221 0x00dd ] 3 | PUSH2 0x0081 # Place 2-byte item on stack. item
128 [ 224 0x00e0 ] 3 | PUSH2 0x0320 # Place 2-byte item on stack. item
129 [ 227 0x00e3 ] 8 | JUMP @0x320 # Alter the program counter. evm.pc
:loc_0xe4
130 [ 228 0x00e4 ] 1 | JUMPDEST JUMP@0x80 # Mark a valid destination for jumps.
131 [ 229 0x00e5 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item
132 [ 231 0x00e7 ] 2 | ORIGIN # Get execution origination address. tx.origin
133 [ 232 0x00e8 ] 3 | PUSH1 0x01 # Place 1 byte item on stack. item
134 [ 234 0x00ea ] 3 | PUSH1 0xa0 # Place 1 byte item on stack. item
135 [ 236 0x00ec ] 3 | PUSH1 0x02 # Place 1 byte item on stack. item
136 [ 238 0x00ee ] 10 | EXP # Exponential operation. result base, exponent
137 [ 239 0x00ef ] 3 | SUB # Subtraction operation. result a, b
138 [ 240 0x00f0 ] 3 | AND # Bitwise AND operation. result a, b
139 [ 241 0x00f1 ] 2 | CALLER # Get caller address.This is the address of the account that is msg.sender
directly responsible for this execution.
140 [ 242 0x00f2 ] 3 | PUSH1 0x01 # Place 1 byte item on stack. item
141 [ 244 0x00f4 ] 3 | PUSH1 0xa0 # Place 1 byte item on stack. item
142 [ 246 0x00f6 ] 3 | PUSH1 0x02 # Place 1 byte item on stack. item
143 [ 248 0x00f8 ] 10 | EXP # Exponential operation. result base, exponent
144 [ 249 0x00f9 ] 3 | SUB # Subtraction operation. result a, b
145 [ 250 0x00fa ] 3 | AND # Bitwise AND operation. result a, b
146 [ 251 0x00fb ] 3 | EQ # Equality comparison flag a, b
147 [ 252 0x00fc ] 3 | ISZERO # Simple not operator flag a
148 [ 253 0x00fd ] 3 | ISZERO # Simple not operator flag a
149 [ 254 0x00fe ] 3 | ISZERO # Simple not operator flag a
150 [ 255 0x00ff ] 3 | PUSH2 0x0107 # Place 2-byte item on stack. item
151 [ 258 0x0102 ] 10 | JUMPI @0x107 # Conditionally alter the program counter. evm.pc, condition
152 [ 259 0x0103 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item
153 [ 261 0x0105 ] 3 | DUP1 # Duplicate 1st stack item.
154 [ 262 0x0106 ] 0 | REVERT # throw an error offset, size
[...]
:loc_0x5d5
954 [1493 0x05d5 ] 1 | JUMPDEST JUMPI@0x5c9 # Mark a valid destination for jumps.
955 [1494 0x05d6 ] 2 | POP # Remove item from stack. #dummy
956 [1495 0x05d7 ] 3 | SWAP1 # Exchange 1st and 2nd stack items.
957 [1496 0x05d8 ] 8 | JUMP # Alter the program counter. evm.pc
958 [1497 0x05d9 ] 0 | STOP # Halts execution.
959 [1498 0x05da ] 750 | LOG1 0x65 # Append log record with one topic. start, size, topic1
960 [1500 0x05dc ] 3 | PUSH3 0x7a7a72 # Place 3-byte item on stack. item
961 [1504 0x05e0 ] 2 | ADDRESS # Get address of currently executing account. this.address
962 [1505 0x05e1 ] 2 | PC # Get the value of the program counter prior to the increment. evm.pc
963 [1506 0x05e2 ] 30 | SHA3 # Compute Keccak-256 hash. flag offset, size
964 [1507 0x05e3 ] -1 | UNKNOWN_0xf # Invalid opcode
965 [1508 0x05e4 ] 3 | SWAP4 # Exchange 1st and 5th stack items.
966 [1509 0x05e5 ] 3 | SWAP14 # Exchange 1st and 15th stack items.
967 [1510 0x05e6 ] 2 | CALLDATASIZE # Get size of input data in current environment. msg.data.length
968 [1511 0x05e7 ] -1 | UNKNOWN_0xe1 # Invalid opcode
969 [1512 0x05e8 ] -1 | UNKNOWN_0xcb # Invalid opcode
970 [1513 0x05e9 ] 3 | PUSH22 0xc68ec825da862dc7082ea12aea89eb3783b2e0423cd2 # Place 22-byte item on stack. item
971 [1536 0x0600 ] 30 | SHA3 # Compute Keccak-256 hash. flag offset, size
972 [1537 0x0601 ] -1 | UNKNOWN_0x28 # Invalid opcode
973 [1538 0x0602 ] 3 | PUSH16 0x0029 # Place 16-byte item on stack. item
==============================
reconstructed ABI:
[{'name': 'enter', 'stateMutability': 'nonpayable', 'signature': '0x124c32a1', 'payable': False, 'inputs': [{'name': '_passcode', 'type': 'bytes32'}, {'name': '_gateKey', 'type': 'bytes8'}], 'constant': False, 'type': 'function', 'outputs': [{'name': '', 'type': 'bool'}]}, {'name': 'maxEntrants', 'stateMutability': 'pure', 'signature': '0x60643652', 'payable': False, 'inputs': [], 'constant': True, 'type': 'function', 'outputs': [{'name': '', 'type': 'uint8'}]}, {'name': 'totalEntrants', 'stateMutability': 'view', 'signature': '0x694463a2', 'payable': False, 'inputs': [], 'constant': True, 'type': 'function', 'outputs': [{'name': '', 'type': 'uint8'}]}, {'name': 'assignAll', 'stateMutability': 'nonpayable', 'signature': '0x90ae631d', 'payable': False, 'inputs': [], 'constant': False, 'type': 'function', 'outputs': [{'name': '', 'type': 'bool'}]}, {'stateMutability': 'nonpayable', 'type': 'constructor', 'payable': False, 'inputs': []}]
```
**decompile to pseudocode**
```
python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf --simplify #[--simplify-show-asm, --simplify-show-unreachable]
======================[simplified]
:init
memory[0x40] = 0x60
if (Not(ULE(0x4, 1_calldatasize))) goto LOC_0x48
if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0xa1,
If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x32,
If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0x4c,
If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x12)) goto function_enter (LOC_0x4d)
if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0x52,
If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x36,
If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0x64,
If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x60)) goto function_maxEntrants (LOC_0x95)
if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0xa2,
If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x63,
If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0x44,
If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x69)) goto function_totalEntrants (LOC_0xbe)
if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0x1d,
If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x63,
If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0xae,
If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x90)) goto function_assignAll (LOC_0xd1)
:LOC_0x48
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:function_enter (LOC_0x4d)
/*******************************************************************
function enter(bytes32,bytes8)
payable: False
inputs: (2) ['bytes32', '<bytes??>']
potential signatures: ['enter(bytes32,bytes8)']
*******************************************************************/
if (call_value1 == 0x0) goto LOC_0x58
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0x58
goto LOC_0xe4
:LOC_0x81
:function_maxEntrants (LOC_0x95)
/*******************************************************************
function maxEntrants()
payable: False
inputs: (0) []
potential signatures: ['maxEntrants()']
*******************************************************************/
if (call_value1 == 0x0) goto LOC_0xa0
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0xa0
goto LOC_0x314
:LOC_0xa8
memory[0x60] = 0xfa
RETURN(offset=0x60, size=0x20)
/******* <<terminates execution>> *******/
:function_totalEntrants (LOC_0xbe)
/*******************************************************************
function totalEntrants()
payable: False
inputs: (0) []
potential signatures: ['totalEntrants()']
*******************************************************************/
if (call_value1 == 0x0) goto LOC_0xc9
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0xc9
goto LOC_0x31a
:function_assignAll (LOC_0xd1)
/*******************************************************************
function assignAll()
payable: False
inputs: (0) []
potential signatures: ['assignAll()']
*******************************************************************/
if (call_value1 == 0x0) goto LOC_0xdc
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0xdc
goto LOC_0x320
:LOC_0xe4
if (Not(Extract(159, 0, origin1) ==
0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef)) goto LOC_0x107
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0x107
if (True) goto LOC_0x114
:LOC_0x114
if (bvurem_i(1_gas, 0x1fff) == 0x0) goto LOC_0x11f
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0x11f
if (And(If(1_calldatasize <= 0x29, 0x0, 1_calldata[0x29]) == 0x0,
If(1_calldatasize <= 0x28, 0x0, 1_calldata[0x28]) == 0x0)) goto LOC_0x154
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0x154
if (Not(And(If(1_calldatasize <= 0x27, 0x0, 1_calldata[0x27]) ==
0x0,
If(1_calldatasize <= 0x26, 0x0, 1_calldata[0x26]) ==
0x0,
If(1_calldatasize <= 0x25, 0x0, 1_calldata[0x25]) ==
0x0,
If(1_calldatasize <= 0x24, 0x0, 1_calldata[0x24]) ==
0x0))) goto LOC_0x18f
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0x18f
if (And(Extract(7, 0, origin1) ==
If(1_calldatasize <= 0x2b, 0x0, 1_calldata[0x2b]),
Extract(15, 8, origin1) ==
If(1_calldatasize <= 0x2a, 0x0, 1_calldata[0x2a]),
If(1_calldatasize <= 0x29, 0x0, 1_calldata[0x29]) == 0x0,
If(1_calldatasize <= 0x28, 0x0, 1_calldata[0x28]) == 0x0)) goto LOC_0x1c0
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0x1c0
if (True) goto LOC_0x1d1
:LOC_0x1d1
memory[0x0] = 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef
memory[0x20] = 0x3
if (True) goto LOC_0x1f7
:LOC_0x1f7
memory[0x0] = Concat(0x0, Extract(159, 0, origin1))
memory[0x20] = 0x3
if (True) goto LOC_0x21d
:LOC_0x21d
memory[0x60] = Concat(If(1_calldatasize <= 0x4, 0x0, 1_calldata[0x4]),
If(1_calldatasize <= 0x5, 0x0, 1_calldata[0x5]),
If(1_calldatasize <= 0x6, 0x0, 1_calldata[0x6]),
If(1_calldatasize <= 0x7, 0x0, 1_calldata[0x7]),
If(1_calldatasize <= 0x8, 0x0, 1_calldata[0x8]),
If(1_calldatasize <= 0x9, 0x0, 1_calldata[0x9]),
If(1_calldatasize <= 0xa, 0x0, 1_calldata[0xa]),
If(1_calldatasize <= 0xb, 0x0, 1_calldata[0xb]),
If(1_calldatasize <= 0xc, 0x0, 1_calldata[0xc]),
If(1_calldatasize <= 0xd, 0x0, 1_calldata[0xd]),
If(1_calldatasize <= 0xe, 0x0, 1_calldata[0xe]),
If(1_calldatasize <= 0xf, 0x0, 1_calldata[0xf]),
If(1_calldatasize <= 0x10, 0x0, 1_calldata[0x10]),
If(1_calldatasize <= 0x11, 0x0, 1_calldata[0x11]),
If(1_calldatasize <= 0x12, 0x0, 1_calldata[0x12]),
If(1_calldatasize <= 0x13, 0x0, 1_calldata[0x13]),
If(1_calldatasize <= 0x14, 0x0, 1_calldata[0x14]),
If(1_calldatasize <= 0x15, 0x0, 1_calldata[0x15]),
If(1_calldatasize <= 0x16, 0x0, 1_calldata[0x16]),
If(1_calldatasize <= 0x17, 0x0, 1_calldata[0x17]),
If(1_calldatasize <= 0x18, 0x0, 1_calldata[0x18]),
If(1_calldatasize <= 0x19, 0x0, 1_calldata[0x19]),
If(1_calldatasize <= 0x1a, 0x0, 1_calldata[0x1a]),
If(1_calldatasize <= 0x1b, 0x0, 1_calldata[0x1b]),
If(1_calldatasize <= 0x1c, 0x0, 1_calldata[0x1c]),
If(1_calldatasize <= 0x1d, 0x0, 1_calldata[0x1d]),
If(1_calldatasize <= 0x1e, 0x0, 1_calldata[0x1e]),
If(1_calldatasize <= 0x1f, 0x0, 1_calldata[0x1f]),
If(1_calldatasize <= 0x20, 0x0, 1_calldata[0x20]),
If(1_calldatasize <= 0x21, 0x0, 1_calldata[0x21]),
If(1_calldatasize <= 0x22, 0x0, 1_calldata[0x22]),
If(1_calldatasize <= 0x23, 0x0, 1_calldata[0x23]))
memory[0x0] = KECCAC[If(1_calldatasize_<=_0x4,_0x0,_1_calldata[0x4])]
memory[0x20] = 0x4
if (False) goto LOC_0x257
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0x257
:LOC_0x275
:LOC_0x2d6
:LOC_0x314
:LOC_0x317
goto LOC_0xa8
:LOC_0x31a
goto LOC_0xa8
:LOC_0x320
if (False) goto LOC_0x338
REVERT(offset=0x0, size=0x0)
/******* <<terminates execution>> *******/
:LOC_0x338
:LOC_0x347
:LOC_0x3a8
:LOC_0x3b9
:LOC_0x3d8
:LOC_0x3e0
:LOC_0x3f5
:LOC_0x459
:LOC_0x46a
:LOC_0x4de
:LOC_0x541
:LOC_0x552
:LOC_0x556
:LOC_0x55e
:LOC_0x588
:LOC_0x592
:LOC_0x5b6
:LOC_0x5bb
:LOC_0x5c1
:LOC_0x5d5
```
Raw data
{
"_id": null,
"home_page": "https://github.com/tintinweb/ethereum-dasm",
"name": "ethereum-dasm",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "ethereum,blockchain,evm,disassembler,decompiler,pseudocode",
"author": "tintinweb",
"author_email": "tintinweb@oststrom.com",
"download_url": "https://github.com/tintinweb/ethereum-dasm/tarball/v0.1.5",
"platform": "",
"description": "# ethereum-dasm \nethereum evm bytecode disassembler with static- and dynamic-analysis and function signature lookup\n\n[https://github.com/ethereum/] [https://www.ethereum.org/]\n\n![windows](https://user-images.githubusercontent.com/2865694/42905736-28e71672-8ad9-11e8-9a2d-baa6f4260dbc.png)\n\n**disassembles evm bytecode**\n\n[![asciicast](https://asciinema.org/a/256036.png)](https://asciinema.org/a/256036)\n\n**decompile a contract to pseudocode**\n\n[![asciicast](https://asciinema.org/a/0xJvR55Zr7svqibS0oLHA2vY5.png)](https://asciinema.org/a/0xJvR55Zr7svqibS0oLHA2vY5)\n\n\n## install\n\n```\n#> python3 -m pip install -r requirements*.txt\n#> python3 -m pip install ethereum-dasm[mythril,abidecoder]\n#> python3 -m ethereum-dasm # verify installation\n```\n\n```\n#> python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf # jusst to verify installation\n```\n\n## usage\n\n```\nUsage: ethereum_dasm.py [options]\n\n example: ethereum_dasm.py [-L -F -v] <file_or_bytecode>\n ethereum_dasm.py [-L -F -v] # read from stdin\n ethereum_dasm.py [-L -F -a <address>] # fetch contract code from infura.io\n\n\nOptions:\n -h, --help show this help message and exit\n -v VERBOSITY, --verbosity=VERBOSITY\n available loglevels:\n critical,fatal,error,warning,warn,info,debug,notset\n [default: critical]\n -L, --listing disables table mode, outputs assembly only\n -F, --no-online-lookup\n disable online function signature lookup\n -a ADDRESS, --address=ADDRESS\n fetch contract bytecode from address\n -C, --no-color disable color mode (requires pip install colorama)\n -A, --guess-abi guess the ABI for that contract\n -D, --no-dynamic-analysis\n disable dynamic analysis / symolic execution\n -S, --no-static-analysis\n disable static analysis\n -s, --simplify simplify disassembly to human readable code\n -x, --simplify-show-asm\n simplify: show or hide asm annotations in simplified\n code\n -y, --simplify-show-unreachable\n simplify: show or hide annotations for unreachable\n instructions in simplified code\n -n NETWORK, --network=NETWORK\n network for address lookup (default: mainnet, ropsten,\n rinkeby, kovan\n```\n\n #> echo \"0x12345678\" | python3 -m ethereum_dasm\n #> python3 -m ethereum_dasm 0x12345678\n #> python3 -m ethereum_dasm ether_contract.evm\n #> python3 -m ethereum_dasm -a <contract address>\n #> python3 -m ethereum_dasm -a <contract address> -A\n #> python3 -m ethereum_dasm -a <contract address> --simplify [--simplify-show-asm, --simplify-show-unreachable]\n\n## features\n\n* disassemble evm bytecode\n* decompile evm bytecode to pseudocode\n* provide the path to the ethereum vm bytecode or the bytecode as an argument to evmdasm. Tries to read from stdin by default.\n* returns !=0 on errors\n* various output modes (`-L` to switch from table to listing mode)\n* color-mode\n* invalid opcodes are prefixed with `UNKNOWN_`\n* gas consumption for instruction\n* return value and arguments for instruction\n* basic jump/xref analysis\n* basicblocking\n* online function signature and method name lookup, operand annotations\n* payable modifier detection\n* dynamic analysis based on symbolic execution (depends on mythril)\n* ABI.json download (from etherchain.org)\n* ABI.json reconstruction from static analysis of the evm bytecode\n* main interface `Contract()`.\n\n## examples\n\n**abi online lookup or reconstruction**\n```#>python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf -A```\n```python\n# [....]\n[{'stateMutability': 'nonpayable', 'constant': False, 'type': 'function', 'name': 'enter', 'signature': '0x124c32a1', 'outputs': [{'type': 'bool', 'name': ''}], 'inputs': [{'type': 'bytes32', 'name': '_passcode'\n}, {'type': 'bytes8', 'name': '_gateKey'}], 'payable': False}, {'stateMutability': 'pure', 'constant': True, 'type': 'function', 'name': 'maxEntrants', 'signature': '0x60643652', 'outputs': [{'type': 'uint8', 'n\name': ''}], 'inputs': [], 'payable': False}, {'stateMutability': 'view', 'constant': True, 'type': 'function', 'name': 'totalEntrants', 'signature': '0x694463a2', 'outputs': [{'type': 'uint8', 'name': ''}], 'inp\nuts': [], 'payable': False}, {'stateMutability': 'nonpayable', 'constant': False, 'type': 'function', 'name': 'assignAll', 'signature': '0x90ae631d', 'outputs': [{'type': 'bool', 'name': ''}], 'inputs': [], 'pay\nable': False}, {'inputs': [], 'stateMutability': 'nonpayable', 'payable': False, 'type': 'constructor'}]\n```\n\n**abi reconstruction from dasm if abi is not available**\n`#> python3 -m ethereum_dasm -a 0x8f8bed23a644f3bbb4e227e28704c050e67c35be -A`\n```\n[{'signature': '0x95d89b41', 'outputs': [], 'stateMutability': None, 'name': 'symbol', 'constant': None, 'inputs': [], 'payable': True, 'type': 'function', 'address': 598}, {'signature': '0x095ea7b3', 'outputs':\n [], 'stateMutability': None, 'name': 'approve', 'constant': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 328}, {'signature': '0x313ce567', 'outputs': [], 'stateMutab\nility': None, 'name': 'decimals', 'constant': None, 'inputs': [], 'payable': True, 'type': 'function', 'address': 486}, {'signature': '0xdd62ed3e', 'outputs': [], 'stateMutability': None, 'name': 'allowance', 'c\nonstant': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 691}, {'signature': '0x66188463', 'outputs': [], 'stateMutability': None, 'name': 'decreaseApproval', 'constant\n': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 529}, {'signature': '0x23b872dd', 'outputs': [], 'stateMutability': None, 'name': 'transferFrom', 'constant': None, 'i\nnputs': ['bytes32', 'bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 423}, {'signature': '0x2ff2e9dc', 'outputs': [], 'stateMutability': None, 'name': 'INITIAL_SUPPLY', 'constant': None,\n'inputs': [], 'payable': True, 'type': 'function', 'address': 465}, {'signature': '0x06fdde03', 'outputs': [], 'stateMutability': None, 'name': 'name', 'constant': None, 'inputs': [], 'payable': True, 'type': 'f\nunction', 'address': 190}, {'signature': '0x18160ddd', 'outputs': [], 'stateMutability': None, 'name': 'totalSupply', 'constant': None, 'inputs': [], 'payable': True, 'type': 'function', 'address': 384}, {'signa\nture': '0x70a08231', 'outputs': [], 'stateMutability': None, 'name': 'balanceOf', 'constant': None, 'inputs': ['<bytes??>'], 'payable': True, 'type': 'function', 'address': 565}, {'signature': '0xa9059cbb', 'out\nputs': [], 'stateMutability': None, 'name': 'transfer', 'constant': None, 'inputs': [{'type': 'address', 'name': 'arg0'}, {'type': 'uint256', 'name': 'arg1'}], 'payable': True, 'type': 'function', 'address': 619\n}, {'signature': '0xd73dd623', 'outputs': [], 'stateMutability': None, 'name': 'increaseApproval', 'constant': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 655}]\n```\n\n\n**detailed listing**\n\n```python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf -A --no-color ```\n```python\n Inst addr hex gas | mnemonic operand xrefs description retval args\n------------------------------------------------------------------------------------------------ ----------- -------------------------------------------------------------------- --------------- --------------------\n:loc_0x0\n 0 [ 0 0x0000 ] 3 | PUSH1 0x60 # Place 1 byte item on stack. item\n 1 [ 2 0x0002 ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item\n 2 [ 4 0x0004 ] 3 | MSTORE # Save word to memory. value, offset\n 3 [ 5 0x0005 ] 3 | PUSH1 0x04 # Place 1 byte item on stack. item\n 4 [ 7 0x0007 ] 2 | CALLDATASIZE # Get size of input data in current environment. msg.data.length\n 5 [ 8 0x0008 ] 3 | LT # Lesser-than comparison flag a, b\n 6 [ 9 0x0009 ] 3 | PUSH2 0x0048 # Place 2-byte item on stack. item\n 7 [ 12 0x000c ] 10 | JUMPI @0x48 # Conditionally alter the program counter. evm.pc, condition\n 8 [ 13 0x000d ] 3 | PUSH4 0xffffffff # Place 4-byte item on stack. item\n 9 [ 18 0x0012 ] 3 | PUSH1 0xe0 # Place 1 byte item on stack. item\n 10 [ 20 0x0014 ] 3 | PUSH1 0x02 # Place 1 byte item on stack. item\n 11 [ 22 0x0016 ] 10 | EXP # Exponential operation. result base, exponent\n 12 [ 23 0x0017 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item\n 13 [ 25 0x0019 ] 3 | CALLDATALOAD # Get input data of current environment. msg.data unknown\n 14 [ 26 0x001a ] 5 | DIV # Integer division operation. result a, b\n 15 [ 27 0x001b ] 3 | AND # Bitwise AND operation. result a, b\n 16 [ 28 0x001c ] 3 | PUSH4 0x124c32a1 --> 'function enter(bytes32,bytes8)' # Place 4-byte item on stack. item\n 17 [ 33 0x0021 ] 3 | DUP2 # Duplicate 2nd stack item.\n 18 [ 34 0x0022 ] 3 | EQ # Equality comparison flag a, b\n 19 [ 35 0x0023 ] 3 | PUSH2 0x004d # Place 2-byte item on stack. item\n 20 [ 38 0x0026 ] 10 | JUMPI @0x4d # Conditionally alter the program counter. evm.pc, condition\n 21 [ 39 0x0027 ] 3 | DUP1 # Duplicate 1st stack item.\n 22 [ 40 0x0028 ] 3 | PUSH4 0x60643652 --> 'function maxEntrants()' # Place 4-byte item on stack. item\n 23 [ 45 0x002d ] 3 | EQ # Equality comparison flag a, b\n 24 [ 46 0x002e ] 3 | PUSH2 0x0095 # Place 2-byte item on stack. item\n 25 [ 49 0x0031 ] 10 | JUMPI @0x95 # Conditionally alter the program counter. evm.pc, condition\n 26 [ 50 0x0032 ] 3 | DUP1 # Duplicate 1st stack item.\n 27 [ 51 0x0033 ] 3 | PUSH4 0x694463a2 --> 'function totalEntrants()' # Place 4-byte item on stack. item\n 28 [ 56 0x0038 ] 3 | EQ # Equality comparison flag a, b\n 29 [ 57 0x0039 ] 3 | PUSH2 0x00be # Place 2-byte item on stack. item\n 30 [ 60 0x003c ] 10 | JUMPI @0xbe # Conditionally alter the program counter. evm.pc, condition\n 31 [ 61 0x003d ] 3 | DUP1 # Duplicate 1st stack item.\n 32 [ 62 0x003e ] 3 | PUSH4 0x90ae631d --> 'function assignAll()' # Place 4-byte item on stack. item\n 33 [ 67 0x0043 ] 3 | EQ # Equality comparison flag a, b\n 34 [ 68 0x0044 ] 3 | PUSH2 0x00d1 # Place 2-byte item on stack. item\n 35 [ 71 0x0047 ] 10 | JUMPI @0xd1 # Conditionally alter the program counter. evm.pc, condition\n\n:loc_0x48\n 36 [ 72 0x0048 ] 1 | JUMPDEST JUMPI@0xc # Mark a valid destination for jumps.\n 37 [ 73 0x0049 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item\n 38 [ 75 0x004b ] 3 | DUP1 # Duplicate 1st stack item.\n 39 [ 76 0x004c ] 0 | REVERT # throw an error offset, size\n:loc_0x4d\n /*******************************************************************\n function enter(bytes32,bytes8)\n payable: False\n inputs: (2) ['bytes32', '<bytes??>']\n potential signatures: ['enter(bytes32,bytes8)']\n *******************************************************************/\n 40 [ 77 0x004d ] 1 | JUMPDEST JUMPI@0x26 # Mark a valid destination for jumps.\n 41 [ 78 0x004e ] 2 | CALLVALUE # Get deposited value by the instruction/transaction responsible for msg.value\n this execution.\n 42 [ 79 0x004f ] 3 | ISZERO # Simple not operator flag a\n 43 [ 80 0x0050 ] 3 | PUSH2 0x0058 # Place 2-byte item on stack. item\n 44 [ 83 0x0053 ] 10 | JUMPI @0x58 # Conditionally alter the program counter. evm.pc, condition\n 45 [ 84 0x0054 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item\n 46 [ 86 0x0056 ] 3 | DUP1 # Duplicate 1st stack item.\n 47 [ 87 0x0057 ] 0 | REVERT # throw an error offset, size\n:loc_0x58\n 48 [ 88 0x0058 ] 1 | JUMPDEST JUMPI@0x53 # Mark a valid destination for jumps.\n 49 [ 89 0x0059 ] 3 | PUSH2 0x0081 # Place 2-byte item on stack. item\n 50 [ 92 0x005c ] 3 | PUSH1 0x04 # Place 1 byte item on stack. item\n 51 [ 94 0x005e ] 3 | CALLDATALOAD # Get input data of current environment. msg.data unknown\n 52 [ 95 0x005f ] 3 | PUSH24 0xffffffffffffffffffffffffffffffffffffffffffffffff # Place 24-byte item on stack. item\n 53 [ 120 0x0078 ] 3 | NOT # Bitwise NOT operation. result a, b\n 54 [ 121 0x0079 ] 3 | PUSH1 0x24 # Place 1 byte item on stack. item\n 55 [ 123 0x007b ] 3 | CALLDATALOAD # Get input data of current environment. msg.data unknown\n 56 [ 124 0x007c ] 3 | AND # Bitwise AND operation. result a, b\n 57 [ 125 0x007d ] 3 | PUSH2 0x00e4 # Place 2-byte item on stack. item\n 58 [ 128 0x0080 ] 8 | JUMP @0xe4 # Alter the program counter. evm.pc\n\n:loc_0x81\n 59 [ 129 0x0081 ] 1 | JUMPDEST # Mark a valid destination for jumps.\n 60 [ 130 0x0082 ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item\n 61 [ 132 0x0084 ] 3 | MLOAD # Load word from memory. offset\n 62 [ 133 0x0085 ] 3 | SWAP1 # Exchange 1st and 2nd stack items.\n 63 [ 134 0x0086 ] 3 | ISZERO # Simple not operator flag a\n 64 [ 135 0x0087 ] 3 | ISZERO # Simple not operator flag a\n 65 [ 136 0x0088 ] 3 | DUP2 # Duplicate 2nd stack item.\n 66 [ 137 0x0089 ] 3 | MSTORE # Save word to memory. value, offset\n 67 [ 138 0x008a ] 3 | PUSH1 0x20 # Place 1 byte item on stack. item\n 68 [ 140 0x008c ] 3 | ADD # Addition operation. result a, b\n 69 [ 141 0x008d ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item\n 70 [ 143 0x008f ] 3 | MLOAD # Load word from memory. offset\n 71 [ 144 0x0090 ] 3 | DUP1 # Duplicate 1st stack item.\n 72 [ 145 0x0091 ] 3 | SWAP2 # Exchange 1st and 3rd stack items.\n 73 [ 146 0x0092 ] 3 | SUB # Subtraction operation. result a, b\n 74 [ 147 0x0093 ] 3 | SWAP1 # Exchange 1st and 2nd stack items.\n 75 [ 148 0x0094 ] 0 | RETURN # Halt execution returning output data. offset, size\n\n:loc_0x95\n /*******************************************************************\n function maxEntrants()\n payable: False\n inputs: (0) []\n potential signatures: ['maxEntrants()']\n *******************************************************************/\n 76 [ 149 0x0095 ] 1 | JUMPDEST JUMPI@0x31 # Mark a valid destination for jumps.\n 77 [ 150 0x0096 ] 2 | CALLVALUE # Get deposited value by the instruction/transaction responsible for msg.value\n this execution.\n 78 [ 151 0x0097 ] 3 | ISZERO # Simple not operator flag a\n 79 [ 152 0x0098 ] 3 | PUSH2 0x00a0 # Place 2-byte item on stack. item\n 80 [ 155 0x009b ] 10 | JUMPI @0xa0 # Conditionally alter the program counter. evm.pc, condition\n 81 [ 156 0x009c ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item\n 82 [ 158 0x009e ] 3 | DUP1 # Duplicate 1st stack item.\n 83 [ 159 0x009f ] 0 | REVERT # throw an error offset, size\n:loc_0xa0\n 84 [ 160 0x00a0 ] 1 | JUMPDEST JUMPI@0x9b # Mark a valid destination for jumps.\n 85 [ 161 0x00a1 ] 3 | PUSH2 0x00a8 # Place 2-byte item on stack. item\n 86 [ 164 0x00a4 ] 3 | PUSH2 0x0314 # Place 2-byte item on stack. item\n 87 [ 167 0x00a7 ] 8 | JUMP @0x314 # Alter the program counter. evm.pc\n\n:loc_0xa8\n 88 [ 168 0x00a8 ] 1 | JUMPDEST # Mark a valid destination for jumps.\n 89 [ 169 0x00a9 ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item\n 90 [ 171 0x00ab ] 3 | MLOAD # Load word from memory. offset\n 91 [ 172 0x00ac ] 3 | PUSH1 0xff # Place 1 byte item on stack. item\n 92 [ 174 0x00ae ] 3 | SWAP1 # Exchange 1st and 2nd stack items.\n 93 [ 175 0x00af ] 3 | SWAP2 # Exchange 1st and 3rd stack items.\n 94 [ 176 0x00b0 ] 3 | AND # Bitwise AND operation. result a, b\n 95 [ 177 0x00b1 ] 3 | DUP2 # Duplicate 2nd stack item.\n 96 [ 178 0x00b2 ] 3 | MSTORE # Save word to memory. value, offset\n 97 [ 179 0x00b3 ] 3 | PUSH1 0x20 # Place 1 byte item on stack. item\n 98 [ 181 0x00b5 ] 3 | ADD # Addition operation. result a, b\n 99 [ 182 0x00b6 ] 3 | PUSH1 0x40 # Place 1 byte item on stack. item\n 100 [ 184 0x00b8 ] 3 | MLOAD # Load word from memory. offset\n 101 [ 185 0x00b9 ] 3 | DUP1 # Duplicate 1st stack item.\n 102 [ 186 0x00ba ] 3 | SWAP2 # Exchange 1st and 3rd stack items.\n 103 [ 187 0x00bb ] 3 | SUB # Subtraction operation. result a, b\n 104 [ 188 0x00bc ] 3 | SWAP1 # Exchange 1st and 2nd stack items.\n 105 [ 189 0x00bd ] 0 | RETURN # Halt execution returning output data. offset, size\n\n:loc_0xbe\n /*******************************************************************\n function totalEntrants()\n payable: False\n inputs: (0) []\n potential signatures: ['totalEntrants()']\n *******************************************************************/\n 106 [ 190 0x00be ] 1 | JUMPDEST JUMPI@0x3c # Mark a valid destination for jumps.\n 107 [ 191 0x00bf ] 2 | CALLVALUE # Get deposited value by the instruction/transaction responsible for msg.value\n this execution.\n 108 [ 192 0x00c0 ] 3 | ISZERO # Simple not operator flag a\n 109 [ 193 0x00c1 ] 3 | PUSH2 0x00c9 # Place 2-byte item on stack. item\n 110 [ 196 0x00c4 ] 10 | JUMPI @0xc9 # Conditionally alter the program counter. evm.pc, condition\n 111 [ 197 0x00c5 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item\n 112 [ 199 0x00c7 ] 3 | DUP1 # Duplicate 1st stack item.\n 113 [ 200 0x00c8 ] 0 | REVERT # throw an error offset, size\n:loc_0xc9\n 114 [ 201 0x00c9 ] 1 | JUMPDEST JUMPI@0xc4 # Mark a valid destination for jumps.\n 115 [ 202 0x00ca ] 3 | PUSH2 0x00a8 # Place 2-byte item on stack. item\n 116 [ 205 0x00cd ] 3 | PUSH2 0x031a # Place 2-byte item on stack. item\n 117 [ 208 0x00d0 ] 8 | JUMP @0x31a # Alter the program counter. evm.pc\n\n:loc_0xd1\n /*******************************************************************\n function assignAll()\n payable: False\n inputs: (0) []\n potential signatures: ['assignAll()']\n *******************************************************************/\n 118 [ 209 0x00d1 ] 1 | JUMPDEST JUMPI@0x47 # Mark a valid destination for jumps.\n 119 [ 210 0x00d2 ] 2 | CALLVALUE # Get deposited value by the instruction/transaction responsible for msg.value\n this execution.\n 120 [ 211 0x00d3 ] 3 | ISZERO # Simple not operator flag a\n 121 [ 212 0x00d4 ] 3 | PUSH2 0x00dc # Place 2-byte item on stack. item\n 122 [ 215 0x00d7 ] 10 | JUMPI @0xdc # Conditionally alter the program counter. evm.pc, condition\n 123 [ 216 0x00d8 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item\n 124 [ 218 0x00da ] 3 | DUP1 # Duplicate 1st stack item.\n 125 [ 219 0x00db ] 0 | REVERT # throw an error offset, size\n:loc_0xdc\n 126 [ 220 0x00dc ] 1 | JUMPDEST JUMPI@0xd7 # Mark a valid destination for jumps.\n 127 [ 221 0x00dd ] 3 | PUSH2 0x0081 # Place 2-byte item on stack. item\n 128 [ 224 0x00e0 ] 3 | PUSH2 0x0320 # Place 2-byte item on stack. item\n 129 [ 227 0x00e3 ] 8 | JUMP @0x320 # Alter the program counter. evm.pc\n\n:loc_0xe4\n 130 [ 228 0x00e4 ] 1 | JUMPDEST JUMP@0x80 # Mark a valid destination for jumps.\n 131 [ 229 0x00e5 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item\n 132 [ 231 0x00e7 ] 2 | ORIGIN # Get execution origination address. tx.origin\n 133 [ 232 0x00e8 ] 3 | PUSH1 0x01 # Place 1 byte item on stack. item\n 134 [ 234 0x00ea ] 3 | PUSH1 0xa0 # Place 1 byte item on stack. item\n 135 [ 236 0x00ec ] 3 | PUSH1 0x02 # Place 1 byte item on stack. item\n 136 [ 238 0x00ee ] 10 | EXP # Exponential operation. result base, exponent\n 137 [ 239 0x00ef ] 3 | SUB # Subtraction operation. result a, b\n 138 [ 240 0x00f0 ] 3 | AND # Bitwise AND operation. result a, b\n 139 [ 241 0x00f1 ] 2 | CALLER # Get caller address.This is the address of the account that is msg.sender\n directly responsible for this execution.\n 140 [ 242 0x00f2 ] 3 | PUSH1 0x01 # Place 1 byte item on stack. item\n 141 [ 244 0x00f4 ] 3 | PUSH1 0xa0 # Place 1 byte item on stack. item\n 142 [ 246 0x00f6 ] 3 | PUSH1 0x02 # Place 1 byte item on stack. item\n 143 [ 248 0x00f8 ] 10 | EXP # Exponential operation. result base, exponent\n 144 [ 249 0x00f9 ] 3 | SUB # Subtraction operation. result a, b\n 145 [ 250 0x00fa ] 3 | AND # Bitwise AND operation. result a, b\n 146 [ 251 0x00fb ] 3 | EQ # Equality comparison flag a, b\n 147 [ 252 0x00fc ] 3 | ISZERO # Simple not operator flag a\n 148 [ 253 0x00fd ] 3 | ISZERO # Simple not operator flag a\n 149 [ 254 0x00fe ] 3 | ISZERO # Simple not operator flag a\n 150 [ 255 0x00ff ] 3 | PUSH2 0x0107 # Place 2-byte item on stack. item\n 151 [ 258 0x0102 ] 10 | JUMPI @0x107 # Conditionally alter the program counter. evm.pc, condition\n 152 [ 259 0x0103 ] 3 | PUSH1 0x00 # Place 1 byte item on stack. item\n 153 [ 261 0x0105 ] 3 | DUP1 # Duplicate 1st stack item.\n 154 [ 262 0x0106 ] 0 | REVERT # throw an error offset, size\n\n[...]\n\n:loc_0x5d5\n 954 [1493 0x05d5 ] 1 | JUMPDEST JUMPI@0x5c9 # Mark a valid destination for jumps.\n 955 [1494 0x05d6 ] 2 | POP # Remove item from stack. #dummy\n 956 [1495 0x05d7 ] 3 | SWAP1 # Exchange 1st and 2nd stack items.\n 957 [1496 0x05d8 ] 8 | JUMP # Alter the program counter. evm.pc\n 958 [1497 0x05d9 ] 0 | STOP # Halts execution.\n 959 [1498 0x05da ] 750 | LOG1 0x65 # Append log record with one topic. start, size, topic1\n 960 [1500 0x05dc ] 3 | PUSH3 0x7a7a72 # Place 3-byte item on stack. item\n 961 [1504 0x05e0 ] 2 | ADDRESS # Get address of currently executing account. this.address\n 962 [1505 0x05e1 ] 2 | PC # Get the value of the program counter prior to the increment. evm.pc\n 963 [1506 0x05e2 ] 30 | SHA3 # Compute Keccak-256 hash. flag offset, size\n 964 [1507 0x05e3 ] -1 | UNKNOWN_0xf # Invalid opcode\n 965 [1508 0x05e4 ] 3 | SWAP4 # Exchange 1st and 5th stack items.\n 966 [1509 0x05e5 ] 3 | SWAP14 # Exchange 1st and 15th stack items.\n 967 [1510 0x05e6 ] 2 | CALLDATASIZE # Get size of input data in current environment. msg.data.length\n 968 [1511 0x05e7 ] -1 | UNKNOWN_0xe1 # Invalid opcode\n 969 [1512 0x05e8 ] -1 | UNKNOWN_0xcb # Invalid opcode\n 970 [1513 0x05e9 ] 3 | PUSH22 0xc68ec825da862dc7082ea12aea89eb3783b2e0423cd2 # Place 22-byte item on stack. item\n 971 [1536 0x0600 ] 30 | SHA3 # Compute Keccak-256 hash. flag offset, size\n 972 [1537 0x0601 ] -1 | UNKNOWN_0x28 # Invalid opcode\n 973 [1538 0x0602 ] 3 | PUSH16 0x0029 # Place 16-byte item on stack. item\n==============================\nreconstructed ABI:\n[{'name': 'enter', 'stateMutability': 'nonpayable', 'signature': '0x124c32a1', 'payable': False, 'inputs': [{'name': '_passcode', 'type': 'bytes32'}, {'name': '_gateKey', 'type': 'bytes8'}], 'constant': False, 'type': 'function', 'outputs': [{'name': '', 'type': 'bool'}]}, {'name': 'maxEntrants', 'stateMutability': 'pure', 'signature': '0x60643652', 'payable': False, 'inputs': [], 'constant': True, 'type': 'function', 'outputs': [{'name': '', 'type': 'uint8'}]}, {'name': 'totalEntrants', 'stateMutability': 'view', 'signature': '0x694463a2', 'payable': False, 'inputs': [], 'constant': True, 'type': 'function', 'outputs': [{'name': '', 'type': 'uint8'}]}, {'name': 'assignAll', 'stateMutability': 'nonpayable', 'signature': '0x90ae631d', 'payable': False, 'inputs': [], 'constant': False, 'type': 'function', 'outputs': [{'name': '', 'type': 'bool'}]}, {'stateMutability': 'nonpayable', 'type': 'constructor', 'payable': False, 'inputs': []}]\n\n```\n\n\n**decompile to pseudocode**\n\n```\npython3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf --simplify #[--simplify-show-asm, --simplify-show-unreachable]\n\n======================[simplified]\n\n:init\n memory[0x40] = 0x60\n if (Not(ULE(0x4, 1_calldatasize))) goto LOC_0x48\n if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0xa1,\n If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x32,\n If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0x4c,\n If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x12)) goto function_enter (LOC_0x4d)\n if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0x52,\n If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x36,\n If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0x64,\n If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x60)) goto function_maxEntrants (LOC_0x95)\n if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0xa2,\n If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x63,\n If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0x44,\n If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x69)) goto function_totalEntrants (LOC_0xbe)\n if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0x1d,\n If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x63,\n If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0xae,\n If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x90)) goto function_assignAll (LOC_0xd1)\n\n:LOC_0x48 \n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:function_enter (LOC_0x4d) \n /*******************************************************************\n function enter(bytes32,bytes8)\n payable: False\n inputs: (2) ['bytes32', '<bytes??>']\n potential signatures: ['enter(bytes32,bytes8)']\n *******************************************************************/\n\n if (call_value1 == 0x0) goto LOC_0x58\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0x58 \n goto LOC_0xe4\n\n:LOC_0x81 \n\n:function_maxEntrants (LOC_0x95) \n /*******************************************************************\n function maxEntrants()\n payable: False\n inputs: (0) []\n potential signatures: ['maxEntrants()']\n *******************************************************************/\n\n if (call_value1 == 0x0) goto LOC_0xa0\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0xa0 \n goto LOC_0x314\n\n:LOC_0xa8 \n memory[0x60] = 0xfa\n RETURN(offset=0x60, size=0x20)\n /******* <<terminates execution>> *******/\n\n:function_totalEntrants (LOC_0xbe) \n /*******************************************************************\n function totalEntrants()\n payable: False\n inputs: (0) []\n potential signatures: ['totalEntrants()']\n *******************************************************************/\n\n if (call_value1 == 0x0) goto LOC_0xc9\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0xc9 \n goto LOC_0x31a\n\n:function_assignAll (LOC_0xd1) \n /*******************************************************************\n function assignAll()\n payable: False\n inputs: (0) []\n potential signatures: ['assignAll()']\n *******************************************************************/\n\n if (call_value1 == 0x0) goto LOC_0xdc\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0xdc \n goto LOC_0x320\n\n:LOC_0xe4 \n if (Not(Extract(159, 0, origin1) ==\n 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef)) goto LOC_0x107\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0x107 \n if (True) goto LOC_0x114\n\n:LOC_0x114 \n if (bvurem_i(1_gas, 0x1fff) == 0x0) goto LOC_0x11f\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0x11f \n if (And(If(1_calldatasize <= 0x29, 0x0, 1_calldata[0x29]) == 0x0,\n If(1_calldatasize <= 0x28, 0x0, 1_calldata[0x28]) == 0x0)) goto LOC_0x154\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0x154 \n if (Not(And(If(1_calldatasize <= 0x27, 0x0, 1_calldata[0x27]) ==\n 0x0,\n If(1_calldatasize <= 0x26, 0x0, 1_calldata[0x26]) ==\n 0x0,\n If(1_calldatasize <= 0x25, 0x0, 1_calldata[0x25]) ==\n 0x0,\n If(1_calldatasize <= 0x24, 0x0, 1_calldata[0x24]) ==\n 0x0))) goto LOC_0x18f\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0x18f \n if (And(Extract(7, 0, origin1) ==\n If(1_calldatasize <= 0x2b, 0x0, 1_calldata[0x2b]),\n Extract(15, 8, origin1) ==\n If(1_calldatasize <= 0x2a, 0x0, 1_calldata[0x2a]),\n If(1_calldatasize <= 0x29, 0x0, 1_calldata[0x29]) == 0x0,\n If(1_calldatasize <= 0x28, 0x0, 1_calldata[0x28]) == 0x0)) goto LOC_0x1c0\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0x1c0 \n if (True) goto LOC_0x1d1\n\n:LOC_0x1d1 \n memory[0x0] = 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef\n memory[0x20] = 0x3\n if (True) goto LOC_0x1f7\n\n:LOC_0x1f7 \n memory[0x0] = Concat(0x0, Extract(159, 0, origin1))\n memory[0x20] = 0x3\n if (True) goto LOC_0x21d\n\n:LOC_0x21d \n memory[0x60] = Concat(If(1_calldatasize <= 0x4, 0x0, 1_calldata[0x4]),\n If(1_calldatasize <= 0x5, 0x0, 1_calldata[0x5]),\n If(1_calldatasize <= 0x6, 0x0, 1_calldata[0x6]),\n If(1_calldatasize <= 0x7, 0x0, 1_calldata[0x7]),\n If(1_calldatasize <= 0x8, 0x0, 1_calldata[0x8]),\n If(1_calldatasize <= 0x9, 0x0, 1_calldata[0x9]),\n If(1_calldatasize <= 0xa, 0x0, 1_calldata[0xa]),\n If(1_calldatasize <= 0xb, 0x0, 1_calldata[0xb]),\n If(1_calldatasize <= 0xc, 0x0, 1_calldata[0xc]),\n If(1_calldatasize <= 0xd, 0x0, 1_calldata[0xd]),\n If(1_calldatasize <= 0xe, 0x0, 1_calldata[0xe]),\n If(1_calldatasize <= 0xf, 0x0, 1_calldata[0xf]),\n If(1_calldatasize <= 0x10, 0x0, 1_calldata[0x10]),\n If(1_calldatasize <= 0x11, 0x0, 1_calldata[0x11]),\n If(1_calldatasize <= 0x12, 0x0, 1_calldata[0x12]),\n If(1_calldatasize <= 0x13, 0x0, 1_calldata[0x13]),\n If(1_calldatasize <= 0x14, 0x0, 1_calldata[0x14]),\n If(1_calldatasize <= 0x15, 0x0, 1_calldata[0x15]),\n If(1_calldatasize <= 0x16, 0x0, 1_calldata[0x16]),\n If(1_calldatasize <= 0x17, 0x0, 1_calldata[0x17]),\n If(1_calldatasize <= 0x18, 0x0, 1_calldata[0x18]),\n If(1_calldatasize <= 0x19, 0x0, 1_calldata[0x19]),\n If(1_calldatasize <= 0x1a, 0x0, 1_calldata[0x1a]),\n If(1_calldatasize <= 0x1b, 0x0, 1_calldata[0x1b]),\n If(1_calldatasize <= 0x1c, 0x0, 1_calldata[0x1c]),\n If(1_calldatasize <= 0x1d, 0x0, 1_calldata[0x1d]),\n If(1_calldatasize <= 0x1e, 0x0, 1_calldata[0x1e]),\n If(1_calldatasize <= 0x1f, 0x0, 1_calldata[0x1f]),\n If(1_calldatasize <= 0x20, 0x0, 1_calldata[0x20]),\n If(1_calldatasize <= 0x21, 0x0, 1_calldata[0x21]),\n If(1_calldatasize <= 0x22, 0x0, 1_calldata[0x22]),\n If(1_calldatasize <= 0x23, 0x0, 1_calldata[0x23]))\n memory[0x0] = KECCAC[If(1_calldatasize_<=_0x4,_0x0,_1_calldata[0x4])]\n memory[0x20] = 0x4\n if (False) goto LOC_0x257\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0x257 \n\n:LOC_0x275 \n\n:LOC_0x2d6 \n\n:LOC_0x314 \n\n:LOC_0x317 \n goto LOC_0xa8\n\n:LOC_0x31a \n goto LOC_0xa8\n\n:LOC_0x320 \n if (False) goto LOC_0x338\n REVERT(offset=0x0, size=0x0)\n /******* <<terminates execution>> *******/\n\n:LOC_0x338 \n\n:LOC_0x347 \n\n:LOC_0x3a8 \n\n:LOC_0x3b9 \n\n:LOC_0x3d8 \n\n:LOC_0x3e0 \n\n:LOC_0x3f5 \n\n:LOC_0x459 \n\n:LOC_0x46a \n\n:LOC_0x4de \n\n:LOC_0x541 \n\n:LOC_0x552 \n\n:LOC_0x556 \n\n:LOC_0x55e \n\n:LOC_0x588 \n\n:LOC_0x592 \n\n:LOC_0x5b6 \n\n:LOC_0x5bb \n\n:LOC_0x5c1 \n\n:LOC_0x5d5 \n```\n\n",
"bugtrack_url": null,
"license": "GPLv2",
"summary": "An ethereum bytecode disassembler with static and dynamic analysis features",
"version": "0.1.5",
"split_keywords": [
"ethereum",
"blockchain",
"evm",
"disassembler",
"decompiler",
"pseudocode"
],
"urls": [
{
"comment_text": "",
"digests": {
"md5": "13e04e7340efd434ece59925dfddc858",
"sha256": "998aff7fbc1ef70210c1a34ffa2788e25f4e014c61e164411f6e4b4c2fdf2907"
},
"downloads": -1,
"filename": "ethereum_dasm-0.1.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "13e04e7340efd434ece59925dfddc858",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 35726,
"upload_time": "2019-07-06T23:44:50",
"upload_time_iso_8601": "2019-07-06T23:44:50.419776Z",
"url": "https://files.pythonhosted.org/packages/da/6e/5246ae5cc12915bcc2ef798e0011618c4407bc18ef1fd03b0137815b8716/ethereum_dasm-0.1.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2019-07-06 23:44:50",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "tintinweb",
"github_project": "ethereum-dasm",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "evmdasm",
"specs": []
},
{
"name": "requests",
"specs": []
},
{
"name": "colorama",
"specs": []
},
{
"name": "tabulate",
"specs": []
}
],
"lcname": "ethereum-dasm"
}