diff --git a/tests/core/web3-module/test_keccak.py b/tests/core/web3-module/test_keccak.py index 25fcc1f090..e49f44517f 100644 --- a/tests/core/web3-module/test_keccak.py +++ b/tests/core/web3-module/test_keccak.py @@ -119,3 +119,11 @@ def test_keccak_raise_if_hexstr_and_text(): def test_keccak_raise_if_no_args(): with pytest.raises(TypeError): Web3.keccak() + + +def test_solidity_keccak_bytes_padding(): + # bytes1 value 0x01 should be padded to 32 bytes in Solidity + result = Web3.solidity_keccak(["bytes1"], [b"\x01"]) + # The padded value is 0x01 followed by 31 zero bytes + expected = Web3.keccak(hexstr="0x01" + "00" * 31) + assert result == expected diff --git a/web3/_utils/encoding.py b/web3/_utils/encoding.py index c6d9f72639..11c9ff702f 100644 --- a/web3/_utils/encoding.py +++ b/web3/_utils/encoding.py @@ -85,6 +85,12 @@ def hex_encode_abi_type( return pad_hex(value, data_size) elif is_bytes_type(abi_type): if is_bytes(value): + # Pad fixed-size bytesN to 32 bytes (Solidity right-pads to 32 bytes in abi.encode) + if abi_type != "bytes": + hex_val = remove_0x_prefix(encode_hex(value)) + # Right-pad to 32 bytes (64 hex chars) + padded = hex_val.ljust(64, "0") + return add_0x_prefix(HexStr(padded)) return encode_hex(value) else: return value diff --git a/web3/_utils/http_session_manager.py b/web3/_utils/http_session_manager.py index 913ea550f1..703d619f3d 100644 --- a/web3/_utils/http_session_manager.py +++ b/web3/_utils/http_session_manager.py @@ -1,4 +1,5 @@ import asyncio +import sys from concurrent.futures import ( ThreadPoolExecutor, ) @@ -19,6 +20,14 @@ from eth_typing import ( URI, ) + +# aiohttp's `enable_cleanup_closed` parameter is deprecated on Python 3.12.8+ +# and 3.13.1+ (CPython bug fix https://github.com/python/cpython/pull/118960). +# Passing it triggers a DeprecationWarning on those versions. +_ENABLE_CLEANUP_CLOSED = ( + sys.version_info < (3, 12, 8) + or (3, 13) <= sys.version_info < (3, 13, 1) +) import requests from web3._utils.async_caching import ( @@ -190,7 +199,12 @@ async def async_cache_and_return_session( session = ClientSession( raise_for_status=True, connector=TCPConnector( - force_close=True, enable_cleanup_closed=True + force_close=True, + **( + {"enable_cleanup_closed": True} + if _ENABLE_CLEANUP_CLOSED + else {} + ), ), ) @@ -237,7 +251,12 @@ async def async_cache_and_return_session( _session = ClientSession( raise_for_status=True, connector=TCPConnector( - force_close=True, enable_cleanup_closed=True + force_close=True, + **( + {"enable_cleanup_closed": True} + if _ENABLE_CLEANUP_CLOSED + else {} + ), ), ) cached_session, evicted_items = self.session_cache.cache(