Skip to content

test_dup()

Documentation for tests/frontier/opcodes/test_dup.py::test_dup@verkle@v0.0.6.

Generate fixtures for these test cases for Frontier with:

Frontier only:

fill -v tests/frontier/opcodes/test_dup.py::test_dup --fork=Frontier --evm-bin=/path/to/evm-tool-dev-version

For all forks up to and including Frontier:

fill -v tests/frontier/opcodes/test_dup.py::test_dup --until=Frontier

Test the DUP1-DUP16 opcodes.

note: Test case ported from:

- [ethereum/tests/GeneralStateTests/VMTests/vmTests/dup.json](https://github.com/ethereum/tests/blob/develop/GeneralStateTests/VMTests/vmTests/dup.json)
by Ori Pomerantz.
Source code in tests/frontier/opcodes/test_dup.py
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
@pytest.mark.parametrize(
    "dup_opcode",
    [
        Op.DUP1,
        Op.DUP2,
        Op.DUP3,
        Op.DUP4,
        Op.DUP5,
        Op.DUP6,
        Op.DUP7,
        Op.DUP8,
        Op.DUP9,
        Op.DUP10,
        Op.DUP11,
        Op.DUP12,
        Op.DUP13,
        Op.DUP14,
        Op.DUP15,
        Op.DUP16,
    ],
    ids=lambda op: str(op),
)
@pytest.mark.with_all_evm_code_types
def test_dup(
    state_test: StateTestFiller,
    fork: str,
    dup_opcode: Op,
    pre: Alloc,
):
    """
    Test the DUP1-DUP16 opcodes.

    note: Test case ported from:

        - [ethereum/tests/GeneralStateTests/VMTests/vmTests/dup.json](https://github.com/ethereum/tests/blob/develop/GeneralStateTests/VMTests/vmTests/dup.json)
        by Ori Pomerantz.
    """  # noqa: E501
    env = Environment()
    sender = pre.fund_eoa()
    post = {}

    # Push 0x00 - 0x10 onto the stack
    account_code = sum(Op.PUSH1(i) for i in range(0x11))

    # Use the DUP opcode
    account_code += dup_opcode

    # Save each stack value into different keys in storage
    account_code += sum(Op.PUSH1(i) + Op.SSTORE for i in range(0x11))

    account = pre.deploy_contract(account_code)

    tx = Transaction(
        ty=0x0,
        nonce=0,
        to=account,
        gas_limit=500000,
        gas_price=10,
        protected=False if fork in [Frontier, Homestead] else True,
        data="",
        sender=sender,
    )

    """
    Storage will be structured as follows:

    0x00: 0x10-0x01 (Depending on DUP opcode)
    0x01: 0x10
    0x02: 0x0F
    0x03: 0x0E
    0x04: 0x0D
    0x05: 0x0C
    0x06: 0x0B
    0x07: 0x0A
    0x08: 0x09
    0x09: 0x08
    0x0A: 0x07
    0x0B: 0x06
    0x0C: 0x05
    0x0D: 0x04
    0x0E: 0x03
    0x0F: 0x02
    0x10: 0x01

    DUP1 copies the first element of the stack (0x10).
    DUP16 copies the 16th element of the stack (0x01).
    """
    s: Storage.StorageDictType = dict(zip(range(1, 17), range(16, 0, -1)))
    s[0] = 16 - (dup_opcode.int() - 0x80)

    post[account] = Account(storage=s)

    state_test(env=env, pre=pre, post=post, tx=tx)

Parametrized Test Cases

The interactive table below is also available as a standalone page.

Skipped Parameters

For more concise readability, the table below does not list the following parameter values: fork, blockchain_test, state_test, state_test_only, eof_test, eof_state_test.

Test ID evm_code_type dup_opcode
evm_code_type_LEGACY-DUP1 LEGACY DUP1
evm_code_type_LEGACY-DUP2 LEGACY DUP2
evm_code_type_LEGACY-DUP3 LEGACY DUP3
evm_code_type_LEGACY-DUP4 LEGACY DUP4
evm_code_type_LEGACY-DUP5 LEGACY DUP5
evm_code_type_LEGACY-DUP6 LEGACY DUP6
evm_code_type_LEGACY-DUP7 LEGACY DUP7
evm_code_type_LEGACY-DUP8 LEGACY DUP8
evm_code_type_LEGACY-DUP9 LEGACY DUP9
evm_code_type_LEGACY-DUP10 LEGACY DUP10
evm_code_type_LEGACY-DUP11 LEGACY DUP11
evm_code_type_LEGACY-DUP12 LEGACY DUP12
evm_code_type_LEGACY-DUP13 LEGACY DUP13
evm_code_type_LEGACY-DUP14 LEGACY DUP14
evm_code_type_LEGACY-DUP15 LEGACY DUP15
evm_code_type_LEGACY-DUP16 LEGACY DUP16
evm_code_type_LEGACY-DUP1 LEGACY DUP1
evm_code_type_LEGACY-DUP2 LEGACY DUP2
evm_code_type_LEGACY-DUP3 LEGACY DUP3
evm_code_type_LEGACY-DUP4 LEGACY DUP4
evm_code_type_LEGACY-DUP5 LEGACY DUP5
evm_code_type_LEGACY-DUP6 LEGACY DUP6
evm_code_type_LEGACY-DUP7 LEGACY DUP7
evm_code_type_LEGACY-DUP8 LEGACY DUP8
evm_code_type_LEGACY-DUP9 LEGACY DUP9
evm_code_type_LEGACY-DUP10 LEGACY DUP10
evm_code_type_LEGACY-DUP11 LEGACY DUP11
evm_code_type_LEGACY-DUP12 LEGACY DUP12
evm_code_type_LEGACY-DUP13 LEGACY DUP13
evm_code_type_LEGACY-DUP14 LEGACY DUP14
evm_code_type_LEGACY-DUP15 LEGACY DUP15
evm_code_type_LEGACY-DUP16 LEGACY DUP16
evm_code_type_EOF_V1-DUP1 EOF_V1 DUP1
evm_code_type_EOF_V1-DUP2 EOF_V1 DUP2
evm_code_type_EOF_V1-DUP3 EOF_V1 DUP3
evm_code_type_EOF_V1-DUP4 EOF_V1 DUP4
evm_code_type_EOF_V1-DUP5 EOF_V1 DUP5
evm_code_type_EOF_V1-DUP6 EOF_V1 DUP6
evm_code_type_EOF_V1-DUP7 EOF_V1 DUP7
evm_code_type_EOF_V1-DUP8 EOF_V1 DUP8
evm_code_type_EOF_V1-DUP9 EOF_V1 DUP9
evm_code_type_EOF_V1-DUP10 EOF_V1 DUP10
evm_code_type_EOF_V1-DUP11 EOF_V1 DUP11
evm_code_type_EOF_V1-DUP12 EOF_V1 DUP12
evm_code_type_EOF_V1-DUP13 EOF_V1 DUP13
evm_code_type_EOF_V1-DUP14 EOF_V1 DUP14
evm_code_type_EOF_V1-DUP15 EOF_V1 DUP15
evm_code_type_EOF_V1-DUP16 EOF_V1 DUP16
evm_code_type_EOF_V1-DUP1 EOF_V1 DUP1
evm_code_type_EOF_V1-DUP2 EOF_V1 DUP2
evm_code_type_EOF_V1-DUP3 EOF_V1 DUP3
evm_code_type_EOF_V1-DUP4 EOF_V1 DUP4
evm_code_type_EOF_V1-DUP5 EOF_V1 DUP5
evm_code_type_EOF_V1-DUP6 EOF_V1 DUP6
evm_code_type_EOF_V1-DUP7 EOF_V1 DUP7
evm_code_type_EOF_V1-DUP8 EOF_V1 DUP8
evm_code_type_EOF_V1-DUP9 EOF_V1 DUP9
evm_code_type_EOF_V1-DUP10 EOF_V1 DUP10
evm_code_type_EOF_V1-DUP11 EOF_V1 DUP11
evm_code_type_EOF_V1-DUP12 EOF_V1 DUP12
evm_code_type_EOF_V1-DUP13 EOF_V1 DUP13
evm_code_type_EOF_V1-DUP14 EOF_V1 DUP14
evm_code_type_EOF_V1-DUP15 EOF_V1 DUP15
evm_code_type_EOF_V1-DUP16 EOF_V1 DUP16