Skip to content

Commit 1b9478f

Browse files
authored
Add parsed_abi property to SierraContractClass (#1313)
* Add parsed_abi property to SierraContractClass
1 parent 0a2cbf2 commit 1b9478f

File tree

7 files changed

+54
-17
lines changed

7 files changed

+54
-17
lines changed

docs/migration_guide.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Version 0.21.0 of **starknet.py** comes with support for RPC 0.7.0-rc2!
3131
3. :class:`InvokeTransactionTrace`, :class:`DeclareTransactionTrace` and :class:`DeployAccountTransactionTrace` have a new required field ``execution_resources``
3232
4. :class:`EstimatedFee` has new required fields ``data_gas_consumed`` and ``data_gas_price``
3333
5. :class:`StarknetBlock`, :class:`PendingStarknetBlock`, :class:`StarknetBlockWithTxHashes`, :class:`PendingStarknetBlockWithTxHashes` have new required fields ``l1_data_gas_price`` and ``l1_da_mode``
34+
6. :class:`SierraContractClass` has an additional propery ``parsed_abi``
3435

3536
**********************
3637
0.20.0 Migration guide

starknet_py/contract.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
import dataclasses
4-
import json
54
from abc import ABC, abstractmethod
65
from dataclasses import dataclass
76
from functools import cached_property
@@ -280,7 +279,8 @@ def _get_abi(self) -> List:
280279
sierra_compiled_contract = create_sierra_compiled_contract(
281280
compiled_contract=self.compiled_contract
282281
)
283-
abi = json.loads(sierra_compiled_contract.abi)
282+
abi = sierra_compiled_contract.parsed_abi
283+
284284
except Exception as exc:
285285
raise ValueError(
286286
"Contract's ABI can't be converted to format List[Dict]. "

starknet_py/net/client_models.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,28 @@
33
They need to stay backwards compatible for old transactions/blocks to be fetchable.
44
"""
55

6+
import json
67
from abc import ABC
78
from dataclasses import dataclass, field
89
from enum import Enum
9-
from typing import Any, Iterable, List, Optional, Union
10+
from typing import Any, Iterable, List, Literal, Optional, Union, cast
1011

11-
from typing_extensions import Literal
12+
from marshmallow import EXCLUDE
1213

1314
from starknet_py.abi.v0.shape import AbiDictList
15+
from starknet_py.abi.v1.schemas import (
16+
ContractAbiEntrySchema as ContractAbiEntrySchemaV1,
17+
)
18+
from starknet_py.abi.v1.shape import AbiDictEntry as AbiDictEntryV1
19+
from starknet_py.abi.v1.shape import AbiDictList as AbiDictListV1
20+
from starknet_py.abi.v2.schemas import (
21+
ContractAbiEntrySchema as ContractAbiEntrySchemaV2,
22+
)
23+
from starknet_py.abi.v2.shape import AbiDictEntry as AbiDictEntryV2
24+
from starknet_py.abi.v2.shape import AbiDictList as AbiDictListV2
25+
from starknet_py.utils.constructor_args_translator import _is_abi_v2
26+
27+
# pylint: disable=too-many-lines
1428

1529
Hash = Union[int, str]
1630
Tag = Literal["pending", "latest"]
@@ -764,6 +778,27 @@ class SierraContractClass:
764778
entry_points_by_type: SierraEntryPointsByType
765779
abi: Optional[str] = None
766780

781+
@property
782+
def parsed_abi(self) -> Union[AbiDictListV2, AbiDictListV1]:
783+
if self.abi is None:
784+
return []
785+
786+
load_abi: List = json.loads(self.abi)
787+
788+
if _is_abi_v2(load_abi):
789+
return [
790+
cast(
791+
AbiDictEntryV2,
792+
ContractAbiEntrySchemaV2(unknown=EXCLUDE).load(entry),
793+
)
794+
for entry in load_abi
795+
]
796+
797+
return [
798+
cast(AbiDictEntryV1, ContractAbiEntrySchemaV1(unknown=EXCLUDE).load(entry))
799+
for entry in load_abi
800+
]
801+
767802

768803
@dataclass
769804
class SierraCompiledContract(SierraContractClass):

starknet_py/tests/e2e/client/client_test.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@ async def test_get_class_by_hash_sierra_program(
534534
class_hash=cairo1_hello_starknet_class_hash
535535
)
536536

537+
assert isinstance(contract_class.parsed_abi, list)
537538
assert isinstance(contract_class, SierraContractClass)
538539
assert contract_class.contract_class_version == "0.1.0"
539540
assert isinstance(contract_class.sierra_program, list)

starknet_py/tests/e2e/contract_interaction/deploy_test.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import dataclasses
2-
import json
32
import re
43
from unittest.mock import Mock
54

@@ -97,12 +96,14 @@ async def test_throws_on_wrong_abi(account, cairo1_minimal_contract_class_hash:
9796
@pytest.mark.asyncio
9897
async def test_deploy_contract_v1(account, cairo1_hello_starknet_class_hash: int):
9998
compiled_contract = read_contract("hello_starknet_compiled.json")
100-
abi = create_sierra_compiled_contract(compiled_contract=compiled_contract).abi
99+
abi = create_sierra_compiled_contract(
100+
compiled_contract=compiled_contract
101+
).parsed_abi
101102

102103
deploy_result = await Contract.deploy_contract_v1(
103104
class_hash=cairo1_hello_starknet_class_hash,
104105
account=account,
105-
abi=json.loads(abi),
106+
abi=abi,
106107
max_fee=MAX_FEE,
107108
cairo_version=1,
108109
)
@@ -125,12 +126,14 @@ async def test_deploy_contract_v1(account, cairo1_hello_starknet_class_hash: int
125126
@pytest.mark.asyncio
126127
async def test_deploy_contract_v3(account, cairo1_hello_starknet_class_hash: int):
127128
compiled_contract = read_contract("hello_starknet_compiled.json")
128-
abi = create_sierra_compiled_contract(compiled_contract=compiled_contract).abi
129+
abi = create_sierra_compiled_contract(
130+
compiled_contract=compiled_contract
131+
).parsed_abi
129132

130133
deploy_result = await Contract.deploy_contract_v3(
131134
class_hash=cairo1_hello_starknet_class_hash,
132135
account=account,
133-
abi=json.loads(abi),
136+
abi=abi,
134137
l1_resource_bounds=MAX_RESOURCE_BOUNDS_L1,
135138
cairo_version=1,
136139
)

starknet_py/tests/e2e/docs/guide/test_simple_deploy_cairo1.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import json
21
import sys
32

43
import pytest
@@ -28,7 +27,9 @@ async def test_simple_deploy_cairo1(account, cairo1_erc20_class_hash):
2827
class_hash = cairo1_erc20_class_hash
2928

3029
# docs: start
31-
abi = create_sierra_compiled_contract(compiled_contract=compiled_contract).abi
30+
abi = create_sierra_compiled_contract(
31+
compiled_contract=compiled_contract
32+
).parsed_abi
3233

3334
constructor_args = {
3435
"name_": encode_shortstring("erc20_basic"),
@@ -41,7 +42,7 @@ async def test_simple_deploy_cairo1(account, cairo1_erc20_class_hash):
4142
deploy_result = await Contract.deploy_contract_v1(
4243
account=account,
4344
class_hash=class_hash,
44-
abi=json.loads(abi),
45+
abi=abi,
4546
constructor_args=constructor_args,
4647
max_fee=int(1e16),
4748
cairo_version=1, # note the `cairo_version` parameter

starknet_py/tests/e2e/fixtures/contracts.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# pylint: disable=redefined-outer-name
2-
import json
32
from typing import Any, Dict, List, Optional, Tuple
43

54
import pytest
@@ -139,10 +138,7 @@ async def deploy_v1_contract(
139138
:returns: Instance of the deployed contract.
140139
"""
141140
contract_sierra = read_contract(contract_file_name + "_compiled.json")
142-
sierra_compiled_contract = create_sierra_compiled_contract(
143-
compiled_contract=contract_sierra
144-
)
145-
abi = json.loads(sierra_compiled_contract.abi)
141+
abi = create_sierra_compiled_contract(compiled_contract=contract_sierra).parsed_abi
146142

147143
deployer = Deployer()
148144
deploy_call, address = deployer.create_contract_deployment(

0 commit comments

Comments
 (0)