From 2419435b0cfa95e903000c5edfed156eb512a1f8 Mon Sep 17 00:00:00 2001
From: Stuart Reed <stuart.reed@ethereum.org>
Date: Thu, 9 Jan 2025 13:15:53 -0700
Subject: [PATCH] Create test cases from EIP-152 for precompiled contracts with
 Blake2

Use opcodes and set test parameters to the expected inputs and outputs.

Update CHANGELOG

Document removal of json in converted-ethereum-tests.txt
---
 converted-ethereum-tests.txt                |   3 +
 docs/CHANGELOG.md                           |   1 +
 tests/istanbul/eip152_blake2/__init__.py    |   4 +
 tests/istanbul/eip152_blake2/test_blake2.py | 581 ++++++++++++++++++++
 4 files changed, 589 insertions(+)
 create mode 100644 tests/istanbul/eip152_blake2/__init__.py
 create mode 100644 tests/istanbul/eip152_blake2/test_blake2.py

diff --git a/converted-ethereum-tests.txt b/converted-ethereum-tests.txt
index c7452ae9527..1d38a56e900 100644
--- a/converted-ethereum-tests.txt
+++ b/converted-ethereum-tests.txt
@@ -66,3 +66,6 @@ GeneralStateTests/Cancun/stEIP1153-transientStorage/20_oogUndoesTransientStoreIn
 
 ([#975](https://github.com/ethereum/execution-spec-tests/pull/975))
 GeneralStateTests/VMTests/vmTests/push.json
+
+([#1067](https://github.com/ethereum/execution-spec-tests/pull/1067))
+GeneralStateTests/stPreCompiledContracts/blake2B.json
\ No newline at end of file
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index d2c14ac753f..b3306dfdd11 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -31,6 +31,7 @@ Release tarball changes:
 - 🔀 Update EIP-2935 according to [spec updates](https://github.com/ethereum/EIPs/pull/9144) ([#1046](https://github.com/ethereum/execution-spec-tests/pull/1046))
 - ✨ [EIP-7691](https://eips.ethereum.org/EIPS/eip-7691) Blob throughput increase tests by parametrization of existing EIP-4844 tests ([#1023](https://github.com/ethereum/execution-spec-tests/pull/1023), [#1082](https://github.com/ethereum/execution-spec-tests/pull/1082))
 - ✨ Port [calldatacopy test](https://github.com/ethereum/tests/blob/ae4791077e8fcf716136e70fe8392f1a1f1495fb/src/GeneralStateTestsFiller/VMTests/vmTests/calldatacopyFiller.yml) ([#1056](https://github.com/ethereum/execution-spec-tests/pull/1056)).
+- ✨ [EIP-152](https://eips.ethereum.org/EIPS/eip-152) Add tests for Blake2 compression function `F` precompile ([#1067](https://github.com/ethereum/execution-spec-tests/pull/1067))
 
 ### 🛠️ Framework
 
diff --git a/tests/istanbul/eip152_blake2/__init__.py b/tests/istanbul/eip152_blake2/__init__.py
new file mode 100644
index 00000000000..1f034e456fb
--- /dev/null
+++ b/tests/istanbul/eip152_blake2/__init__.py
@@ -0,0 +1,4 @@
+"""
+abstract: Tests [EIP-152: BLAKE2 compression precompile](https://eips.ethereum.org/EIPS/eip-152)
+    Test cases for [EIP-152: BLAKE2 compression precompile](https://eips.ethereum.org/EIPS/eip-152).
+"""
diff --git a/tests/istanbul/eip152_blake2/test_blake2.py b/tests/istanbul/eip152_blake2/test_blake2.py
new file mode 100644
index 00000000000..daed476188c
--- /dev/null
+++ b/tests/istanbul/eip152_blake2/test_blake2.py
@@ -0,0 +1,581 @@
+"""
+abstract: Tests [EIP-152: BLAKE2b compression precompile](https://eips.ethereum.org/EIPS/eip-152)
+    Test cases for [EIP-152: BLAKE2b compression precompile](https://eips.ethereum.org/EIPS/eip-152).
+"""
+
+from dataclasses import dataclass
+
+import pytest
+
+from ethereum_test_tools import (
+    Account,
+    Alloc,
+    Environment,
+    StateTestFiller,
+    TestParameterGroup,
+    Transaction,
+)
+from ethereum_test_tools.vm.opcode import Opcodes as Op
+
+REFERENCE_SPEC_GIT_PATH = "EIPS/eip-152.md"
+REFERENCE_SPEC_VERSION = "5510973b40973b6aa774f04c9caba823c8ff8460"
+
+
+@dataclass(kw_only=True, frozen=True, repr=False)
+class Blake2bInput(TestParameterGroup):
+    """
+    Helper class that defines the BLAKE2b precompile inputs and creates the
+    call data from them. Returns all inputs encoded as bytes.
+
+    Attributes:
+        rounds_length (int): An optional integer representing the bytes length
+            for the number of rounds. Defaults to the expected length of 4.
+        rounds (int | str): A hex string or integer value representing the number of rounds.
+        h (str): A hex string that represents the state vector.
+        m (str): A hex string that represents the message block vector.
+        t_0 (int | str): A hex string or integer value that represents the first offset counter.
+        t_1 (int | str): A hex string or integer value that represents the second offset counter.
+        f (bool): An optional boolean that represents the final block indicator flag.
+            Defaults to True.
+
+    """
+
+    rounds_length: int = 4
+    rounds: int | str
+    h: str
+    m: str
+    t_0: int | str
+    t_1: int | str
+    f: bool | int = True
+
+    def create_blake2b_tx_data(self):
+        """Generate input for the BLAKE2b precompile."""
+        _rounds = self.rounds.to_bytes(length=self.rounds_length, byteorder="big")
+        _h = bytes.fromhex(self.h)
+        _m = bytes.fromhex(self.m)
+        _t_0 = (
+            bytes.fromhex(self.t_0)
+            if isinstance(self.t_0, str)
+            else self.t_0.to_bytes(length=8, byteorder="little")
+        )
+        _t_1 = (
+            bytes.fromhex(self.t_1)
+            if isinstance(self.t_1, str)
+            else self.t_1.to_bytes(length=8, byteorder="little")
+        )
+        _f = int(self.f).to_bytes(length=1, byteorder="big")
+
+        return _rounds + _h + _m + _t_0 + _t_1 + _f
+
+
+@dataclass(kw_only=True, frozen=True, repr=False)
+class ExpectedOutput(TestParameterGroup):
+    """
+    Expected test result.
+
+    Attributes:
+        call_succeeds (str | bool): A hex string or boolean to indicate whether the call was
+            successful or not.
+        data_1 (str): String value of the first updated state vector.
+        data_2 (str): String value of the second updated state vector.
+
+    """
+
+    call_succeeds: str | bool
+    data_1: str
+    data_2: str
+
+
+@pytest.mark.valid_from("Istanbul")
+@pytest.mark.parametrize(
+    ["data", "output"],
+    [
+        pytest.param(
+            Blake2bInput(
+                rounds=0,
+                rounds_length=0,
+                h="",
+                m="",
+                t_0="",
+                t_1="",
+            ),
+            ExpectedOutput(
+                call_succeeds=False,
+                data_1="0x00",
+                data_2="0x00",
+            ),
+            id="EIP-152-case0",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=12,
+                rounds_length=3,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=False,
+                data_1="0x00",
+                data_2="0x00",
+            ),
+            id="EIP-152-case1",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=12,
+                rounds_length=5,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=False,
+                data_1="0x00",
+                data_2="0x00",
+            ),
+            id="EIP-152-case2",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=12,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+                f=2,
+            ),
+            ExpectedOutput(
+                call_succeeds=False,
+                data_1="0x00",
+                data_2="0x00",
+            ),
+            id="EIP-152-case3",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=0,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5",
+                data_2="0xd282e6ad7f520e511f6c3e2b8c68059b9442be0454267ce079217e1319cde05b",
+            ),
+            id="EIP-152-case4",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=12,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d1",
+                data_2="0x7d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923",
+            ),
+            id="EIP-152-case5",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=12,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+                f=False,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x75ab69d3190a562c51aef8d88f1c2775876944407270c42c9844252c26d28752",
+                data_2="0x98743e7f6d5ea2f2d3e8d226039cd31b4e426ac4f2d3d666a610c2116fde4735",
+            ),
+            id="EIP-152-case6",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=1,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xb63a380cb2897d521994a85234ee2c181b5f844d2c624c002677e9703449d2fb",
+                data_2="0xa551b3a8333bcdf5f2f7e08993d53923de3d64fcc68c034e717b9293fed7a421",
+            ),
+            id="EIP-152-case7",
+        ),
+        # Excessive number of rounds expects to run out of gas
+        pytest.param(
+            Blake2bInput(
+                rounds=4294967295,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=False,
+                data_1="0x0",
+                data_2="0x0",
+            ),
+            id="EIP-152-case8",
+        ),
+        # Case from https://github.com/ethereum/tests/pull/948#issuecomment-925964632
+        pytest.param(
+            Blake2bInput(
+                rounds=12,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=5,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xf3e89a60ec4b0b1854744984e421d22b82f181bd4601fb9b1726b2662da61c29",
+                data_2="0xdff09e75814acb2639fd79e56616e55fc135f8476f0302b3dc8d44e082eb83a8",
+            ),
+            id="EIP-152-case9",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=16,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xa8ef8236e5f48a74af375df15681d128457891c1cc4706f30747b2d40300b2f4",
+                data_2="0x9d19f80fbd0945fd87736e1fc1ff10a80fd85a7aa5125154f3aaa3789ddff673",
+            ),
+            id="EIP-152-0016",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=32,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xbc5e888ed71b546da7b1506179bdd6c184a6410c40de33f9c330207417797889",
+                data_2="0x5dbe74144468aefe5c2afce693c62dbca99e5e076dd467fe90a41278b16d691e",
+            ),
+            id="EIP-152-0032",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=64,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x74097ae7b16ffd18c742aee5c55dc89d54b6f1a8a19e6139ccfb38afba56b6b0",
+                data_2="0x2cc35c441c19c21194fefb6841e72202f7c9d05eb9c3cfd8f94c67aa77d473c1",
+            ),
+            id="EIP-152-0064",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=128,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xd82c6a670dc90af9d7f77644eacbeddfed91b760c65c927871784abceaab3f81",
+                data_2="0x3759733a1736254fb1cfc515dbfee467930955af56e27ee435f836fc3e65969f",
+            ),
+            id="EIP-152-0128",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=256,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x5d6ff04d5ebaee5687d634613ab21e9a7d36f782033c74f91d562669aaf9d592",
+                data_2="0xc86346cb2df390243a952834306b389e656876a67934e2c023bce4918a016d4e",
+            ),
+            id="EIP-152-0256",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=512,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xa2c1eb780a6e1249156fe0751e5d4687ea9357b0651c78df660ab004cb477363",
+                data_2="0x6298bbbc683e4a0261574b6d857a6a99e06b2eea50b16f86343d2625ff222b98",
+            ),
+            id="EIP-152-0512",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=1024,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=3,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x689419d2bf32b5a9901a2c733b9946727026a60d8773117eabb35f04a52cdcf1",
+                data_2="0xb8fb4473454cf03d46c36a10b3f784aae4dc80a24424960e66a8ad5a8c2bfb30",
+            ),
+            id="EIP-152-1024",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=16,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=16,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x4ab6df9d1f57140bbd27b5e164f42102d9e2b0bf4d53da501273f81a37e505c7",
+                data_2="0xf6e136f9ca4b693aa6e990b04c6412296dc09540c23c395f183011a0c5d7392e",
+            ),
+            id="EIP-152-0016-16",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=32,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=16,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x7af9b4f9c25ba3e3fd4fcb957e703b7b2e648990fe8e24c6ca2a2dfac4ce76e6",
+                data_2="0x18acffc26913d6759843362adeb4c95299777baaa977b5d94dd219d1777e4cb",
+            ),
+            id="EIP-152-0032-16",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=64,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=16,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x97eb79f7abc085a3da64d6e8643d196cbf522a51985ba2cc6a7ca14289b59df0",
+                data_2="0x73366eb68e41966eb8b33ab5bd6078d0de2fa4edc986b1d2afc4c92f2fc30cda",
+            ),
+            id="EIP-152-0064-16",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=128,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=16,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x5ef3d6ee148936390a9053e91ab5a92f4de4dfc62ebb95d71485be26d9b78c8d",
+                data_2="0x8989dfe319f2fb5f11784174db63a7bcfc50de04e13fad57bea159e46e8811df",
+            ),
+            id="EIP-152-0128-16",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=256,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=16,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xa36be13275fec9a91779f0c9b06b1b40d8c8a13ab0786d0764c2eb708cc8eb81",
+                data_2="0xf1acb2a3c7abd2ff5a9fdfe88b81f6f56288dc5260a9c810f023ae83b9b64a1a",
+            ),
+            id="EIP-152-0256-16",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=512,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=16,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xc987e560e3f90833c0d10ae1282bd9d35a7ba06d8abaa13a994d0962ed2bbaa9",
+                data_2="0xf69c1e1e7c9aedb75e72d1b46e9f1b2ad8f8c2f7f858a04ed8aec16f964a96da",
+            ),
+            id="EIP-152-0512-16",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=1024,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                t_0=16,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x224138a6afa847230ff09c23e2ca66522e22d26884b09d7740e2dd127cb61057",
+                data_2="0x90cecbd4de6a52a733ca4a59583c064ad6ec7653d5d457b681de332f16f3d45",
+            ),
+            id="EIP-152-1024-16",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=16,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d900000000000000",
+                t_0=120,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0xabcd200f2962ede252fc455ea70d12b236ad2f4046b91e17558a7741d9da39a2",
+                data_2="0x548083b610bb8591ca50418eabd15b6489a936b178a435b4c182ffa475eba4d8",
+            ),
+            id="EIP-152-0016-120",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=32,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d900000000000000",
+                t_0=120,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x39fc2077154fba422b3d628d10908c596beebea8dfd90f14566aec4f60bdb2bc",
+                data_2="0xa75d73ab2b224d58c3568cbc7fc8905cc849f10745f00addef02384032d53729",
+            ),
+            id="EIP-152-0032-120",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=64,
+                h="48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b",
+                m="6162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d900000000000000",
+                t_0=120,
+                t_1=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=True,
+                data_1="0x5bb981381beb687d5fdbe5e7c096fbd1ce193b780948c1d74ebbb7c58db364c7",
+                data_2="0xb7695d32f918444dbdcbdcff476fc70a926e228c4cbb7d05473711d3b56e5b33",
+            ),
+            id="EIP-152-0064-120",
+        ),
+        pytest.param(
+            Blake2bInput(
+                rounds=0,
+                rounds_length=0,
+                h="00",
+                m="00",
+                t_0=0,
+                t_1=0,
+                f=0,
+            ),
+            ExpectedOutput(
+                call_succeeds=False,
+                data_1="0x00",
+                data_2="0x00",
+            ),
+            id="EIP-152-RFC-7693-zero-input",
+        ),
+    ],
+)
+def test_blake2b(
+    state_test: StateTestFiller,
+    data: Blake2bInput,
+    output: ExpectedOutput,
+    pre: Alloc,
+):
+    """Test BLAKE2b precompile."""
+    env = Environment()
+
+    account = pre.deploy_contract(
+        # Store all CALLDATA into memory (offset 0)
+        Op.CALLDATACOPY(0, 0, Op.CALLDATASIZE())
+        # Store the returned CALL status (success = 1, fail = 0) into slot 0:
+        + Op.SSTORE(
+            0,
+            # Setup stack to CALL into Blake2b with the CALLDATA and CALL into it (+ pop value)
+            Op.CALL(
+                address=9,
+                args_offset=0,
+                args_size=Op.CALLDATASIZE(),
+                ret_offset=0x200,
+                ret_size=0x40,
+                gas_limit=1_000_000,
+            ),
+        )
+        + Op.SSTORE(
+            1,
+            Op.MLOAD(0x200),
+        )
+        + Op.SSTORE(
+            2,
+            Op.MLOAD(0x220),
+        )
+        + Op.STOP(),
+        storage={0: 0xDEADBEEF},
+    )
+    sender = pre.fund_eoa()
+
+    tx = Transaction(
+        ty=0x0,
+        to=account,
+        data=data.create_blake2b_tx_data(),
+        gas_limit=1_000_000,
+        protected=True,
+        sender=sender,
+        value=100000,
+    )
+
+    post = {
+        account: Account(
+            storage={
+                0: 0x1 if output.call_succeeds else 0x0,
+                1: output.data_1,
+                2: output.data_2,
+            }
+        )
+    }
+    state_test(env=env, pre=pre, post=post, tx=tx)