From 1122c9fea2f74ae68ed8e7ebe49d8e6de3bdceb1 Mon Sep 17 00:00:00 2001 From: Dariusz Doktorski Date: Fri, 10 Nov 2023 11:58:28 +0100 Subject: [PATCH 1/3] Update RPC to v0.5.1 --- docs/migration_guide.rst | 2 +- starknet_py/net/client_models.py | 20 +++++++------- starknet_py/net/schemas/rpc.py | 27 ++++++++++++------- .../e2e/tests_on_networks/trace_api_test.py | 15 +++++------ 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/docs/migration_guide.rst b/docs/migration_guide.rst index a774a7658..3a09ba9b2 100644 --- a/docs/migration_guide.rst +++ b/docs/migration_guide.rst @@ -12,7 +12,7 @@ Version 0.18.3 of **starknet.py** comes with support for RPC 0.5.0! ------------------------ - Starknet - `0.12.2 `_ -- RPC - `0.5.0 `_ +- RPC - `0.5.1 `_ 0.18.3 Breaking changes diff --git a/starknet_py/net/client_models.py b/starknet_py/net/client_models.py index 1beb63cfb..518d36446 100644 --- a/starknet_py/net/client_models.py +++ b/starknet_py/net/client_models.py @@ -842,6 +842,7 @@ class CallType(Enum): Enum class representing call types. """ + DELEGATE = "DELEGATE" LIBRARY_CALL = "LIBRARY_CALL" CALL = "CALL" @@ -881,10 +882,10 @@ class InvokeTransactionTrace: Dataclass representing a transaction trace of an INVOKE transaction. """ - validate_invocation: FunctionInvocation execute_invocation: Union[FunctionInvocation, RevertedFunctionInvocation] - fee_transfer_invocation: FunctionInvocation - state_diff: StateDiff + validate_invocation: Optional[FunctionInvocation] = None + fee_transfer_invocation: Optional[FunctionInvocation] = None + state_diff: Optional[StateDiff] = None @dataclass @@ -893,9 +894,9 @@ class DeclareTransactionTrace: Dataclass representing a transaction trace of an DECLARE transaction. """ - validate_invocation: FunctionInvocation - fee_transfer_invocation: FunctionInvocation - state_diff: StateDiff + validate_invocation: Optional[FunctionInvocation] = None + fee_transfer_invocation: Optional[FunctionInvocation] = None + state_diff: Optional[StateDiff] = None @dataclass @@ -904,10 +905,10 @@ class DeployAccountTransactionTrace: Dataclass representing a transaction trace of an DEPLOY_ACCOUNT transaction. """ - validate_invocation: FunctionInvocation constructor_invocation: FunctionInvocation - fee_transfer_invocation: FunctionInvocation - state_diff: StateDiff + validate_invocation: Optional[FunctionInvocation] = None + fee_transfer_invocation: Optional[FunctionInvocation] = None + state_diff: Optional[StateDiff] = None @dataclass @@ -917,6 +918,7 @@ class L1HandlerTransactionTrace: """ function_invocation: FunctionInvocation + state_diff: Optional[StateDiff] = None TransactionTrace = Union[ diff --git a/starknet_py/net/schemas/rpc.py b/starknet_py/net/schemas/rpc.py index 03b8e8355..f40cb96b4 100644 --- a/starknet_py/net/schemas/rpc.py +++ b/starknet_py/net/schemas/rpc.py @@ -667,18 +667,20 @@ def get_data_type(self, data): class InvokeTransactionTraceSchema(Schema): - validate_invocation = fields.Nested( - FunctionInvocationSchema(), data_key="validate_invocation", load_default=None - ) execute_invocation = fields.Nested( ExecuteInvocationSchema(), data_key="execute_invocation", required=True ) + validate_invocation = fields.Nested( + FunctionInvocationSchema(), data_key="validate_invocation", load_default=None + ) fee_transfer_invocation = fields.Nested( FunctionInvocationSchema(), data_key="fee_transfer_invocation", load_default=None, ) - state_diff = fields.Nested(StateDiffSchema(), data_key="state_diff", required=True) + state_diff = fields.Nested( + StateDiffSchema(), data_key="state_diff", load_default=None + ) @post_load def make_dataclass(self, data, **kwargs) -> InvokeTransactionTrace: @@ -694,7 +696,9 @@ class DeclareTransactionTraceSchema(Schema): data_key="fee_transfer_invocation", load_default=None, ) - state_diff = fields.Nested(StateDiffSchema(), data_key="state_diff", required=True) + state_diff = fields.Nested( + StateDiffSchema(), data_key="state_diff", load_default=None + ) @post_load def make_dataclass(self, data, **kwargs) -> DeclareTransactionTrace: @@ -702,18 +706,20 @@ def make_dataclass(self, data, **kwargs) -> DeclareTransactionTrace: class DeployAccountTransactionTraceSchema(Schema): - validate_invocation = fields.Nested( - FunctionInvocationSchema(), data_key="validate_invocation", load_default=None - ) constructor_invocation = fields.Nested( FunctionInvocationSchema(), data_key="constructor_invocation", required=True ) + validate_invocation = fields.Nested( + FunctionInvocationSchema(), data_key="validate_invocation", load_default=None + ) fee_transfer_invocation = fields.Nested( FunctionInvocationSchema(), data_key="fee_transfer_invocation", load_default=None, ) - state_diff = fields.Nested(StateDiffSchema(), data_key="state_diff", required=True) + state_diff = fields.Nested( + StateDiffSchema(), data_key="state_diff", load_default=None + ) @post_load def make_dataclass(self, data, **kwargs) -> DeployAccountTransactionTrace: @@ -724,6 +730,9 @@ class L1HandlerTransactionTraceSchema(Schema): function_invocation = fields.Nested( FunctionInvocationSchema(), data_key="function_invocation", required=True ) + state_diff = fields.Nested( + StateDiffSchema(), data_key="state_diff", load_default=None + ) @post_load def make_dataclass(self, data, **kwargs) -> L1HandlerTransactionTrace: diff --git a/starknet_py/tests/e2e/tests_on_networks/trace_api_test.py b/starknet_py/tests/e2e/tests_on_networks/trace_api_test.py index 1a86d1894..8be042641 100644 --- a/starknet_py/tests/e2e/tests_on_networks/trace_api_test.py +++ b/starknet_py/tests/e2e/tests_on_networks/trace_api_test.py @@ -48,8 +48,8 @@ async def test_trace_transaction_invoke(full_node_client_testnet): invoke_tx_hash = 0xDC6B381884866DD6C4ACCDE75AA1FA7506E6B57612D3D3659F7B919EA07D7C trace = await full_node_client_testnet.trace_transaction(tx_hash=invoke_tx_hash) - assert type(trace) == InvokeTransactionTrace - assert trace.state_diff is not None + assert type(trace) is InvokeTransactionTrace + assert trace.execute_invocation is not None @pytest.mark.asyncio @@ -57,8 +57,7 @@ async def test_trace_transaction_declare(full_node_client_testnet): declare_tx_hash = 0x62DD22627065568C6E4BD619C511217456B5A82ACBDEAD7C3B5DFFF92209451 trace = await full_node_client_testnet.trace_transaction(tx_hash=declare_tx_hash) - assert type(trace) == DeclareTransactionTrace - assert trace.state_diff is not None + assert type(trace) is DeclareTransactionTrace @pytest.mark.asyncio @@ -70,8 +69,8 @@ async def test_trace_transaction_deploy_account(full_node_client_testnet): tx_hash=deploy_account_tx_hash ) - assert type(trace) == DeployAccountTransactionTrace - assert trace.state_diff is not None + assert type(trace) is DeployAccountTransactionTrace + assert trace.constructor_invocation is not None @pytest.mark.asyncio @@ -81,7 +80,8 @@ async def test_trace_transaction_l1_handler(full_node_client_testnet): ) trace = await full_node_client_testnet.trace_transaction(tx_hash=l1_handler_tx_hash) - assert type(trace) == L1HandlerTransactionTrace + assert type(trace) is L1HandlerTransactionTrace + assert trace.function_invocation is not None @pytest.mark.asyncio @@ -135,4 +135,3 @@ async def test_simulate_transactions_declare_on_network( assert isinstance(simulated_txs[0].transaction_trace, DeclareTransactionTrace) assert simulated_txs[0].fee_estimation.overall_fee > 0 - assert simulated_txs[0].transaction_trace.validate_invocation is not None From e4d02a5f917dcc863f35ca132bdfa9e3c30b6d2d Mon Sep 17 00:00:00 2001 From: Dariusz Doktorski Date: Fri, 10 Nov 2023 12:47:20 +0100 Subject: [PATCH 2/3] Add missing documentation --- docs/migration_guide.rst | 2 +- starknet_py/hash/address.py | 12 ++++++++++++ starknet_py/net/full_node_client.py | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/migration_guide.rst b/docs/migration_guide.rst index 3a09ba9b2..387f5feea 100644 --- a/docs/migration_guide.rst +++ b/docs/migration_guide.rst @@ -36,7 +36,7 @@ Version 0.18.3 of **starknet.py** comes with support for RPC 0.5.0! 1. :class:`StarknetBlock`, :class:`StarknetBlockWithTxHashes`, :class:`PendingStarknetBlock` and :class:`PendingStarknetBlockWithTxHashes` now have two additional fields: ``starknet_version`` and ``l1_gas_price``. 2. :class:`PendingStarknetBlock` and :class:`PendingStarknetBlockWithTxHashes` fields ``timestamp``, ``sequencer_address`` and ``parent_block_hash`` are now required, not optional. 3. :class:`TransactionReceipt` now has an additional field - ``message_hash`` (for ``L1_HANDLER_TXN_RECEIPT``). -4. All optional fields in ``TransactionTrace`` classes are now required. +4. Most fields in ``TransactionTrace`` classes are now optional. 5. :class:`InvokeTransactionTrace`, :class:`DeclareTransactionTrace` and :class:`DeployAccountTransactionTrace` classes now have an additional field - ``state_diff``. diff --git a/starknet_py/hash/address.py b/starknet_py/hash/address.py index 08765979d..3e4edbae5 100644 --- a/starknet_py/hash/address.py +++ b/starknet_py/hash/address.py @@ -42,6 +42,15 @@ def compute_address( def get_checksum_address(address: str) -> str: + """ + Outputs formatted checksum address. + + Follows implementation of starknet.js. It is not compatible with EIP55 as it treats hex string as encoded number, + instead of encoding it as ASCII string. + + :param address: Address to encode + :return: Checksum address + """ if not address.lower().startswith(HEX_PREFIX): raise ValueError(f"{address} is not a valid hexadecimal address.") @@ -64,4 +73,7 @@ def get_checksum_address(address: str) -> str: def is_checksum_address(address: str) -> bool: + """ + Checks if provided string is in a checksum address format. + """ return get_checksum_address(address) == address diff --git a/starknet_py/net/full_node_client.py b/starknet_py/net/full_node_client.py index de60e583b..7793140fe 100644 --- a/starknet_py/net/full_node_client.py +++ b/starknet_py/net/full_node_client.py @@ -326,6 +326,10 @@ async def get_transaction( return cast(Transaction, TypesOfTransactionsSchema().load(res, unknown=EXCLUDE)) async def get_l1_message_hash(self, tx_hash: Hash) -> Hash: + """ + :param tx_hash: Transaction's hash + :return: Message hash + """ tx = await self.get_transaction(tx_hash) if not isinstance(tx, L1HandlerTransaction): raise TypeError( From 09d0edb6928cb29175ff694e2902852d555a8b14 Mon Sep 17 00:00:00 2001 From: Dariusz Doktorski Date: Fri, 10 Nov 2023 12:57:52 +0100 Subject: [PATCH 3/3] Add missing class in migration guide minor changes --- docs/migration_guide.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/migration_guide.rst b/docs/migration_guide.rst index 387f5feea..f1638fe58 100644 --- a/docs/migration_guide.rst +++ b/docs/migration_guide.rst @@ -37,7 +37,7 @@ Version 0.18.3 of **starknet.py** comes with support for RPC 0.5.0! 2. :class:`PendingStarknetBlock` and :class:`PendingStarknetBlockWithTxHashes` fields ``timestamp``, ``sequencer_address`` and ``parent_block_hash`` are now required, not optional. 3. :class:`TransactionReceipt` now has an additional field - ``message_hash`` (for ``L1_HANDLER_TXN_RECEIPT``). 4. Most fields in ``TransactionTrace`` classes are now optional. -5. :class:`InvokeTransactionTrace`, :class:`DeclareTransactionTrace` and :class:`DeployAccountTransactionTrace` classes now have an additional field - ``state_diff``. +5. :class:`InvokeTransactionTrace`, :class:`DeclareTransactionTrace`, :class:`DeployAccountTransactionTrace` and :class:`L1HandlerTransactionTrace` classes now have an additional field - ``state_diff``. |