Online Solidity Decompiler

« Decompile another contract

Address

0x0993851170ecac43b58339d8bca884e01e2359dc [etherscan.io | etherchain.org]

Public Methods

No public methods detected.

Internal Methods

func_012C(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 = 0x0110; 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 & 0x159a1f9ef9c2455a11e45ecbdd93ceac8157adbd; var var6 = 0x005f; var var7 = var0; var var9 = memory[0x40:0x60]; var var8 = var1; var6 = func_012C(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_00E3: 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] = 0x0b; memory[temp3 + 0x44:temp3 + 0x44 + 0x20] = 0x4c6f636b6564204974656d << 0xa8; var temp4 = memory[0x40:0x60]; revert(memory[temp4:temp4 + (temp3 + 0x64) - 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_00E3; } else { goto label_00AA; } } } else { stop(); } } function func_012C(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 0x00f0 001D 57 *JUMPI // Stack delta = +1 // Outputs[1] { @0012 stack[0] = msg.data[0x00:0x20] >> 0xe0 } // Block ends with conditional jump to 0x00f0, 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 0x0021 // Incoming jump from 0x0027, if msg.data.length // 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 0x159a1f9ef9c2455a11e45ecbdd93ceac8157adbd 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 0x012c 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 & 0x159a1f9ef9c2455a11e45ecbdd93ceac8157adbd // @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 0x012c, returns to 0x005F label_005F: // Incoming return from call to 0x012C at 0x005E // Inputs[7] // { // @0064 memory[0x40:0x60] // @0066 stack[-1] // @0069 stack[-2] // @006A msg.gas // @006B address(stack[-2]).delegatecall.gas(msg.gas)(memory[memory[0x40:0x60]:memory[0x40:0x60] + stack[-1] - memory[0x40:0x60]]) // @006B 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 0x00e3 00A9 57 *JUMPI // Stack delta = -3 // Outputs[2] // { // @00A1 stack[-4] = 0x60 // @00A3 stack[-5] = stack[-3] // } // Block ends with conditional jump to 0x00e3, 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] // @00DD memory[0x40:0x60] // @00E2 memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x64 + 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 0x0b 00BF 60 PUSH1 0x24 00C1 82 DUP3 00C2 01 ADD 00C3 52 MSTORE 00C4 6A PUSH11 0x4c6f636b6564204974656d 00D0 60 PUSH1 0xa8 00D2 1B SHL 00D3 60 PUSH1 0x44 00D5 82 DUP3 00D6 01 ADD 00D7 52 MSTORE 00D8 60 PUSH1 0x64 00DA 01 ADD 00DB 60 PUSH1 0x40 00DD 51 MLOAD 00DE 80 DUP1 00DF 91 SWAP2 00E0 03 SUB 00E1 90 SWAP1 00E2 FD *REVERT // Stack delta = +0 // Outputs[5] // { // @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] = 0x0b // @00D7 memory[memory[0x40:0x60] + 0x44:memory[0x40:0x60] + 0x44 + 0x20] = 0x4c6f636b6564204974656d << 0xa8 // @00E2 revert(memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x64 + memory[0x40:0x60]) - memory[0x40:0x60]]); // } // Block terminates label_00E3: // Incoming jump from 0x00A9, if stack[-3] // Incoming jump from 0x00A9, if stack[-3] // Inputs[5] // { // @00E4 stack[-1] // @00E5 memory[stack[-1]:stack[-1] + 0x20] // @00E6 stack[-5] // @00EB stack[-4] // @00EF memory[0x20 + stack[-1]:0x20 + stack[-1] + memory[stack[-1]:stack[-1] + 0x20]] // } 00E3 5B JUMPDEST 00E4 80 DUP1 00E5 51 MLOAD 00E6 94 SWAP5 00E7 50 POP 00E8 60 PUSH1 0x20 00EA 01 ADD 00EB 92 SWAP3 00EC 50 POP 00ED 50 POP 00EE 50 POP 00EF F3 *RETURN // Stack delta = -5 // Outputs[1] { @00EF return memory[0x20 + stack[-1]:0x20 + stack[-1] + memory[stack[-1]:stack[-1] + 0x20]]; } // Block terminates label_00F0: // Incoming jump from 0x001D, if 0x8da5cb5b == msg.data[0x00:0x20] >> 0xe0 // Inputs[1] { @00F1 msg.value } 00F0 5B JUMPDEST 00F1 34 CALLVALUE 00F2 80 DUP1 00F3 15 ISZERO 00F4 61 PUSH2 0x00fc 00F7 57 *JUMPI // Stack delta = +1 // Outputs[1] { @00F1 stack[0] = msg.value } // Block ends with conditional jump to 0x00fc, if !msg.value label_00F8: // Incoming jump from 0x00F7, if not !msg.value // Inputs[1] { @00FB memory[0x00:0x00] } 00F8 60 PUSH1 0x00 00FA 80 DUP1 00FB FD *REVERT // Stack delta = +0 // Outputs[1] { @00FB revert(memory[0x00:0x00]); } // Block terminates label_00FC: // Incoming jump from 0x00F7, if !msg.value // Inputs[1] { @0100 storage[0x00] } 00FC 5B JUMPDEST 00FD 50 POP 00FE 60 PUSH1 0x00 0100 54 SLOAD 0101 61 PUSH2 0x0110 0104 90 SWAP1 0105 60 PUSH1 0x01 0107 60 PUSH1 0x01 0109 60 PUSH1 0xa0 010B 1B SHL 010C 03 SUB 010D 16 AND 010E 81 DUP2 010F 56 *JUMP // Stack delta = +1 // Outputs[2] // { // @0104 stack[-1] = 0x0110 // @010D stack[0] = (0x01 << 0xa0) - 0x01 & storage[0x00] // } // Block ends with unconditional jump to 0x0110 label_0110: // Incoming jump from 0x010F // Inputs[4] // { // @0113 memory[0x40:0x60] // @011D stack[-1] // @0126 memory[0x40:0x60] // @012B memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x20 + memory[0x40:0x60]) - memory[0x40:0x60]] // } 0110 5B JUMPDEST 0111 60 PUSH1 0x40 0113 51 MLOAD 0114 60 PUSH1 0x01 0116 60 PUSH1 0x01 0118 60 PUSH1 0xa0 011A 1B SHL 011B 03 SUB 011C 90 SWAP1 011D 91 SWAP2 011E 16 AND 011F 81 DUP2 0120 52 MSTORE 0121 60 PUSH1 0x20 0123 01 ADD 0124 60 PUSH1 0x40 0126 51 MLOAD 0127 80 DUP1 0128 91 SWAP2 0129 03 SUB 012A 90 SWAP1 012B F3 *RETURN // Stack delta = -1 // Outputs[2] // { // @0120 memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x20] = stack[-1] & (0x01 << 0xa0) - 0x01 // @012B return memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x20 + memory[0x40:0x60]) - memory[0x40:0x60]]; // } // Block terminates label_012C: // Incoming call from 0x005E, returns to 0x005F // Inputs[5] // { // @012D stack[-2] // @012E stack[-3] // @012F stack[-1] // @0130 msg.data[stack[-3]:stack[-3] + stack[-2]] // @0138 stack[-4] // } 012C 5B JUMPDEST 012D 81 DUP2 012E 83 DUP4 012F 82 DUP3 0130 37 CALLDATACOPY 0131 60 PUSH1 0x00 0133 91 SWAP2 0134 01 ADD 0135 90 SWAP1 0136 81 DUP2 0137 52 MSTORE 0138 91 SWAP2 0139 90 SWAP1 013A 50 POP 013B 56 *JUMP // Stack delta = -3 // Outputs[3] // { // @0130 memory[stack[-1]:stack[-1] + stack[-2]] = msg.data[stack[-3]:stack[-3] + stack[-2]] // @0137 memory[stack[-2] + stack[-1]:stack[-2] + stack[-1] + 0x20] = 0x00 // @0138 stack[-4] = stack[-2] + stack[-1] // } // Block ends with unconditional jump to stack[-4] 013C FE *ASSERT 013D A2 LOG2 013E 64 PUSH5 0x6970667358 0144 22 22 0145 12 SLT 0146 20 SHA3 0147 97 SWAP8 0148 07 SMOD 0149 ED ED 014A C6 C6 014B BE BE 014C 1B SHL 014D AC AC 014E 60 PUSH1 0x31 0150 30 ADDRESS 0151 0F 0F 0152 F9 F9 0153 16 AND 0154 D6 D6 0155 39 CODECOPY 0156 C1 C1 0157 95 SWAP6 0158 B7 B7 0159 EE EE 015A F7 F7 015B DB DB 015C 67 PUSH8 0x4ab87ae243c7d9d4 0165 F8 F8 0166 4A 4A 0167 64 PUSH5 0x736f6c6343 016D 00 *STOP 016E 08 ADDMOD 016F 0D 0D 0170 00 *STOP 0171 33 CALLER
Found this site useful?
Donations are greatly appreciated!
ETH: 0xB3F04f0c276fa1177c1779f6E1E156B2738ea392
Contact/hire: [email protected]