Online Solidity Decompiler

« Decompile another contract

Address

0xc99a9fc5fb504e46f4ec3ee2d43e62c7214ae464 [etherscan.io | etherchain.org]

Public Methods

Method names cached from 4byte.directory.
0x3ccfd60b withdraw()
0x590e1ae3 refund()

Internal Methods

withdraw()
refund()

Decompilation

contract Contract { function main() { memory[0x40:0x60] = 0x80; if (msg.data.length < 0x04) { revert(memory[0x00:0x00]); } var var0 = msg.data[0x00:0x20] / 0x0100000000000000000000000000000000000000000000000000000000 & 0xffffffff; if (var0 == 0x3ccfd60b) { // Dispatch table entry for withdraw() var var1 = msg.value; if (var1) { revert(memory[0x00:0x00]); } var1 = 0x0065; withdraw(); stop(); } else if (var0 == 0x590e1ae3) { // Dispatch table entry for refund() var1 = msg.value; if (var1) { revert(memory[0x00:0x00]); } var1 = 0x0065; refund(); stop(); } else { revert(memory[0x00:0x00]); } } function withdraw() { if (msg.sender != storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff) { revert(memory[0x00:0x00]); } var temp0 = memory[0x40:0x60]; memory[temp0:temp0 + 0x20] = 0xa9059cbb00000000000000000000000000000000000000000000000000000000; memory[temp0 + 0x04:temp0 + 0x04 + 0x20] = storage[0x02] & 0xffffffffffffffffffffffffffffffffffffffff; memory[temp0 + 0x24:temp0 + 0x24 + 0x20] = storage[0x04]; var var0 = storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff; var var1 = 0xa9059cbb; var var2 = temp0 + 0x44; var var3 = 0x20; var var4 = memory[0x40:0x60]; var var5 = temp0 - var4 + 0x44; var var6 = var4; var var7 = 0x00; var var8 = var0; var var9 = !address(var8).code.length; if (var9) { revert(memory[0x00:0x00]); } var temp1; temp1, memory[var4:var4 + var3] = address(var8).call.gas(msg.gas).value(var7)(memory[var6:var6 + var5]); var3 = !temp1; if (!var3) { var0 = memory[0x40:0x60]; var1 = returndata.length; if (var1 >= 0x20) { return; } else { revert(memory[0x00:0x00]); } } else { var temp2 = returndata.length; memory[0x00:0x00 + temp2] = returndata[0x00:0x00 + temp2]; revert(memory[0x00:0x00 + returndata.length]); } } function refund() { if (msg.sender != storage[0x00] & 0xffffffffffffffffffffffffffffffffffffffff) { revert(memory[0x00:0x00]); } var temp0 = memory[0x40:0x60]; memory[temp0:temp0 + 0x20] = 0xa9059cbb00000000000000000000000000000000000000000000000000000000; memory[temp0 + 0x04:temp0 + 0x04 + 0x20] = storage[0x01] & 0xffffffffffffffffffffffffffffffffffffffff; memory[temp0 + 0x24:temp0 + 0x24 + 0x20] = storage[0x04]; var var0 = storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff; var var1 = 0xa9059cbb; var var2 = temp0 + 0x44; var var3 = 0x20; var var4 = memory[0x40:0x60]; var var5 = temp0 - var4 + 0x44; var var6 = var4; var var7 = 0x00; var var8 = var0; var var9 = !address(var8).code.length; if (var9) { revert(memory[0x00:0x00]); } var temp1; temp1, memory[var4:var4 + var3] = address(var8).call.gas(msg.gas).value(var7)(memory[var6:var6 + var5]); var3 = !temp1; if (!var3) { var0 = memory[0x40:0x60]; var1 = returndata.length; if (var1 >= 0x20) { return; } else { revert(memory[0x00:0x00]); } } else { var temp2 = returndata.length; memory[0x00:0x00 + temp2] = returndata[0x00:0x00 + temp2]; revert(memory[0x00:0x00 + returndata.length]); } } }

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 0x004b 000C 57 *JUMPI // Stack delta = +0 // Outputs[1] { @0004 memory[0x40:0x60] = 0x80 } // Block ends with conditional jump to 0x004b, if msg.data.length < 0x04 label_000D: // Incoming jump from 0x000C, if not msg.data.length < 0x04 // Inputs[1] { @0032 msg.data[0x00:0x20] } 000D 63 PUSH4 0xffffffff 0012 7C PUSH29 0x0100000000000000000000000000000000000000000000000000000000 0030 60 PUSH1 0x00 0032 35 CALLDATALOAD 0033 04 DIV 0034 16 AND 0035 63 PUSH4 0x3ccfd60b 003A 81 DUP2 003B 14 EQ 003C 61 PUSH2 0x0050 003F 57 *JUMPI // Stack delta = +1 // Outputs[1] { @0034 stack[0] = msg.data[0x00:0x20] / 0x0100000000000000000000000000000000000000000000000000000000 & 0xffffffff } // Block ends with conditional jump to 0x0050, if msg.data[0x00:0x20] / 0x0100000000000000000000000000000000000000000000000000000000 & 0xffffffff == 0x3ccfd60b label_0040: // Incoming jump from 0x003F, if not msg.data[0x00:0x20] / 0x0100000000000000000000000000000000000000000000000000000000 & 0xffffffff == 0x3ccfd60b // Inputs[1] { @0040 stack[-1] } 0040 80 DUP1 0041 63 PUSH4 0x590e1ae3 0046 14 EQ 0047 61 PUSH2 0x0067 004A 57 *JUMPI // Stack delta = +0 // Block ends with conditional jump to 0x0067, if 0x590e1ae3 == stack[-1] label_004B: // Incoming jump from 0x004A, if not 0x590e1ae3 == stack[-1] // Incoming jump from 0x000C, if msg.data.length < 0x04 // Inputs[1] { @004F memory[0x00:0x00] } 004B 5B JUMPDEST 004C 60 PUSH1 0x00 004E 80 DUP1 004F FD *REVERT // Stack delta = +0 // Outputs[1] { @004F revert(memory[0x00:0x00]); } // Block terminates label_0050: // Incoming jump from 0x003F, if msg.data[0x00:0x20] / 0x0100000000000000000000000000000000000000000000000000000000 & 0xffffffff == 0x3ccfd60b // 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 005C 5B JUMPDEST 005D 50 POP 005E 61 PUSH2 0x0065 0061 61 PUSH2 0x007c 0064 56 *JUMP // Stack delta = +0 // Outputs[1] { @005E stack[-1] = 0x0065 } // Block ends with call to 0x007c, returns to 0x0065 label_0065: // Incoming return from call to 0x0153 at 0x007B // Incoming return from call to 0x007C at 0x0064 0065 5B JUMPDEST 0066 00 *STOP // Stack delta = +0 // Outputs[1] { @0066 stop(); } // Block terminates label_0067: // Incoming jump from 0x004A, if 0x590e1ae3 == stack[-1] // Inputs[1] { @0068 msg.value } 0067 5B JUMPDEST 0068 34 CALLVALUE 0069 80 DUP1 006A 15 ISZERO 006B 61 PUSH2 0x0073 006E 57 *JUMPI // Stack delta = +1 // Outputs[1] { @0068 stack[0] = msg.value } // Block ends with conditional jump to 0x0073, if !msg.value label_006F: // Incoming jump from 0x006E, if not !msg.value // Inputs[1] { @0072 memory[0x00:0x00] } 006F 60 PUSH1 0x00 0071 80 DUP1 0072 FD *REVERT // Stack delta = +0 // Outputs[1] { @0072 revert(memory[0x00:0x00]); } // Block terminates label_0073: // Incoming jump from 0x006E, if !msg.value 0073 5B JUMPDEST 0074 50 POP 0075 61 PUSH2 0x0065 0078 61 PUSH2 0x0153 007B 56 *JUMP // Stack delta = +0 // Outputs[1] { @0075 stack[-1] = 0x0065 } // Block ends with call to 0x0153, returns to 0x0065 label_007C: // Incoming call from 0x0064, returns to 0x0065 // Inputs[2] // { // @007F storage[0x00] // @0096 msg.sender // } 007C 5B JUMPDEST 007D 60 PUSH1 0x00 007F 54 SLOAD 0080 73 PUSH20 0xffffffffffffffffffffffffffffffffffffffff 0095 16 AND 0096 33 CALLER 0097 14 EQ 0098 61 PUSH2 0x00a0 009B 57 *JUMPI // Stack delta = +0 // Block ends with conditional jump to 0x00a0, if msg.sender == 0xffffffffffffffffffffffffffffffffffffffff & storage[0x00] label_009C: // Incoming jump from 0x009B, if not msg.sender == 0xffffffffffffffffffffffffffffffffffffffff & storage[0x00] // Inputs[1] { @009F memory[0x00:0x00] } 009C 60 PUSH1 0x00 009E 80 DUP1 009F FD *REVERT // Stack delta = +0 // Outputs[1] { @009F revert(memory[0x00:0x00]); } // Block terminates label_00A0: // Incoming jump from 0x009B, if msg.sender == 0xffffffffffffffffffffffffffffffffffffffff & storage[0x00] // Inputs[6] // { // @00A3 storage[0x06] // @00A6 storage[0x02] // @00AA storage[0x04] // @00AE memory[0x40:0x60] // @00F9 memory[0x40:0x60] // @0119 address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length // } 00A0 5B JUMPDEST 00A1 60 PUSH1 0x06 00A3 54 SLOAD 00A4 60 PUSH1 0x02 00A6 54 SLOAD 00A7 60 PUSH1 0x04 00A9 80 DUP1 00AA 54 SLOAD 00AB 60 PUSH1 0x40 00AD 80 DUP1 00AE 51 MLOAD 00AF 7F PUSH32 0xa9059cbb00000000000000000000000000000000000000000000000000000000 00D0 81 DUP2 00D1 52 MSTORE 00D2 73 PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00E7 94 SWAP5 00E8 85 DUP6 00E9 16 AND 00EA 93 SWAP4 00EB 81 DUP2 00EC 01 ADD 00ED 93 SWAP4 00EE 90 SWAP1 00EF 93 SWAP4 00F0 52 MSTORE 00F1 60 PUSH1 0x24 00F3 83 DUP4 00F4 01 ADD 00F5 91 SWAP2 00F6 90 SWAP1 00F7 91 SWAP2 00F8 52 MSTORE 00F9 51 MLOAD 00FA 91 SWAP2 00FB 90 SWAP1 00FC 92 SWAP3 00FD 16 AND 00FE 91 SWAP2 00FF 63 PUSH4 0xa9059cbb 0104 91 SWAP2 0105 60 PUSH1 0x44 0107 80 DUP1 0108 83 DUP4 0109 01 ADD 010A 92 SWAP3 010B 60 PUSH1 0x20 010D 92 SWAP3 010E 91 SWAP2 010F 90 SWAP1 0110 82 DUP3 0111 90 SWAP1 0112 03 SUB 0113 01 ADD 0114 81 DUP2 0115 60 PUSH1 0x00 0117 87 DUP8 0118 80 DUP1 0119 3B EXTCODESIZE 011A 15 ISZERO 011B 80 DUP1 011C 15 ISZERO 011D 61 PUSH2 0x0125 0120 57 *JUMPI // Stack delta = +10 // Outputs[13] // { // @00D1 memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x20] = 0xa9059cbb00000000000000000000000000000000000000000000000000000000 // @00F0 memory[memory[0x40:0x60] + 0x04:memory[0x40:0x60] + 0x04 + 0x20] = 0xffffffffffffffffffffffffffffffffffffffff & storage[0x02] // @00F8 memory[memory[0x40:0x60] + 0x24:memory[0x40:0x60] + 0x24 + 0x20] = storage[0x04] // @00FE stack[0] = storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff // @0104 stack[1] = 0xa9059cbb // @010A stack[2] = memory[0x40:0x60] + 0x44 // @010D stack[3] = 0x20 // @010E stack[4] = memory[0x40:0x60] // @0113 stack[5] = memory[0x40:0x60] - memory[0x40:0x60] + 0x44 // @0114 stack[6] = memory[0x40:0x60] // @0115 stack[7] = 0x00 // @0117 stack[8] = storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff // @011A stack[9] = !address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length // } // Block ends with conditional jump to 0x0125, if !!address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length label_0121: // Incoming jump from 0x0120, if not !!address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length // Inputs[1] { @0124 memory[0x00:0x00] } 0121 60 PUSH1 0x00 0123 80 DUP1 0124 FD *REVERT // Stack delta = +0 // Outputs[1] { @0124 revert(memory[0x00:0x00]); } // Block terminates label_0125: // Incoming jump from 0x01F7, if !!address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length // Incoming jump from 0x0120, if !!address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length // Inputs[9] // { // @0127 msg.gas // @0128 stack[-6] // @0128 stack[-7] // @0128 address(stack[-2]).call.gas(msg.gas).value(stack[-3])(memory[stack[-4]:stack[-4] + stack[-5]]) // @0128 stack[-3] // @0128 stack[-5] // @0128 memory[stack[-4]:stack[-4] + stack[-5]] // @0128 stack[-2] // @0128 stack[-4] // } 0125 5B JUMPDEST 0126 50 POP 0127 5A GAS 0128 F1 CALL 0129 15 ISZERO 012A 80 DUP1 012B 15 ISZERO 012C 61 PUSH2 0x0139 012F 57 *JUMPI // Stack delta = -6 // Outputs[2] // { // @0128 memory[stack[-6]:stack[-6] + stack[-7]] = address(stack[-2]).call.gas(msg.gas).value(stack[-3])(memory[stack[-4]:stack[-4] + stack[-5]]) // @0129 stack[-7] = !address(stack[-2]).call.gas(msg.gas).value(stack[-3])(memory[stack[-4]:stack[-4] + stack[-5]]) // } // Block ends with conditional jump to 0x0139, if !!address(stack[-2]).call.gas(msg.gas).value(stack[-3])(memory[stack[-4]:stack[-4] + stack[-5]]) label_0130: // Incoming jump from 0x012F, if not !!address(stack[-2]).call.gas(msg.gas).value(stack[-3])(memory[stack[-4]:stack[-4] + stack[-5]]) // Inputs[4] // { // @0130 returndata.length // @0134 returndata[0x00:0x00 + returndata.length] // @0135 returndata.length // @0138 memory[0x00:0x00 + returndata.length] // } 0130 3D RETURNDATASIZE 0131 60 PUSH1 0x00 0133 80 DUP1 0134 3E RETURNDATACOPY 0135 3D RETURNDATASIZE 0136 60 PUSH1 0x00 0138 FD *REVERT // Stack delta = +0 // Outputs[2] // { // @0134 memory[0x00:0x00 + returndata.length] = returndata[0x00:0x00 + returndata.length] // @0138 revert(memory[0x00:0x00 + returndata.length]); // } // Block terminates label_0139: // Incoming jump from 0x012F, if !!address(stack[-2]).call.gas(msg.gas).value(stack[-3])(memory[stack[-4]:stack[-4] + stack[-5]]) // Inputs[2] // { // @0140 memory[0x40:0x60] // @0141 returndata.length // } 0139 5B JUMPDEST 013A 50 POP 013B 50 POP 013C 50 POP 013D 50 POP 013E 60 PUSH1 0x40 0140 51 MLOAD 0141 3D RETURNDATASIZE 0142 60 PUSH1 0x20 0144 81 DUP2 0145 10 LT 0146 15 ISZERO 0147 61 PUSH2 0x014f 014A 57 *JUMPI // Stack delta = -2 // Outputs[2] // { // @0140 stack[-4] = memory[0x40:0x60] // @0141 stack[-3] = returndata.length // } // Block ends with conditional jump to 0x014f, if !(returndata.length < 0x20) label_014B: // Incoming jump from 0x014A, if not !(returndata.length < 0x20) // Inputs[1] { @014E memory[0x00:0x00] } 014B 60 PUSH1 0x00 014D 80 DUP1 014E FD *REVERT // Stack delta = +0 // Outputs[1] { @014E revert(memory[0x00:0x00]); } // Block terminates label_014F: // Incoming jump from 0x014A, if !(returndata.length < 0x20) // Inputs[1] { @0152 stack[-3] } 014F 5B JUMPDEST 0150 50 POP 0151 50 POP 0152 56 *JUMP // Stack delta = -3 // Block ends with unconditional jump to stack[-3] label_0153: // Incoming call from 0x007B, returns to 0x0065 // Inputs[2] // { // @0156 storage[0x00] // @016D msg.sender // } 0153 5B JUMPDEST 0154 60 PUSH1 0x00 0156 54 SLOAD 0157 73 PUSH20 0xffffffffffffffffffffffffffffffffffffffff 016C 16 AND 016D 33 CALLER 016E 14 EQ 016F 61 PUSH2 0x0177 0172 57 *JUMPI // Stack delta = +0 // Block ends with conditional jump to 0x0177, if msg.sender == 0xffffffffffffffffffffffffffffffffffffffff & storage[0x00] label_0173: // Incoming jump from 0x0172, if not msg.sender == 0xffffffffffffffffffffffffffffffffffffffff & storage[0x00] // Inputs[1] { @0176 memory[0x00:0x00] } 0173 60 PUSH1 0x00 0175 80 DUP1 0176 FD *REVERT // Stack delta = +0 // Outputs[1] { @0176 revert(memory[0x00:0x00]); } // Block terminates label_0177: // Incoming jump from 0x0172, if msg.sender == 0xffffffffffffffffffffffffffffffffffffffff & storage[0x00] // Inputs[6] // { // @017A storage[0x06] // @017D storage[0x01] // @0181 storage[0x04] // @0185 memory[0x40:0x60] // @01D0 memory[0x40:0x60] // @01F0 address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length // } 0177 5B JUMPDEST 0178 60 PUSH1 0x06 017A 54 SLOAD 017B 60 PUSH1 0x01 017D 54 SLOAD 017E 60 PUSH1 0x04 0180 80 DUP1 0181 54 SLOAD 0182 60 PUSH1 0x40 0184 80 DUP1 0185 51 MLOAD 0186 7F PUSH32 0xa9059cbb00000000000000000000000000000000000000000000000000000000 01A7 81 DUP2 01A8 52 MSTORE 01A9 73 PUSH20 0xffffffffffffffffffffffffffffffffffffffff 01BE 94 SWAP5 01BF 85 DUP6 01C0 16 AND 01C1 93 SWAP4 01C2 81 DUP2 01C3 01 ADD 01C4 93 SWAP4 01C5 90 SWAP1 01C6 93 SWAP4 01C7 52 MSTORE 01C8 60 PUSH1 0x24 01CA 83 DUP4 01CB 01 ADD 01CC 91 SWAP2 01CD 90 SWAP1 01CE 91 SWAP2 01CF 52 MSTORE 01D0 51 MLOAD 01D1 91 SWAP2 01D2 90 SWAP1 01D3 92 SWAP3 01D4 16 AND 01D5 91 SWAP2 01D6 63 PUSH4 0xa9059cbb 01DB 91 SWAP2 01DC 60 PUSH1 0x44 01DE 80 DUP1 01DF 83 DUP4 01E0 01 ADD 01E1 92 SWAP3 01E2 60 PUSH1 0x20 01E4 92 SWAP3 01E5 91 SWAP2 01E6 90 SWAP1 01E7 82 DUP3 01E8 90 SWAP1 01E9 03 SUB 01EA 01 ADD 01EB 81 DUP2 01EC 60 PUSH1 0x00 01EE 87 DUP8 01EF 80 DUP1 01F0 3B EXTCODESIZE 01F1 15 ISZERO 01F2 80 DUP1 01F3 15 ISZERO 01F4 61 PUSH2 0x0125 01F7 57 *JUMPI // Stack delta = +10 // Outputs[13] // { // @01A8 memory[memory[0x40:0x60]:memory[0x40:0x60] + 0x20] = 0xa9059cbb00000000000000000000000000000000000000000000000000000000 // @01C7 memory[memory[0x40:0x60] + 0x04:memory[0x40:0x60] + 0x04 + 0x20] = 0xffffffffffffffffffffffffffffffffffffffff & storage[0x01] // @01CF memory[memory[0x40:0x60] + 0x24:memory[0x40:0x60] + 0x24 + 0x20] = storage[0x04] // @01D5 stack[0] = storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff // @01DB stack[1] = 0xa9059cbb // @01E1 stack[2] = memory[0x40:0x60] + 0x44 // @01E4 stack[3] = 0x20 // @01E5 stack[4] = memory[0x40:0x60] // @01EA stack[5] = memory[0x40:0x60] - memory[0x40:0x60] + 0x44 // @01EB stack[6] = memory[0x40:0x60] // @01EC stack[7] = 0x00 // @01EE stack[8] = storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff // @01F1 stack[9] = !address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length // } // Block ends with conditional jump to 0x0125, if !!address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length label_01F8: // Incoming jump from 0x01F7, if not !!address(storage[0x06] & 0xffffffffffffffffffffffffffffffffffffffff).code.length // Inputs[1] { @01FB memory[0x00:0x00] } 01F8 60 PUSH1 0x00 01FA 80 DUP1 01FB FD *REVERT // Stack delta = +0 // Outputs[1] { @01FB revert(memory[0x00:0x00]); } // Block terminates 01FC 00 *STOP 01FD A1 LOG1 01FE 65 PUSH6 0x627a7a723058 0205 20 SHA3 0206 C5 C5 0207 CA CA 0208 F1 CALL 0209 E4 E4 020A D5 D5 020B 86 DUP7 020C DD DD 020D C8 C8 020E 67 PUSH8 0x6544469586912d62 0217 C2 C2 0218 01 ADD 0219 64 PUSH5 0x83fb249f03 021F 10 LT 0220 E2 E2 0221 1B SHL 0222 43 NUMBER 0223 CC CC 0224 2B 2B 0225 A2 LOG2 0226 00 *STOP 0227 29 29
Found this site useful?
Donations are greatly appreciated!
ETH: 0xB3F04f0c276fa1177c1779f6E1E156B2738ea392
Contact/hire: [email protected]