/*
* Copyright (c) [2016] [ <ether.camp> ]
* This file is part of the ethereumJ library.
*
* The ethereumJ library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The ethereumJ library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
*/
package org.ethereum.vm;
import org.ethereum.core.Repository;
import org.ethereum.util.ByteUtil;
import org.ethereum.vm.program.Program;
import org.ethereum.vm.program.Program.BadJumpDestinationException;
import org.ethereum.vm.program.Program.StackTooSmallException;
import org.ethereum.vm.program.invoke.ProgramInvokeMockImpl;
import org.junit.*;
import org.junit.runners.MethodSorters;
import org.spongycastle.util.encoders.Hex;
import java.util.List;
import static org.ethereum.util.ByteUtil.oneByteToHexString;
import static org.junit.Assert.*;
/**
* @author Roman Mandeleil
* @since 01.06.2014
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class VMTest {
private ProgramInvokeMockImpl invoke;
private Program program;
@Before
public void setup() {
invoke = new ProgramInvokeMockImpl();
}
@After
public void tearDown() {
invoke.getRepository().close();
}
@Test // PUSH1 OP
public void testPUSH1() {
VM vm = new VM();
program = new Program(Hex.decode("60A0"), invoke);
String expected = "00000000000000000000000000000000000000000000000000000000000000A0";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH2 OP
public void testPUSH2() {
VM vm = new VM();
program = new Program(Hex.decode("61A0B0"), invoke);
String expected = "000000000000000000000000000000000000000000000000000000000000A0B0";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH3 OP
public void testPUSH3() {
VM vm = new VM();
program = new Program(Hex.decode("62A0B0C0"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000A0B0C0";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH4 OP
public void testPUSH4() {
VM vm = new VM();
program = new Program(Hex.decode("63A0B0C0D0"), invoke);
String expected = "00000000000000000000000000000000000000000000000000000000A0B0C0D0";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH5 OP
public void testPUSH5() {
VM vm = new VM();
program = new Program(Hex.decode("64A0B0C0D0E0"), invoke);
String expected = "000000000000000000000000000000000000000000000000000000A0B0C0D0E0";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH6 OP
public void testPUSH6() {
VM vm = new VM();
program = new Program(Hex.decode("65A0B0C0D0E0F0"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000A0B0C0D0E0F0";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH7 OP
public void testPUSH7() {
VM vm = new VM();
program = new Program(Hex.decode("66A0B0C0D0E0F0A1"), invoke);
String expected = "00000000000000000000000000000000000000000000000000A0B0C0D0E0F0A1";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH8 OP
public void testPUSH8() {
VM vm = new VM();
program = new Program(Hex.decode("67A0B0C0D0E0F0A1B1"), invoke);
String expected = "000000000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH9 OP
public void testPUSH9() {
VM vm = new VM();
program = new Program(Hex.decode("68A0B0C0D0E0F0A1B1C1"), invoke);
String expected = "0000000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH10 OP
public void testPUSH10() {
VM vm = new VM();
program = new Program(Hex.decode("69A0B0C0D0E0F0A1B1C1D1"), invoke);
String expected = "00000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH11 OP
public void testPUSH11() {
VM vm = new VM();
program = new Program(Hex.decode("6AA0B0C0D0E0F0A1B1C1D1E1"), invoke);
String expected = "000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH12 OP
public void testPUSH12() {
VM vm = new VM();
program = new Program(Hex.decode("6BA0B0C0D0E0F0A1B1C1D1E1F1"), invoke);
String expected = "0000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH13 OP
public void testPUSH13() {
VM vm = new VM();
program = new Program(Hex.decode("6CA0B0C0D0E0F0A1B1C1D1E1F1A2"), invoke);
String expected = "00000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH14 OP
public void testPUSH14() {
VM vm = new VM();
program = new Program(Hex.decode("6DA0B0C0D0E0F0A1B1C1D1E1F1A2B2"), invoke);
String expected = "000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH15 OP
public void testPUSH15() {
VM vm = new VM();
program = new Program(Hex.decode("6EA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2"), invoke);
String expected = "0000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH16 OP
public void testPUSH16() {
VM vm = new VM();
program = new Program(Hex.decode("6FA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2"), invoke);
String expected = "00000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH17 OP
public void testPUSH17() {
VM vm = new VM();
program = new Program(Hex.decode("70A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2"), invoke);
String expected = "000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH18 OP
public void testPUSH18() {
VM vm = new VM();
program = new Program(Hex.decode("71A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2"), invoke);
String expected = "0000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH19 OP
public void testPUSH19() {
VM vm = new VM();
program = new Program(Hex.decode("72A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3"), invoke);
String expected = "00000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH20 OP
public void testPUSH20() {
VM vm = new VM();
program = new Program(Hex.decode("73A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3"), invoke);
String expected = "000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH21 OP
public void testPUSH21() {
VM vm = new VM();
program = new Program(Hex.decode("74A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3"), invoke);
String expected = "0000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH22 OP
public void testPUSH22() {
VM vm = new VM();
program = new Program(Hex.decode("75A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3"), invoke);
String expected = "00000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH23 OP
public void testPUSH23() {
VM vm = new VM();
program = new Program(Hex.decode("76A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3"), invoke);
String expected = "000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH24 OP
public void testPUSH24() {
VM vm = new VM();
program = new Program(Hex.decode("77A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3"), invoke);
String expected = "0000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH25 OP
public void testPUSH25() {
VM vm = new VM();
program = new Program(Hex.decode("78A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4"), invoke);
String expected = "00000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH26 OP
public void testPUSH26() {
VM vm = new VM();
program = new Program(Hex.decode("79A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4"), invoke);
String expected = "000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH27 OP
public void testPUSH27() {
VM vm = new VM();
program = new Program(Hex.decode("7AA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4"), invoke);
String expected = "0000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH28 OP
public void testPUSH28() {
VM vm = new VM();
program = new Program(Hex.decode("7BA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4"), invoke);
String expected = "00000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH29 OP
public void testPUSH29() {
VM vm = new VM();
program = new Program(Hex.decode("7CA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4"), invoke);
String expected = "000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH30 OP
public void testPUSH30() {
VM vm = new VM();
program = new Program(Hex.decode("7DA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4"), invoke);
String expected = "0000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH31 OP
public void testPUSH31() {
VM vm = new VM();
program = new Program(Hex.decode("7EA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1"), invoke);
String expected = "00A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSH32 OP
public void testPUSH32() {
VM vm = new VM();
program = new Program(Hex.decode("7FA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1"), invoke);
String expected = "A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1";
program.fullTrace();
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSHN OP not enough data
public void testPUSHN_1() {
VM vm = new VM();
program = new Program(Hex.decode("61AA"), invoke);
String expected = "000000000000000000000000000000000000000000000000000000000000AA00";
program.fullTrace();
vm.step(program);
assertTrue(program.isStopped());
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PUSHN OP not enough data
public void testPUSHN_2() {
VM vm = new VM();
program = new Program(Hex.decode("7fAABB"), invoke);
String expected = "AABB000000000000000000000000000000000000000000000000000000000000";
program.fullTrace();
vm.step(program);
assertTrue(program.isStopped());
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // AND OP
public void testAND_1() {
VM vm = new VM();
program = new Program(Hex.decode("600A600A16"), invoke);
String expected = "000000000000000000000000000000000000000000000000000000000000000A";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // AND OP
public void testAND_2() {
VM vm = new VM();
program = new Program(Hex.decode("60C0600A16"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = RuntimeException.class) // AND OP mal data
public void testAND_3() {
VM vm = new VM();
program = new Program(Hex.decode("60C016"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // OR OP
public void testOR_1() {
VM vm = new VM();
program = new Program(Hex.decode("60F0600F17"), invoke);
String expected = "00000000000000000000000000000000000000000000000000000000000000FF";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // OR OP
public void testOR_2() {
VM vm = new VM();
program = new Program(Hex.decode("60C3603C17"), invoke);
String expected = "00000000000000000000000000000000000000000000000000000000000000FF";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = RuntimeException.class) // OR OP mal data
public void testOR_3() {
VM vm = new VM();
program = new Program(Hex.decode("60C017"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // XOR OP
public void testXOR_1() {
VM vm = new VM();
program = new Program(Hex.decode("60FF60FF18"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // XOR OP
public void testXOR_2() {
VM vm = new VM();
program = new Program(Hex.decode("600F60F018"), invoke);
String expected = "00000000000000000000000000000000000000000000000000000000000000FF";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = RuntimeException.class) // XOR OP mal data
public void testXOR_3() {
VM vm = new VM();
program = new Program(Hex.decode("60C018"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // BYTE OP
public void testBYTE_1() {
VM vm = new VM();
program = new Program(Hex.decode("65AABBCCDDEEFF601E1A"), invoke);
String expected = "00000000000000000000000000000000000000000000000000000000000000EE";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // BYTE OP
public void testBYTE_2() {
VM vm = new VM();
program = new Program(Hex.decode("65AABBCCDDEEFF60201A"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // BYTE OP
public void testBYTE_3() {
VM vm = new VM();
program = new Program(Hex.decode("65AABBCCDDEE3A601F1A"), invoke);
String expected = "000000000000000000000000000000000000000000000000000000000000003A";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // BYTE OP mal data
public void testBYTE_4() {
VM vm = new VM();
program = new Program(Hex.decode("65AABBCCDDEE3A1A"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // ISZERO OP
public void testISZERO_1() {
VM vm = new VM();
program = new Program(Hex.decode("600015"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // ISZERO OP
public void testISZERO_2() {
VM vm = new VM();
program = new Program(Hex.decode("602A15"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // ISZERO OP mal data
public void testISZERO_3() {
VM vm = new VM();
program = new Program(Hex.decode("15"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // EQ OP
public void testEQ_1() {
VM vm = new VM();
program = new Program(Hex.decode("602A602A14"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // EQ OP
public void testEQ_2() {
VM vm = new VM();
program = new Program(Hex.decode("622A3B4C622A3B4C14"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // EQ OP
public void testEQ_3() {
VM vm = new VM();
program = new Program(Hex.decode("622A3B5C622A3B4C14"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // EQ OP mal data
public void testEQ_4() {
VM vm = new VM();
program = new Program(Hex.decode("622A3B4C14"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // GT OP
public void testGT_1() {
VM vm = new VM();
program = new Program(Hex.decode("6001600211"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // GT OP
public void testGT_2() {
VM vm = new VM();
program = new Program(Hex.decode("6001610F0011"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // GT OP
public void testGT_3() {
VM vm = new VM();
program = new Program(Hex.decode("6301020304610F0011"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // GT OP mal data
public void testGT_4() {
VM vm = new VM();
program = new Program(Hex.decode("622A3B4C11"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // SGT OP
public void testSGT_1() {
VM vm = new VM();
program = new Program(Hex.decode("6001600213"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // SGT OP
public void testSGT_2() {
VM vm = new VM();
program = new Program(Hex.decode("7F000000000000000000000000000000000000000000000000000000000000001E" + // 30
"7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170
"13"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // SGT OP
public void testSGT_3() {
VM vm = new VM();
program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170
"7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57" + // -169
"13"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // SGT OP mal
public void testSGT_4() {
VM vm = new VM();
program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170
"13"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // LT OP
public void testLT_1() {
VM vm = new VM();
program = new Program(Hex.decode("6001600210"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // LT OP
public void testLT_2() {
VM vm = new VM();
program = new Program(Hex.decode("6001610F0010"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // LT OP
public void testLT_3() {
VM vm = new VM();
program = new Program(Hex.decode("6301020304610F0010"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // LT OP mal data
public void testLT_4() {
VM vm = new VM();
program = new Program(Hex.decode("622A3B4C10"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // SLT OP
public void testSLT_1() {
VM vm = new VM();
program = new Program(Hex.decode("6001600212"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // SLT OP
public void testSLT_2() {
VM vm = new VM();
program = new Program(Hex.decode("7F000000000000000000000000000000000000000000000000000000000000001E" + // 30
"7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170
"12"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // SLT OP
public void testSLT_3() {
VM vm = new VM();
program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170
"7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57" + // -169
"12"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // SLT OP mal
public void testSLT_4() {
VM vm = new VM();
program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170
"12"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // NOT OP
public void testNOT_1() {
VM vm = new VM();
program = new Program(Hex.decode("600119"), invoke);
String expected = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE";
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // NOT OP
public void testNOT_2() {
VM vm = new VM();
program = new Program(Hex.decode("61A00319"), invoke);
String expected = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FFC";
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // BNOT OP
public void testBNOT_4() {
VM vm = new VM();
program = new Program(Hex.decode("1a"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // NOT OP test from real failure
public void testNOT_5() {
VM vm = new VM();
program = new Program(Hex.decode("600019"), invoke);
String expected = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // POP OP
public void testPOP_1() {
VM vm = new VM();
program = new Program(Hex.decode("61000060016200000250"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // POP OP
public void testPOP_2() {
VM vm = new VM();
program = new Program(Hex.decode("6100006001620000025050"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // POP OP mal data
public void testPOP_3() {
VM vm = new VM();
program = new Program(Hex.decode("61000060016200000250505050"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // DUP1...DUP16 OP
public void testDUPS() {
for (int i = 1; i < 17; i++) {
testDUPN_1(i);
}
}
/**
* Generic test function for DUP1-16
*
* @param n in DUPn
*/
private void testDUPN_1(int n) {
VM vm = new VM();
byte operation = (byte) (OpCode.DUP1.val() + n - 1);
String programCode = "";
for (int i = 0; i < n; i++) {
programCode += "60" + (12 + i);
}
program = new Program(ByteUtil.appendByte(Hex.decode(programCode.getBytes()), operation), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000000012";
int expectedLen = n + 1;
for (int i = 0; i < expectedLen; i++) {
vm.step(program);
}
assertEquals(expectedLen, program.getStack().toArray().length);
assertEquals(expected, Hex.toHexString(program.stackPop().getData()).toUpperCase());
for (int i = 0; i < expectedLen - 2; i++) {
assertNotEquals(expected, Hex.toHexString(program.stackPop().getData()).toUpperCase());
}
assertEquals(expected, Hex.toHexString(program.stackPop().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // DUPN OP mal data
public void testDUPN_2() {
VM vm = new VM();
program = new Program(Hex.decode("80"), invoke);
try {
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // SWAP1...SWAP16 OP
public void testSWAPS() {
for (int i = 1; i < 17; ++i) {
testSWAPN_1(i);
}
}
/**
* Generic test function for SWAP1-16
*
* @param n in SWAPn
*/
private void testSWAPN_1(int n) {
VM vm = new VM();
byte operation = (byte) (OpCode.SWAP1.val() + n - 1);
String programCode = "";
String top = new DataWord(0x10 + n).toString();
for (int i = n; i > -1; --i) {
programCode += "60" + oneByteToHexString((byte) (0x10 + i));
}
programCode += Hex.toHexString(new byte[]{ (byte)(OpCode.SWAP1.val() + n - 1) });
program = new Program(ByteUtil.appendByte(Hex.decode(programCode), operation), invoke);
for (int i = 0; i < n + 2; ++i) {
vm.step(program);
}
assertEquals(n + 1, program.getStack().toArray().length);
assertEquals(top, Hex.toHexString(program.stackPop().getData()));
}
@Test(expected = StackTooSmallException.class) // SWAPN OP mal data
public void testSWAPN_2() {
VM vm = new VM();
program = new Program(Hex.decode("90"), invoke);
try {
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // MSTORE OP
public void testMSTORE_1() {
VM vm = new VM();
program = new Program(Hex.decode("611234600052"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000001234";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getMemory()));
}
@Test // LOG0 OP
public void tesLog0() {
VM vm = new VM();
program = new Program(Hex.decode("61123460005260206000A0"), invoke);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
List<LogInfo> logInfoList = program.getResult().getLogInfoList();
LogInfo logInfo = logInfoList.get(0);
assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress()));
assertEquals(0, logInfo.getTopics().size());
assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo
.getData()));
}
@Test // LOG1 OP
public void tesLog1() {
VM vm = new VM();
program = new Program(Hex.decode("61123460005261999960206000A1"), invoke);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
List<LogInfo> logInfoList = program.getResult().getLogInfoList();
LogInfo logInfo = logInfoList.get(0);
assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress()));
assertEquals(1, logInfo.getTopics().size());
assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo
.getData()));
}
@Test // LOG2 OP
public void tesLog2() {
VM vm = new VM();
program = new Program(Hex.decode("61123460005261999961666660206000A2"), invoke);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
List<LogInfo> logInfoList = program.getResult().getLogInfoList();
LogInfo logInfo = logInfoList.get(0);
assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress()));
assertEquals(2, logInfo.getTopics().size());
assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo
.getData()));
}
@Test // LOG3 OP
public void tesLog3() {
VM vm = new VM();
program = new Program(Hex.decode("61123460005261999961666661333360206000A3"), invoke);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
List<LogInfo> logInfoList = program.getResult().getLogInfoList();
LogInfo logInfo = logInfoList.get(0);
assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress()));
assertEquals(3, logInfo.getTopics().size());
assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo
.getData()));
}
@Test // LOG4 OP
public void tesLog4() {
VM vm = new VM();
program = new Program(Hex.decode("61123460005261999961666661333361555560206000A4"), invoke);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
List<LogInfo> logInfoList = program.getResult().getLogInfoList();
LogInfo logInfo = logInfoList.get(0);
assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress()));
assertEquals(4, logInfo.getTopics().size());
assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo
.getData()));
}
@Test // MSTORE OP
public void testMSTORE_2() {
VM vm = new VM();
program = new Program(Hex.decode("611234600052615566602052"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000001234" +
"0000000000000000000000000000000000000000000000000000000000005566";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getMemory()));
}
@Test // MSTORE OP
public void testMSTORE_3() {
VM vm = new VM();
program = new Program(Hex.decode("611234600052615566602052618888600052"), invoke);
String expected = "0000000000000000000000000000000000000000000000000000000000008888" +
"0000000000000000000000000000000000000000000000000000000000005566";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getMemory()));
}
@Test // MSTORE OP
public void testMSTORE_4() {
VM vm = new VM();
program = new Program(Hex.decode("61123460A052"), invoke);
String expected = "" +
"0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000001234";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(expected, Hex.toHexString(program.getMemory()));
}
@Test(expected = StackTooSmallException.class) // MSTORE OP
public void testMSTORE_5() {
VM vm = new VM();
program = new Program(Hex.decode("61123452"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // MLOAD OP
public void testMLOAD_1() {
VM vm = new VM();
program = new Program(Hex.decode("600051"), invoke);
String m_expected = "0000000000000000000000000000000000000000000000000000000000000000";
String s_expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
assertEquals(m_expected, Hex.toHexString(program.getMemory()));
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // MLOAD OP
public void testMLOAD_2() {
VM vm = new VM();
program = new Program(Hex.decode("602251"), invoke);
String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000";
String s_expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
assertEquals(m_expected, Hex.toHexString(program.getMemory()).toUpperCase());
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // MLOAD OP
public void testMLOAD_3() {
VM vm = new VM();
program = new Program(Hex.decode("602051"), invoke);
String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000000000";
String s_expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
assertEquals(m_expected, Hex.toHexString(program.getMemory()));
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // MLOAD OP
public void testMLOAD_4() {
VM vm = new VM();
program = new Program(Hex.decode("611234602052602051"), invoke);
String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000001234";
String s_expected = "0000000000000000000000000000000000000000000000000000000000001234";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(m_expected, Hex.toHexString(program.getMemory()));
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // MLOAD OP
public void testMLOAD_5() {
VM vm = new VM();
program = new Program(Hex.decode("611234602052601F51"), invoke);
String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" +
"0000000000000000000000000000000000000000000000000000000000001234";
String s_expected = "0000000000000000000000000000000000000000000000000000000000000012";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(m_expected, Hex.toHexString(program.getMemory()));
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // MLOAD OP mal data
public void testMLOAD_6() {
VM vm = new VM();
program = new Program(Hex.decode("51"), invoke);
try {
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // MSTORE8 OP
public void testMSTORE8_1() {
VM vm = new VM();
program = new Program(Hex.decode("6011600053"), invoke);
String m_expected = "1100000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(m_expected, Hex.toHexString(program.getMemory()));
}
@Test // MSTORE8 OP
public void testMSTORE8_2() {
VM vm = new VM();
program = new Program(Hex.decode("6022600153"), invoke);
String m_expected = "0022000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(m_expected, Hex.toHexString(program.getMemory()));
}
@Test // MSTORE8 OP
public void testMSTORE8_3() {
VM vm = new VM();
program = new Program(Hex.decode("6022602153"), invoke);
String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" +
"0022000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(m_expected, Hex.toHexString(program.getMemory()));
}
@Test(expected = StackTooSmallException.class) // MSTORE8 OP mal
public void testMSTORE8_4() {
VM vm = new VM();
program = new Program(Hex.decode("602253"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // SSTORE OP
public void testSSTORE_1() {
VM vm = new VM();
program = new Program(Hex.decode("602260AA55"), invoke);
String s_expected_key = "00000000000000000000000000000000000000000000000000000000000000AA";
String s_expected_val = "0000000000000000000000000000000000000000000000000000000000000022";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord key = new DataWord(Hex.decode(s_expected_key));
DataWord val = program.getStorage().getStorageValue(invoke.getOwnerAddress()
.getNoLeadZeroesData(), key);
assertEquals(s_expected_val, Hex.toHexString(val.getData()).toUpperCase());
}
@Test // SSTORE OP
public void testSSTORE_2() {
VM vm = new VM();
program = new Program(Hex.decode("602260AA55602260BB55"), invoke);
String s_expected_key = "00000000000000000000000000000000000000000000000000000000000000BB";
String s_expected_val = "0000000000000000000000000000000000000000000000000000000000000022";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
Repository repository = program.getStorage();
DataWord key = new DataWord(Hex.decode(s_expected_key));
DataWord val = repository.getStorageValue(invoke.getOwnerAddress().getNoLeadZeroesData(), key);
assertEquals(s_expected_val, Hex.toHexString(val.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // SSTORE OP
public void testSSTORE_3() {
VM vm = new VM();
program = new Program(Hex.decode("602255"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // SLOAD OP
public void testSLOAD_1() {
VM vm = new VM();
program = new Program(Hex.decode("60AA54"), invoke);
String s_expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // SLOAD OP
public void testSLOAD_2() {
VM vm = new VM();
program = new Program(Hex.decode("602260AA5560AA54"), invoke);
String s_expected = "0000000000000000000000000000000000000000000000000000000000000022";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // SLOAD OP
public void testSLOAD_3() {
VM vm = new VM();
program = new Program(Hex.decode("602260AA55603360CC5560CC54"), invoke);
String s_expected = "0000000000000000000000000000000000000000000000000000000000000033";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // SLOAD OP
public void testSLOAD_4() {
VM vm = new VM();
program = new Program(Hex.decode("56"), invoke);
try {
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // PC OP
public void testPC_1() {
VM vm = new VM();
program = new Program(Hex.decode("58"), invoke);
String s_expected = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // PC OP
public void testPC_2() {
VM vm = new VM();
program = new Program(Hex.decode("602260AA5260AA5458"), invoke);
String s_expected = "0000000000000000000000000000000000000000000000000000000000000008";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = BadJumpDestinationException.class) // JUMP OP mal data
public void testJUMP_1() {
VM vm = new VM();
program = new Program(Hex.decode("60AA60BB600E5660CC60DD60EE5B60FF"), invoke);
String s_expected = "00000000000000000000000000000000000000000000000000000000000000FF";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test(expected = BadJumpDestinationException.class) // JUMP OP mal data
public void testJUMP_2() {
VM vm = new VM();
program = new Program(Hex.decode("600C600C905660CC60DD60EE60FF"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // JUMPI OP
public void testJUMPI_1() {
VM vm = new VM();
program = new Program(Hex.decode("60016005575B60CC"), invoke);
String s_expected = "00000000000000000000000000000000000000000000000000000000000000CC";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase());
}
@Test // JUMPI OP
public void testJUMPI_2() {
VM vm = new VM();
program = new Program(Hex.decode("630000000060445760CC60DD"), invoke);
String s_expected_1 = "00000000000000000000000000000000000000000000000000000000000000DD";
String s_expected_2 = "00000000000000000000000000000000000000000000000000000000000000CC";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
DataWord item2 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
assertEquals(s_expected_2, Hex.toHexString(item2.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // JUMPI OP mal
public void testJUMPI_3() {
VM vm = new VM();
program = new Program(Hex.decode("600157"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test(expected = BadJumpDestinationException.class) // JUMPI OP mal
public void testJUMPI_4() {
VM vm = new VM();
program = new Program(Hex.decode("60016022909057"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test(expected = BadJumpDestinationException.class) // JUMP OP mal data
public void testJUMPDEST_1() {
VM vm = new VM();
program = new Program(Hex.decode("602360085660015b600255"), invoke);
String s_expected_key = "0000000000000000000000000000000000000000000000000000000000000002";
String s_expected_val = "0000000000000000000000000000000000000000000000000000000000000023";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord key = new DataWord(Hex.decode(s_expected_key));
DataWord val = program.getStorage().getStorageValue(invoke.getOwnerAddress()
.getNoLeadZeroesData(), key);
assertTrue(program.isStopped());
assertEquals(s_expected_val, Hex.toHexString(val.getData()).toUpperCase());
}
@Test // JUMPDEST OP for JUMPI
public void testJUMPDEST_2() {
VM vm = new VM();
program = new Program(Hex.decode("6023600160095760015b600255"), invoke);
String s_expected_key = "0000000000000000000000000000000000000000000000000000000000000002";
String s_expected_val = "0000000000000000000000000000000000000000000000000000000000000023";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord key = new DataWord(Hex.decode(s_expected_key));
DataWord val = program.getStorage().getStorageValue(invoke.getOwnerAddress()
.getNoLeadZeroesData(), key);
assertTrue(program.isStopped());
assertEquals(s_expected_val, Hex.toHexString(val.getData()).toUpperCase());
}
@Test // ADD OP mal
public void testADD_1() {
VM vm = new VM();
program = new Program(Hex.decode("6002600201"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000004";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // ADD OP
public void testADD_2() {
VM vm = new VM();
program = new Program(Hex.decode("611002600201"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000001004";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // ADD OP
public void testADD_3() {
VM vm = new VM();
program = new Program(Hex.decode("6110026512345678900901"), invoke);
String s_expected_1 = "000000000000000000000000000000000000000000000000000012345678A00B";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // ADD OP mal
public void testADD_4() {
VM vm = new VM();
program = new Program(Hex.decode("61123401"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // ADDMOD OP mal
public void testADDMOD_1() {
VM vm = new VM();
program = new Program(Hex.decode("60026002600308"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertTrue(program.isStopped());
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // ADDMOD OP
public void testADDMOD_2() {
VM vm = new VM();
program = new Program(Hex.decode("6110006002611002086000"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000004";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertFalse(program.isStopped());
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // ADDMOD OP
public void testADDMOD_3() {
VM vm = new VM();
program = new Program(Hex.decode("61100265123456789009600208"), invoke);
String s_expected_1 = "000000000000000000000000000000000000000000000000000000000000093B";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertTrue(program.isStopped());
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // ADDMOD OP mal
public void testADDMOD_4() {
VM vm = new VM();
program = new Program(Hex.decode("61123408"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // MUL OP
public void testMUL_1() {
VM vm = new VM();
program = new Program(Hex.decode("6003600202"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000006";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // MUL OP
public void testMUL_2() {
VM vm = new VM();
program = new Program(Hex.decode("62222222600302"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000666666";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // MUL OP
public void testMUL_3() {
VM vm = new VM();
program = new Program(Hex.decode("622222226233333302"), invoke);
String s_expected_1 = "000000000000000000000000000000000000000000000000000006D3A05F92C6";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // MUL OP mal
public void testMUL_4() {
VM vm = new VM();
program = new Program(Hex.decode("600102"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // MULMOD OP
public void testMULMOD_1() {
VM vm = new VM();
program = new Program(Hex.decode("60036002600409"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000002";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // MULMOD OP
public void testMULMOD_2() {
VM vm = new VM();
program = new Program(Hex.decode("622222226003600409"), invoke);
String s_expected_1 = "000000000000000000000000000000000000000000000000000000000000000C";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // MULMOD OP
public void testMULMOD_3() {
VM vm = new VM();
program = new Program(Hex.decode("62222222623333336244444409"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // MULMOD OP mal
public void testMULMOD_4() {
VM vm = new VM();
program = new Program(Hex.decode("600109"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // DIV OP
public void testDIV_1() {
VM vm = new VM();
program = new Program(Hex.decode("6002600404"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000002";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // DIV OP
public void testDIV_2() {
VM vm = new VM();
program = new Program(Hex.decode("6033609904"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000003";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // DIV OP
public void testDIV_3() {
VM vm = new VM();
program = new Program(Hex.decode("6022609904"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000004";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // DIV OP
public void testDIV_4() {
VM vm = new VM();
program = new Program(Hex.decode("6015609904"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000007";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // DIV OP
public void testDIV_5() {
VM vm = new VM();
program = new Program(Hex.decode("6004600704"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // DIV OP
public void testDIV_6() {
VM vm = new VM();
program = new Program(Hex.decode("600704"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // SDIV OP
public void testSDIV_1() {
VM vm = new VM();
program = new Program(Hex.decode("6103E87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1805" +
""), invoke);
String s_expected_1 = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // SDIV OP
public void testSDIV_2() {
VM vm = new VM();
program = new Program(Hex.decode("60FF60FF05"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // SDIV OP
public void testSDIV_3() {
VM vm = new VM();
program = new Program(Hex.decode("600060FF05"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // SDIV OP mal
public void testSDIV_4() {
VM vm = new VM();
program = new Program(Hex.decode("60FF05"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // SUB OP
public void testSUB_1() {
VM vm = new VM();
program = new Program(Hex.decode("6004600603"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000002";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // SUB OP
public void testSUB_2() {
VM vm = new VM();
program = new Program(Hex.decode("61444461666603"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000002222";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // SUB OP
public void testSUB_3() {
VM vm = new VM();
program = new Program(Hex.decode("614444639999666603"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000099992222";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // SUB OP mal
public void testSUB_4() {
VM vm = new VM();
program = new Program(Hex.decode("639999666603"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // MSIZE OP
public void testMSIZE_1() {
VM vm = new VM();
program = new Program(Hex.decode("59"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // MSIZE OP
public void testMSIZE_2() {
VM vm = new VM();
program = new Program(Hex.decode("602060305259"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000060";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // STOP OP
public void testSTOP_1() {
VM vm = new VM();
program = new Program(Hex.decode("60206030601060306011602300"), invoke);
int expectedSteps = 7;
int i = 0;
while (!program.isStopped()) {
vm.step(program);
++i;
}
assertEquals(expectedSteps, i);
}
@Ignore //TODO #POC9
@Test // EXP OP
public void testEXP_1() {
VM vm = new VM();
program = new Program(Hex.decode("600360020a"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000008";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
long gas = program.getResult().getGasUsed();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
assertEquals(4, gas);
}
@Ignore //TODO #POC9
@Test // EXP OP
public void testEXP_2() {
VM vm = new VM();
program = new Program(Hex.decode("6000621234560a"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
long gas = program.getResult().getGasUsed();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
assertEquals(3, gas);
}
@Ignore //TODO #POC9
@Test // EXP OP
public void testEXP_3() {
VM vm = new VM();
program = new Program(Hex.decode("61112260010a"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
long gas = program.getResult().getGasUsed();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
assertEquals(5, gas);
}
@Test(expected = StackTooSmallException.class) // EXP OP mal
public void testEXP_4() {
VM vm = new VM();
program = new Program(Hex.decode("621234560a"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // RETURN OP
public void testRETURN_1() {
VM vm = new VM();
program = new Program(Hex.decode("61123460005260206000F3"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000001234";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(s_expected_1, Hex.toHexString(program.getResult().getHReturn()).toUpperCase());
assertTrue(program.isStopped());
}
@Test // RETURN OP
public void testRETURN_2() {
VM vm = new VM();
program = new Program(Hex.decode("6112346000526020601FF3"), invoke);
String s_expected_1 = "3400000000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(s_expected_1, Hex.toHexString(program.getResult().getHReturn()).toUpperCase());
assertTrue(program.isStopped());
}
@Test // RETURN OP
public void testRETURN_3() {
VM vm = new VM();
program =
new Program(Hex.decode
("7FA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B160005260206000F3"),
invoke);
String s_expected_1 = "A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(s_expected_1, Hex.toHexString(program.getResult().getHReturn()).toUpperCase());
assertTrue(program.isStopped());
}
@Test // RETURN OP
public void testRETURN_4() {
VM vm = new VM();
program =
new Program(Hex.decode
("7FA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B160005260206010F3"),
invoke);
String s_expected_1 = "E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B100000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(s_expected_1, Hex.toHexString(program.getResult().getHReturn()).toUpperCase());
assertTrue(program.isStopped());
}
@Ignore //TODO #POC9
@Test // CODECOPY OP
public void testCODECOPY_1() {
VM vm = new VM();
program =
new Program(Hex.decode("60036007600039123456"), invoke);
String m_expected_1 = "1234560000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
long gas = program.getResult().getGasUsed();
assertEquals(m_expected_1, Hex.toHexString(program.getMemory()).toUpperCase());
assertEquals(6, gas);
}
@Ignore //TODO #POC9
@Test // CODECOPY OP
public void testCODECOPY_2() {
VM vm = new VM();
program =
new Program(Hex.decode
("605E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235602054"),
invoke);
String m_expected_1 =
"6000605F556014600054601E60205463ABCDDCBA6040545B51602001600A5254516040016014525451606001601E5254516080016028525460A052546016604860003960166000F26000603F556103E756600054600053602002356020540000";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
long gas = program.getResult().getGasUsed();
assertEquals(m_expected_1, Hex.toHexString(program.getMemory()).toUpperCase());
assertEquals(10, gas);
}
@Ignore //TODO #POC9
@Test // CODECOPY OP
public void testCODECOPY_3() {
// cost for that:
// 94 - data copied
// 95 - new bytes allocated
VM vm = new VM();
program =
new Program(Hex.decode
("605E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235"),
invoke);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(10, program.getResult().getGasUsed());
}
@Ignore //TODO #POC9
@Test // CODECOPY OP
public void testCODECOPY_4() {
VM vm = new VM();
program =
new Program(Hex.decode
("605E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e756600054600053602002351234"),
invoke);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(10, program.getResult().getGasUsed());
}
@Test // CODECOPY OP
public void testCODECOPY_5() {
VM vm = new VM();
program =
new Program(Hex.decode
("611234600054615566602054607060006020396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e756600054600053602002351234"),
invoke);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertFalse(program.isStopped());
}
@Test(expected = StackTooSmallException.class) // CODECOPY OP mal
public void testCODECOPY_6() {
VM vm = new VM();
program =
new Program(Hex.decode
("605E6007396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e756600054600053602002351234"),
invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // EXTCODECOPY OP
public void testEXTCODECOPY_1() {
VM vm = new VM();
program =
new Program(Hex.decode("60036007600073471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C123456"), invoke);
String m_expected_1 = "6000600000000000000000000000000000000000000000000000000000000000";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(m_expected_1, Hex.toHexString(program.getMemory()).toUpperCase());
}
@Test // EXTCODECOPY OP
public void testEXTCODECOPY_2() {
VM vm = new VM();
program =
new Program(Hex.decode
("603E6007600073471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C6000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235602054"),
invoke);
String m_expected_1 =
"6000605F556014600054601E60205463ABCDDCBA6040545B51602001600A5254516040016014525451606001601E5254516080016028525460A0525460160000";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(m_expected_1, Hex.toHexString(program.getMemory()).toUpperCase());
}
@Test // EXTCODECOPY OP
public void testEXTCODECOPY_3() {
VM vm = new VM();
program =
new Program(Hex.decode
("605E6007600073471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C6000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235"),
invoke);
String m_expected_1 =
"6000605F556014600054601E60205463ABCDDCBA6040545B51602001600A5254516040016014525451606001601E5254516080016028525460A052546016604860003960166000F26000603F556103E756600054600053602002350000000000";
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertEquals(m_expected_1, Hex.toHexString(program.getMemory()).toUpperCase());
}
@Test // EXTCODECOPY OP
public void testEXTCODECOPY_4() {
VM vm = new VM();
program =
new Program(Hex.decode
("611234600054615566602054603E6000602073471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C6000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e756600054600053602002351234"),
invoke);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
assertFalse(program.isStopped());
}
@Test(expected = StackTooSmallException.class) // EXTCODECOPY OP mal
public void testEXTCODECOPY_5() {
VM vm = new VM();
program =
new Program(Hex.decode("605E600773471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C"),
invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // CODESIZE OP
public void testCODESIZE_1() {
VM vm = new VM();
program =
new Program(Hex.decode
("385E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235"),
invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000062";
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Ignore // todo: test is not testing EXTCODESIZE
@Test // EXTCODESIZE OP
public void testEXTCODESIZE_1() {
VM vm = new VM();
program =
new Program(Hex.decode
("73471FD3AD3E9EEADEEC4608B92D16CE6B500704CC395E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235"),
invoke); // Push address on the stack and perform EXTCODECOPY
String s_expected_1 = "000000000000000000000000471FD3AD3E9EEADEEC4608B92D16CE6B500704CC";
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // MOD OP
public void testMOD_1() {
VM vm = new VM();
program = new Program(Hex.decode("6003600406"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // MOD OP
public void testMOD_2() {
VM vm = new VM();
program = new Program(Hex.decode("61012C6101F406"), invoke);
String s_expected_1 = "00000000000000000000000000000000000000000000000000000000000000C8";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // MOD OP
public void testMOD_3() {
VM vm = new VM();
program = new Program(Hex.decode("6004600206"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000002";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // MOD OP mal
public void testMOD_4() {
VM vm = new VM();
program = new Program(Hex.decode("600406"), invoke);
try {
vm.step(program);
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test // SMOD OP
public void testSMOD_1() {
VM vm = new VM();
program = new Program(Hex.decode("6003600407"), invoke);
String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // SMOD OP
public void testSMOD_2() {
VM vm = new VM();
program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2" + // -30
"7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170
"07"), invoke);
String s_expected_1 = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test // SMOD OP
public void testSMOD_3() {
VM vm = new VM();
program = new Program(Hex.decode("7F000000000000000000000000000000000000000000000000000000000000001E" + // 30
"7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170
"07"), invoke);
String s_expected_1 = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC";
vm.step(program);
vm.step(program);
vm.step(program);
DataWord item1 = program.stackPop();
assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase());
}
@Test(expected = StackTooSmallException.class) // SMOD OP mal
public void testSMOD_4() {
VM vm = new VM();
program = new Program(Hex.decode("7F000000000000000000000000000000000000000000000000000000000000001E" + // 30
"07"), invoke);
try {
vm.step(program);
vm.step(program);
} finally {
assertTrue(program.isStopped());
}
}
@Test
public void regression1Test() {
// testing that we are working fine with unknown 0xFE bytecode produced by Serpent compiler
String code2 = "60006116bf537c01000000000000000000000000000000000000000000000000000000006000350463b041b2858114156101c257600435604052780100000000000000000000000000000000000000000000000060606060599059016000905260028152604051816020015260008160400152809050205404606052606051151561008f57600060a052602060a0f35b66040000000000015460c052600760e0525b60605178010000000000000000000000000000000000000000000000006060606059905901600090526002815260c05181602001526000816040015280905020540413156101b0575b60e05160050a60605178010000000000000000000000000000000000000000000000006060606059905901600090526002815260c05181602001526000816040015280905020540403121561014457600060e05113610147565b60005b1561015a57600160e0510360e0526100ea565b7c010000000000000000000000000000000000000000000000000000000060e05160200260020a6060606059905901600090526002815260c051816020015260018160400152809050205402045460c0526100a1565b60405160c05114610160526020610160f35b63720f60f58114156102435760043561018052601c60445990590160009052016305215b2f601c820352790100000000000000000000000000000000000000000000000000600482015260206101c0602483600061018051602d5a03f1506101c05190506604000000000003556604000000000003546101e05260206101e0f35b63b8c48f8c8114156104325760043560c05260243561020052604435610220526000660400000000000254141515610286576000610240526020610240f3610292565b60016604000000000002555b60c0516604000000000001556060606059905901600090526002815260c051816020015260008160400152809050205461026052610260610200518060181a82538060191a600183015380601a1a600283015380601b1a600383015380601c1a600483015380601d1a600583015380601e1a600683015380601f1a60078301535050610260516060606059905901600090526002815260c05181602001526000816040015280905020556060606059905901600090526002815260c051816020015260008160400152809050205461030052601061030001610220518060101a82538060111a60018301538060121a60028301538060131a60038301538060141a60048301538060151a60058301538060161a60068301538060171a60078301538060181a60088301538060191a600983015380601a1a600a83015380601b1a600b83015380601c1a600c83015380601d1a600d83015380601e1a600e83015380601f1a600f8301535050610300516060606059905901600090526002815260c051816020015260008160400152809050205560016103a05260206103a0f35b632b861629811415610eed57365990590160009052366004823760043560208201016103e0525060483580601f1a6104405380601e1a6001610440015380601d1a6002610440015380601c1a6003610440015380601b1a6004610440015380601a1a600561044001538060191a600661044001538060181a600761044001538060171a600861044001538060161a600961044001538060151a600a61044001538060141a600b61044001538060131a600c61044001538060121a600d61044001538060111a600e61044001538060101a600f610440015380600f1a6010610440015380600e1a6011610440015380600d1a6012610440015380600c1a6013610440015380600b1a6014610440015380600a1a601561044001538060091a601661044001538060081a601761044001538060071a601861044001538060061a601961044001538060051a601a61044001538060041a601b61044001538060031a601c61044001538060021a601d61044001538060011a601e61044001538060001a601f6104400153506104405161040052700100000000000000000000000000000000700100000000000000000000000000000000606060605990590160009052600281526104005181602001526000816040015280905020540204610460526104605161061b57005b6103e05160208103516020599059016000905260208183856000600287604801f15080519050905090506104a0526020599059016000905260208160206104a0600060026068f1508051905080601f1a6105605380601e1a6001610560015380601d1a6002610560015380601c1a6003610560015380601b1a6004610560015380601a1a600561056001538060191a600661056001538060181a600761056001538060171a600861056001538060161a600961056001538060151a600a61056001538060141a600b61056001538060131a600c61056001538060121a600d61056001538060111a600e61056001538060101a600f610560015380600f1a6010610560015380600e1a6011610560015380600d1a6012610560015380600c1a6013610560015380600b1a6014610560015380600a1a601561056001538060091a601661056001538060081a601761056001538060071a601861056001538060061a601961056001538060051a601a61056001538060041a601b61056001538060031a601c61056001538060021a601d61056001538060011a601e61056001538060001a601f6105600153506105605160c0527001000000000000000000000000000000007001000000000000000000000000000000006060606059905901600090526002815260c05181602001526000816040015280905020540204610580526000610580511415156108345760006105c05260206105c0f35b608c3563010000008160031a02620100008260021a026101008360011a028360001a01010190506105e05263010000006105e051046106405262ffffff6105e0511661066052600361064051036101000a610660510261062052600060c05113156108a6576106205160c051126108a9565b60005b15610ee05760c05160c05160c051660400000000000054556060606059905901600090526002815260c0518160200152600081604001528090502054610680526008610680016604000000000000548060181a82538060191a600183015380601a1a600283015380601b1a600383015380601c1a600483015380601d1a600583015380601e1a600683015380601f1a60078301535050610680516060606059905901600090526002815260c05181602001526000816040015280905020556001660400000000000054016604000000000000556060606059905901600090526002815260c051816020015260008160400152809050205461072052610720600178010000000000000000000000000000000000000000000000006060606059905901600090526002815261040051816020015260008160400152809050205404018060181a82538060191a600183015380601a1a600283015380601b1a600383015380601c1a600483015380601d1a600583015380601e1a600683015380601f1a60078301535050610720516060606059905901600090526002815260c051816020015260008160400152809050205560006107e052780100000000000000000000000000000000000000000000000068010000000000000000606060605990590160009052600281526104005181602001526000816040015280905020540204610800526107e06108005180601c1a825380601d1a600183015380601e1a600283015380601f1a600383015350506001610880525b6008610880511215610c07576108805160050a6108a05260016108a05178010000000000000000000000000000000000000000000000006060606059905901600090526002815260c051816020015260008160400152809050205404071415610b7957610880516004026107e0016108005180601c1a825380601d1a600183015380601e1a600283015380601f1a60038301535050610bf7565b610880516004026107e0017c01000000000000000000000000000000000000000000000000000000006108805160200260020a60606060599059016000905260028152610400518160200152600181604001528090502054020480601c1a825380601d1a600183015380601e1a600283015380601f1a600383015350505b6001610880510161088052610adf565b6107e0516060606059905901600090526002815260c051816020015260018160400152809050205550506080608059905901600090526002815260c051816020015260028160400152600081606001528090502060005b6002811215610c8057806020026103e051015182820155600181019050610c5e565b700100000000000000000000000000000000600003816020026103e051015116828201555050610620517bffff000000000000000000000000000000000000000000000000000005610a00526060606059905901600090526002815260c0518160200152600081604001528090502054610a20526010610a2001610a005161046051018060101a82538060111a60018301538060121a60028301538060131a60038301538060141a60048301538060151a60058301538060161a60068301538060171a60078301538060181a60088301538060191a600983015380601a1a600a83015380601b1a600b83015380601c1a600c83015380601d1a600d83015380601e1a600e83015380601f1a600f8301535050610a20516060606059905901600090526002815260c05181602001526000816040015280905020557001000000000000000000000000000000007001000000000000000000000000000000006060606059905901600090526002815260c051816020015260008160400152809050205402046105805266040000000000025461058051121515610e965760c05166040000000000015561058051660400000000000255601c606459905901600090520163c86a90fe601c8203526103e860048201523260248201526020610ae06044836000660400000000000354602d5a03f150610ae051905015610e95576103e8660400000000000454016604000000000004555b5b78010000000000000000000000000000000000000000000000006060606059905901600090526002815260c051816020015260008160400152809050205404610b00526020610b00f35b6000610b40526020610b40f35b63c6605beb811415611294573659905901600090523660048237600435610b6052602435610b80526044356020820101610ba0526064356040525067016345785d8a00003412151515610f47576000610bc0526020610bc0f35b601c6044599059016000905201633d73b705601c82035260405160048201526020610be0602483600030602d5a03f150610be05190508015610f895780610fc1565b601c604459905901600090520163b041b285601c82035260405160048201526020610c20602483600030602d5a03f150610c20519050155b905015610fd5576000610c40526020610c40f35b6060601c61014c59905901600090520163b7129afb601c820352610b60516004820152610b80516024820152610ba05160208103516020026020018360448401526020820360a4840152806101088401528084019350505081600401599059016000905260648160648460006004601cf161104c57fe5b6064810192506101088201518080858260a487015160006004600a8705601201f161107357fe5b508084019350508083036020610d008284600030602d5a03f150610d00519050905090509050610c60526080608059905901600090526002815260405181602001526002816040015260008160600152809050207c010000000000000000000000000000000000000000000000000000000060028201540464010000000060018301540201610d805250610d805180601f1a610de05380601e1a6001610de0015380601d1a6002610de0015380601c1a6003610de0015380601b1a6004610de0015380601a1a6005610de001538060191a6006610de001538060181a6007610de001538060171a6008610de001538060161a6009610de001538060151a600a610de001538060141a600b610de001538060131a600c610de001538060121a600d610de001538060111a600e610de001538060101a600f610de0015380600f1a6010610de0015380600e1a6011610de0015380600d1a6012610de0015380600c1a6013610de0015380600b1a6014610de0015380600a1a6015610de001538060091a6016610de001538060081a6017610de001538060071a6018610de001538060061a6019610de001538060051a601a610de001538060041a601b610de001538060031a601c610de001538060021a601d610de001538060011a601e610de001538060001a601f610de0015350610de051610d4052610d4051610c60511415611286576001610e00526020610e00f3611293565b6000610e20526020610e20f35b5b638f6b104c8114156115195736599059016000905236600482376004356020820101610e4052602435610b6052604435610b80526064356020820101610ba05260843560405260a435610e60525060016080601c6101ac59905901600090520163c6605beb601c820352610b60516004820152610b80516024820152610ba05160208103516020026020018360448401526020820360c48401528061014884015280840193505050604051606482015281600401599059016000905260848160848460006004601ff161136357fe5b6084810192506101488201518080858260c487015160006004600a8705601201f161138a57fe5b508084019350508083036020610e80828434306123555a03f150610e8051905090509050905014156114b3576040601c60ec59905901600090520163f0cf1ff4601c820352610e40516020601f6020830351010460200260200183600484015260208203604484015280608884015280840193505050610b60516024820152816004015990590160009052604481604484600060046018f161142857fe5b604481019250608882015180808582604487015160006004600a8705601201f161144e57fe5b508084019350508083036020610ec082846000610e6051602d5a03f150610ec0519050905090509050610ea0526040599059016000905260018152610ea051602082015260208101905033602082035160200282a150610ea051610f20526020610f20f35b604059905901600090526001815261270f600003602082015260208101905033602082035160200282a150604059905901600090526001815261270f6000036020820152602081019050610e6051602082035160200282a1506000610f80526020610f80f35b6309dd0e8181141561153957660400000000000154610fa0526020610fa0f35b630239487281141561159557780100000000000000000000000000000000000000000000000060606060599059016000905260028152660400000000000154816020015260008160400152809050205404610fc0526020610fc0f35b6361b919a68114156116045770010000000000000000000000000000000070010000000000000000000000000000000060606060599059016000905260028152660400000000000154816020015260008160400152809050205402046110005261100051611040526020611040f35b63a7cc63c28114156118b55766040000000000015460c0527001000000000000000000000000000000007001000000000000000000000000000000006060606059905901600090526002815260c05181602001526000816040015280905020540204611060526000610880525b600a610880511215611853576080608059905901600090526002815260c05181602001526002816040015260008160600152809050207c0100000000000000000000000000000000000000000000000000000000600182015404640100000000825402016110c052506110c05180601f1a6111205380601e1a6001611120015380601d1a6002611120015380601c1a6003611120015380601b1a6004611120015380601a1a600561112001538060191a600661112001538060181a600761112001538060171a600861112001538060161a600961112001538060151a600a61112001538060141a600b61112001538060131a600c61112001538060121a600d61112001538060111a600e61112001538060101a600f611120015380600f1a6010611120015380600e1a6011611120015380600d1a6012611120015380600c1a6013611120015380600b1a6014611120015380600a1a601561112001538060091a601661112001538060081a601761112001538060071a601861112001538060061a601961112001538060051a601a61112001538060041a601b61112001538060031a601c61112001538060021a601d61112001538060011a601e61112001538060001a601f6111200153506111205160c0526001610880510161088052611671565b7001000000000000000000000000000000007001000000000000000000000000000000006060606059905901600090526002815260c0518160200152600081604001528090502054020461114052611140516110605103611180526020611180f35b63b7129afb811415611e35573659905901600090523660048237600435610b6052602435610b80526044356020820101610ba05250610b60516111a0526020610ba05103516111c0526000610880525b6111c051610880511215611e0c5761088051602002610ba05101516111e0526002610b805107611200526001611200511415611950576111e051611220526111a0516112405261196e565b600061120051141561196d576111a051611220526111e051611240525b5b604059905901600090526112205180601f1a6112805380601e1a6001611280015380601d1a6002611280015380601c1a6003611280015380601b1a6004611280015380601a1a600561128001538060191a600661128001538060181a600761128001538060171a600861128001538060161a600961128001538060151a600a61128001538060141a600b61128001538060131a600c61128001538060121a600d61128001538060111a600e61128001538060101a600f611280015380600f1a6010611280015380600e1a6011611280015380600d1a6012611280015380600c1a6013611280015380600b1a6014611280015380600a1a601561128001538060091a601661128001538060081a601761128001538060071a601861128001538060061a601961128001538060051a601a61128001538060041a601b61128001538060031a601c61128001538060021a601d61128001538060011a601e61128001538060001a601f6112800153506112805181526112405180601f1a6112e05380601e1a60016112e0015380601d1a60026112e0015380601c1a60036112e0015380601b1a60046112e0015380601a1a60056112e001538060191a60066112e001538060181a60076112e001538060171a60086112e001538060161a60096112e001538060151a600a6112e001538060141a600b6112e001538060131a600c6112e001538060121a600d6112e001538060111a600e6112e001538060101a600f6112e0015380600f1a60106112e0015380600e1a60116112e0015380600d1a60126112e0015380600c1a60136112e0015380600b1a60146112e0015380600a1a60156112e001538060091a60166112e001538060081a60176112e001538060071a60186112e001538060061a60196112e001538060051a601a6112e001538060041a601b6112e001538060031a601c6112e001538060021a601d6112e001538060011a601e6112e001538060001a601f6112e00153506112e051602082015260205990590160009052602081604084600060026088f1508051905061130052602059905901600090526020816020611300600060026068f1508051905080601f1a6113805380601e1a6001611380015380601d1a6002611380015380601c1a6003611380015380601b1a6004611380015380601a1a600561138001538060191a600661138001538060181a600761138001538060171a600861138001538060161a600961138001538060151a600a61138001538060141a600b61138001538060131a600c61138001538060121a600d61138001538060111a600e61138001538060101a600f611380015380600f1a6010611380015380600e1a6011611380015380600d1a6012611380015380600c1a6013611380015380600b1a6014611380015380600a1a601561138001538060091a601661138001538060081a601761138001538060071a601861138001538060061a601961138001538060051a601a61138001538060041a601b61138001538060031a601c61138001538060021a601d61138001538060011a601e61138001538060001a601f6113800153506113805190506111a0526002610b805105610b80526001610880510161088052611905565b6111a0511515611e265760016000036113a05260206113a0f35b6111a0516113c05260206113c0f35b633d73b7058114156120625760043560405266040000000000015460c0526000610880525b60066108805112156120555760c0516040511415611e7f5760016113e05260206113e0f35b6080608059905901600090526002815260c05181602001526002816040015260008160600152809050207c01000000000000000000000000000000000000000000000000000000006001820154046401000000008254020161142052506114205180601f1a6114805380601e1a6001611480015380601d1a6002611480015380601c1a6003611480015380601b1a6004611480015380601a1a600561148001538060191a600661148001538060181a600761148001538060171a600861148001538060161a600961148001538060151a600a61148001538060141a600b61148001538060131a600c61148001538060121a600d61148001538060111a600e61148001538060101a600f611480015380600f1a6010611480015380600e1a6011611480015380600d1a6012611480015380600c1a6013611480015380600b1a6014611480015380600a1a601561148001538060091a601661148001538060081a601761148001538060071a601861148001538060061a601961148001538060051a601a61148001538060041a601b61148001538060031a601c61148001538060021a601d61148001538060011a601e61148001538060001a601f6114800153506114805160c0526001610880510161088052611e5a565b60006114a05260206114a0f35b6391cf0e96811415612105576004356114c052601c60845990590160009052016367eae672601c8203523360048201526114c051602482015230604482015260206114e06064836000660400000000000354602d5a03f1506114e051905015612104576604000000000004546114c05130310205611500526114c0516604000000000004540366040000000000045560006000600060006115005133611388f1505b5b6313f955e18114156122985736599059016000905236600482376004356020820101611520526024356115405250605061156052600061158052611560516115a0526000610880525b611540516108805112156122895761158051806115a051038080602001599059016000905281815260208101905090508180828286611520510160006004600a8705601201f161219a57fe5b50809050905090506115c0526020601c608c599059016000905201632b861629601c8203526115c0516020601f6020830351010460200260200183600484015260208203602484015280604884015280840193505050816004015990590160009052602481602484600060046015f161220f57fe5b602481019250604882015180808582602487015160006004600a8705601201f161223557fe5b5080840193505080830360206116808284600030602d5a03f150611680519050905090509050610ea05261156051611580510161158052611560516115a051016115a052600161088051016108805261214e565b610ea0516116a05260206116a0f35b50";
String result = Program.stringifyMultiline(Hex.decode(code2));
}
@Test
public void regression2Test() {
// testing that we are working fine with unknown 0xFE bytecode produced by Serpent compiler
String code2 = "6060604052604051602080603f8339016040526060805190602001505b806000600050819055505b50600a8060356000396000f30060606040526008565b000000000000000000000000000000000000000000000000000000000000000021";
String result = Program.stringifyMultiline(Hex.decode(code2));
assertTrue(result.contains("00000000000000000000000000000000")); // detecting bynary data in bytecode
}
}
// TODO: add gas expeted and calculated to all test cases
// TODO: considering: G_TXDATA + G_TRANSACTION
/**
* TODO:
*
* 22) CREATE:
* 23) CALL:
*
*
**/
/**
contract creation (gas usage)
-----------------------------
G_TRANSACTION = (500)
60016000546006601160003960066000f261778e600054 (115)
PUSH1 6001 (1)
PUSH1 6000 (1)
MSTORE 54 (1 + 1)
PUSH1 6006 (1)
PUSH1 6011 (1)
PUSH1 6000 (1)
CODECOPY 39 (1)
PUSH1 6006 (1)
PUSH1 6000 (1)
RETURN f2 (1)
61778e600054
*/