具有静态和动态分析功能的以太坊字节码反汇编程序
ethereum-dasm的Python项目详细描述
以太坊DASM
以太坊EVM字节码反汇编程序,具有静态和动态分析以及函数签名查找功能
[https://github.com/ethereum/][https://www.ethereum.org/]
反汇编evm字节码
将合同反编译为伪代码
安装
#> 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: 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]
功能
- 反汇编evm字节码
- 将evm字节码反编译为伪码
- 提供以太坊虚拟机字节码或字节码的路径作为evmdasm的参数。默认情况下尝试从stdin读取。
- 回来了!=0(错误时)
- 各种输出模式(
-L
从表格模式切换到列表模式) - 颜色模式
- 无效操作码的前缀是
UNKNOWN_
- 指令用气量
- 指令的返回值和参数
- 基本跳转/外部参照分析
- 基本锁定
- 联机函数签名和方法名查找,操作数注释
- 应付修饰语检测
- 基于符号执行的动态分析(取决于mythril)
- abi.json下载(从etherchain.org)
- 从evm字节码的静态分析重构abi.json
- 主界面
Contract()
。
示例
abi联机查找或重建#>python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf -A
# [....][{'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','name': ''}], 'inputs': [], 'payable': False}, {'stateMutability': 'view', 'constant': True, 'type': 'function', 'name': 'totalEntrants', 'signature': '0x694463a2', 'outputs': [{'type': 'uint8', 'name': ''}], 'inputs': [], 'payable': False}, {'stateMutability': 'nonpayable', 'constant': False, 'type': 'function', 'name': 'assignAll', 'signature': '0x90ae631d', 'outputs': [{'type': 'bool', 'name': ''}], 'inputs': [], 'payable': False}, {'inputs': [], 'stateMutability': 'nonpayable', 'payable': False, 'type': 'constructor'}]
ABI重建(如果ABI不可用)
#> 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}]
详细列表
python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf -A --no-color
Instaddrhexgas|mnemonicoperandxrefsdescriptionretvalargs------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:loc_0x00[00x0000]3|PUSH10x60# Place 1 byte item on stack. item1[20x0002]3|PUSH10x40# Place 1 byte item on stack. item2[40x0004]3|MSTORE# Save word to memory. value, offset3[50x0005]3|PUSH10x04# Place 1 byte item on stack. item4[70x0007]2|CALLDATASIZE# Get size of input data in current environment. msg.data.length5[80x0008]3|LT# Lesser-than comparison flag a, b6[90x0009]3|PUSH20x0048# Place 2-byte item on stack. item7[120x000c]10|JUMPI@0x48# Conditionally alter the program counter. evm.pc, condition8[130x000d]3|PUSH40xffffffff# Place 4-byte item on stack. item9[180x0012]3|PUSH10xe0# Place 1 byte item on stack. item10[200x0014]3|PUSH10x02# Place 1 byte item on stack. item11[220x0016]10|EXP# Exponential operation. result base, exponent12[230x0017]3|PUSH10x00# Place 1 byte item on stack. item13[250x0019]3|CALLDATALOAD# Get input data of current environment. msg.data unknown14[260x001a]5|DIV# Integer division operation. result a, b15[270x001b]3|AND# Bitwise AND operation. result a, b16[280x001c]3|PUSH40x124c32a1-->'function enter(bytes32,bytes8)'# Place 4-byte item on stack. item17[330x0021]3|DUP2# Duplicate 2nd stack item.18[340x0022]3|EQ# Equality comparison flag a, b19[350x0023]3|PUSH20x004d# Place 2-byte item on stack. item20[380x0026]10|JUMPI@0x4d# Conditionally alter the program counter. evm.pc, condition21[390x0027]3|DUP1# Duplicate 1st stack item.22[400x0028]3|PUSH40x60643652-->'function maxEntrants()'# Place 4-byte item on stack. item23[450x002d]3|EQ# Equality comparison flag a, b24[460x002e]3|PUSH20x0095# Place 2-byte item on stack. item25[490x0031]10|JUMPI@0x95# Conditionally alter the program counter. evm.pc, condition26[500x0032]3|DUP1# Duplicate 1st stack item.27[510x0033]3|PUSH40x694463a2-->'function totalEntrants()'# Place 4-byte item on stack. item28[560x0038]3|EQ# Equality comparison flag a, b29[570x0039]3|PUSH20x00be# Place 2-byte item on stack. item30[600x003c]10|JUMPI@0xbe# Conditionally alter the program counter. evm.pc, condition31[610x003d]3|DUP1# Duplicate 1st stack item.32[620x003e]3|PUSH40x90ae631d-->'function assignAll()'# Place 4-byte item on stack. item33[670x0043]3|EQ# Equality comparison flag a, b34[680x0044]3|PUSH20x00d1# Place 2-byte item on stack. item35[710x0047]10|JUMPI@0xd1# Conditionally alter the program counter. evm.pc, condition:loc_0x4836[720x0048]1|JUMPDESTJUMPI@0xc# Mark a valid destination for jumps.37[730x0049]3|PUSH10x00# Place 1 byte item on stack. item38[750x004b]3|DUP1# Duplicate 1st stack item.39[760x004c]0|REVERT# throw an error offset, size:loc_0x4d/*******************************************************************functionenter(bytes32,bytes8)payable:Falseinputs:(2)['bytes32','<bytes??>']potentialsignatures:['enter(bytes32,bytes8)']*******************************************************************/40[770x004d]1|JUMPDESTJUMPI@0x26# Mark a valid destination for jumps.41[780x004e]2|CALLVALUE# Get deposited value by the instruction/transaction responsible for msg.valuethisexecution.42[790x004f]3|ISZERO# Simple not operator flag a43[800x0050]3|PUSH20x0058# Place 2-byte item on stack. item44[830x0053]10|JUMPI@0x58# Conditionally alter the program counter. evm.pc, condition45[840x0054]3|PUSH10x00# Place 1 byte item on stack. item46[860x0056]3|DUP1# Duplicate 1st stack item.47[870x0057]0|REVERT# throw an error offset, size:loc_0x5848[880x0058]1|JUMPDESTJUMPI@0x53# Mark a valid destination for jumps.49[890x0059]3|PUSH20x0081# Place 2-byte item on stack. item50[920x005c]3|PUSH10x04# Place 1 byte item on stack. item51[940x005e]3|CALLDATALOAD# Get input data of current environment. msg.data unknown52[950x005f]3|PUSH240xffffffffffffffffffffffffffffffffffffffffffffffff# Place 24-byte item on stack. item53[1200x0078]3|NOT# Bitwise NOT operation. result a, b54[1210x0079]3|PUSH10x24# Place 1 byte item on stack. item55[1230x007b]3|CALLDATALOAD# Get input data of current environment. msg.data unknown56[1240x007c]3|AND# Bitwise AND operation. result a, b57[1250x007d]3|PUSH20x00e4# Place 2-byte item on stack. item58[1280x0080]8|JUMP@0xe4# Alter the program counter. evm.pc:loc_0x8159[1290x0081]1|JUMPDEST# Mark a valid destination for jumps.60[1300x0082]3|PUSH10x40# Place 1 byte item on stack. item61[1320x0084]3|MLOAD# Load word from memory. offset62[1330x0085]3|SWAP1# Exchange 1st and 2nd stack items.63[1340x0086]3|ISZERO# Simple not operator flag a64[1350x0087]3|ISZERO# Simple not operator flag a65[1360x0088]3|DUP2# Duplicate 2nd stack item.66[1370x0089]3|MSTORE# Save word to memory. value, offset67[1380x008a]3|PUSH10x20# Place 1 byte item on stack. item68[1400x008c]3|ADD# Addition operation. result a, b69[1410x008d]3|PUSH10x40# Place 1 byte item on stack. item70[1430x008f]3|MLOAD# Load word from memory. offset71[1440x0090]3|DUP1# Duplicate 1st stack item.72[1450x0091]3|SWAP2# Exchange 1st and 3rd stack items.73[1460x0092]3|SUB# Subtraction operation. result a, b74[1470x0093]3|SWAP1# Exchange 1st and 2nd stack items.75[1480x0094]0|RETURN# Halt execution returning output data. offset, size:loc_0x95/*******************************************************************functionmaxEntrants()payable:Falseinputs:(0)[]potentialsignatures:['maxEntrants()']*******************************************************************/76[1490x0095]1|JUMPDESTJUMPI@0x31# Mark a valid destination for jumps.77[1500x0096]2|CALLVALUE# Get deposited value by the instruction/transaction responsible for msg.valuethisexecution.78[1510x0097]3|ISZERO# Simple not operator flag a79[1520x0098]3|PUSH20x00a0# Place 2-byte item on stack. item80[1550x009b]10|JUMPI@0xa0# Conditionally alter the program counter. evm.pc, condition81[1560x009c]3|PUSH10x00# Place 1 byte item on stack. item82[1580x009e]3|DUP1# Duplicate 1st stack item.83[1590x009f]0|REVERT# throw an error offset, size:loc_0xa084[1600x00a0]1|JUMPDESTJUMPI@0x9b# Mark a valid destination for jumps.85[1610x00a1]3|PUSH20x00a8# Place 2-byte item on stack. item86[1640x00a4]3|PUSH20x0314# Place 2-byte item on stack. item87[1670x00a7]8|JUMP@0x314# Alter the program counter. evm.pc:loc_0xa888[1680x00a8]1|JUMPDEST# Mark a valid destination for jumps.89[1690x00a9]3|PUSH10x40# Place 1 byte item on stack. item90[1710x00ab]3|MLOAD# Load word from memory. offset91[1720x00ac]3|PUSH10xff# Place 1 byte item on stack. item92[1740x00ae]3|SWAP1# Exchange 1st and 2nd stack items.93[1750x00af]3|SWAP2# Exchange 1st and 3rd stack items.94[1760x00b0]3|AND# Bitwise AND operation. result a, b95[1770x00b1]3|DUP2# Duplicate 2nd stack item.96[1780x00b2]3|MSTORE# Save word to memory. value, offset97[1790x00b3]3|PUSH10x20# Place 1 byte item on stack. item98[1810x00b5]3|ADD# Addition operation. result a, b99[1820x00b6]3|PUSH10x40# Place 1 byte item on stack. item100[1840x00b8]3|MLOAD# Load word from memory. offset101[1850x00b9]3|DUP1# Duplicate 1st stack item.102[1860x00ba]3|SWAP2# Exchange 1st and 3rd stack items.103[1870x00bb]3|SUB# Subtraction operation. result a, b104[1880x00bc]3|SWAP1# Exchange 1st and 2nd stack items.105[1890x00bd]0|RETURN# Halt execution returning output data. offset, size:loc_0xbe/*******************************************************************functiontotalEntrants()payable:Falseinputs:(0)[]potentialsignatures:['totalEntrants()']*******************************************************************/106[1900x00be]1|JUMPDESTJUMPI@0x3c# Mark a valid destination for jumps.107[1910x00bf]2|CALLVALUE# Get deposited value by the instruction/transaction responsible for msg.valuethisexecution.108[1920x00c0]3|ISZERO# Simple not operator flag a109[1930x00c1]3|PUSH20x00c9# Place 2-byte item on stack. item110[1960x00c4]10|JUMPI@0xc9# Conditionally alter the program counter. evm.pc, condition111[1970x00c5]3|PUSH10x00# Place 1 byte item on stack. item112[1990x00c7]3|DUP1# Duplicate 1st stack item.113[2000x00c8]0|REVERT# throw an error offset, size:loc_0xc9114[2010x00c9]1|JUMPDESTJUMPI@0xc4# Mark a valid destination for jumps.115[2020x00ca]3|PUSH20x00a8# Place 2-byte item on stack. item116[2050x00cd]3|PUSH20x031a# Place 2-byte item on stack. item117[2080x00d0]8|JUMP@0x31a# Alter the program counter. evm.pc:loc_0xd1/*******************************************************************functionassignAll()payable:Falseinputs:(0)[]potentialsignatures:['assignAll()']*******************************************************************/118[2090x00d1]1|JUMPDESTJUMPI@0x47# Mark a valid destination for jumps.119[2100x00d2]2|CALLVALUE# Get deposited value by the instruction/transaction responsible for msg.valuethisexecution.120[2110x00d3]3|ISZERO# Simple not operator flag a121[2120x00d4]3|PUSH20x00dc# Place 2-byte item on stack. item122[2150x00d7]10|JUMPI@0xdc# Conditionally alter the program counter. evm.pc, condition123[2160x00d8]3|PUSH10x00# Place 1 byte item on stack. item124[2180x00da]3|DUP1# Duplicate 1st stack item.125[2190x00db]0|REVERT# throw an error offset, size:loc_0xdc126[2200x00dc]1|JUMPDESTJUMPI@0xd7# Mark a valid destination for jumps.127[2210x00dd]3|PUSH20x0081# Place 2-byte item on stack. item128[2240x00e0]3|PUSH20x0320# Place 2-byte item on stack. item129[2270x00e3]8|JUMP@0x320# Alter the program counter. evm.pc:loc_0xe4130[2280x00e4]1|JUMPDESTJUMP@0x80# Mark a valid destination for jumps.131[2290x00e5]3|PUSH10x00# Place 1 byte item on stack. item132[2310x00e7]2|ORIGIN# Get execution origination address. tx.origin133[2320x00e8]3|PUSH10x01# Place 1 byte item on stack. item134[2340x00ea]3|PUSH10xa0# Place 1 byte item on stack. item135[2360x00ec]3|PUSH10x02# Place 1 byte item on stack. item136[2380x00ee]10|EXP# Exponential operation. result base, exponent137[2390x00ef]3|SUB# Subtraction operation. result a, b138[2400x00f0]3|AND# Bitwise AND operation. result a, b139[2410x00f1]2|CALLER# Get caller address.This is the address of the account that is msg.senderdirectlyresponsibleforthisexecution.140[2420x00f2]3|PUSH10x01# Place 1 byte item on stack. item141[2440x00f4]3|PUSH10xa0# Place 1 byte item on stack. item142[2460x00f6]3|PUSH10x02# Place 1 byte item on stack. item143[2480x00f8]10|EXP# Exponential operation. result base, exponent144[2490x00f9]3|SUB# Subtraction operation. result a, b145[2500x00fa]3|AND# Bitwise AND operation. result a, b146[2510x00fb]3|EQ# Equality comparison flag a, b147[2520x00fc]3|ISZERO# Simple not operator flag a148[2530x00fd]3|ISZERO# Simple not operator flag a149[2540x00fe]3|ISZERO# Simple not operator flag a150[2550x00ff]3|PUSH20x0107# Place 2-byte item on stack. item151[2580x0102]10|JUMPI@0x107# Conditionally alter the program counter. evm.pc, condition152[2590x0103]3|PUSH10x00# Place 1 byte item on stack. item153[2610x0105]3|DUP1# Duplicate 1st stack item.154[2620x0106]0|REVERT# throw an error offset, size[...]:loc_0x5d5954[14930x05d5]1|JUMPDESTJUMPI@0x5c9# Mark a valid destination for jumps.955[14940x05d6]2|POP# Remove item from stack. #dummy956[14950x05d7]3|SWAP1# Exchange 1st and 2nd stack items.957[14960x05d8]8|JUMP# Alter the program counter. evm.pc958[14970x05d9]0|STOP# Halts execution.959[14980x05da]750|LOG10x65# Append log record with one topic. start, size, topic1960[15000x05dc]3|PUSH30x7a7a72# Place 3-byte item on stack. item961[15040x05e0]2|ADDRESS# Get address of currently executing account. this.address962[15050x05e1]2|PC# Get the value of the program counter prior to the increment. evm.pc963[15060x05e2]30|SHA3# Compute Keccak-256 hash. flag offset, size964[15070x05e3]-1|UNKNOWN_0xf# Invalid opcode965[15080x05e4]3|SWAP4# Exchange 1st and 5th stack items.966[15090x05e5]3|SWAP14# Exchange 1st and 15th stack items.967[15100x05e6]2|CALLDATASIZE# Get size of input data in current environment. msg.data.length968[15110x05e7]-1|UNKNOWN_0xe1# Invalid opcode969[15120x05e8]-1|UNKNOWN_0xcb# Invalid opcode970[15130x05e9]3|PUSH220xc68ec825da862dc7082ea12aea89eb3783b2e0423cd2# Place 22-byte item on stack. item971[15360x0600]30|SHA3# Compute Keccak-256 hash. flag offset, size972[15370x0601]-1|UNKNOWN_0x28# Invalid opcode973[15380x0602]3|PUSH160x0029# Place 16-byte item on stack. item==============================reconstructedABI:[{'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':[]}]
反编译为伪代码
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