Online Solidity Decompiler

« Decompile another contract

Address

0xda7a8ac42dd8a0687b1a0fb3d5502f49329ddfae [etherscan.io | etherchain.org]

Public Methods

No public methods detected.

Internal Methods

func_0158(arg0, arg1, arg2) returns (r0)

Decompilation

This might be constructor bytecode - to get at the deployed contract, go back and remove the constructor prefix, usually up to the next 6060 or 6080.
contract Contract { function main() { memory[0x40:0x60] = 0x80; if (msg.data.length >= 0x04) { var0 = msg.data[0x00:0x20] >> 0xe0; if (var0 != 0x8da5cb5b) { goto label_0029; } var1 = msg.value; if (var1) { revert(memory[0x00:0x00]); } var1 = 0x013c; var2 = storage[0x00] & (0x01 << 0xa0) - 0x01; var temp7 = memory[0x40:0x60]; memory[temp7:temp7 + 0x20] = var2 & (0x01 << 0xa0) - 0x01; var temp8 = memory[0x40:0x60]; return memory[temp8:temp8 + (temp7 + 0x20) - temp8]; } else if (msg.data.length) { label_0029: var var0 = 0x00; var var1 = msg.data.length; var var2 = 0x60; var var3 = 0x00; var var4 = var3; var var5 = (0x01 << 0xa0) - 0x01 & 0x6148378844e5b192a768e4c31b266276dae08c01; var var6 = 0x005f; var var7 = var0; var var9 = memory[0x40:0x60]; var var8 = var1; var6 = func_0158(var7, var8, var9); var temp0 = memory[0x40:0x60]; var temp1; temp1, memory[temp0:temp0 + 0x00] = address(var5).delegatecall.gas(msg.gas)(memory[temp0:temp0 + var6 - temp0]); var6 = returndata.length; var7 = var6; if (var7 == 0x00) { var4 = 0x60; var3 = var5; if (var3) { label_010F: var temp2 = var4; return memory[temp2 + 0x20:temp2 + 0x20 + memory[temp2:temp2 + 0x20]]; } else { label_00AA: var temp3 = memory[0x40:0x60]; memory[temp3:temp3 + 0x20] = 0x461bcd << 0xe5; memory[temp3 + 0x04:temp3 + 0x04 + 0x20] = 0x20; memory[temp3 + 0x24:temp3 + 0x24 + 0x20] = 0x31; memory[temp3 + 0x44:temp3 + 0x44 + 0x20] = 0x4974656d206973204c6f636b65642e205669736974207765627369746520746f; memory[temp3 + 0x64:temp3 + 0x64 + 0x20] = 0x102ab73637b1b5903a34329034ba32b697 << 0x79; var temp4 = memory[0x40:0x60]; revert(memory[temp4:temp4 + (temp3 + 0x84) - temp4]); } } else { var temp5 = memory[0x40:0x60]; var6 = temp5; memory[0x40:0x60] = var6 + (returndata.length + 0x3f & ~0x1f); memory[var6:var6 + 0x20] = returndata.length; var temp6 = returndata.length; memory[var6 + 0x20:var6 + 0x20 + temp6] = returndata[0x00:0x00 + temp6]; var4 = var6; var3 = var5; if (var3) { goto label_010F; } else { goto label_00AA; } } } else { stop(); } } function func_0158(var arg0, var arg1, var arg2) returns (var r0) { var temp0 = arg1; var temp1 = arg2; memory[temp1:temp1 + temp0] = msg.data[arg0:arg0 + temp0]; memory[temp0 + temp1:temp0 + temp1 + 0x20] = 0x00; return temp0 + temp1; } }

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 0x0022 000C 57 *JUMPI // Stack delta = +0 // Outputs[1] { @0004 memory[0x40:0x60] = 0x80 } // Block ends with conditional jump to 0x0022, 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 0x8da5cb5b 0019 14 EQ 001A 61 PUSH2 0x011c 001D 57 *JUMPI // Stack delta = +1 // Outputs[1] { @0012 stack[0] = msg.data[0x00:0x20] >> 0xe0 } // Block ends with conditional jump to 0x011c, if 0x8da5cb5b == msg.data[0x00:0x20] >> 0xe0 label_001E: // Incoming jump from 0x001D, if not 0x8da5cb5b == msg.data[0x00:0x20] >> 0xe0 001E 61 PUSH2 0x0029 0021 56 *JUMP // Stack delta = +0 // Block ends with unconditional jump to 0x0029 label_0022: // Incoming jump from 0x000C, if msg.data.length < 0x04 // Inputs[1] { @0023 msg.data.length } 0022 5B JUMPDEST 0023 36 CALLDATASIZE 0024 61 PUSH2 0x0029 0027 57 *JUMPI // Stack delta = +0 // Block ends with conditional jump to 0x0029, if msg.data.length label_0028: // Incoming jump from 0x0027, if not msg.data.length 0028 00 *STOP // Stack delta = +0 // Outputs[1] { @0028 stop(); } // Block terminates label_0029: // Incoming jump from 0x0027, if msg.data.length // Incoming jump from 0x0021 // Inputs[2] // { // @002C msg.data.length // @0054 memory[0x40:0x60] // } 0029 5B JUMPDEST 002A 60 PUSH1 0x00 002C 36 CALLDATASIZE 002D 60 PUSH1 0x60 002F 60 PUSH1 0x00 0031 80 DUP1 0032 73 PUSH20 0x6148378844e5b192a768e4c31b266276dae08c01 0047 60 PUSH1 0x01 0049 60 PUSH1 0x01 004B 60 PUSH1 0xa0 004D 1B SHL 004E 03 SUB 004F 16 AND 0050 85 DUP6 0051 85 DUP6 0052 60 PUSH1 0x40 0054 51 MLOAD 0055 61 PUSH2 0x005f 0058 92 SWAP3 0059 91 SWAP2 005A 90 SWAP1 005B 61 PUSH2 0x0158 005E 56 *JUMP // Stack delta = +10 // Outputs[10] // { // @002A stack[0] = 0x00 // @002C stack[1] = msg.data.length // @002D stack[2] = 0x60 // @002F stack[3] = 0x00 // @0031 stack[4] = 0x00 // @004F stack[5] = (0x01 << 0xa0) - 0x01 & 0x6148378844e5b192a768e4c31b266276dae08c01 // @0058 stack[6] = 0x005f // @0059 stack[7] = 0x00 // @005A stack[8] = msg.data.length // @005A stack[9] = memory[0x40:0x60] // } // Block ends with call to 0x0158, returns to 0x005F label_005F: // Incoming return from call to 0x0158 at 0x005E // Inputs[7] // { // @0064 memory[0x40:0x60] // @0066 stack[-1] // @0069 stack[-2] // @006A msg.gas // @006B memory[memory[0x40:0x60]:memory[0x40:0x60] + stack[-1] - memory[0x40:0x60]] // @006B address(stack[-2]).delegatecall.gas(msg.gas)(memory[memory[0x40:0x60]:memory[0x40:0x60] + stack[-1] - memory[0x40:0x60]]) // @006F returndata.length // } 005F 5B JUMPDEST 0060 60 PUSH1 0x00 0062 60 PUSH1 0x40 0064 51 MLOAD 0065 80 DUP1 0066 83 DUP4 0067 03 SUB 0068 81 DUP2 0069 85 DUP6 006A 5A GAS 006B F4 DELEGATECALL 006C 91 SWAP2 006D 50 POP 006E 50 POP 006F 3D RETURNDATASIZE 0070 80 DUP1 0071 60 PUSH1 0x00 0073 81 DUP2 0074 14 EQ 0075 61 PUSH2 0x009a 0078 57 *JUMPI // Stack delta = +1 // Outputs[4] // { // @006B memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x00] = address(stack[-2]).delegatecall.gas(msg.gas)(memory[memory[0x40:0x60]:memory[0x40:0x60] + stack[-1] - memory[0x40:0x60]]) // @006C stack[-2] = address(stack[-2]).delegatecall.gas(msg.gas)(memory[memory[0x40:0x60]:memory[0x40:0x60] + stack[-1] - memory[0x40:0x60]]) // @006F stack[-1] = returndata.length // @0070 stack[0] = returndata.length // } // Block ends with conditional jump to 0x009a, if returndata.length == 0x00 label_0079: // Incoming jump from 0x0078, if not returndata.length == 0x00 // Inputs[6] // { // @007B memory[0x40:0x60] // @007C stack[-2] // @0083 returndata.length // @008B returndata.length // @008E returndata.length // @0095 returndata[0x00:0x00 + returndata.length] // } 0079 60 PUSH1 0x40 007B 51 MLOAD 007C 91 SWAP2 007D 50 POP 007E 60 PUSH1 0x1f 0080 19 NOT 0081 60 PUSH1 0x3f 0083 3D RETURNDATASIZE 0084 01 ADD 0085 16 AND 0086 82 DUP3 0087 01 ADD 0088 60 PUSH1 0x40 008A 52 MSTORE 008B 3D RETURNDATASIZE 008C 82 DUP3 008D 52 MSTORE 008E 3D RETURNDATASIZE 008F 60 PUSH1 0x00 0091 60 PUSH1 0x20 0093 84 DUP5 0094 01 ADD 0095 3E RETURNDATACOPY 0096 61 PUSH2 0x009f 0099 56 *JUMP // Stack delta = +0 // Outputs[4] // { // @007C stack[-2] = memory[0x40:0x60] // @008A memory[0x40:0x60] = memory[0x40:0x60] + (returndata.length + 0x3f & ~0x1f) // @008D memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x20] = returndata.length // @0095 memory[memory[0x40:0x60] + 0x20:memory[0x40:0x60] + 0x20 + returndata.length] = returndata[0x00:0x00 + returndata.length] // } // Block ends with unconditional jump to 0x009f label_009A: // Incoming jump from 0x0078, if returndata.length == 0x00 // Inputs[4] // { // @009D stack[-2] // @00A1 stack[-4] // @00A3 stack[-5] // @00A3 stack[-3] // } 009A 5B JUMPDEST 009B 60 PUSH1 0x60 009D 91 SWAP2 009E 50 POP 009F 5B JUMPDEST 00A0 50 POP 00A1 91 SWAP2 00A2 50 POP 00A3 91 SWAP2 00A4 50 POP 00A5 81 DUP2 00A6 61 PUSH2 0x010f 00A9 57 *JUMPI // Stack delta = -3 // Outputs[2] // { // @00A1 stack[-4] = 0x60 // @00A3 stack[-5] = stack[-3] // } // Block ends with conditional jump to 0x010f, if stack[-3] label_00AA: // Incoming jump from 0x00A9, if not stack[-3] // Incoming jump from 0x00A9, if not stack[-3] // Inputs[3] // { // @00AC memory[0x40:0x60] // @0109 memory[0x40:0x60] // @010E memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x84 + memory[0x40:0x60]) - memory[0x40:0x60]] // } 00AA 60 PUSH1 0x40 00AC 51 MLOAD 00AD 62 PUSH3 0x461bcd 00B1 60 PUSH1 0xe5 00B3 1B SHL 00B4 81 DUP2 00B5 52 MSTORE 00B6 60 PUSH1 0x20 00B8 60 PUSH1 0x04 00BA 82 DUP3 00BB 01 ADD 00BC 52 MSTORE 00BD 60 PUSH1 0x31 00BF 60 PUSH1 0x24 00C1 82 DUP3 00C2 01 ADD 00C3 52 MSTORE 00C4 7F PUSH32 0x4974656d206973204c6f636b65642e205669736974207765627369746520746f 00E5 60 PUSH1 0x44 00E7 82 DUP3 00E8 01 ADD 00E9 52 MSTORE 00EA 70 PUSH17 0x102ab73637b1b5903a34329034ba32b697 00FC 60 PUSH1 0x79 00FE 1B SHL 00FF 60 PUSH1 0x64 0101 82 DUP3 0102 01 ADD 0103 52 MSTORE 0104 60 PUSH1 0x84 0106 01 ADD 0107 60 PUSH1 0x40 0109 51 MLOAD 010A 80 DUP1 010B 91 SWAP2 010C 03 SUB 010D 90 SWAP1 010E FD *REVERT // Stack delta = +0 // Outputs[6] // { // @00B5 memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x20] = 0x461bcd << 0xe5 // @00BC memory[memory[0x40:0x60] + 0x04:memory[0x40:0x60] + 0x04 + 0x20] = 0x20 // @00C3 memory[memory[0x40:0x60] + 0x24:memory[0x40:0x60] + 0x24 + 0x20] = 0x31 // @00E9 memory[memory[0x40:0x60] + 0x44:memory[0x40:0x60] + 0x44 + 0x20] = 0x4974656d206973204c6f636b65642e205669736974207765627369746520746f // @0103 memory[memory[0x40:0x60] + 0x64:memory[0x40:0x60] + 0x64 + 0x20] = 0x102ab73637b1b5903a34329034ba32b697 << 0x79 // @010E revert(memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x84 + memory[0x40:0x60]) - memory[0x40:0x60]]); // } // Block terminates label_010F: // Incoming jump from 0x00A9, if stack[-3] // Incoming jump from 0x00A9, if stack[-3] // Inputs[5] // { // @0110 stack[-1] // @0111 memory[stack[-1]:stack[-1] + 0x20] // @0112 stack[-5] // @0117 stack[-4] // @011B memory[0x20 + stack[-1]:0x20 + stack[-1] + memory[stack[-1]:stack[-1] + 0x20]] // } 010F 5B JUMPDEST 0110 80 DUP1 0111 51 MLOAD 0112 94 SWAP5 0113 50 POP 0114 60 PUSH1 0x20 0116 01 ADD 0117 92 SWAP3 0118 50 POP 0119 50 POP 011A 50 POP 011B F3 *RETURN // Stack delta = -5 // Outputs[1] { @011B return memory[0x20 + stack[-1]:0x20 + stack[-1] + memory[stack[-1]:stack[-1] + 0x20]]; } // Block terminates label_011C: // Incoming jump from 0x001D, if 0x8da5cb5b == msg.data[0x00:0x20] >> 0xe0 // Inputs[1] { @011D msg.value } 011C 5B JUMPDEST 011D 34 CALLVALUE 011E 80 DUP1 011F 15 ISZERO 0120 61 PUSH2 0x0128 0123 57 *JUMPI // Stack delta = +1 // Outputs[1] { @011D stack[0] = msg.value } // Block ends with conditional jump to 0x0128, if !msg.value label_0124: // Incoming jump from 0x0123, if not !msg.value // Inputs[1] { @0127 memory[0x00:0x00] } 0124 60 PUSH1 0x00 0126 80 DUP1 0127 FD *REVERT // Stack delta = +0 // Outputs[1] { @0127 revert(memory[0x00:0x00]); } // Block terminates label_0128: // Incoming jump from 0x0123, if !msg.value // Inputs[1] { @012C storage[0x00] } 0128 5B JUMPDEST 0129 50 POP 012A 60 PUSH1 0x00 012C 54 SLOAD 012D 61 PUSH2 0x013c 0130 90 SWAP1 0131 60 PUSH1 0x01 0133 60 PUSH1 0x01 0135 60 PUSH1 0xa0 0137 1B SHL 0138 03 SUB 0139 16 AND 013A 81 DUP2 013B 56 *JUMP // Stack delta = +1 // Outputs[2] // { // @0130 stack[-1] = 0x013c // @0139 stack[0] = (0x01 << 0xa0) - 0x01 & storage[0x00] // } // Block ends with unconditional jump to 0x013c label_013C: // Incoming jump from 0x013B // Inputs[4] // { // @013F memory[0x40:0x60] // @0149 stack[-1] // @0152 memory[0x40:0x60] // @0157 memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x20 + memory[0x40:0x60]) - memory[0x40:0x60]] // } 013C 5B JUMPDEST 013D 60 PUSH1 0x40 013F 51 MLOAD 0140 60 PUSH1 0x01 0142 60 PUSH1 0x01 0144 60 PUSH1 0xa0 0146 1B SHL 0147 03 SUB 0148 90 SWAP1 0149 91 SWAP2 014A 16 AND 014B 81 DUP2 014C 52 MSTORE 014D 60 PUSH1 0x20 014F 01 ADD 0150 60 PUSH1 0x40 0152 51 MLOAD 0153 80 DUP1 0154 91 SWAP2 0155 03 SUB 0156 90 SWAP1 0157 F3 *RETURN // Stack delta = -1 // Outputs[2] // { // @014C memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x20] = stack[-1] & (0x01 << 0xa0) - 0x01 // @0157 return memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x20 + memory[0x40:0x60]) - memory[0x40:0x60]]; // } // Block terminates label_0158: // Incoming call from 0x005E, returns to 0x005F // Inputs[5] // { // @0159 stack[-2] // @015A stack[-3] // @015B stack[-1] // @015C msg.data[stack[-3]:stack[-3] + stack[-2]] // @0164 stack[-4] // } 0158 5B JUMPDEST 0159 81 DUP2 015A 83 DUP4 015B 82 DUP3 015C 37 CALLDATACOPY 015D 60 PUSH1 0x00 015F 91 SWAP2 0160 01 ADD 0161 90 SWAP1 0162 81 DUP2 0163 52 MSTORE 0164 91 SWAP2 0165 90 SWAP1 0166 50 POP 0167 56 *JUMP // Stack delta = -3 // Outputs[3] // { // @015C memory[stack[-1]:stack[-1] + stack[-2]] = msg.data[stack[-3]:stack[-3] + stack[-2]] // @0163 memory[stack[-2] + stack[-1]:stack[-2] + stack[-1] + 0x20] = 0x00 // @0164 stack[-4] = stack[-2] + stack[-1] // } // Block ends with unconditional jump to stack[-4] 0168 FE *ASSERT 0169 A2 LOG2 016A 64 PUSH5 0x6970667358 0170 22 22 0171 12 SLT 0172 20 SHA3 0173 78 PUSH25 0x86e98c265623a177ae698a5807605514d0bbac96aa0366bf8c 018D 7B PUSH28 0x5a6af213004f590aeb4e5600080d0033
Found this site useful?
Donations are greatly appreciated!
ETH: 0xB3F04f0c276fa1177c1779f6E1E156B2738ea392
Contact/hire: [email protected]