Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 3a2cc1f

Browse files
edg-lfannyguthmann
authored andcommitted
refactor/ fix TryFrom InvokeTransaction into a standalone method on InvokeFunction (#999)
* refactor and fix TryFrom InvokeTransaction into a standalone method on InvokeFunction * document * fix
1 parent e438e08 commit 3a2cc1f

File tree

1 file changed

+98
-22
lines changed

1 file changed

+98
-22
lines changed

src/transaction/invoke_function.rs

Lines changed: 98 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use 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::{
2020
use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType;
2121
use cairo_vm::felt::Felt252;
2222
use getset::Getters;
23-
use num_traits::{One, Zero};
23+
use num_traits::Zero;
2424

2525
use 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

407423
fn 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

445461
fn 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)]
495498
mod 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

Comments
 (0)