11use crate :: {
22 core:: transaction_hash:: { calculate_transaction_hash_common, TransactionHashPrefix } ,
33 definitions:: {
4- block_context:: BlockContext ,
4+ block_context:: { BlockContext , StarknetChainId } ,
55 constants:: {
66 EXECUTE_ENTRY_POINT_SELECTOR , QUERY_VERSION_BASE , VALIDATE_ENTRY_POINT_SELECTOR ,
77 } ,
@@ -20,7 +20,7 @@ use crate::{
2020use crate :: services:: api:: contract_classes:: deprecated_contract_class:: EntryPointType ;
2121use cairo_vm:: felt:: Felt252 ;
2222use getset:: Getters ;
23- use num_traits:: { One , Zero } ;
23+ use num_traits:: Zero ;
2424
2525use super :: { fee:: charge_fee, Transaction } ;
2626
@@ -120,6 +120,22 @@ impl InvokeFunction {
120120 } )
121121 }
122122
123+ /// Creates a `InvokeFunction` from a starknet api `InvokeTransaction`.
124+ pub fn from_invoke_transaction (
125+ tx : starknet_api:: transaction:: InvokeTransaction ,
126+ chain_id : StarknetChainId ,
127+ version : Felt252 ,
128+ ) -> Result < Self , TransactionError > {
129+ match tx {
130+ starknet_api:: transaction:: InvokeTransaction :: V0 ( v0) => {
131+ convert_invoke_v0 ( v0, chain_id, version)
132+ }
133+ starknet_api:: transaction:: InvokeTransaction :: V1 ( v1) => {
134+ convert_invoke_v1 ( v1, chain_id, version)
135+ }
136+ }
137+ }
138+
123139 fn get_execution_context (
124140 & self ,
125141 n_steps : u64 ,
@@ -406,15 +422,15 @@ pub(crate) fn preprocess_invoke_function_fields(
406422
407423fn convert_invoke_v0 (
408424 value : starknet_api:: transaction:: InvokeTransactionV0 ,
425+ chain_id : StarknetChainId ,
426+ version : Felt252 ,
409427) -> Result < InvokeFunction , TransactionError > {
410428 let contract_address = Address ( Felt252 :: from_bytes_be (
411429 value. contract_address . 0 . key ( ) . bytes ( ) ,
412430 ) ) ;
413431 let max_fee = value. max_fee . 0 ;
414432 let entry_point_selector = Felt252 :: from_bytes_be ( value. entry_point_selector . 0 . bytes ( ) ) ;
415- let version = Felt252 :: zero ( ) ;
416433 let nonce = None ;
417- let chain_id = Felt252 :: zero ( ) ;
418434
419435 let signature = value
420436 . signature
@@ -437,19 +453,19 @@ fn convert_invoke_v0(
437453 version,
438454 calldata,
439455 signature,
440- chain_id,
456+ chain_id. to_felt ( ) ,
441457 nonce,
442458 )
443459}
444460
445461fn convert_invoke_v1 (
446462 value : starknet_api:: transaction:: InvokeTransactionV1 ,
463+ chain_id : StarknetChainId ,
464+ version : Felt252 ,
447465) -> Result < InvokeFunction , TransactionError > {
448466 let contract_address = Address ( Felt252 :: from_bytes_be ( value. sender_address . 0 . key ( ) . bytes ( ) ) ) ;
449467 let max_fee = value. max_fee . 0 ;
450- let version = Felt252 :: one ( ) ;
451468 let nonce = Felt252 :: from_bytes_be ( value. nonce . 0 . bytes ( ) ) ;
452- let chain_id = Felt252 :: zero ( ) ;
453469 let entry_point_selector = EXECUTE_ENTRY_POINT_SELECTOR . clone ( ) ;
454470
455471 let signature = value
@@ -473,24 +489,11 @@ fn convert_invoke_v1(
473489 version,
474490 calldata,
475491 signature,
476- chain_id,
492+ chain_id. to_felt ( ) ,
477493 Some ( nonce) ,
478494 )
479495}
480496
481- impl TryFrom < starknet_api:: transaction:: InvokeTransaction > for InvokeFunction {
482- type Error = TransactionError ;
483-
484- fn try_from (
485- value : starknet_api:: transaction:: InvokeTransaction ,
486- ) -> Result < Self , TransactionError > {
487- match value {
488- starknet_api:: transaction:: InvokeTransaction :: V0 ( v0) => convert_invoke_v0 ( v0) ,
489- starknet_api:: transaction:: InvokeTransaction :: V1 ( v1) => convert_invoke_v1 ( v1) ,
490- }
491- }
492- }
493-
494497#[ cfg( test) ]
495498mod tests {
496499 use super :: * ;
@@ -503,9 +506,82 @@ mod tests {
503506 utils:: calculate_sn_keccak,
504507 } ;
505508 use cairo_lang_starknet:: casm_contract_class:: CasmContractClass ;
506- use num_traits:: Num ;
509+ use num_traits:: { Num , One } ;
510+ use starknet_api:: {
511+ core:: { ContractAddress , Nonce , PatriciaKey } ,
512+ hash:: { StarkFelt , StarkHash } ,
513+ transaction:: { Fee , InvokeTransaction , InvokeTransactionV1 , TransactionSignature } ,
514+ } ;
507515 use std:: { collections:: HashMap , sync:: Arc } ;
508516
517+ #[ test]
518+ fn test_from_invoke_transaction ( ) {
519+ // https://starkscan.co/tx/0x05b6cf416d56e7c7c519b44e6d06a41657ff6c6a3f2629044fac395e6d200ac4
520+ // result 0x05b6cf416d56e7c7c519b44e6d06a41657ff6c6a3f2629044fac395e6d200ac4
521+ let tx = InvokeTransaction :: V1 ( InvokeTransactionV1 {
522+ sender_address : ContractAddress (
523+ PatriciaKey :: try_from (
524+ StarkHash :: try_from (
525+ "0x00c4658311841a69ce121543af332622bc243cf5593fc4aaf822481c7b7f183d" ,
526+ )
527+ . unwrap ( ) ,
528+ )
529+ . unwrap ( ) ,
530+ ) ,
531+ max_fee : Fee ( 49000000000000 ) ,
532+ signature : TransactionSignature ( vec ! [
533+ StarkFelt :: try_from(
534+ "0x18315db8eb360a82ea11f302d6a6a35a11b9df1dc220ec1376c4d4604770dd4" ,
535+ )
536+ . unwrap( ) ,
537+ StarkFelt :: try_from(
538+ "0x5e8642259ac8e99c84cdf88c17385698150eb11dccfb3036ecc2b97c0903d27" ,
539+ )
540+ . unwrap( ) ,
541+ ] ) ,
542+ nonce : Nonce ( StarkFelt :: from ( 22u32 ) ) ,
543+ calldata : starknet_api:: transaction:: Calldata ( Arc :: new ( vec ! [
544+ StarkFelt :: try_from( "0x1" ) . unwrap( ) ,
545+ StarkFelt :: try_from(
546+ "0x0454f0bd015e730e5adbb4f080b075fdbf55654ff41ee336203aa2e1ac4d4309" ,
547+ )
548+ . unwrap( ) ,
549+ StarkFelt :: try_from(
550+ "0x032a99297e1d12a9b91d4f90d5dd4b160d93c84a9e3b4daa916fec14ec852e05" ,
551+ )
552+ . unwrap( ) ,
553+ StarkFelt :: try_from(
554+ "0x0000000000000000000000000000000000000000000000000000000000000000" ,
555+ )
556+ . unwrap( ) ,
557+ StarkFelt :: try_from(
558+ "0x0000000000000000000000000000000000000000000000000000000000000002" ,
559+ )
560+ . unwrap( ) ,
561+ StarkFelt :: try_from(
562+ "0x0000000000000000000000000000000000000000000000000000000000000002" ,
563+ )
564+ . unwrap( ) ,
565+ StarkFelt :: try_from(
566+ "0x0383538353434346334616431626237363933663435643237376236313461663" ,
567+ )
568+ . unwrap( ) ,
569+ StarkFelt :: try_from(
570+ "0x0393762666334373463313762393535303530383563613961323435643965666" ,
571+ )
572+ . unwrap( ) ,
573+ ] ) ) ,
574+ } ) ;
575+
576+ let tx_sir =
577+ InvokeFunction :: from_invoke_transaction ( tx, StarknetChainId :: MainNet , Felt252 :: one ( ) )
578+ . unwrap ( ) ;
579+ assert_eq ! (
580+ tx_sir. hash_value. to_str_radix( 16 ) ,
581+ "5b6cf416d56e7c7c519b44e6d06a41657ff6c6a3f2629044fac395e6d200ac4"
582+ ) ;
583+ }
584+
509585 #[ test]
510586 fn test_invoke_apply_without_fees ( ) {
511587 let internal_invoke_function = InvokeFunction {
0 commit comments