From 3b7a6382d66fd1c5007daec0179cbdcd5acffad3 Mon Sep 17 00:00:00 2001 From: Piper Merriam Date: Tue, 6 Sep 2016 21:23:07 -0600 Subject: [PATCH 1/4] add failing test --- tests/eth-module/test_eth_getBlock.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/eth-module/test_eth_getBlock.py b/tests/eth-module/test_eth_getBlock.py index 23e59fb..c54f0f0 100644 --- a/tests/eth-module/test_eth_getBlock.py +++ b/tests/eth-module/test_eth_getBlock.py @@ -45,3 +45,14 @@ 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): + assert web3.eth.blockNumber >= 1 + + current_block_number = web3.eth.blockNumber + + block = web3.eth.getBlock('latest') + block_number = block['number'] + + assert block_number >= current_block_number From 9b956c3e8a92c2ef1b4b7867c92cf994d8dff5ac Mon Sep 17 00:00:00 2001 From: Piper Merriam Date: Wed, 7 Sep 2016 09:56:29 -0600 Subject: [PATCH 2/4] fix it --- tests/eth-module/test_eth_getBlock.py | 17 ++++++++++------ .../test_is_predefined_block_number.py | 20 +++++++++++++++++++ web3/eth.py | 5 ++++- web3/formatters.py | 14 ------------- web3/utils/blocks.py | 8 ++++++++ 5 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 tests/utilities/test_is_predefined_block_number.py create mode 100644 web3/utils/blocks.py diff --git a/tests/eth-module/test_eth_getBlock.py b/tests/eth-module/test_eth_getBlock.py index c54f0f0..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'] @@ -48,11 +44,20 @@ def test_eth_getBlock_by_hash_with_full_transactions(web3): def test_eth_getBlock_using_latest(web3): - assert web3.eth.blockNumber >= 1 - 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..80c8dc1 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' diff --git a/web3/formatters.py b/web3/formatters.py index b656cd0..95a5707 100644 --- a/web3/formatters.py +++ b/web3/formatters.py @@ -66,20 +66,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"} From 18d389c1ad272fa0cee6bfb33942a56a56a103a5 Mon Sep 17 00:00:00 2001 From: Piper Merriam Date: Wed, 7 Sep 2016 10:20:56 -0600 Subject: [PATCH 3/4] fix other functions as well --- web3/eth.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web3/eth.py b/web3/eth.py index 80c8dc1..32e4f3d 100644 --- a/web3/eth.py +++ b/web3/eth.py @@ -157,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' @@ -183,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' From 1dd4693bc0d6321e34cfe4e0199dde6c1c8f7be9 Mon Sep 17 00:00:00 2001 From: Piper Merriam Date: Wed, 7 Sep 2016 11:18:11 -0600 Subject: [PATCH 4/4] lint --- web3/formatters.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/web3/formatters.py b/web3/formatters.py index 95a5707..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,