From 6f31ebdb60bd8babf61e7637635155def92ce229 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 9 Sep 2022 17:14:55 +0200 Subject: [PATCH 1/2] Allow fee estimation for version 0 and 1 --- test-0.10.0.sh => scripts/test-0.10.0.sh | 0 starknet_devnet/blueprints/feeder_gateway.py | 8 +++++++- test/test_estimate_fee.py | 12 ++++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) rename test-0.10.0.sh => scripts/test-0.10.0.sh (100%) diff --git a/test-0.10.0.sh b/scripts/test-0.10.0.sh similarity index 100% rename from test-0.10.0.sh rename to scripts/test-0.10.0.sh diff --git a/starknet_devnet/blueprints/feeder_gateway.py b/starknet_devnet/blueprints/feeder_gateway.py index e56c330eb..0686ec467 100644 --- a/starknet_devnet/blueprints/feeder_gateway.py +++ b/starknet_devnet/blueprints/feeder_gateway.py @@ -11,6 +11,7 @@ AccountTransaction, InvokeFunction, ) +from starkware.starknet.services.api.gateway.transaction import Transaction from starkware.starknet.services.api.feeder_gateway.request_objects import CallFunction from starkware.starknet.services.api.feeder_gateway.response_objects import ( TransactionSimulationInfo, @@ -268,7 +269,12 @@ def get_state_update(): @feeder_gateway.route("/estimate_fee", methods=["POST"]) async def estimate_fee(): """Returns the estimated fee for a transaction.""" - transaction = validate_request(request.data, InvokeFunction) + + try: + transaction = validate_request(request.data, Transaction) # version 1 + except StarknetDevnetException: + transaction = validate_request(request.data, InvokeFunction) # version 0 + _, fee_response = await state.starknet_wrapper.calculate_actual_fee(transaction) return jsonify(FeeEstimationInfo.load(fee_response)) diff --git a/test/test_estimate_fee.py b/test/test_estimate_fee.py index 0e9e8f40f..72e4857d1 100644 --- a/test/test_estimate_fee.py +++ b/test/test_estimate_fee.py @@ -90,8 +90,15 @@ def test_estimate_fee_with_invalid_data(): @pytest.mark.estimate_fee +@pytest.mark.parametrize( + "request_kwargs", + [ + {}, # tx version 0 + {"type": "INVOKE_FUNCTION"}, # tx version 1 + ], +) @devnet_in_background("--gas-price", str(DEFAULT_GAS_PRICE)) -def test_estimate_fee_with_complete_request_data(): +def test_estimate_fee_with_complete_request_data(request_kwargs): """Estimate fee with complete request data""" deploy_info = deploy(CONTRACT_PATH, ["0"]) @@ -104,10 +111,11 @@ def test_estimate_fee_with_complete_request_data(): "calldata": ["10", "20"], "max_fee": "0x0", "entry_point_selector": "0x362398bec32bc0ebb411203221a35a0301193a96f317ebe5e40be9f60d15320", + **request_kwargs, } ) - assert response.status_code == 200 + assert response.status_code == 200, f"Request not OK: {response.json()}" common_estimate_response(response.json()) From 3fe0b37f3ddf8de59a75bdcdcf441adcfcd724c1 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 9 Sep 2022 17:40:14 +0200 Subject: [PATCH 2/2] Fix invalid data test --- starknet_devnet/starknet_wrapper.py | 12 +++++++++--- test/test_estimate_fee.py | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/starknet_devnet/starknet_wrapper.py b/starknet_devnet/starknet_wrapper.py index ac8d48713..a1d73554f 100644 --- a/starknet_devnet/starknet_wrapper.py +++ b/starknet_devnet/starknet_wrapper.py @@ -51,6 +51,7 @@ from .origin import NullOrigin, Origin from .util import ( DummyExecutionInfo, + StarknetDevnetException, Uint256, enable_pickling, get_storage_diffs, @@ -476,9 +477,14 @@ async def calculate_actual_fee(self, external_tx: InvokeFunction): """Calculates actual fee""" state = self.get_state() - internal_tx = InternalInvokeFunctionForSimulate.from_external( - external_tx, state.general_config - ) + try: + internal_tx = InternalInvokeFunctionForSimulate.from_external( + external_tx, state.general_config + ) + except AssertionError as error: + raise StarknetDevnetException( + status_code=400, message="Invalid format of fee estimation request" + ) from error execution_info = await internal_tx.apply_state_updates( # pylint: disable=protected-access diff --git a/test/test_estimate_fee.py b/test/test_estimate_fee.py index 72e4857d1..57b40d960 100644 --- a/test/test_estimate_fee.py +++ b/test/test_estimate_fee.py @@ -86,7 +86,7 @@ def test_estimate_fee_with_invalid_data(): json_error_message = resp.json()["message"] assert resp.status_code == 400 - assert "Invalid InvokeFunction" in json_error_message + assert "Invalid format of fee estimation request" in json_error_message @pytest.mark.estimate_fee