Online Solidity Decompiler

« Decompile another contract

Address

0x615c8c3675e6f683e201553939508e6ade823634 [etherscan.io | etherchain.org]

Public Methods

Method names cached from 4byte.directory.
0x8da5cb5b owner()
0xfe0d94c1 execute(uint256)

Internal Methods

func_00B4(arg0)
withdraw()
func_013F(arg0, arg1) returns (r0)

Decompilation

contract Contract { function main() { memory[0x40:0x60] = 0x80; if (msg.data.length < 0x04) { revert(memory[0x00:0x00]); } var var0 = msg.data[0x00:0x20] >> 0xe0; if (var0 == 0x3ccfd60b) { // Dispatch table entry for withdraw() var var1 = msg.value; if (var1) { revert(memory[0x00:0x00]); } var1 = 0x004e; withdraw(); stop(); } else if (var0 == 0x8da5cb5b) { // Dispatch table entry for owner() var1 = msg.value; if (var1) { revert(memory[0x00:0x00]); } var1 = 0x007d; var var2 = storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff; var temp0 = memory[0x40:0x60]; memory[temp0:temp0 + 0x20] = var2 & 0xffffffffffffffffffffffffffffffffffffffff; var temp1 = memory[0x40:0x60]; return memory[temp1:temp1 + (temp0 + 0x20) - temp1]; } else if (var0 == 0xfe0d94c1) { // Dispatch table entry for execute(uint256) var1 = 0x004e; var2 = 0x00b4; var var3 = msg.data.length; var var4 = 0x04; var2 = func_013F(var3, var4); func_00B4(var2); stop(); } else { revert(memory[0x00:0x00]); } } function func_00B4(var arg0) { if (block.timestamp != arg0) { revert(memory[0x00:0x00]); } var temp0 = memory[0x40:0x60]; var temp1 = msg.value; var temp2; temp2, memory[temp0:temp0 + 0x00] = address(block.coinbase).call.gas(!temp1 * 0x08fc).value(temp1)(memory[temp0:temp0 + 0x00]); var var0 = !temp2; if (!var0) { return; } var temp3 = returndata.length; memory[0x00:0x00 + temp3] = returndata[0x00:0x00 + temp3]; revert(memory[0x00:0x00 + returndata.length]); } function withdraw() { var temp0 = memory[0x40:0x60]; var temp1 = address(this).balance; var temp2; temp2, memory[temp0:temp0 + 0x00] = address(storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff).call.gas(!temp1 * 0x08fc).value(temp1)(memory[temp0:temp0 + 0x00]); var var0 = !temp2; if (!var0) { return; } var temp3 = returndata.length; memory[0x00:0x00 + temp3] = returndata[0x00:0x00 + temp3]; revert(memory[0x00:0x00 + returndata.length]); } function func_013F(var arg0, var arg1) returns (var r0) { var var0 = 0x00; if (arg0 - arg1 i>= 0x20) { return msg.data[arg1:arg1 + 0x20]; } else { revert(memory[0x00:0x00]); } } }

Disassembly

label_0000: // Inputs[1] { @0007 msg.data.length } 0000 60 PUSH1 0x80 0002 60 PUSH1 0x40 0004 52 MSTORE 0005 60 PUSH1 0x04 0007 36 CALLDATASIZE 0008 10 LT 0009 61 PUSH2 0x0034 000C 57 *JUMPI // Stack delta = +0 // Outputs[1] { @0004 memory[0x40:0x60] = 0x80 } // Block ends with conditional jump to 0x0034, if msg.data.length < 0x04 label_000D: // Incoming jump from 0x000C, if not msg.data.length < 0x04 // Inputs[1] { @000F msg.data[0x00:0x20] } 000D 60 PUSH1 0x00 000F 35 CALLDATALOAD 0010 60 PUSH1 0xe0 0012 1C SHR 0013 80 DUP1 0014 63 PUSH4 0x3ccfd60b 0019 14 EQ 001A 61 PUSH2 0x0039 001D 57 *JUMPI // Stack delta = +1 // Outputs[1] { @0012 stack[0] = msg.data[0x00:0x20] >> 0xe0 } // Block ends with conditional jump to 0x0039, if 0x3ccfd60b == msg.data[0x00:0x20] >> 0xe0 label_001E: // Incoming jump from 0x001D, if not 0x3ccfd60b == msg.data[0x00:0x20] >> 0xe0 // Inputs[1] { @001E stack[-1] } 001E 80 DUP1 001F 63 PUSH4 0x8da5cb5b 0024 14 EQ 0025 61 PUSH2 0x0050 0028 57 *JUMPI // Stack delta = +0 // Block ends with conditional jump to 0x0050, if 0x8da5cb5b == stack[-1] label_0029: // Incoming jump from 0x0028, if not 0x8da5cb5b == stack[-1] // Inputs[1] { @0029 stack[-1] } 0029 80 DUP1 002A 63 PUSH4 0xfe0d94c1 002F 14 EQ 0030 61 PUSH2 0x00a6 0033 57 *JUMPI // Stack delta = +0 // Block ends with conditional jump to 0x00a6, if 0xfe0d94c1 == stack[-1] label_0034: // Incoming jump from 0x000C, if msg.data.length < 0x04 // Incoming jump from 0x0033, if not 0xfe0d94c1 == stack[-1] // Inputs[1] { @0038 memory[0x00:0x00] } 0034 5B JUMPDEST 0035 60 PUSH1 0x00 0037 80 DUP1 0038 FD *REVERT // Stack delta = +0 // Outputs[1] { @0038 revert(memory[0x00:0x00]); } // Block terminates label_0039: // Incoming jump from 0x001D, if 0x3ccfd60b == msg.data[0x00:0x20] >> 0xe0 // Inputs[1] { @003A msg.value } 0039 5B JUMPDEST 003A 34 CALLVALUE 003B 80 DUP1 003C 15 ISZERO 003D 61 PUSH2 0x0045 0040 57 *JUMPI // Stack delta = +1 // Outputs[1] { @003A stack[0] = msg.value } // Block ends with conditional jump to 0x0045, if !msg.value label_0041: // Incoming jump from 0x0040, if not !msg.value // Inputs[1] { @0044 memory[0x00:0x00] } 0041 60 PUSH1 0x00 0043 80 DUP1 0044 FD *REVERT // Stack delta = +0 // Outputs[1] { @0044 revert(memory[0x00:0x00]); } // Block terminates label_0045: // Incoming jump from 0x0040, if !msg.value 0045 5B JUMPDEST 0046 50 POP 0047 61 PUSH2 0x004e 004A 61 PUSH2 0x00b9 004D 56 *JUMP // Stack delta = +0 // Outputs[1] { @0047 stack[-1] = 0x004e } // Block ends with call to 0x00b9, returns to 0x004E label_004E: // Incoming return from call to 0x00B4 at 0x00B3 // Incoming return from call to 0x00B9 at 0x004D 004E 5B JUMPDEST 004F 00 *STOP // Stack delta = +0 // Outputs[1] { @004F stop(); } // Block terminates label_0050: // Incoming jump from 0x0028, if 0x8da5cb5b == stack[-1] // Inputs[1] { @0051 msg.value } 0050 5B JUMPDEST 0051 34 CALLVALUE 0052 80 DUP1 0053 15 ISZERO 0054 61 PUSH2 0x005c 0057 57 *JUMPI // Stack delta = +1 // Outputs[1] { @0051 stack[0] = msg.value } // Block ends with conditional jump to 0x005c, if !msg.value label_0058: // Incoming jump from 0x0057, if not !msg.value // Inputs[1] { @005B memory[0x00:0x00] } 0058 60 PUSH1 0x00 005A 80 DUP1 005B FD *REVERT // Stack delta = +0 // Outputs[1] { @005B revert(memory[0x00:0x00]); } // Block terminates label_005C: // Incoming jump from 0x0057, if !msg.value // Inputs[1] { @0060 storage[0x00] } 005C 5B JUMPDEST 005D 50 POP 005E 60 PUSH1 0x00 0060 54 SLOAD 0061 61 PUSH2 0x007d 0064 90 SWAP1 0065 73 PUSH20 0xffffffffffffffffffffffffffffffffffffffff 007A 16 AND 007B 81 DUP2 007C 56 *JUMP // Stack delta = +1 // Outputs[2] // { // @0064 stack[-1] = 0x007d // @007A stack[0] = 0xffffffffffffffffffffffffffffffffffffffff & storage[0x00] // } // Block ends with unconditional jump to 0x007d label_007D: // Incoming jump from 0x007C // Inputs[4] // { // @0080 memory[0x40:0x60] // @0097 stack[-1] // @00A0 memory[0x40:0x60] // @00A5 memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x20 + memory[0x40:0x60]) - memory[0x40:0x60]] // } 007D 5B JUMPDEST 007E 60 PUSH1 0x40 0080 51 MLOAD 0081 73 PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0096 90 SWAP1 0097 91 SWAP2 0098 16 AND 0099 81 DUP2 009A 52 MSTORE 009B 60 PUSH1 0x20 009D 01 ADD 009E 60 PUSH1 0x40 00A0 51 MLOAD 00A1 80 DUP1 00A2 91 SWAP2 00A3 03 SUB 00A4 90 SWAP1 00A5 F3 *RETURN // Stack delta = -1 // Outputs[2] // { // @009A memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x20] = stack[-1] & 0xffffffffffffffffffffffffffffffffffffffff // @00A5 return memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x20 + memory[0x40:0x60]) - memory[0x40:0x60]]; // } // Block terminates label_00A6: // Incoming jump from 0x0033, if 0xfe0d94c1 == stack[-1] // Inputs[1] { @00AD msg.data.length } 00A6 5B JUMPDEST 00A7 61 PUSH2 0x004e 00AA 61 PUSH2 0x00b4 00AD 36 CALLDATASIZE 00AE 60 PUSH1 0x04 00B0 61 PUSH2 0x013f 00B3 56 *JUMP // Stack delta = +4 // Outputs[4] // { // @00A7 stack[0] = 0x004e // @00AA stack[1] = 0x00b4 // @00AD stack[2] = msg.data.length // @00AE stack[3] = 0x04 // } // Block ends with call to 0x013f, returns to 0x00B4 label_00B4: // Incoming return from call to 0x013F at 0x00B3 00B4 5B JUMPDEST 00B5 61 PUSH2 0x0103 00B8 56 *JUMP // Stack delta = +0 // Block ends with unconditional jump to 0x0103 label_00B9: // Incoming call from 0x004D, returns to 0x004E // Inputs[6] // { // @00BD storage[0x00] // @00C0 memory[0x40:0x60] // @00DA address(this) // @00DA address(this).balance // @00EA memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00] // @00EA address(storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff).call.gas(0x08fc * !address(this).balance).value(address(this).balance)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // } 00B9 5B JUMPDEST 00BA 60 PUSH1 0x00 00BC 80 DUP1 00BD 54 SLOAD 00BE 60 PUSH1 0x40 00C0 51 MLOAD 00C1 73 PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00D6 90 SWAP1 00D7 91 SWAP2 00D8 16 AND 00D9 91 SWAP2 00DA 47 SELFBALANCE 00DB 80 DUP1 00DC 15 ISZERO 00DD 61 PUSH2 0x08fc 00E0 02 MUL 00E1 92 SWAP3 00E2 90 SWAP1 00E3 91 SWAP2 00E4 81 DUP2 00E5 81 DUP2 00E6 81 DUP2 00E7 85 DUP6 00E8 88 DUP9 00E9 88 DUP9 00EA F1 CALL 00EB 93 SWAP4 00EC 50 POP 00ED 50 POP 00EE 50 POP 00EF 50 POP 00F0 15 ISZERO 00F1 80 DUP1 00F2 15 ISZERO 00F3 61 PUSH2 0x0100 00F6 57 *JUMPI // Stack delta = +1 // Outputs[2] // { // @00EA memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00] = address(storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff).call.gas(0x08fc * !address(this).balance).value(address(this).balance)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // @00F0 stack[0] = !address(storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff).call.gas(0x08fc * !address(this).balance).value(address(this).balance)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // } // Block ends with conditional jump to 0x0100, if !!address(storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff).call.gas(0x08fc * !address(this).balance).value(address(this).balance)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) label_00F7: // Incoming jump from 0x00F6, if not !!address(storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff).call.gas(0x08fc * !address(this).balance).value(address(this).balance)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // Inputs[4] // { // @00F7 returndata.length // @00FB returndata[0x00:0x00 + returndata.length] // @00FC returndata.length // @00FF memory[0x00:0x00 + returndata.length] // } 00F7 3D RETURNDATASIZE 00F8 60 PUSH1 0x00 00FA 80 DUP1 00FB 3E RETURNDATACOPY 00FC 3D RETURNDATASIZE 00FD 60 PUSH1 0x00 00FF FD *REVERT // Stack delta = +0 // Outputs[2] // { // @00FB memory[0x00:0x00 + returndata.length] = returndata[0x00:0x00 + returndata.length] // @00FF revert(memory[0x00:0x00 + returndata.length]); // } // Block terminates label_0100: // Incoming jump from 0x00F6, if !!address(storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff).call.gas(0x08fc * !address(this).balance).value(address(this).balance)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // Inputs[1] { @0102 stack[-2] } 0100 5B JUMPDEST 0101 50 POP 0102 56 *JUMP // Stack delta = -2 // Block ends with unconditional jump to stack[-2] label_0103: // Incoming jump from 0x00B8 // Inputs[2] // { // @0104 stack[-1] // @0105 block.timestamp // } 0103 5B JUMPDEST 0104 80 DUP1 0105 42 TIMESTAMP 0106 14 EQ 0107 61 PUSH2 0x010f 010A 57 *JUMPI // Stack delta = +0 // Block ends with conditional jump to 0x010f, if block.timestamp == stack[-1] label_010B: // Incoming jump from 0x010A, if not block.timestamp == stack[-1] // Inputs[1] { @010E memory[0x00:0x00] } 010B 60 PUSH1 0x00 010D 80 DUP1 010E FD *REVERT // Stack delta = +0 // Outputs[1] { @010E revert(memory[0x00:0x00]); } // Block terminates label_010F: // Incoming jump from 0x010A, if block.timestamp == stack[-1] // Inputs[5] // { // @0112 memory[0x40:0x60] // @0113 block.coinbase // @0115 msg.value // @0125 address(block.coinbase).call.gas(0x08fc * !msg.value).value(msg.value)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // @0125 memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00] // } 010F 5B JUMPDEST 0110 60 PUSH1 0x40 0112 51 MLOAD 0113 41 COINBASE 0114 90 SWAP1 0115 34 CALLVALUE 0116 80 DUP1 0117 15 ISZERO 0118 61 PUSH2 0x08fc 011B 02 MUL 011C 91 SWAP2 011D 60 PUSH1 0x00 011F 81 DUP2 0120 81 DUP2 0121 81 DUP2 0122 85 DUP6 0123 88 DUP9 0124 88 DUP9 0125 F1 CALL 0126 93 SWAP4 0127 50 POP 0128 50 POP 0129 50 POP 012A 50 POP 012B 15 ISZERO 012C 80 DUP1 012D 15 ISZERO 012E 61 PUSH2 0x013b 0131 57 *JUMPI // Stack delta = +1 // Outputs[2] // { // @0125 memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00] = address(block.coinbase).call.gas(0x08fc * !msg.value).value(msg.value)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // @012B stack[0] = !address(block.coinbase).call.gas(0x08fc * !msg.value).value(msg.value)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // } // Block ends with conditional jump to 0x013b, if !!address(block.coinbase).call.gas(0x08fc * !msg.value).value(msg.value)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) label_0132: // Incoming jump from 0x0131, if not !!address(block.coinbase).call.gas(0x08fc * !msg.value).value(msg.value)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // Inputs[4] // { // @0132 returndata.length // @0136 returndata[0x00:0x00 + returndata.length] // @0137 returndata.length // @013A memory[0x00:0x00 + returndata.length] // } 0132 3D RETURNDATASIZE 0133 60 PUSH1 0x00 0135 80 DUP1 0136 3E RETURNDATACOPY 0137 3D RETURNDATASIZE 0138 60 PUSH1 0x00 013A FD *REVERT // Stack delta = +0 // Outputs[2] // { // @0136 memory[0x00:0x00 + returndata.length] = returndata[0x00:0x00 + returndata.length] // @013A revert(memory[0x00:0x00 + returndata.length]); // } // Block terminates label_013B: // Incoming jump from 0x0131, if !!address(block.coinbase).call.gas(0x08fc * !msg.value).value(msg.value)(memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00]) // Inputs[1] { @013E stack[-3] } 013B 5B JUMPDEST 013C 50 POP 013D 50 POP 013E 56 *JUMP // Stack delta = -3 // Block ends with unconditional jump to stack[-3] label_013F: // Incoming call from 0x00B3, returns to 0x00B4 // Inputs[2] // { // @0144 stack[-1] // @0145 stack[-2] // } 013F 5B JUMPDEST 0140 60 PUSH1 0x00 0142 60 PUSH1 0x20 0144 82 DUP3 0145 84 DUP5 0146 03 SUB 0147 12 SLT 0148 15 ISZERO 0149 61 PUSH2 0x0151 014C 57 *JUMPI // Stack delta = +1 // Outputs[1] { @0140 stack[0] = 0x00 } // Block ends with conditional jump to 0x0151, if !(stack[-2] - stack[-1] i< 0x20) label_014D: // Incoming jump from 0x014C, if not !(stack[-2] - stack[-1] i< 0x20) // Inputs[1] { @0150 memory[0x00:0x00] } 014D 60 PUSH1 0x00 014F 80 DUP1 0150 FD *REVERT // Stack delta = +0 // Outputs[1] { @0150 revert(memory[0x00:0x00]); } // Block terminates label_0151: // Incoming jump from 0x014C, if !(stack[-2] - stack[-1] i< 0x20) // Inputs[4] // { // @0153 stack[-2] // @0153 msg.data[stack[-2]:stack[-2] + 0x20] // @0154 stack[-4] // @0155 stack[-3] // } 0151 5B JUMPDEST 0152 50 POP 0153 35 CALLDATALOAD 0154 91 SWAP2 0155 90 SWAP1 0156 50 POP 0157 56 *JUMP // Stack delta = -3 // Outputs[1] { @0154 stack[-4] = msg.data[stack[-2]:stack[-2] + 0x20] } // Block ends with unconditional jump to stack[-4] 0158 FE *ASSERT 0159 A2 LOG2 015A 64 PUSH5 0x6970667358 0160 22 22 0161 12 SLT 0162 20 SHA3 0163 43 NUMBER 0164 4A 4A 0165 14 EQ 0166 97 SWAP8 0167 C0 C0 0168 DF DF 0169 A7 A7 016A 96 SWAP7 016B FF *SELFDESTRUCT 016C 23 23 016D 92 SWAP3 016E 03 SUB 016F 74 PUSH21 0xe3a3380016e1b880729ddb99228cac2991270c6473 0185 6F PUSH16 0x6c63430008130033
Found this site useful?
Donations are greatly appreciated!
ETH: 0xB3F04f0c276fa1177c1779f6E1E156B2738ea392
Contact/hire: [email protected]