Online Solidity Decompiler

« Decompile another contract

Address

0x8919066186712e63219af21ce9a8d6835e186bf1 [etherscan.io | etherchain.org]

Public Methods

No public methods detected.

Internal Methods

func_0130(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 = 0x0114; 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 & 0x59bee5a7e3a52b78513161f1158c7770eb7b28e3; var var6 = 0x005f; var var7 = var0; var var9 = memory[0x40:0x60]; var var8 = var1; var6 = func_0130(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_00E7: 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] = 0x0f; memory[temp3 + 0x44:temp3 + 0x44 + 0x20] = 0x24ba32b69034b9902637b1b5b2b217 << 0x89; 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_00E7; } else { goto label_00AA; } } } else { stop(); } } function func_0130(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 0x00f4 001D 57 *JUMPI // Stack delta = +1 // Outputs[1] { @0012 stack[0] = msg.data[0x00:0x20] >> 0xe0 } // Block ends with conditional jump to 0x00f4, 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 0x59bee5a7e3a52b78513161f1158c7770eb7b28e3 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 0x0130 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 & 0x59bee5a7e3a52b78513161f1158c7770eb7b28e3 // @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 0x0130, returns to 0x005F label_005F: // Incoming return from call to 0x0130 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 0x00e7 00A9 57 *JUMPI // Stack delta = -3 // Outputs[2] // { // @00A1 stack[-4] = 0x60 // @00A3 stack[-5] = stack[-3] // } // Block ends with conditional jump to 0x00e7, 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] // @00E1 memory[0x40:0x60] // @00E6 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 0x0f 00BF 60 PUSH1 0x24 00C1 82 DUP3 00C2 01 ADD 00C3 52 MSTORE 00C4 6E PUSH15 0x24ba32b69034b9902637b1b5b2b217 00D4 60 PUSH1 0x89 00D6 1B SHL 00D7 60 PUSH1 0x44 00D9 82 DUP3 00DA 01 ADD 00DB 52 MSTORE 00DC 60 PUSH1 0x64 00DE 01 ADD 00DF 60 PUSH1 0x40 00E1 51 MLOAD 00E2 80 DUP1 00E3 91 SWAP2 00E4 03 SUB 00E5 90 SWAP1 00E6 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] = 0x0f // @00DB memory[memory[0x40:0x60] + 0x44:memory[0x40:0x60] + 0x44 + 0x20] = 0x24ba32b69034b9902637b1b5b2b217 << 0x89 // @00E6 revert(memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x64 + memory[0x40:0x60]) - memory[0x40:0x60]]); // } // Block terminates label_00E7: // Incoming jump from 0x00A9, if stack[-3] // Incoming jump from 0x00A9, if stack[-3] // Inputs[5] // { // @00E8 stack[-1] // @00E9 memory[stack[-1]:stack[-1] + 0x20] // @00EA stack[-5] // @00EF stack[-4] // @00F3 memory[0x20 + stack[-1]:0x20 + stack[-1] + memory[stack[-1]:stack[-1] + 0x20]] // } 00E7 5B JUMPDEST 00E8 80 DUP1 00E9 51 MLOAD 00EA 94 SWAP5 00EB 50 POP 00EC 60 PUSH1 0x20 00EE 01 ADD 00EF 92 SWAP3 00F0 50 POP 00F1 50 POP 00F2 50 POP 00F3 F3 *RETURN // Stack delta = -5 // Outputs[1] { @00F3 return memory[0x20 + stack[-1]:0x20 + stack[-1] + memory[stack[-1]:stack[-1] + 0x20]]; } // Block terminates label_00F4: // Incoming jump from 0x001D, if 0x8da5cb5b == msg.data[0x00:0x20] >> 0xe0 // Inputs[1] { @00F5 msg.value } 00F4 5B JUMPDEST 00F5 34 CALLVALUE 00F6 80 DUP1 00F7 15 ISZERO 00F8 61 PUSH2 0x0100 00FB 57 *JUMPI // Stack delta = +1 // Outputs[1] { @00F5 stack[0] = msg.value } // Block ends with conditional jump to 0x0100, if !msg.value label_00FC: // Incoming jump from 0x00FB, if not !msg.value // Inputs[1] { @00FF memory[0x00:0x00] } 00FC 60 PUSH1 0x00 00FE 80 DUP1 00FF FD *REVERT // Stack delta = +0 // Outputs[1] { @00FF revert(memory[0x00:0x00]); } // Block terminates label_0100: // Incoming jump from 0x00FB, if !msg.value // Inputs[1] { @0104 storage[0x00] } 0100 5B JUMPDEST 0101 50 POP 0102 60 PUSH1 0x00 0104 54 SLOAD 0105 61 PUSH2 0x0114 0108 90 SWAP1 0109 60 PUSH1 0x01 010B 60 PUSH1 0x01 010D 60 PUSH1 0xa0 010F 1B SHL 0110 03 SUB 0111 16 AND 0112 81 DUP2 0113 56 *JUMP // Stack delta = +1 // Outputs[2] // { // @0108 stack[-1] = 0x0114 // @0111 stack[0] = (0x01 << 0xa0) - 0x01 & storage[0x00] // } // Block ends with unconditional jump to 0x0114 label_0114: // Incoming jump from 0x0113 // Inputs[4] // { // @0117 memory[0x40:0x60] // @0121 stack[-1] // @012A memory[0x40:0x60] // @012F memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x20 + memory[0x40:0x60]) - memory[0x40:0x60]] // } 0114 5B JUMPDEST 0115 60 PUSH1 0x40 0117 51 MLOAD 0118 60 PUSH1 0x01 011A 60 PUSH1 0x01 011C 60 PUSH1 0xa0 011E 1B SHL 011F 03 SUB 0120 90 SWAP1 0121 91 SWAP2 0122 16 AND 0123 81 DUP2 0124 52 MSTORE 0125 60 PUSH1 0x20 0127 01 ADD 0128 60 PUSH1 0x40 012A 51 MLOAD 012B 80 DUP1 012C 91 SWAP2 012D 03 SUB 012E 90 SWAP1 012F F3 *RETURN // Stack delta = -1 // Outputs[2] // { // @0124 memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x20] = stack[-1] & (0x01 << 0xa0) - 0x01 // @012F return memory[memory[0x40:0x60]:memory[0x40:0x60] + (0x20 + memory[0x40:0x60]) - memory[0x40:0x60]]; // } // Block terminates label_0130: // Incoming call from 0x005E, returns to 0x005F // Inputs[5] // { // @0131 stack[-2] // @0132 stack[-3] // @0133 stack[-1] // @0134 msg.data[stack[-3]:stack[-3] + stack[-2]] // @013C stack[-4] // } 0130 5B JUMPDEST 0131 81 DUP2 0132 83 DUP4 0133 82 DUP3 0134 37 CALLDATACOPY 0135 60 PUSH1 0x00 0137 91 SWAP2 0138 01 ADD 0139 90 SWAP1 013A 81 DUP2 013B 52 MSTORE 013C 91 SWAP2 013D 90 SWAP1 013E 50 POP 013F 56 *JUMP // Stack delta = -3 // Outputs[3] // { // @0134 memory[stack[-1]:stack[-1] + stack[-2]] = msg.data[stack[-3]:stack[-3] + stack[-2]] // @013B memory[stack[-2] + stack[-1]:stack[-2] + stack[-1] + 0x20] = 0x00 // @013C stack[-4] = stack[-2] + stack[-1] // } // Block ends with unconditional jump to stack[-4] 0140 FE *ASSERT 0141 A2 LOG2 0142 64 PUSH5 0x6970667358 0148 22 22 0149 12 SLT 014A 20 SHA3 014B A2 LOG2 014C 54 SLOAD 014D 1F 1F 014E 79 PUSH26 0x7917701c2970368f2115d861766a3d4de447963c5d1ed22ce7eb 0169 2C 2C 016A 01 ADD 016B 64 PUSH5 0x736f6c6343 0171 00 *STOP 0172 08 ADDMOD 0173 0D 0D 0174 00 *STOP 0175 33 CALLER
Found this site useful?
Donations are greatly appreciated!
ETH: 0xB3F04f0c276fa1177c1779f6E1E156B2738ea392
Contact/hire: [email protected]