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 May 15, 2024
1 parent e7a6182 commit d342b73
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"""
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

REFERENCE_SPEC_GIT_PATH = "EIPS/eip-663.md"
REFERENCE_SPEC_VERSION = "6aed382f86258f33603f5dc275956f739aaae096"
14 changes: 14 additions & 0 deletions tests/prague/eip7692_eof_v1/eip663_dupn_swapn_exchange/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""
Pytest fixtures for EIP-663 tests
"""
import pytest

from ethereum_test_tools import Transaction


@pytest.fixture
def tx() -> Transaction:
"""
Produces the default Transaction.
"""
return Transaction(to=0xC0DE, gas_limit=10_000_000)
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
"""
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

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.SSTORE(x, Op.DUPN[x]) for x in range(0, n))
+ Op.STOP,
code_inputs=0,
code_outputs=NON_RETURNING_SECTION,
max_stack_height=n + 2,
)
],
)

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,
)
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 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

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 = 256
values = range(0x500, 0x500 + 257)

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

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,
)
3 changes: 3 additions & 0 deletions tests/prague/eip7692_eof_v1/tracker.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@

## EIP-663: SWAPN, DUPN and EXCHANGE instructions

- [x] [Positive tests for DUPN instructions](./eip663_dupn_swapn_exchange/test_dupn.py::test_dupn_all_valid_immediates)
- [x] [Positive tests for SWAPN instructions](./eip663_dupn_swapn_exchange/test_swapn.py::test_swapn_all_valid_immediates)

## EIP-7069: Revamped CALL instructions

## EIP-7620: EOF Contract Creation
Expand Down
2 changes: 2 additions & 0 deletions whitelist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ dup
dunder
EEST
eip
eip3540
eips
EIPs
endianness
Expand Down Expand Up @@ -163,6 +164,7 @@ hyperledger
iat
ignoreRevsFile
img
immediates
incrementing
init
initcode
Expand Down

0 comments on commit d342b73

Please sign in to comment.