Skip to content

test_contract_log_and_transfer_ordering()

Documentation for tests/amsterdam/eip7708_eth_transfer_logs/test_transfer_logs.py::test_contract_log_and_transfer_ordering@9c2813ee.

Generate fixtures for these test cases for Amsterdam with:

fill -v tests/amsterdam/eip7708_eth_transfer_logs/test_transfer_logs.py::test_contract_log_and_transfer_ordering --fork Amsterdam

Test log ordering between contract-emitted logs and transfer logs.

Scenario: Contract emits LOG0, then CALLs with value. Expected order: tx transfer log, contract LOG0, CALL transfer log.

Source code in tests/amsterdam/eip7708_eth_transfer_logs/test_transfer_logs.py
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
def test_contract_log_and_transfer_ordering(
    state_test: StateTestFiller,
    env: Environment,
    pre: Alloc,
    sender: EOA,
) -> None:
    """
    Test log ordering between contract-emitted logs and transfer logs.

    Scenario: Contract emits LOG0, then CALLs with value.
    Expected order: tx transfer log, contract LOG0, CALL transfer log.
    """
    callee = pre.deploy_contract(Op.STOP)

    # Contract emits LOG0, then CALLs callee with value
    contract_code = (
        Op.MSTORE(0, 0xDEADBEEF)
        + Op.LOG0(offset=0, size=32)  # Emit LOG0 with data
        + Op.CALL(gas=50_000, address=callee, value=1)
    )
    contract = pre.deploy_contract(contract_code, balance=1)

    tx = Transaction(
        sender=sender,
        to=contract,
        value=1,
        gas_limit=200_000,
        expected_receipt=TransactionReceipt(
            logs=[
                # 1. TX-level transfer
                transfer_log(sender, contract, 1),
                # 2. Contract LOG0 (emitted before CALL)
                TransactionLog(
                    address=contract,
                    topics=[],
                    data=Bytes((0xDEADBEEF).to_bytes(32, "big")),
                ),
                # 3. CALL transfer (emitted during CALL)
                transfer_log(contract, callee, 1),
            ]
        ),
    )

    post = {callee: Account(balance=1)}
    state_test(env=env, pre=pre, post=post, tx=tx)

Parametrized Test Cases

This test generates 1 parametrized test case across 1 fork.