From 587fc48cc3a8b68cd3f108a75a572d4aa543c75e Mon Sep 17 00:00:00 2001 From: antazoey Date: Tue, 24 Dec 2024 06:57:45 +0700 Subject: [PATCH] fix: transaction was missing signature / couldn't get hash when came from receipt (#2446) --- src/ape_ethereum/provider.py | 7 +++++++ src/ape_ethereum/transactions.py | 2 ++ src/ape_test/provider.py | 3 --- tests/functional/geth/test_receipt.py | 10 ++++++++++ tests/functional/test_receipt.py | 8 ++++++++ 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/ape_ethereum/provider.py b/src/ape_ethereum/provider.py index dde8c84cf8..e589db6163 100644 --- a/src/ape_ethereum/provider.py +++ b/src/ape_ethereum/provider.py @@ -1047,6 +1047,10 @@ def send_transaction(self, txn: TransactionAPI) -> ReceiptAPI: else self.network.required_confirmations ) txn_data = txn_data or txn.model_dump(by_alias=True, mode="json") + + # Signature is excluded from the model fields, so we have to include it manually. + txn_data["signature"] = txn.signature + if vm_err: receipt = self._create_receipt( block_number=-1, # Not in a block. @@ -1076,6 +1080,9 @@ def send_transaction(self, txn: TransactionAPI) -> ReceiptAPI: # `nonce`, it's not needed anyway. txn_data.pop("nonce", None) + # Signature causes issues when making call (instead of tx) + txn_data.pop("signature", None) + # NOTE: Using JSON mode since used as request data. txn_params = cast(TxParams, txn_data) diff --git a/src/ape_ethereum/transactions.py b/src/ape_ethereum/transactions.py index b8e9828237..8e4522a34a 100644 --- a/src/ape_ethereum/transactions.py +++ b/src/ape_ethereum/transactions.py @@ -112,6 +112,8 @@ def serialize_transaction(self) -> bytes: return signed_txn + # TODO: In 0.9, either use hex-str or hex-bytes between both this + # and ReceiptAPI (make consistent). @property def txn_hash(self) -> HexBytes: txn_bytes = self.serialize_transaction() diff --git a/src/ape_test/provider.py b/src/ape_test/provider.py index f4994fc20e..28f84801ae 100644 --- a/src/ape_test/provider.py +++ b/src/ape_test/provider.py @@ -368,9 +368,6 @@ def send_transaction(self, txn: "TransactionAPI") -> "ReceiptAPI": self.chain_manager.history.append(receipt) if receipt.failed: - # NOTE: Using JSON mode since used as request data. - txn_dict = txn_dict or txn.model_dump(mode="json") - txn_dict["nonce"] += 1 txn_params = cast(TxParams, txn_dict) txn_dict.pop("signature", None) diff --git a/tests/functional/geth/test_receipt.py b/tests/functional/geth/test_receipt.py index 5a4a53a7bf..9b244cdcfd 100644 --- a/tests/functional/geth/test_receipt.py +++ b/tests/functional/geth/test_receipt.py @@ -1,3 +1,5 @@ +from eth_utils import to_hex + from ape.api import TraceAPI from ape.utils import ManagerAccessMixin from tests.conftest import geth_process_test @@ -73,3 +75,11 @@ def test_await_confirmations_zero_confirmations(mocker, geth_account, geth_contr tx.await_confirmations() assert tx.confirmed assert spy.call_count == 1 + + +@geth_process_test +def test_transaction(geth_account, geth_contract): + receipt = geth_contract.setNumber(1998, sender=geth_account) + actual = receipt.transaction + assert actual.sender == geth_account.address + assert to_hex(actual.txn_hash) == receipt.txn_hash diff --git a/tests/functional/test_receipt.py b/tests/functional/test_receipt.py index 0f66fecbf7..604a9a7758 100644 --- a/tests/functional/test_receipt.py +++ b/tests/functional/test_receipt.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING import pytest +from eth_utils import to_hex from rich.table import Table from rich.tree import Tree @@ -270,6 +271,13 @@ def test_access_from_tx(deploy_receipt): assert actual == deploy_receipt +def test_transaction(owner, vyper_contract_instance): + receipt = vyper_contract_instance.setNumber(1999, sender=owner) + actual = receipt.transaction + assert actual.sender == owner.address + assert to_hex(actual.txn_hash) == receipt.txn_hash + + def test_transaction_validated_from_dict(ethereum, owner, deploy_receipt): tx = ethereum.create_transaction(sender=owner.address, value=123, data=b"hello") tx_data = tx.model_dump()