Skip to content

Commit 295934b

Browse files
add cairo_version to execute to support cairo1 calls encoding (#1165)
* add execute_v2 to support cairo1 calls encoding * Fixed lint error * serialize calldata * removed duplicate _v2 functions and added cairo_version paramater * Format account.py --------- Co-authored-by: Tomasz Miśkowicz <tomasz.miskowicz@swmansion.com>
1 parent bf42db4 commit 295934b

File tree

1 file changed

+49
-6
lines changed

1 file changed

+49
-6
lines changed

starknet_py/net/account/account.py

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ async def _prepare_invoke(
137137
nonce: Optional[int] = None,
138138
max_fee: Optional[int] = None,
139139
auto_estimate: bool = False,
140+
cairo_version: int = 0,
140141
) -> Invoke:
141142
"""
142143
Takes calls and creates Invoke from them.
@@ -149,10 +150,16 @@ async def _prepare_invoke(
149150
if nonce is None:
150151
nonce = await self.get_nonce()
151152

152-
call_descriptions, calldata = _merge_calls(ensure_iterable(calls))
153-
wrapped_calldata = _execute_payload_serializer.serialize(
154-
{"call_array": call_descriptions, "calldata": calldata}
155-
)
153+
if cairo_version == 1:
154+
parsed_calls = _parse_calls_v2(ensure_iterable(calls))
155+
wrapped_calldata = _execute_payload_serializer_v2.serialize(
156+
{"calls": parsed_calls}
157+
)
158+
else:
159+
call_descriptions, calldata = _merge_calls(ensure_iterable(calls))
160+
wrapped_calldata = _execute_payload_serializer.serialize(
161+
{"call_array": call_descriptions, "calldata": calldata}
162+
)
156163

157164
transaction = Invoke(
158165
calldata=wrapped_calldata,
@@ -246,9 +253,14 @@ async def sign_invoke_transaction(
246253
nonce: Optional[int] = None,
247254
max_fee: Optional[int] = None,
248255
auto_estimate: bool = False,
256+
cairo_version: int = 0,
249257
) -> Invoke:
250258
execute_tx = await self._prepare_invoke(
251-
calls, nonce=nonce, max_fee=max_fee, auto_estimate=auto_estimate
259+
calls,
260+
nonce=nonce,
261+
max_fee=max_fee,
262+
auto_estimate=auto_estimate,
263+
cairo_version=cairo_version,
252264
)
253265
signature = self.signer.sign_transaction(execute_tx)
254266
return _add_signature_to_transaction(execute_tx, signature)
@@ -375,9 +387,14 @@ async def execute(
375387
nonce: Optional[int] = None,
376388
max_fee: Optional[int] = None,
377389
auto_estimate: bool = False,
390+
cairo_version: int = 0,
378391
) -> SentTransactionResponse:
379392
execute_transaction = await self.sign_invoke_transaction(
380-
calls, nonce=nonce, max_fee=max_fee, auto_estimate=auto_estimate
393+
calls,
394+
nonce=nonce,
395+
max_fee=max_fee,
396+
auto_estimate=auto_estimate,
397+
cairo_version=cairo_version,
381398
)
382399
return await self._client.send_transaction(execute_transaction)
383400

@@ -529,6 +546,19 @@ def _merge_calls(calls: Iterable[Call]) -> Tuple[List[Dict], List[int]]:
529546
return call_descriptions, entire_calldata
530547

531548

549+
def _parse_calls_v2(calls: Iterable[Call]) -> List[Dict]:
550+
calls_parsed = []
551+
for call in calls:
552+
_data = {
553+
"to": call.to_addr,
554+
"selector": call.selector,
555+
"calldata": call.calldata,
556+
}
557+
calls_parsed.append(_data)
558+
559+
return calls_parsed
560+
561+
532562
_felt_serializer = FeltSerializer()
533563
_call_description = StructSerializer(
534564
OrderedDict(
@@ -538,9 +568,22 @@ def _merge_calls(calls: Iterable[Call]) -> Tuple[List[Dict], List[int]]:
538568
data_len=_felt_serializer,
539569
)
540570
)
571+
_call_description_v2 = StructSerializer(
572+
OrderedDict(
573+
to=_felt_serializer,
574+
selector=_felt_serializer,
575+
calldata=ArraySerializer(_felt_serializer),
576+
)
577+
)
578+
541579
_execute_payload_serializer = PayloadSerializer(
542580
OrderedDict(
543581
call_array=ArraySerializer(_call_description),
544582
calldata=ArraySerializer(_felt_serializer),
545583
)
546584
)
585+
_execute_payload_serializer_v2 = PayloadSerializer(
586+
OrderedDict(
587+
calls=ArraySerializer(_call_description_v2),
588+
)
589+
)

0 commit comments

Comments
 (0)