diff --git a/tests/eth-module/test_eth_getBlock.py b/tests/eth-module/test_eth_getBlock.py index 23e59fb..a8e5e3a 100644 --- a/tests/eth-module/test_eth_getBlock.py +++ b/tests/eth-module/test_eth_getBlock.py @@ -9,7 +9,6 @@ def wait_for_first_block(web3, wait_for_block): def test_eth_getBlock_by_number(web3): - assert web3.eth.blockNumber >= 1 block_1 = web3.eth.getBlock(1) assert block_1 assert block_1['number'] == 1 @@ -17,7 +16,6 @@ def test_eth_getBlock_by_number(web3): def test_eth_getBlock_by_hash(web3): - assert web3.eth.blockNumber >= 1 block_1 = web3.eth.getBlock(1) block_1_hash = block_1['hash'] @@ -29,14 +27,12 @@ def test_eth_getBlock_by_hash(web3): def test_eth_getBlock_by_number_with_full_transactions(web3): - assert web3.eth.blockNumber >= 1 block_1 = web3.eth.getBlock(1, True) assert block_1['number'] == 1 assert all(isinstance(txn, dict) for txn in block_1['transactions']) def test_eth_getBlock_by_hash_with_full_transactions(web3): - assert web3.eth.blockNumber >= 1 block_1 = web3.eth.getBlock(1, True) block_1_hash = block_1['hash'] @@ -45,3 +41,23 @@ def test_eth_getBlock_by_hash_with_full_transactions(web3): assert block_1_by_hash['number'] == 1 assert block_1_by_hash['hash'] == block_1_hash assert all(isinstance(txn, dict) for txn in block_1['transactions']) + + +def test_eth_getBlock_using_latest(web3): + current_block_number = web3.eth.blockNumber + + block = web3.eth.getBlock('latest') + block_number = block['number'] + + assert block_number >= current_block_number + + +def test_eth_getBlock_using_earliest(web3): + current_block_number = web3.eth.blockNumber + + block = web3.eth.getBlock('earliest') + + assert block['number'] == 0 + + block_1 = web3.eth.getBlock(0) + assert block == block_1 diff --git a/tests/utilities/test_is_predefined_block_number.py b/tests/utilities/test_is_predefined_block_number.py new file mode 100644 index 0000000..3bffc45 --- /dev/null +++ b/tests/utilities/test_is_predefined_block_number.py @@ -0,0 +1,20 @@ +import pytest + +from web3.utils.blocks import ( + is_predefined_block_number, +) + + +@pytest.mark.parametrize( + 'block_identifier,expected', + ( + ('earliest', True), + ('latest', True), + ('pending', True), + (1, False), + ('0x1', False), + ), +) +def test_is_predefined_block_number(block_identifier, expected): + actual = is_predefined_block_number(block_identifier) + assert actual is expected diff --git a/web3/eth.py b/web3/eth.py index a3072b1..32e4f3d 100644 --- a/web3/eth.py +++ b/web3/eth.py @@ -20,6 +20,9 @@ from web3.utils.filters import ( TransactionFilter, LogFilter, ) +from web3.utils.blocks import ( + is_predefined_block_number, +) from web3.contract import construct_contract_class @@ -138,7 +141,7 @@ class Eth(object): `eth_getBlockByHash` `eth_getBlockByNumber` """ - if is_integer(block_identifier): + if is_predefined_block_number(block_identifier) or is_integer(block_identifier): method = 'eth_getBlockByNumber' else: method = 'eth_getBlockByHash' @@ -154,7 +157,7 @@ class Eth(object): `eth_getBlockTransactionCountByHash` `eth_getBlockTransactionCountByNumber` """ - if is_integer(block_identifier): + if is_predefined_block_number(block_identifier) or is_integer(block_identifier): method = 'eth_getBlockTransactionCountByNumber' else: method = 'eth_getBlockTransactionCountByHash' @@ -180,7 +183,7 @@ class Eth(object): `eth_getTransactionByBlockHashAndIndex` `eth_getTransactionByBlockNumberAndIndex` """ - if is_integer(block_identifier): + if is_predefined_block_number(block_identifier) or is_integer(block_identifier): method = 'eth_getTransactionByBlockNumberAndIndex' else: method = 'eth_getTransactionByBlockHashAndIndex' diff --git a/web3/formatters.py b/web3/formatters.py index b656cd0..b0e1796 100644 --- a/web3/formatters.py +++ b/web3/formatters.py @@ -6,7 +6,6 @@ import operator from web3.iban import Iban from web3.utils.string import ( - force_text, coerce_args_to_text, coerce_return_to_text, ) @@ -26,7 +25,6 @@ from web3.utils.formatting import ( add_0x_prefix, ) from web3.utils.encoding import ( - to_hex, encode_hex, decode_hex, from_decimal, @@ -66,20 +64,6 @@ def apply_to_array(formatter_fn): ) -def isPredefinedBlockNumber(blockNumber): - if not is_string(blockNumber): - return False - return force_text(blockNumber) in {"latest", "pending", "earliest"} - - -def inputBlockNumberFormatter(blockNumber): - if not blockNumber: - return None - elif isPredefinedBlockNumber(blockNumber): - return blockNumber - return to_hex(blockNumber) - - @coerce_args_to_text @coerce_return_to_text def input_call_formatter(eth, txn): diff --git a/web3/utils/blocks.py b/web3/utils/blocks.py new file mode 100644 index 0000000..7a959f6 --- /dev/null +++ b/web3/utils/blocks.py @@ -0,0 +1,8 @@ +from .types import is_string +from .string import force_text + + +def is_predefined_block_number(block_number): + if not is_string(block_number): + return False + return force_text(block_number) in {"latest", "pending", "earliest"}