Skip to content

Commit

Permalink
new(test): add tests for EOF/EIP-663 DUPN SWAPN
Browse files Browse the repository at this point in the history
  • Loading branch information
chfast committed Apr 19, 2024
1 parent e7d677b commit 1fe701e
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 0 deletions.
16 changes: 16 additions & 0 deletions tests/prague/eip663_dupn_swapn_exchange/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
abstract: Tests [EIP-663: SWAPN, DUPN and EXCHANGE instructions](https://eips.ethereum.org/EIPS/eip-663)
Tests for [EIP-663: SWAPN, DUPN and EXCHANGE instructions](https://eips.ethereum.org/EIPS/eip-663).
""" # noqa: E501

import pytest

from ethereum_test_tools import Transaction

REFERENCE_SPEC_GIT_PATH = "EIPS/eip-663.md"
REFERENCE_SPEC_VERSION = "6aed382f86258f33603f5dc275956f739aaae096"


@pytest.fixture
def tx() -> Transaction:
return Transaction(to=0xC0DE, gas_limit=10_000_000)
57 changes: 57 additions & 0 deletions tests/prague/eip663_dupn_swapn_exchange/test_dupn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
"""
abstract: Tests [EIP-663: SWAPN, DUPN and EXCHANGE instructions](https://eips.ethereum.org/EIPS/eip-663)
Tests for the DUPN instruction.
""" # noqa: E501

import pytest

from ethereum_test_tools import Account, Environment, StateTestFiller, TestAddress, Transaction
from ethereum_test_tools.eof.v1 import Container, Section
from ethereum_test_tools.eof.v1.constants import NON_RETURNING_SECTION
from ethereum_test_tools.vm.opcode import Opcodes as Op

from ..eip3540_eof_v1.spec import EOF_FORK_NAME
from . import REFERENCE_SPEC_GIT_PATH, REFERENCE_SPEC_VERSION, tx

REFERENCE_SPEC_GIT_PATH = REFERENCE_SPEC_GIT_PATH
REFERENCE_SPEC_VERSION = REFERENCE_SPEC_VERSION


@pytest.mark.valid_from(EOF_FORK_NAME)
def test_dupn_all_valid_immediates(
tx: Transaction,
state_test: StateTestFiller,
):
"""
Test case for all valid DUPN immediates.
"""

n = 256
values = range(0xD00, 0xD00 + n)

eof_code = Container(
sections=[
Section.Code(
code=b"".join(Op.PUSH2(v) for v in values)
+ b"".join(Op.DUPN(x) + Op.PUSH2(x) + Op.SSTORE for x in range(0, n))
+ Op.STOP,
code_inputs=0,
code_outputs=NON_RETURNING_SECTION,
max_stack_height=258,
)
],
)

pre = {
TestAddress: Account(balance=1_000_000_000),
tx.to: Account(code=eof_code),
}

post = {tx.to: Account(storage=dict(zip(range(0, n), reversed(values))))}

state_test(
env=Environment(),
pre=pre,
post=post,
tx=tx,
)
58 changes: 58 additions & 0 deletions tests/prague/eip663_dupn_swapn_exchange/test_swapn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""
abstract: Tests [EIP-663: SWAPN, DUPN and EXCHANGE instructions](https://eips.ethereum.org/EIPS/eip-663)
Tests for the SWAPN instruction.
""" # noqa: E501

import pytest

from ethereum_test_tools import Account, Environment, StateTestFiller, TestAddress, Transaction
from ethereum_test_tools.eof.v1 import Container, Section
from ethereum_test_tools.eof.v1.constants import NON_RETURNING_SECTION
from ethereum_test_tools.vm.opcode import Opcodes as Op

from ..eip3540_eof_v1.spec import EOF_FORK_NAME
from . import REFERENCE_SPEC_GIT_PATH, REFERENCE_SPEC_VERSION, tx

REFERENCE_SPEC_GIT_PATH = REFERENCE_SPEC_GIT_PATH
REFERENCE_SPEC_VERSION = REFERENCE_SPEC_VERSION


@pytest.mark.valid_from(EOF_FORK_NAME)
def test_swapn_all_valid_immediates(
tx: Transaction,
state_test: StateTestFiller,
):
"""
Test case for all valid SWAPN immediates.
"""

n = 100
values = range(0x500, 0x500 + 257)

eof_code = Container(
sections=[
Section.Code(
code=b"".join(Op.PUSH2(v) for v in values)
+ b"".join(Op.SWAPN(0xFF - x) + Op.PUSH2(x) + Op.SSTORE for x in range(0, n))
+ Op.STOP,
code_inputs=0,
code_outputs=NON_RETURNING_SECTION,
max_stack_height=258,
)
],
)

pre = {
TestAddress: Account(balance=1_000_000_000),
tx.to: Account(code=eof_code),
}

values_rotated = list(values[1:]) + [values[0]]
post = {tx.to: Account(storage=dict(zip(range(0, n), reversed(values_rotated))))}

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

0 comments on commit 1fe701e

Please sign in to comment.