From 20585f10da1c991b8bda5879d225621ebdad276d Mon Sep 17 00:00:00 2001 From: Milton Date: Tue, 29 Aug 2023 11:33:17 -0300 Subject: [PATCH 01/29] From/TryFrom starknet api types --- src/transaction/mod.rs | 1 + src/transaction/starket_api.rs | 87 ++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/transaction/starket_api.rs diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 645a08b8f..efffd2025 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -6,6 +6,7 @@ pub mod error; pub mod fee; pub mod invoke_function; pub mod l1_handler; +pub mod starket_api; mod verify_version; pub use declare::Declare; diff --git a/src/transaction/starket_api.rs b/src/transaction/starket_api.rs new file mode 100644 index 000000000..c66da5223 --- /dev/null +++ b/src/transaction/starket_api.rs @@ -0,0 +1,87 @@ +use cairo_vm::felt::Felt252; +use num_traits::{One, Zero}; + +use crate::{definitions::constants::EXECUTE_ENTRY_POINT_SELECTOR, utils::Address}; + +use super::InvokeFunction; + +fn convert_v0(value: starknet_api::transaction::InvokeTransactionV0) -> InvokeFunction { + let contract_address = Address(Felt252::from_bytes_be( + value.contract_address.0.key().bytes(), + )); + let max_fee = value.max_fee.0; + let entry_point_selector = Felt252::from_bytes_be(value.entry_point_selector.0.bytes()); + let version = Felt252::zero(); + let nonce = None; + let chain_id = Felt252::zero(); + + let signature = value + .signature + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + let calldata = value + .calldata + .0 + .as_ref() + .into_iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + + InvokeFunction::new( + contract_address, + entry_point_selector, + max_fee, + version, + calldata, + signature, + chain_id, + nonce, + ) + .unwrap() +} + +fn convert_v1(value: starknet_api::transaction::InvokeTransactionV1) -> InvokeFunction { + let contract_address = Address(Felt252::from_bytes_be(value.sender_address.0.key().bytes())); + let max_fee = value.max_fee.0; + let version = Felt252::one(); + let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); + let chain_id = Felt252::zero(); + let entry_point_selector = EXECUTE_ENTRY_POINT_SELECTOR.clone(); + + let signature = value + .signature + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + let calldata = value + .calldata + .0 + .as_ref() + .into_iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + + InvokeFunction::new( + contract_address, + entry_point_selector, + max_fee, + version, + calldata, + signature, + chain_id, + Some(nonce), + ) + .unwrap() +} + +impl From for InvokeFunction { + fn from(value: starknet_api::transaction::InvokeTransaction) -> Self { + match value { + starknet_api::transaction::InvokeTransaction::V0(v0) => convert_v0(v0), + starknet_api::transaction::InvokeTransaction::V1(v1) => convert_v1(v1), + } + } +} From 24b327ed90ba29d8cc4aeca9ea355622bf113d33 Mon Sep 17 00:00:00 2001 From: Milton Date: Tue, 29 Aug 2023 13:48:55 -0300 Subject: [PATCH 02/29] Add deploy account --- src/transaction/starket_api.rs | 66 +++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 5 deletions(-) diff --git a/src/transaction/starket_api.rs b/src/transaction/starket_api.rs index c66da5223..fb1340af8 100644 --- a/src/transaction/starket_api.rs +++ b/src/transaction/starket_api.rs @@ -3,9 +3,9 @@ use num_traits::{One, Zero}; use crate::{definitions::constants::EXECUTE_ENTRY_POINT_SELECTOR, utils::Address}; -use super::InvokeFunction; +use super::{DeployAccount, InvokeFunction}; -fn convert_v0(value: starknet_api::transaction::InvokeTransactionV0) -> InvokeFunction { +fn convert_invoke_v0(value: starknet_api::transaction::InvokeTransactionV0) -> InvokeFunction { let contract_address = Address(Felt252::from_bytes_be( value.contract_address.0.key().bytes(), )); @@ -42,7 +42,7 @@ fn convert_v0(value: starknet_api::transaction::InvokeTransactionV0) -> InvokeFu .unwrap() } -fn convert_v1(value: starknet_api::transaction::InvokeTransactionV1) -> InvokeFunction { +fn convert_invoke_v1(value: starknet_api::transaction::InvokeTransactionV1) -> InvokeFunction { let contract_address = Address(Felt252::from_bytes_be(value.sender_address.0.key().bytes())); let max_fee = value.max_fee.0; let version = Felt252::one(); @@ -80,8 +80,64 @@ fn convert_v1(value: starknet_api::transaction::InvokeTransactionV1) -> InvokeFu impl From for InvokeFunction { fn from(value: starknet_api::transaction::InvokeTransaction) -> Self { match value { - starknet_api::transaction::InvokeTransaction::V0(v0) => convert_v0(v0), - starknet_api::transaction::InvokeTransaction::V1(v1) => convert_v1(v1), + starknet_api::transaction::InvokeTransaction::V0(v0) => convert_invoke_v0(v0), + starknet_api::transaction::InvokeTransaction::V1(v1) => convert_invoke_v1(v1), } } } + +impl From for DeployAccount { + fn from(value: starknet_api::transaction::DeployAccountTransaction) -> Self { + let max_fee = value.max_fee.0; + let version = Felt252::from_bytes_be(value.version.0.bytes()); + let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); + let class_hash: [u8; 32] = value.class_hash.0.bytes().try_into().unwrap(); + let contract_address_salt = Felt252::from_bytes_be(value.contract_address_salt.0.bytes()); + + let signature = value + .signature + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + let constructor_calldata = value + .constructor_calldata + .0 + .as_ref() + .into_iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + + let chain_id = Felt252::zero(); + + DeployAccount::new( + class_hash, + max_fee, + version, + nonce, + constructor_calldata, + signature, + contract_address_salt, + chain_id, + ) + .unwrap() + } +} + +// fn convert_declare_v0(value: starknet_api::transaction::DeclareTransactionV0V1) -> Declare { + +// let sender_address = Felt252::from_bytes_be(value.sender_address.0.key().bytes()); + +// Declare::new(contract_class, chain_id, sender_address, max_fee, version, signature, nonce) +// todo!() +// } + +// impl From for Declare { +// fn from(value: starknet_api::transaction::DeclareTransaction) -> Self { +// match value { +// starknet_api::transaction::DeclareTransaction::V0(v0) => convert_declare_v0(v0), +// starknet_api::transaction::DeclareTransaction::V1(v1) => todo!(), +// starknet_api::transaction::DeclareTransaction::V2(_) => unreachable!(), +// } +// } +// } From 8f62569f1b1625b4f3c2b7e0b05b92dea0bde51b Mon Sep 17 00:00:00 2001 From: Milton Date: Tue, 29 Aug 2023 13:49:42 -0300 Subject: [PATCH 03/29] Modify gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3e25dca32..abb8b256d 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ lcov.info .rusty-hook.toml !/starknet_programs/raw_contract_classes/*.json cairo-*.tar +starknet-pypy-env/ \ No newline at end of file From dc8f5a18d2d5c6f239393cb6ba3422b059c43fb6 Mon Sep 17 00:00:00 2001 From: Milton Date: Tue, 29 Aug 2023 15:46:54 -0300 Subject: [PATCH 04/29] Deploy account and invoke function --- src/transaction/starket_api.rs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/transaction/starket_api.rs b/src/transaction/starket_api.rs index fb1340af8..a2429aa77 100644 --- a/src/transaction/starket_api.rs +++ b/src/transaction/starket_api.rs @@ -123,21 +123,3 @@ impl From for DeployAccount .unwrap() } } - -// fn convert_declare_v0(value: starknet_api::transaction::DeclareTransactionV0V1) -> Declare { - -// let sender_address = Felt252::from_bytes_be(value.sender_address.0.key().bytes()); - -// Declare::new(contract_class, chain_id, sender_address, max_fee, version, signature, nonce) -// todo!() -// } - -// impl From for Declare { -// fn from(value: starknet_api::transaction::DeclareTransaction) -> Self { -// match value { -// starknet_api::transaction::DeclareTransaction::V0(v0) => convert_declare_v0(v0), -// starknet_api::transaction::DeclareTransaction::V1(v1) => todo!(), -// starknet_api::transaction::DeclareTransaction::V2(_) => unreachable!(), -// } -// } -// } From d4491cf87bdff702c8414004888630967964b533 Mon Sep 17 00:00:00 2001 From: Milton Date: Tue, 29 Aug 2023 15:47:57 -0300 Subject: [PATCH 05/29] Change into_iter to iter --- src/transaction/starket_api.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/transaction/starket_api.rs b/src/transaction/starket_api.rs index a2429aa77..313d902e8 100644 --- a/src/transaction/starket_api.rs +++ b/src/transaction/starket_api.rs @@ -25,7 +25,7 @@ fn convert_invoke_v0(value: starknet_api::transaction::InvokeTransactionV0) -> I .calldata .0 .as_ref() - .into_iter() + .iter() .map(|f| Felt252::from_bytes_be(f.bytes())) .collect(); @@ -60,7 +60,7 @@ fn convert_invoke_v1(value: starknet_api::transaction::InvokeTransactionV1) -> I .calldata .0 .as_ref() - .into_iter() + .iter() .map(|f| Felt252::from_bytes_be(f.bytes())) .collect(); @@ -104,7 +104,7 @@ impl From for DeployAccount .constructor_calldata .0 .as_ref() - .into_iter() + .iter() .map(|f| Felt252::from_bytes_be(f.bytes())) .collect(); From 10467c824fba5782d5e932aa99fb4d7f6c5e70ae Mon Sep 17 00:00:00 2001 From: Juan Bono Date: Tue, 29 Aug 2023 17:28:51 -0300 Subject: [PATCH 06/29] Update .gitignore Co-authored-by: fmoletta <99273364+fmoletta@users.noreply.github.com> --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index abb8b256d..36bae6551 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,4 @@ lcov.info .rusty-hook.toml !/starknet_programs/raw_contract_classes/*.json cairo-*.tar -starknet-pypy-env/ \ No newline at end of file +starknet-pypy-env/ From 4b16b7bd1901ed076dcb621dd5f5954dba92ece9 Mon Sep 17 00:00:00 2001 From: Milton Date: Tue, 29 Aug 2023 17:46:42 -0300 Subject: [PATCH 07/29] change to try_from --- src/transaction/starket_api.rs | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/transaction/starket_api.rs b/src/transaction/starket_api.rs index 313d902e8..30ce91a4e 100644 --- a/src/transaction/starket_api.rs +++ b/src/transaction/starket_api.rs @@ -1,11 +1,16 @@ use cairo_vm::felt::Felt252; use num_traits::{One, Zero}; -use crate::{definitions::constants::EXECUTE_ENTRY_POINT_SELECTOR, utils::Address}; +use crate::{ + definitions::constants::EXECUTE_ENTRY_POINT_SELECTOR, + syscalls::syscall_handler_errors::SyscallHandlerError, utils::Address, +}; -use super::{DeployAccount, InvokeFunction}; +use super::{error::TransactionError, DeployAccount, InvokeFunction}; -fn convert_invoke_v0(value: starknet_api::transaction::InvokeTransactionV0) -> InvokeFunction { +fn convert_invoke_v0( + value: starknet_api::transaction::InvokeTransactionV0, +) -> Result { let contract_address = Address(Felt252::from_bytes_be( value.contract_address.0.key().bytes(), )); @@ -39,10 +44,11 @@ fn convert_invoke_v0(value: starknet_api::transaction::InvokeTransactionV0) -> I chain_id, nonce, ) - .unwrap() } -fn convert_invoke_v1(value: starknet_api::transaction::InvokeTransactionV1) -> InvokeFunction { +fn convert_invoke_v1( + value: starknet_api::transaction::InvokeTransactionV1, +) -> Result { let contract_address = Address(Felt252::from_bytes_be(value.sender_address.0.key().bytes())); let max_fee = value.max_fee.0; let version = Felt252::one(); @@ -74,11 +80,14 @@ fn convert_invoke_v1(value: starknet_api::transaction::InvokeTransactionV1) -> I chain_id, Some(nonce), ) - .unwrap() } -impl From for InvokeFunction { - fn from(value: starknet_api::transaction::InvokeTransaction) -> Self { +impl TryFrom for InvokeFunction { + type Error = TransactionError; + + fn try_from( + value: starknet_api::transaction::InvokeTransaction, + ) -> Result { match value { starknet_api::transaction::InvokeTransaction::V0(v0) => convert_invoke_v0(v0), starknet_api::transaction::InvokeTransaction::V1(v1) => convert_invoke_v1(v1), @@ -86,8 +95,12 @@ impl From for InvokeFunction { } } -impl From for DeployAccount { - fn from(value: starknet_api::transaction::DeployAccountTransaction) -> Self { +impl TryFrom for DeployAccount { + type Error = SyscallHandlerError; + + fn try_from( + value: starknet_api::transaction::DeployAccountTransaction, + ) -> Result { let max_fee = value.max_fee.0; let version = Felt252::from_bytes_be(value.version.0.bytes()); let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); @@ -120,6 +133,5 @@ impl From for DeployAccount contract_address_salt, chain_id, ) - .unwrap() } } From f40fad6682daf9d9d1468970794962726093f649 Mon Sep 17 00:00:00 2001 From: Milton Date: Tue, 29 Aug 2023 18:04:05 -0300 Subject: [PATCH 08/29] Move functions to its respective files --- .gitignore | 2 +- src/transaction/deploy_account.rs | 45 ++++++++++ src/transaction/invoke_function.rs | 93 +++++++++++++++++++- src/transaction/mod.rs | 1 - src/transaction/starket_api.rs | 137 ----------------------------- 5 files changed, 138 insertions(+), 140 deletions(-) delete mode 100644 src/transaction/starket_api.rs diff --git a/.gitignore b/.gitignore index 36bae6551..abb8b256d 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,4 @@ lcov.info .rusty-hook.toml !/starknet_programs/raw_contract_classes/*.json cairo-*.tar -starknet-pypy-env/ +starknet-pypy-env/ \ No newline at end of file diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 2833004e1..2f45ab9c6 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -383,6 +383,51 @@ impl DeployAccount { } } +// ---------------------------------- +// Try from starknet api +// ---------------------------------- + +impl TryFrom for DeployAccount { + type Error = SyscallHandlerError; + + fn try_from( + value: starknet_api::transaction::DeployAccountTransaction, + ) -> Result { + let max_fee = value.max_fee.0; + let version = Felt252::from_bytes_be(value.version.0.bytes()); + let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); + let class_hash: [u8; 32] = value.class_hash.0.bytes().try_into().unwrap(); + let contract_address_salt = Felt252::from_bytes_be(value.contract_address_salt.0.bytes()); + + let signature = value + .signature + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + let constructor_calldata = value + .constructor_calldata + .0 + .as_ref() + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + + let chain_id = Felt252::zero(); + + DeployAccount::new( + class_hash, + max_fee, + version, + nonce, + constructor_calldata, + signature, + contract_address_salt, + chain_id, + ) + } +} + #[cfg(test)] mod tests { use std::{path::PathBuf, sync::Arc}; diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index f4ec8a579..6e2a5f847 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -20,7 +20,7 @@ use crate::{ use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use cairo_vm::felt::Felt252; use getset::Getters; -use num_traits::Zero; +use num_traits::{One, Zero}; use super::{fee::charge_fee, Transaction}; @@ -397,6 +397,97 @@ pub(crate) fn preprocess_invoke_function_fields( } } +// ---------------------------------- +// Try from starknet api +// ---------------------------------- + +fn convert_invoke_v0( + value: starknet_api::transaction::InvokeTransactionV0, +) -> Result { + let contract_address = Address(Felt252::from_bytes_be( + value.contract_address.0.key().bytes(), + )); + let max_fee = value.max_fee.0; + let entry_point_selector = Felt252::from_bytes_be(value.entry_point_selector.0.bytes()); + let version = Felt252::zero(); + let nonce = None; + let chain_id = Felt252::zero(); + + let signature = value + .signature + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + let calldata = value + .calldata + .0 + .as_ref() + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + + InvokeFunction::new( + contract_address, + entry_point_selector, + max_fee, + version, + calldata, + signature, + chain_id, + nonce, + ) +} + +fn convert_invoke_v1( + value: starknet_api::transaction::InvokeTransactionV1, +) -> Result { + let contract_address = Address(Felt252::from_bytes_be(value.sender_address.0.key().bytes())); + let max_fee = value.max_fee.0; + let version = Felt252::one(); + let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); + let chain_id = Felt252::zero(); + let entry_point_selector = EXECUTE_ENTRY_POINT_SELECTOR.clone(); + + let signature = value + .signature + .0 + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + let calldata = value + .calldata + .0 + .as_ref() + .iter() + .map(|f| Felt252::from_bytes_be(f.bytes())) + .collect(); + + InvokeFunction::new( + contract_address, + entry_point_selector, + max_fee, + version, + calldata, + signature, + chain_id, + Some(nonce), + ) +} + +impl TryFrom for InvokeFunction { + type Error = TransactionError; + + fn try_from( + value: starknet_api::transaction::InvokeTransaction, + ) -> Result { + match value { + starknet_api::transaction::InvokeTransaction::V0(v0) => convert_invoke_v0(v0), + starknet_api::transaction::InvokeTransaction::V1(v1) => convert_invoke_v1(v1), + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index efffd2025..645a08b8f 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -6,7 +6,6 @@ pub mod error; pub mod fee; pub mod invoke_function; pub mod l1_handler; -pub mod starket_api; mod verify_version; pub use declare::Declare; diff --git a/src/transaction/starket_api.rs b/src/transaction/starket_api.rs deleted file mode 100644 index 30ce91a4e..000000000 --- a/src/transaction/starket_api.rs +++ /dev/null @@ -1,137 +0,0 @@ -use cairo_vm::felt::Felt252; -use num_traits::{One, Zero}; - -use crate::{ - definitions::constants::EXECUTE_ENTRY_POINT_SELECTOR, - syscalls::syscall_handler_errors::SyscallHandlerError, utils::Address, -}; - -use super::{error::TransactionError, DeployAccount, InvokeFunction}; - -fn convert_invoke_v0( - value: starknet_api::transaction::InvokeTransactionV0, -) -> Result { - let contract_address = Address(Felt252::from_bytes_be( - value.contract_address.0.key().bytes(), - )); - let max_fee = value.max_fee.0; - let entry_point_selector = Felt252::from_bytes_be(value.entry_point_selector.0.bytes()); - let version = Felt252::zero(); - let nonce = None; - let chain_id = Felt252::zero(); - - let signature = value - .signature - .0 - .iter() - .map(|f| Felt252::from_bytes_be(f.bytes())) - .collect(); - let calldata = value - .calldata - .0 - .as_ref() - .iter() - .map(|f| Felt252::from_bytes_be(f.bytes())) - .collect(); - - InvokeFunction::new( - contract_address, - entry_point_selector, - max_fee, - version, - calldata, - signature, - chain_id, - nonce, - ) -} - -fn convert_invoke_v1( - value: starknet_api::transaction::InvokeTransactionV1, -) -> Result { - let contract_address = Address(Felt252::from_bytes_be(value.sender_address.0.key().bytes())); - let max_fee = value.max_fee.0; - let version = Felt252::one(); - let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); - let chain_id = Felt252::zero(); - let entry_point_selector = EXECUTE_ENTRY_POINT_SELECTOR.clone(); - - let signature = value - .signature - .0 - .iter() - .map(|f| Felt252::from_bytes_be(f.bytes())) - .collect(); - let calldata = value - .calldata - .0 - .as_ref() - .iter() - .map(|f| Felt252::from_bytes_be(f.bytes())) - .collect(); - - InvokeFunction::new( - contract_address, - entry_point_selector, - max_fee, - version, - calldata, - signature, - chain_id, - Some(nonce), - ) -} - -impl TryFrom for InvokeFunction { - type Error = TransactionError; - - fn try_from( - value: starknet_api::transaction::InvokeTransaction, - ) -> Result { - match value { - starknet_api::transaction::InvokeTransaction::V0(v0) => convert_invoke_v0(v0), - starknet_api::transaction::InvokeTransaction::V1(v1) => convert_invoke_v1(v1), - } - } -} - -impl TryFrom for DeployAccount { - type Error = SyscallHandlerError; - - fn try_from( - value: starknet_api::transaction::DeployAccountTransaction, - ) -> Result { - let max_fee = value.max_fee.0; - let version = Felt252::from_bytes_be(value.version.0.bytes()); - let nonce = Felt252::from_bytes_be(value.nonce.0.bytes()); - let class_hash: [u8; 32] = value.class_hash.0.bytes().try_into().unwrap(); - let contract_address_salt = Felt252::from_bytes_be(value.contract_address_salt.0.bytes()); - - let signature = value - .signature - .0 - .iter() - .map(|f| Felt252::from_bytes_be(f.bytes())) - .collect(); - let constructor_calldata = value - .constructor_calldata - .0 - .as_ref() - .iter() - .map(|f| Felt252::from_bytes_be(f.bytes())) - .collect(); - - let chain_id = Felt252::zero(); - - DeployAccount::new( - class_hash, - max_fee, - version, - nonce, - constructor_calldata, - signature, - contract_address_salt, - chain_id, - ) - } -} From 5ce80fbab66165332d0ffd43bc49c0fdfbce6b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Wed, 30 Aug 2023 11:24:35 -0300 Subject: [PATCH 09/29] WIP Added SIR support to SNRPC --- Cargo.lock | 1 + rpc_state_reader_sn_api/Cargo.toml | 1 + rpc_state_reader_sn_api/src/lib.rs | 260 +++++++++++++++++++++++++---- 3 files changed, 226 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fbf90ed9e..0cdf271e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3139,6 +3139,7 @@ dependencies = [ "serde_with 3.1.0", "starknet", "starknet_api 0.4.1", + "starknet_in_rust", "thiserror", "ureq", ] diff --git a/rpc_state_reader_sn_api/Cargo.toml b/rpc_state_reader_sn_api/Cargo.toml index ba20520ba..7b9612204 100644 --- a/rpc_state_reader_sn_api/Cargo.toml +++ b/rpc_state_reader_sn_api/Cargo.toml @@ -22,3 +22,4 @@ serde_with = "3.0.0" dotenv = "0.15.0" cairo-vm = "0.8.5" blockifier = "0.2.0-rc0" +starknet_in_rust = { path = "../", version = "0.3.1" } diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index ef1c81d4a..3a64ce360 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -432,10 +432,7 @@ impl RpcState { } } - pub fn get_contract_class( - &self, - class_hash: &starknet_api::core::ClassHash, - ) -> BlockifierContractClass { + pub fn get_contract_class(&self, class_hash: &ClassHash) -> SNContractClass { let params = ureq::json!({ "jsonrpc": "2.0", "method": "starknet_getClass", @@ -443,37 +440,7 @@ impl RpcState { "id": 1 }); - let response = self.rpc_call_result(¶ms).unwrap(); - - match response { - SNContractClass::Legacy(compressed_legacy_cc) => { - let as_str = utils::decode_reader(compressed_legacy_cc.program).unwrap(); - let program = Program::from_bytes(as_str.as_bytes(), None).unwrap(); - let entry_points_by_type = utils::map_entry_points_by_type_legacy( - compressed_legacy_cc.entry_points_by_type, - ); - let inner = Arc::new(ContractClassV0Inner { - program, - entry_points_by_type, - }); - BlockifierContractClass::V0(ContractClassV0(inner)) - } - SNContractClass::Sierra(flattened_sierra_cc) => { - let middle_sierra: utils::MiddleSierraContractClass = { - let v = serde_json::to_value(flattened_sierra_cc).unwrap(); - serde_json::from_value(v).unwrap() - }; - let sierra_cc = SierraContractClass { - sierra_program: middle_sierra.sierra_program, - contract_class_version: middle_sierra.contract_class_version, - entry_points_by_type: middle_sierra.entry_points_by_type, - sierra_program_debug_info: None, - abi: None, - }; - let casm_cc = CasmContractClass::from_contract_class(sierra_cc, false).unwrap(); - BlockifierContractClass::V1(casm_cc.try_into().unwrap()) - } - } + self.rpc_call_result(¶ms).unwrap() } pub fn get_class_hash_at(&self, contract_address: &ContractAddress) -> ClassHash { @@ -882,7 +849,35 @@ mod blockifier_transaction_tests { &mut self, class_hash: &ClassHash, ) -> StateResult { - Ok(self.0.get_contract_class(class_hash)) + Ok(match self.0.get_contract_class(class_hash) { + SNContractClass::Legacy(compressed_legacy_cc) => { + let as_str = utils::decode_reader(compressed_legacy_cc.program).unwrap(); + let program = Program::from_bytes(as_str.as_bytes(), None).unwrap(); + let entry_points_by_type = utils::map_entry_points_by_type_legacy( + compressed_legacy_cc.entry_points_by_type, + ); + let inner = Arc::new(ContractClassV0Inner { + program, + entry_points_by_type, + }); + BlockifierContractClass::V0(ContractClassV0(inner)) + } + SNContractClass::Sierra(flattened_sierra_cc) => { + let middle_sierra: utils::MiddleSierraContractClass = { + let v = serde_json::to_value(flattened_sierra_cc).unwrap(); + serde_json::from_value(v).unwrap() + }; + let sierra_cc = SierraContractClass { + sierra_program: middle_sierra.sierra_program, + contract_class_version: middle_sierra.contract_class_version, + entry_points_by_type: middle_sierra.entry_points_by_type, + sierra_program_debug_info: None, + abi: None, + }; + let casm_cc = CasmContractClass::from_contract_class(sierra_cc, false).unwrap(); + BlockifierContractClass::V1(casm_cc.try_into().unwrap()) + } + }) } /// Returns the compiled class hash of the given class hash. @@ -1030,3 +1025,196 @@ mod blockifier_transaction_tests { } } } + +mod starknet_in_rust_transaction_tests { + use cairo_vm::felt::Felt252; + use starknet_api::{ + contract_address, + core::{CompiledClassHash, Nonce, PatriciaKey}, + patricia_key, stark_felt, + transaction::TransactionHash, + }; + use starknet_in_rust::{ + core::errors::state_errors::StateError, + services::api::contract_classes::compiled_class::CompiledClass, + state::{state_api::StateReader, state_cache::StorageEntry}, + utils::{Address, ClassHash}, + }; + + use super::*; + + pub struct RpcStateReader(RpcState); + + impl StateReader for RpcStateReader { + fn get_contract_class(&self, class_hash: &ClassHash) -> Result { + let hash = ClassHash(StarkHash::new(class_hash.clone()).unwrap()); + Ok(CompiledClass::from(self.0.get_contract_class(&hash))) + } + + fn get_class_hash_at(&self, contract_address: &Address) -> Result { + let address = ContractAddress( + PatriciaKey::try_from( + StarkHash::new(contract_address.clone().0.to_be_bytes()).unwrap(), + ) + .unwrap(), + ); + let mut bytes = [0u8; 32]; + bytes.copy_from_slice(self.0.get_class_hash_at(&address).0.bytes()); + Ok(bytes) + } + + fn get_nonce_at(&self, contract_address: &Address) -> Result { + let address = ContractAddress( + PatriciaKey::try_from( + StarkHash::new(contract_address.clone().0.to_be_bytes()).unwrap(), + ) + .unwrap(), + ); + let bytes = self.0.get_nonce_at(&address).bytes(); + Ok(Felt252::from_bytes_be(bytes)) + } + fn get_storage_at(&self, storage_entry: &StorageEntry) -> Result { + let (contract_address, key) = storage_entry; + let address = ContractAddress( + PatriciaKey::try_from( + StarkHash::new(contract_address.clone().0.to_be_bytes()).unwrap(), + ) + .unwrap(), + ); + let key = + StorageKey(PatriciaKey::try_from(StarkHash::new(key.clone()).unwrap()).unwrap()); + let bytes = self.0.get_storage_at(&address, &key).bytes(); + Ok(Felt252::from_bytes_be(bytes)) + } + fn get_compiled_class_hash( + &self, + class_hash: &ClassHash, + ) -> Result { + Ok(self.0.get_class_hash_at(contract_address).0) + } + } + + #[allow(unused)] + pub fn execute_tx( + tx_hash: &str, + network: RpcChain, + block_number: BlockNumber, + gas_price: u128, + ) -> ( + TransactionExecutionInfo, + TransactionTrace, + RpcTransactionReceipt, + ) { + let tx_hash = tx_hash.strip_prefix("0x").unwrap(); + + // Instantiate the RPC StateReader and the CachedState + let rpc_reader = RpcStateReader(RpcState::new(network, block_number.into())); + + // Get values for block context before giving ownership of the reader + let chain_id = rpc_reader.0.get_chain_name(); + let RpcBlockInfo { + block_number, + block_timestamp, + sequencer_address, + } = rpc_reader.0.get_block_info(); + + // Get transaction before giving ownership of the reader + let tx_hash = TransactionHash(stark_felt!(tx_hash)); + let sn_api_tx = rpc_reader.0.get_transaction(&tx_hash); + + let trace = rpc_reader.0.get_transaction_trace(&tx_hash); + let receipt = rpc_reader.0.get_transaction_receipt(&tx_hash); + + // Create state from RPC reader + let global_cache = GlobalContractCache::default(); + let mut state = CachedState::new(rpc_reader, global_cache); + + let fee_token_address = + contract_address!("049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"); + + const N_STEPS_FEE_WEIGHT: f64 = 0.01; + let vm_resource_fee_cost = Arc::new(HashMap::from([ + ("n_steps".to_string(), N_STEPS_FEE_WEIGHT), + ("output_builtin".to_string(), 0.0), + ("pedersen_builtin".to_string(), N_STEPS_FEE_WEIGHT * 32.0), + ("range_check_builtin".to_string(), N_STEPS_FEE_WEIGHT * 16.0), + ("ecdsa_builtin".to_string(), N_STEPS_FEE_WEIGHT * 2048.0), + ("bitwise_builtin".to_string(), N_STEPS_FEE_WEIGHT * 64.0), + ("ec_op_builtin".to_string(), N_STEPS_FEE_WEIGHT * 1024.0), + ("poseidon_builtin".to_string(), N_STEPS_FEE_WEIGHT * 32.0), + ( + "segment_arena_builtin".to_string(), + N_STEPS_FEE_WEIGHT * 10.0, + ), + ("keccak_builtin".to_string(), N_STEPS_FEE_WEIGHT * 2048.0), // 2**11 + ])); + + let block_context = BlockContext { + chain_id, + block_number, + block_timestamp, + sequencer_address, + fee_token_address, + vm_resource_fee_cost, + gas_price, + invoke_tx_max_n_steps: 1_000_000, + validate_max_n_steps: 1_000_000, + max_recursion_depth: 500, + }; + + // Map starknet_api transaction to blockifier's + let blockifier_tx = match sn_api_tx { + Transaction::Invoke(tx) => { + let invoke = InvokeTransaction { tx, tx_hash }; + AccountTransaction::Invoke(invoke) + } + _ => unimplemented!(), + }; + + ( + blockifier_tx + .execute(&mut state, &block_context, true, true) + .unwrap(), + trace, + receipt, + ) + } + + #[cfg(test)] + mod test { + use blockifier::execution::entry_point::CallInfo; + + use super::*; + + #[test] + #[ignore = "working on fixes"] + fn test_recent_tx() { + let (tx_info, trace, receipt) = execute_tx( + "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", + RpcChain::MainNet, + BlockNumber(169928), + 17110275391107, + ); + + let TransactionExecutionInfo { + execute_call_info, + actual_fee, + .. + } = tx_info; + + let CallInfo { + vm_resources, + inner_calls, + .. + } = execute_call_info.unwrap(); + + assert_eq!(vm_resources, trace.function_invocation.execution_resources); + assert_eq!( + inner_calls.len(), + trace.function_invocation.internal_calls.len() + ); + + assert_eq!(actual_fee.0, receipt.actual_fee); + } + } +} From 75894a43d17b29e724cdf45b22c3ffd20e5d6f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Wed, 30 Aug 2023 12:13:31 -0300 Subject: [PATCH 10/29] Implemented state reader for sir --- rpc_state_reader_sn_api/src/lib.rs | 119 ++++++++++++++++------------- 1 file changed, 66 insertions(+), 53 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index 3a64ce360..6e5a5ba81 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -362,7 +362,7 @@ impl RpcState { "0x1" => Transaction::Invoke(InvokeTransaction::V1( serde_json::from_value(result).unwrap(), )), - _ => unimplemented!(), + _ => unreachable!(), }, _ => unimplemented!(), } @@ -1027,17 +1027,26 @@ mod blockifier_transaction_tests { } mod starknet_in_rust_transaction_tests { - use cairo_vm::felt::Felt252; + use cairo_vm::felt::{felt_str, Felt252}; use starknet_api::{ - contract_address, - core::{CompiledClassHash, Nonce, PatriciaKey}, - patricia_key, stark_felt, - transaction::TransactionHash, + contract_address, core::PatriciaKey, patricia_key, stark_felt, transaction::TransactionHash, }; use starknet_in_rust::{ core::errors::state_errors::StateError, + definitions::{ + block_context::{BlockContext, StarknetChainId, StarknetOsConfig}, + constants::{ + DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS, + DEFAULT_CONTRACT_STORAGE_COMMITMENT_TREE_HEIGHT, + DEFAULT_GLOBAL_STATE_COMMITMENT_TREE_HEIGHT, DEFAULT_INVOKE_TX_MAX_N_STEPS, + DEFAULT_VALIDATE_MAX_N_STEPS, + }, + }, + execution::TransactionExecutionInfo, services::api::contract_classes::compiled_class::CompiledClass, - state::{state_api::StateReader, state_cache::StorageEntry}, + state::{ + cached_state::CachedState, state_api::StateReader, state_cache::StorageEntry, BlockInfo, + }, utils::{Address, ClassHash}, }; @@ -1086,11 +1095,13 @@ mod starknet_in_rust_transaction_tests { let bytes = self.0.get_storage_at(&address, &key).bytes(); Ok(Felt252::from_bytes_be(bytes)) } - fn get_compiled_class_hash( - &self, - class_hash: &ClassHash, - ) -> Result { - Ok(self.0.get_class_hash_at(contract_address).0) + fn get_compiled_class_hash(&self, class_hash: &ClassHash) -> Result<[u8; 32], StateError> { + let address = ContractAddress( + PatriciaKey::try_from(StarkHash::new(class_hash.clone()).unwrap()).unwrap(), + ); + let mut bytes = [0u8; 32]; + bytes.copy_from_slice(self.0.get_class_hash_at(&address).0.bytes()); + Ok(bytes) } } @@ -1105,6 +1116,11 @@ mod starknet_in_rust_transaction_tests { TransactionTrace, RpcTransactionReceipt, ) { + let fee_token_address = Address(felt_str!( + "049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + 16 + )); + let tx_hash = tx_hash.strip_prefix("0x").unwrap(); // Instantiate the RPC StateReader and the CachedState @@ -1112,11 +1128,31 @@ mod starknet_in_rust_transaction_tests { // Get values for block context before giving ownership of the reader let chain_id = rpc_reader.0.get_chain_name(); - let RpcBlockInfo { - block_number, - block_timestamp, - sequencer_address, - } = rpc_reader.0.get_block_info(); + let starknet_os_config = StarknetOsConfig::new( + (chain_id.into() as StarknetChainId).to_felt(), + fee_token_address, + gas_price, + ); + let block_info = { + let RpcBlockInfo { + block_number, + block_timestamp, + sequencer_address, + } = rpc_reader.0.get_block_info(); + + let block_number = block_number.0; + let block_timestamp = block_timestamp.0; + let sequencer_address = + Address(Felt252::from_bytes_be(sequencer_address.0.key().bytes())); + let gas_price = gas_price as u64; // FIXME: possible issue + + BlockInfo { + block_number, + block_timestamp, + gas_price, + sequencer_address, + } + }; // Get transaction before giving ownership of the reader let tx_hash = TransactionHash(stark_felt!(tx_hash)); @@ -1125,42 +1161,19 @@ mod starknet_in_rust_transaction_tests { let trace = rpc_reader.0.get_transaction_trace(&tx_hash); let receipt = rpc_reader.0.get_transaction_receipt(&tx_hash); - // Create state from RPC reader - let global_cache = GlobalContractCache::default(); - let mut state = CachedState::new(rpc_reader, global_cache); - - let fee_token_address = - contract_address!("049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"); - - const N_STEPS_FEE_WEIGHT: f64 = 0.01; - let vm_resource_fee_cost = Arc::new(HashMap::from([ - ("n_steps".to_string(), N_STEPS_FEE_WEIGHT), - ("output_builtin".to_string(), 0.0), - ("pedersen_builtin".to_string(), N_STEPS_FEE_WEIGHT * 32.0), - ("range_check_builtin".to_string(), N_STEPS_FEE_WEIGHT * 16.0), - ("ecdsa_builtin".to_string(), N_STEPS_FEE_WEIGHT * 2048.0), - ("bitwise_builtin".to_string(), N_STEPS_FEE_WEIGHT * 64.0), - ("ec_op_builtin".to_string(), N_STEPS_FEE_WEIGHT * 1024.0), - ("poseidon_builtin".to_string(), N_STEPS_FEE_WEIGHT * 32.0), - ( - "segment_arena_builtin".to_string(), - N_STEPS_FEE_WEIGHT * 10.0, - ), - ("keccak_builtin".to_string(), N_STEPS_FEE_WEIGHT * 2048.0), // 2**11 - ])); - - let block_context = BlockContext { - chain_id, - block_number, - block_timestamp, - sequencer_address, - fee_token_address, - vm_resource_fee_cost, - gas_price, - invoke_tx_max_n_steps: 1_000_000, - validate_max_n_steps: 1_000_000, - max_recursion_depth: 500, - }; + let mut state = CachedState::new(Arc::new(rpc_reader), None, None); + + let block_context = BlockContext::new( + starknet_os_config, + DEFAULT_CONTRACT_STORAGE_COMMITMENT_TREE_HEIGHT, + DEFAULT_GLOBAL_STATE_COMMITMENT_TREE_HEIGHT, + DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS.clone(), + DEFAULT_INVOKE_TX_MAX_N_STEPS, + DEFAULT_VALIDATE_MAX_N_STEPS, + block_info, + Default::default(), + true, + ); // Map starknet_api transaction to blockifier's let blockifier_tx = match sn_api_tx { From d277eb3d6beef5f6015eb6c171faeefb325ee8fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Wed, 30 Aug 2023 12:32:08 -0300 Subject: [PATCH 11/29] WIP Transaction --- rpc_state_reader_sn_api/src/lib.rs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index 6e5a5ba81..0a8fd0d43 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -1047,6 +1047,7 @@ mod starknet_in_rust_transaction_tests { state::{ cached_state::CachedState, state_api::StateReader, state_cache::StorageEntry, BlockInfo, }, + transaction::Transaction, utils::{Address, ClassHash}, }; @@ -1175,19 +1176,10 @@ mod starknet_in_rust_transaction_tests { true, ); - // Map starknet_api transaction to blockifier's - let blockifier_tx = match sn_api_tx { - Transaction::Invoke(tx) => { - let invoke = InvokeTransaction { tx, tx_hash }; - AccountTransaction::Invoke(invoke) - } - _ => unimplemented!(), - }; + let tx: Transaction = rpc_reader.0.get_transaction(&tx_hash).try_into().unwrap(); ( - blockifier_tx - .execute(&mut state, &block_context, true, true) - .unwrap(), + tx.execute(&mut state, &block_context, true, true).unwrap(), trace, receipt, ) From 9f810d4eb5e3d6f191608bd26d52428389f4f79e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Wed, 30 Aug 2023 14:19:40 -0300 Subject: [PATCH 12/29] WIP SiR execution --- rpc_state_reader_sn_api/src/lib.rs | 40 +++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index 0a8fd0d43..fe23b5f3d 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -1045,7 +1045,10 @@ mod starknet_in_rust_transaction_tests { execution::TransactionExecutionInfo, services::api::contract_classes::compiled_class::CompiledClass, state::{ - cached_state::CachedState, state_api::StateReader, state_cache::StorageEntry, BlockInfo, + cached_state::{CachedState, ContractClassCache}, + state_api::StateReader, + state_cache::StorageEntry, + BlockInfo, }, transaction::Transaction, utils::{Address, ClassHash}, @@ -1139,6 +1142,7 @@ mod starknet_in_rust_transaction_tests { block_number, block_timestamp, sequencer_address, + .. } = rpc_reader.0.get_block_info(); let block_number = block_number.0; @@ -1162,7 +1166,8 @@ mod starknet_in_rust_transaction_tests { let trace = rpc_reader.0.get_transaction_trace(&tx_hash); let receipt = rpc_reader.0.get_transaction_receipt(&tx_hash); - let mut state = CachedState::new(Arc::new(rpc_reader), None, None); + let class_cache = ContractClassCache::default(); + let mut state = CachedState::new(Arc::new(rpc_reader), class_cache); let block_context = BlockContext::new( starknet_os_config, @@ -1176,10 +1181,18 @@ mod starknet_in_rust_transaction_tests { true, ); - let tx: Transaction = rpc_reader.0.get_transaction(&tx_hash).try_into().unwrap(); + let tx: starknet_in_rust::transaction::invoke_function::InvokeFunction = + match rpc_reader.0.get_transaction(&tx_hash) { + starknet_api::transaction::Transaction::Invoke(x) => x.try_into().unwrap(), + _ => unimplemented!(), + } + .try_into() + .unwrap(); + + let tx = Transaction::InvokeFunction(tx); ( - tx.execute(&mut state, &block_context, true, true).unwrap(), + tx.execute(&mut state, &block_context, u128::MAX).unwrap(), trace, receipt, ) @@ -1187,7 +1200,7 @@ mod starknet_in_rust_transaction_tests { #[cfg(test)] mod test { - use blockifier::execution::entry_point::CallInfo; + use starknet_in_rust::execution::CallInfo; use super::*; @@ -1202,24 +1215,27 @@ mod starknet_in_rust_transaction_tests { ); let TransactionExecutionInfo { - execute_call_info, + call_info, actual_fee, .. } = tx_info; let CallInfo { - vm_resources, - inner_calls, + execution_resources, + internal_calls, .. - } = execute_call_info.unwrap(); + } = call_info.unwrap(); - assert_eq!(vm_resources, trace.function_invocation.execution_resources); assert_eq!( - inner_calls.len(), + execution_resources, + trace.function_invocation.execution_resources + ); + assert_eq!( + internal_calls.len(), trace.function_invocation.internal_calls.len() ); - assert_eq!(actual_fee.0, receipt.actual_fee); + assert_eq!(actual_fee, receipt.actual_fee); } } } From 7dcc455298cadf962d5462e2d72796feff1d2357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Wed, 30 Aug 2023 15:48:34 -0300 Subject: [PATCH 13/29] Fixed rpc sir execute_tx --- Cargo.lock | 28 ++----- Cargo.toml | 2 +- rpc_state_reader_sn_api/src/lib.rs | 76 ++++++++++--------- .../deprecated_contract_class.rs | 51 ++++++------- 4 files changed, 68 insertions(+), 89 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0cdf271e6..fe741b143 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -691,7 +691,7 @@ dependencies = [ "serde_json", "sha3", "starknet-crypto 0.5.1", - "starknet_api 0.4.1", + "starknet_api", "strum", "strum_macros", "thiserror", @@ -1889,7 +1889,7 @@ dependencies = [ "honggfuzz", "num-traits 0.2.16", "serde_json", - "starknet_api 0.3.0", + "starknet_api", "starknet_in_rust", "tempfile", ] @@ -3118,7 +3118,7 @@ dependencies = [ "serde_json", "serde_with 3.1.0", "starknet", - "starknet_api 0.3.0", + "starknet_api", "starknet_in_rust", "thiserror", "ureq", @@ -3138,7 +3138,7 @@ dependencies = [ "serde_json", "serde_with 3.1.0", "starknet", - "starknet_api 0.4.1", + "starknet_api", "starknet_in_rust", "thiserror", "ureq", @@ -3780,24 +3780,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "starknet_api" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfe4732113f66de3d6e9fc77f713b934cfd4b24d43887ca8cbfbe9462ed9119" -dependencies = [ - "cairo-lang-starknet", - "derive_more", - "hex", - "indexmap 1.9.3", - "once_cell", - "primitive-types", - "serde", - "serde_json", - "starknet-crypto 0.5.1", - "thiserror", -] - [[package]] name = "starknet_api" version = "0.4.1" @@ -3846,7 +3828,7 @@ dependencies = [ "sha3", "starknet", "starknet-crypto 0.5.1", - "starknet_api 0.3.0", + "starknet_api", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index c4ef535b6..068875b87 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ members = ["cli", "fuzzer", "rpc_state_reader", "rpc_state_reader_sn_api"] [workspace.dependencies] cairo-vm = { version = "0.8.5", features = ["cairo-1-hints"] } -starknet_api = "0.3.0" +starknet_api = "0.4.0" num-traits = "0.2.15" starknet = "0.5.0" thiserror = "1.0.32" diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index fe23b5f3d..4d8e97eed 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -16,7 +16,7 @@ use starknet_api::block::{BlockNumber, BlockTimestamp}; use starknet_api::core::{ChainId, ClassHash, EntryPointSelector}; use starknet_api::deprecated_contract_class::EntryPointOffset; use starknet_api::hash::StarkFelt; -use starknet_api::transaction::{InvokeTransaction, Transaction, TransactionHash}; +use starknet_api::transaction::{InvokeTransaction, Transaction as SNTransaction, TransactionHash}; use starknet_api::{core::ContractAddress, hash::StarkHash, state::StorageKey}; use std::collections::HashMap; use std::env; @@ -129,7 +129,7 @@ pub struct RpcBlockInfo { /// The sequencer address of this block. pub sequencer_address: ContractAddress, /// The transactions of this block. - pub transactions: Vec, + pub transactions: Vec, } #[derive(Deserialize)] @@ -302,16 +302,18 @@ impl<'de> Deserialize<'de> for TransactionTrace { } /// Freestanding deserialize method to avoid a new type. -fn deserialize_transaction_json(transaction: serde_json::Value) -> serde_json::Result { +fn deserialize_transaction_json( + transaction: serde_json::Value, +) -> serde_json::Result { let tx_type: String = serde_json::from_value(transaction["type"].clone())?; let tx_version: String = serde_json::from_value(transaction["version"].clone())?; match tx_type.as_str() { "INVOKE" => match tx_version.as_str() { - "0x0" => Ok(Transaction::Invoke(InvokeTransaction::V0( + "0x0" => Ok(SNTransaction::Invoke(InvokeTransaction::V0( serde_json::from_value(transaction)?, ))), - "0x1" => Ok(Transaction::Invoke(InvokeTransaction::V1( + "0x1" => Ok(SNTransaction::Invoke(InvokeTransaction::V1( serde_json::from_value(transaction)?, ))), x => Err(serde::de::Error::custom(format!( @@ -345,7 +347,7 @@ impl RpcState { } /// Requests the given transaction to the Feeder Gateway API. - pub fn get_transaction(&self, hash: &TransactionHash) -> Transaction { + pub fn get_transaction(&self, hash: &TransactionHash) -> SNTransaction { let params = ureq::json!({ "jsonrpc": "2.0", "method": "starknet_getTransactionByHash", @@ -356,10 +358,10 @@ impl RpcState { match result["type"].as_str().unwrap() { "INVOKE" => match result["version"].as_str().unwrap() { - "0x0" => Transaction::Invoke(InvokeTransaction::V0( + "0x0" => SNTransaction::Invoke(InvokeTransaction::V0( serde_json::from_value(result).unwrap(), )), - "0x1" => Transaction::Invoke(InvokeTransaction::V1( + "0x1" => SNTransaction::Invoke(InvokeTransaction::V1( serde_json::from_value(result).unwrap(), )), _ => unreachable!(), @@ -964,7 +966,7 @@ mod blockifier_transaction_tests { // Map starknet_api transaction to blockifier's let blockifier_tx = match sn_api_tx { - Transaction::Invoke(tx) => { + SNTransaction::Invoke(tx) => { let invoke = InvokeTransaction { tx, tx_hash }; AccountTransaction::Invoke(invoke) } @@ -1028,9 +1030,7 @@ mod blockifier_transaction_tests { mod starknet_in_rust_transaction_tests { use cairo_vm::felt::{felt_str, Felt252}; - use starknet_api::{ - contract_address, core::PatriciaKey, patricia_key, stark_felt, transaction::TransactionHash, - }; + use starknet_api::{core::PatriciaKey, stark_felt, transaction::TransactionHash}; use starknet_in_rust::{ core::errors::state_errors::StateError, definitions::{ @@ -1050,7 +1050,7 @@ mod starknet_in_rust_transaction_tests { state_cache::StorageEntry, BlockInfo, }, - transaction::Transaction, + transaction::{InvokeFunction, Transaction}, utils::{Address, ClassHash}, }; @@ -1083,8 +1083,8 @@ mod starknet_in_rust_transaction_tests { ) .unwrap(), ); - let bytes = self.0.get_nonce_at(&address).bytes(); - Ok(Felt252::from_bytes_be(bytes)) + let nonce = self.0.get_nonce_at(&address); + Ok(Felt252::from_bytes_be(nonce.bytes())) } fn get_storage_at(&self, storage_entry: &StorageEntry) -> Result { let (contract_address, key) = storage_entry; @@ -1096,8 +1096,8 @@ mod starknet_in_rust_transaction_tests { ); let key = StorageKey(PatriciaKey::try_from(StarkHash::new(key.clone()).unwrap()).unwrap()); - let bytes = self.0.get_storage_at(&address, &key).bytes(); - Ok(Felt252::from_bytes_be(bytes)) + let value = self.0.get_storage_at(&address, &key); + Ok(Felt252::from_bytes_be(value.bytes())) } fn get_compiled_class_hash(&self, class_hash: &ClassHash) -> Result<[u8; 32], StateError> { let address = ContractAddress( @@ -1114,7 +1114,6 @@ mod starknet_in_rust_transaction_tests { tx_hash: &str, network: RpcChain, block_number: BlockNumber, - gas_price: u128, ) -> ( TransactionExecutionInfo, TransactionTrace, @@ -1129,14 +1128,16 @@ mod starknet_in_rust_transaction_tests { // Instantiate the RPC StateReader and the CachedState let rpc_reader = RpcStateReader(RpcState::new(network, block_number.into())); + let gas_price = rpc_reader.0.get_gas_price(block_number.0).unwrap(); // Get values for block context before giving ownership of the reader - let chain_id = rpc_reader.0.get_chain_name(); - let starknet_os_config = StarknetOsConfig::new( - (chain_id.into() as StarknetChainId).to_felt(), - fee_token_address, - gas_price, - ); + let chain_id = match rpc_reader.0.chain { + RpcChain::MainNet => StarknetChainId::MainNet, + RpcChain::TestNet => StarknetChainId::TestNet, + RpcChain::TestNet2 => StarknetChainId::TestNet2, + }; + let starknet_os_config = + StarknetOsConfig::new(chain_id.to_felt(), fee_token_address, gas_price); let block_info = { let RpcBlockInfo { block_number, @@ -1161,7 +1162,12 @@ mod starknet_in_rust_transaction_tests { // Get transaction before giving ownership of the reader let tx_hash = TransactionHash(stark_felt!(tx_hash)); - let sn_api_tx = rpc_reader.0.get_transaction(&tx_hash); + let tx = match rpc_reader.0.get_transaction(&tx_hash) { + SNTransaction::Invoke(tx) => { + Transaction::InvokeFunction(InvokeFunction::try_from(tx).unwrap()) + } + _ => unimplemented!(), + }; let trace = rpc_reader.0.get_transaction_trace(&tx_hash); let receipt = rpc_reader.0.get_transaction_receipt(&tx_hash); @@ -1181,16 +1187,6 @@ mod starknet_in_rust_transaction_tests { true, ); - let tx: starknet_in_rust::transaction::invoke_function::InvokeFunction = - match rpc_reader.0.get_transaction(&tx_hash) { - starknet_api::transaction::Transaction::Invoke(x) => x.try_into().unwrap(), - _ => unimplemented!(), - } - .try_into() - .unwrap(); - - let tx = Transaction::InvokeFunction(tx); - ( tx.execute(&mut state, &block_context, u128::MAX).unwrap(), trace, @@ -1204,6 +1200,15 @@ mod starknet_in_rust_transaction_tests { use super::*; + #[test] + fn test_get_gas_price() { + let block = BlockValue::Number(BlockNumber(169928)); + let rpc_state = RpcState::new(RpcChain::MainNet, block); + + let price = rpc_state.get_gas_price(169928).unwrap(); + assert_eq!(price, 22804578690); + } + #[test] #[ignore = "working on fixes"] fn test_recent_tx() { @@ -1211,7 +1216,6 @@ mod starknet_in_rust_transaction_tests { "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", RpcChain::MainNet, BlockNumber(169928), - 17110275391107, ); let TransactionExecutionInfo { diff --git a/src/services/api/contract_classes/deprecated_contract_class.rs b/src/services/api/contract_classes/deprecated_contract_class.rs index 2736bbca4..c20085975 100644 --- a/src/services/api/contract_classes/deprecated_contract_class.rs +++ b/src/services/api/contract_classes/deprecated_contract_class.rs @@ -265,9 +265,7 @@ mod tests { felt::{felt_str, PRIME_STR}, serde::deserialize_program::BuiltinName, }; - use starknet_api::deprecated_contract_class::{ - FunctionAbiEntry, FunctionAbiEntryType, FunctionAbiEntryWithType, TypedParameter, - }; + use starknet_api::deprecated_contract_class::{FunctionAbiEntry, TypedParameter}; #[test] fn deserialize_contract_class() { @@ -334,33 +332,28 @@ mod tests { let res = ContractClass::from_path("starknet_programs/fibonacci.json"); let contract_class = res.expect("should be able to read file"); - let expected_abi = Some(vec![ContractClassAbiEntry::Function( - FunctionAbiEntryWithType { - r#type: FunctionAbiEntryType::Function, - entry: FunctionAbiEntry { - name: "fib".to_string(), - inputs: vec![ - TypedParameter { - name: "first_element".to_string(), - r#type: "felt".to_string(), - }, - TypedParameter { - name: "second_element".to_string(), - r#type: "felt".to_string(), - }, - TypedParameter { - name: "n".to_string(), - r#type: "felt".to_string(), - }, - ], - outputs: vec![TypedParameter { - name: "res".to_string(), - r#type: "felt".to_string(), - }], - state_mutability: None, + let expected_abi = Some(vec![ContractClassAbiEntry::Function(FunctionAbiEntry { + name: "fib".to_string(), + inputs: vec![ + TypedParameter { + name: "first_element".to_string(), + r#type: "felt".to_string(), + }, + TypedParameter { + name: "second_element".to_string(), + r#type: "felt".to_string(), + }, + TypedParameter { + name: "n".to_string(), + r#type: "felt".to_string(), }, - }, - )]); + ], + outputs: vec![TypedParameter { + name: "res".to_string(), + r#type: "felt".to_string(), + }], + state_mutability: None, + })]); assert_eq!(contract_class.abi, expected_abi); } From 99e7cc0fd9fbbf99a76695812052aaf5df102d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Wed, 30 Aug 2023 15:55:07 -0300 Subject: [PATCH 14/29] Fix clippy --- rpc_state_reader_sn_api/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index 4d8e97eed..80a73e0fd 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -1060,7 +1060,7 @@ mod starknet_in_rust_transaction_tests { impl StateReader for RpcStateReader { fn get_contract_class(&self, class_hash: &ClassHash) -> Result { - let hash = ClassHash(StarkHash::new(class_hash.clone()).unwrap()); + let hash = ClassHash(StarkHash::new(*class_hash).unwrap()); Ok(CompiledClass::from(self.0.get_contract_class(&hash))) } @@ -1095,13 +1095,13 @@ mod starknet_in_rust_transaction_tests { .unwrap(), ); let key = - StorageKey(PatriciaKey::try_from(StarkHash::new(key.clone()).unwrap()).unwrap()); + StorageKey(PatriciaKey::try_from(StarkHash::new(*key).unwrap()).unwrap()); let value = self.0.get_storage_at(&address, &key); Ok(Felt252::from_bytes_be(value.bytes())) } fn get_compiled_class_hash(&self, class_hash: &ClassHash) -> Result<[u8; 32], StateError> { let address = ContractAddress( - PatriciaKey::try_from(StarkHash::new(class_hash.clone()).unwrap()).unwrap(), + PatriciaKey::try_from(StarkHash::new(*class_hash).unwrap()).unwrap(), ); let mut bytes = [0u8; 32]; bytes.copy_from_slice(self.0.get_class_hash_at(&address).0.bytes()); @@ -1210,7 +1210,7 @@ mod starknet_in_rust_transaction_tests { } #[test] - #[ignore = "working on fixes"] + //#[ignore = "working on fixes"] fn test_recent_tx() { let (tx_info, trace, receipt) = execute_tx( "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", From f84aaf3539d1ce3b5787bce80821132d62c97e2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Wed, 30 Aug 2023 15:55:18 -0300 Subject: [PATCH 15/29] Import last version of sn_api --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 068875b87..b4552d465 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ members = ["cli", "fuzzer", "rpc_state_reader", "rpc_state_reader_sn_api"] [workspace.dependencies] cairo-vm = { version = "0.8.5", features = ["cairo-1-hints"] } -starknet_api = "0.4.0" +starknet_api = "0.4.1" num-traits = "0.2.15" starknet = "0.5.0" thiserror = "1.0.32" From edd9fd6f81b76208e78eff75c40f01d1f1166041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Wed, 30 Aug 2023 15:58:15 -0300 Subject: [PATCH 16/29] Formatting --- rpc_state_reader_sn_api/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index 80a73e0fd..1b9323687 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -1094,8 +1094,7 @@ mod starknet_in_rust_transaction_tests { ) .unwrap(), ); - let key = - StorageKey(PatriciaKey::try_from(StarkHash::new(*key).unwrap()).unwrap()); + let key = StorageKey(PatriciaKey::try_from(StarkHash::new(*key).unwrap()).unwrap()); let value = self.0.get_storage_at(&address, &key); Ok(Felt252::from_bytes_be(value.bytes())) } From 70335b5cdbe258ef6f083e47702ff7885f59ded9 Mon Sep 17 00:00:00 2001 From: Milton Date: Wed, 30 Aug 2023 17:40:10 -0300 Subject: [PATCH 17/29] Test --- Cargo.lock | 28 ++-------- Cargo.toml | 2 +- .../deprecated_contract_class.rs | 52 ++++++++----------- src/transaction/invoke_function.rs | 15 +++++- 4 files changed, 42 insertions(+), 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fbf90ed9e..6b5dc8f09 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -691,7 +691,7 @@ dependencies = [ "serde_json", "sha3", "starknet-crypto 0.5.1", - "starknet_api 0.4.1", + "starknet_api", "strum", "strum_macros", "thiserror", @@ -1889,7 +1889,7 @@ dependencies = [ "honggfuzz", "num-traits 0.2.16", "serde_json", - "starknet_api 0.3.0", + "starknet_api", "starknet_in_rust", "tempfile", ] @@ -3118,7 +3118,7 @@ dependencies = [ "serde_json", "serde_with 3.1.0", "starknet", - "starknet_api 0.3.0", + "starknet_api", "starknet_in_rust", "thiserror", "ureq", @@ -3138,7 +3138,7 @@ dependencies = [ "serde_json", "serde_with 3.1.0", "starknet", - "starknet_api 0.4.1", + "starknet_api", "thiserror", "ureq", ] @@ -3779,24 +3779,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "starknet_api" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfe4732113f66de3d6e9fc77f713b934cfd4b24d43887ca8cbfbe9462ed9119" -dependencies = [ - "cairo-lang-starknet", - "derive_more", - "hex", - "indexmap 1.9.3", - "once_cell", - "primitive-types", - "serde", - "serde_json", - "starknet-crypto 0.5.1", - "thiserror", -] - [[package]] name = "starknet_api" version = "0.4.1" @@ -3845,7 +3827,7 @@ dependencies = [ "sha3", "starknet", "starknet-crypto 0.5.1", - "starknet_api 0.3.0", + "starknet_api", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index e3110c53b..cf38d6c40 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ members = ["cli", "fuzzer", "rpc_state_reader", "rpc_state_reader_sn_api"] [workspace.dependencies] cairo-vm = { version = "0.8.5", features = ["cairo-1-hints"] } -starknet_api = "0.3.0" +starknet_api = "0.4.1" num-traits = "0.2.15" starknet = "0.5.0" thiserror = "1.0.32" diff --git a/src/services/api/contract_classes/deprecated_contract_class.rs b/src/services/api/contract_classes/deprecated_contract_class.rs index 2736bbca4..a1ef5c367 100644 --- a/src/services/api/contract_classes/deprecated_contract_class.rs +++ b/src/services/api/contract_classes/deprecated_contract_class.rs @@ -265,9 +265,7 @@ mod tests { felt::{felt_str, PRIME_STR}, serde::deserialize_program::BuiltinName, }; - use starknet_api::deprecated_contract_class::{ - FunctionAbiEntry, FunctionAbiEntryType, FunctionAbiEntryWithType, TypedParameter, - }; + use starknet_api::deprecated_contract_class::{FunctionAbiEntry, TypedParameter}; #[test] fn deserialize_contract_class() { @@ -333,34 +331,28 @@ mod tests { // This specific contract compiles with --no_debug_info let res = ContractClass::from_path("starknet_programs/fibonacci.json"); let contract_class = res.expect("should be able to read file"); - - let expected_abi = Some(vec![ContractClassAbiEntry::Function( - FunctionAbiEntryWithType { - r#type: FunctionAbiEntryType::Function, - entry: FunctionAbiEntry { - name: "fib".to_string(), - inputs: vec![ - TypedParameter { - name: "first_element".to_string(), - r#type: "felt".to_string(), - }, - TypedParameter { - name: "second_element".to_string(), - r#type: "felt".to_string(), - }, - TypedParameter { - name: "n".to_string(), - r#type: "felt".to_string(), - }, - ], - outputs: vec![TypedParameter { - name: "res".to_string(), - r#type: "felt".to_string(), - }], - state_mutability: None, + let expected_abi = Some(vec![ContractClassAbiEntry::Function(FunctionAbiEntry { + name: "fib".to_string(), + inputs: vec![ + TypedParameter { + name: "first_element".to_string(), + r#type: "felt".to_string(), + }, + TypedParameter { + name: "second_element".to_string(), + r#type: "felt".to_string(), + }, + TypedParameter { + name: "n".to_string(), + r#type: "felt".to_string(), }, - }, - )]); + ], + outputs: vec![TypedParameter { + name: "res".to_string(), + r#type: "felt".to_string(), + }], + state_mutability: None, + })]); assert_eq!(contract_class.abi, expected_abi); } diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 6e2a5f847..8acee87ea 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -498,7 +498,10 @@ mod tests { }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; use num_traits::Num; - use std::{collections::HashMap, sync::Arc}; + use std::{ + collections::HashMap, + sync::Arc, fs, + }; #[test] fn test_invoke_apply_without_fees() { @@ -1220,4 +1223,14 @@ mod tests { .class_hash_to_compiled_class_hash ); } + + #[test] + fn test_try_from_invoke() { + let tx_str = fs::read_to_string("sierra.json").unwrap(); + let tx: starknet_api::transaction::InvokeTransactionV1 = + serde_json::from_str(&tx_str).unwrap(); + print!("{:?}", tx); + + let parsed_tx = InvokeFunction::try_from(tx); + } } From ffb9e28c1ac5c90be5c117fd4fb0b3f8271f9f66 Mon Sep 17 00:00:00 2001 From: Milton Date: Wed, 30 Aug 2023 18:06:08 -0300 Subject: [PATCH 18/29] Test try from --- rpc_state_reader_sn_api/src/lib.rs | 17 +++++++++++++++++ src/transaction/invoke_function.rs | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index 1b9323687..7292a5aa9 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -561,6 +561,7 @@ mod tests { hash::StarkFelt, stark_felt, }; + use starknet_in_rust::transaction::InvokeFunction; use super::*; @@ -653,6 +654,22 @@ mod tests { rpc_state.get_transaction(&tx_hash); } + #[test] + fn test_try_from_invoke() { + let rpc_state = RpcState::new(RpcChain::MainNet, BlockTag::Latest.into()); + let tx_hash = TransactionHash(stark_felt!( + "06da92cfbdceac5e5e94a1f40772d6c79d34f011815606742658559ec77b6955" + )); + + let tx = rpc_state.get_transaction(&tx_hash); + let parsed = match tx { + SNTransaction::Invoke(y) => InvokeFunction::try_from(y), + _ => unreachable!(), + }; + + assert!(parsed.is_ok()); + } + #[test] fn test_get_block_info() { let rpc_state = RpcState::new(RpcChain::MainNet, BlockTag::Latest.into()); diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index f532cd04b..6944d01fc 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -501,7 +501,7 @@ mod tests { }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; use num_traits::Num; - use std::{collections::HashMap, sync::Arc}; + use std::{collections::HashMap, fs, sync::Arc}; #[test] fn test_invoke_apply_without_fees() { From bea372af1a42ffa35c24bd39888ccd6ab54dc482 Mon Sep 17 00:00:00 2001 From: Milton Date: Wed, 30 Aug 2023 18:07:11 -0300 Subject: [PATCH 19/29] Delete test --- src/transaction/invoke_function.rs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 9ce35d3dd..8da8e938c 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -1249,14 +1249,4 @@ mod tests { .class_hash_to_compiled_class_hash ); } - - #[test] - fn test_try_from_invoke() { - let tx_str = fs::read_to_string("sierra.json").unwrap(); - let tx: starknet_api::transaction::InvokeTransactionV1 = - serde_json::from_str(&tx_str).unwrap(); - print!("{:?}", tx); - - let parsed_tx = InvokeFunction::try_from(tx); - } } From af487c085f79cd76d99e9df44935f7cba0e44564 Mon Sep 17 00:00:00 2001 From: Milton Date: Wed, 30 Aug 2023 18:09:03 -0300 Subject: [PATCH 20/29] Fix format --- src/transaction/invoke_function.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 8da8e938c..6944d01fc 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -501,10 +501,7 @@ mod tests { }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; use num_traits::Num; - use std::{ - collections::HashMap, - sync::Arc, fs, - }; + use std::{collections::HashMap, fs, sync::Arc}; #[test] fn test_invoke_apply_without_fees() { From c11eb16fccf549904c9be91fd50254c7884baf94 Mon Sep 17 00:00:00 2001 From: Milton Date: Wed, 30 Aug 2023 20:19:49 -0300 Subject: [PATCH 21/29] Fix test --- src/transaction/invoke_function.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 6944d01fc..f532cd04b 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -501,7 +501,7 @@ mod tests { }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; use num_traits::Num; - use std::{collections::HashMap, fs, sync::Arc}; + use std::{collections::HashMap, sync::Arc}; #[test] fn test_invoke_apply_without_fees() { From fcccf58dc1945a5d36c421e7b9d57a4f8a8f9b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Fri, 1 Sep 2023 12:19:46 -0300 Subject: [PATCH 22/29] Fix clippy --- rpc_state_reader_sn_api/src/lib.rs | 2 +- src/transaction/invoke_function.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index af04c51df..ac1680047 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -669,7 +669,7 @@ mod tests { assert!(parsed.is_ok()); } - + #[test] fn test_get_block_info() { let rpc_state = RpcState::new(RpcChain::MainNet, BlockTag::Latest.into()); diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 1e103ad2e..e430fb39d 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -501,7 +501,7 @@ mod tests { }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; use num_traits::Num; - use std::{collections::HashMap, fs, sync::Arc}; + use std::{collections::HashMap, sync::Arc}; #[test] fn test_invoke_apply_without_fees() { From ab48bb50f28c642d024433a2bb349bd29e5675d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Mon, 4 Sep 2023 11:03:55 -0300 Subject: [PATCH 23/29] Replaced try_from with from_invoke_transaction --- rpc_state_reader_sn_api/src/lib.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index ac1680047..be25c4e99 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -556,12 +556,15 @@ mod utils { #[cfg(test)] mod tests { + use cairo_vm::felt::felt_str; use starknet_api::{ core::{ClassHash, PatriciaKey}, hash::StarkFelt, stark_felt, }; - use starknet_in_rust::transaction::InvokeFunction; + use starknet_in_rust::{ + definitions::block_context::StarknetChainId, transaction::InvokeFunction, + }; use super::*; @@ -663,7 +666,11 @@ mod tests { let tx = rpc_state.get_transaction(&tx_hash); let parsed = match tx { - SNTransaction::Invoke(y) => InvokeFunction::try_from(y), + SNTransaction::Invoke(tx) => InvokeFunction::from_invoke_transaction( + tx, + StarknetChainId::MainNet, + felt_str!("0x1"), + ), _ => unreachable!(), }; @@ -1178,9 +1185,9 @@ mod starknet_in_rust_transaction_tests { // Get transaction before giving ownership of the reader let tx_hash = TransactionHash(stark_felt!(tx_hash)); let tx = match rpc_reader.0.get_transaction(&tx_hash) { - SNTransaction::Invoke(tx) => { - Transaction::InvokeFunction(InvokeFunction::try_from(tx).unwrap()) - } + SNTransaction::Invoke(tx) => Transaction::InvokeFunction( + InvokeFunction::from_invoke_transaction(tx, chain_id, felt_str!("0x1")).unwrap(), + ), _ => unimplemented!(), }; From 8b83cd2fb0971931ef294ca1af1fa0ee24d6ed13 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Mon, 4 Sep 2023 16:08:16 +0200 Subject: [PATCH 24/29] infer version --- rpc_state_reader_sn_api/src/lib.rs | 11 ++++------- src/transaction/invoke_function.rs | 21 ++++++--------------- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index be25c4e99..01f85e9da 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -556,7 +556,6 @@ mod utils { #[cfg(test)] mod tests { - use cairo_vm::felt::felt_str; use starknet_api::{ core::{ClassHash, PatriciaKey}, hash::StarkFelt, @@ -666,11 +665,9 @@ mod tests { let tx = rpc_state.get_transaction(&tx_hash); let parsed = match tx { - SNTransaction::Invoke(tx) => InvokeFunction::from_invoke_transaction( - tx, - StarknetChainId::MainNet, - felt_str!("0x1"), - ), + SNTransaction::Invoke(tx) => { + InvokeFunction::from_invoke_transaction(tx, StarknetChainId::MainNet) + } _ => unreachable!(), }; @@ -1186,7 +1183,7 @@ mod starknet_in_rust_transaction_tests { let tx_hash = TransactionHash(stark_felt!(tx_hash)); let tx = match rpc_reader.0.get_transaction(&tx_hash) { SNTransaction::Invoke(tx) => Transaction::InvokeFunction( - InvokeFunction::from_invoke_transaction(tx, chain_id, felt_str!("0x1")).unwrap(), + InvokeFunction::from_invoke_transaction(tx, chain_id).unwrap(), ), _ => unimplemented!(), }; diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 1f2cc3e08..53888808a 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -124,15 +124,10 @@ impl InvokeFunction { pub fn from_invoke_transaction( tx: starknet_api::transaction::InvokeTransaction, chain_id: StarknetChainId, - version: Felt252, ) -> Result { match tx { - starknet_api::transaction::InvokeTransaction::V0(v0) => { - convert_invoke_v0(v0, chain_id, version) - } - starknet_api::transaction::InvokeTransaction::V1(v1) => { - convert_invoke_v1(v1, chain_id, version) - } + starknet_api::transaction::InvokeTransaction::V0(v0) => convert_invoke_v0(v0, chain_id), + starknet_api::transaction::InvokeTransaction::V1(v1) => convert_invoke_v1(v1, chain_id), } } @@ -423,7 +418,6 @@ pub(crate) fn preprocess_invoke_function_fields( fn convert_invoke_v0( value: starknet_api::transaction::InvokeTransactionV0, chain_id: StarknetChainId, - version: Felt252, ) -> Result { let contract_address = Address(Felt252::from_bytes_be( value.contract_address.0.key().bytes(), @@ -450,7 +444,7 @@ fn convert_invoke_v0( contract_address, entry_point_selector, max_fee, - version, + Felt252::new(0), calldata, signature, chain_id.to_felt(), @@ -461,7 +455,6 @@ fn convert_invoke_v0( fn convert_invoke_v1( value: starknet_api::transaction::InvokeTransactionV1, chain_id: StarknetChainId, - version: Felt252, ) -> Result { let contract_address = Address(Felt252::from_bytes_be(value.sender_address.0.key().bytes())); let max_fee = value.max_fee.0; @@ -486,7 +479,7 @@ fn convert_invoke_v1( contract_address, entry_point_selector, max_fee, - version, + Felt252::new(0), calldata, signature, chain_id.to_felt(), @@ -506,7 +499,7 @@ mod tests { utils::calculate_sn_keccak, }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; - use num_traits::{Num, One}; + use num_traits::Num; use starknet_api::{ core::{ContractAddress, Nonce, PatriciaKey}, hash::{StarkFelt, StarkHash}, @@ -573,9 +566,7 @@ mod tests { ])), }); - let tx_sir = - InvokeFunction::from_invoke_transaction(tx, StarknetChainId::MainNet, Felt252::one()) - .unwrap(); + let tx_sir = InvokeFunction::from_invoke_transaction(tx, StarknetChainId::MainNet).unwrap(); assert_eq!( tx_sir.hash_value.to_str_radix(16), "5b6cf416d56e7c7c519b44e6d06a41657ff6c6a3f2629044fac395e6d200ac4" From 52dd83c72413a6a185f691626dc1d98ffe3e3217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Mon, 4 Sep 2023 11:10:11 -0300 Subject: [PATCH 25/29] Fix version --- src/transaction/invoke_function.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 53888808a..f05e3e942 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -479,7 +479,7 @@ fn convert_invoke_v1( contract_address, entry_point_selector, max_fee, - Felt252::new(0), + Felt252::new(1), calldata, signature, chain_id.to_felt(), From 8e50309c49a5340368fb72a5b659bc080dd10235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Mon, 4 Sep 2023 11:17:38 -0300 Subject: [PATCH 26/29] Changed test_try_from_invoke --- rpc_state_reader_sn_api/src/lib.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index 01f85e9da..f89a6ed64 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -664,14 +664,13 @@ mod tests { )); let tx = rpc_state.get_transaction(&tx_hash); - let parsed = match tx { + match tx { SNTransaction::Invoke(tx) => { InvokeFunction::from_invoke_transaction(tx, StarknetChainId::MainNet) } _ => unreachable!(), - }; - - assert!(parsed.is_ok()); + } + .unwrap(); } #[test] From a0d34e6dc674c7a0fa62c46e5df60609c036305d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Mon, 4 Sep 2023 11:17:56 -0300 Subject: [PATCH 27/29] Ignore test_recent_tx --- rpc_state_reader_sn_api/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index f89a6ed64..15dd7f9fb 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -1018,6 +1018,7 @@ mod blockifier_transaction_tests { } #[test] + //#[ignore = "working on fixes"] fn test_recent_tx() { let (tx_info, trace, receipt) = execute_tx( "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", From ce4060b34389bd04e7eedff442bcd924dc9d23c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Mon, 4 Sep 2023 11:26:44 -0300 Subject: [PATCH 28/29] Refactor tx deser, (un)ignore tests --- rpc_state_reader_sn_api/src/lib.rs | 73 ++++++++++++------------------ 1 file changed, 30 insertions(+), 43 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index 15dd7f9fb..af85f0b25 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -301,31 +301,6 @@ impl<'de> Deserialize<'de> for TransactionTrace { } } -/// Freestanding deserialize method to avoid a new type. -fn deserialize_transaction_json( - transaction: serde_json::Value, -) -> serde_json::Result { - let tx_type: String = serde_json::from_value(transaction["type"].clone())?; - let tx_version: String = serde_json::from_value(transaction["version"].clone())?; - - match tx_type.as_str() { - "INVOKE" => match tx_version.as_str() { - "0x0" => Ok(SNTransaction::Invoke(InvokeTransaction::V0( - serde_json::from_value(transaction)?, - ))), - "0x1" => Ok(SNTransaction::Invoke(InvokeTransaction::V1( - serde_json::from_value(transaction)?, - ))), - x => Err(serde::de::Error::custom(format!( - "unimplemented invoke version: {x}" - ))), - }, - x => Err(serde::de::Error::custom(format!( - "unimplemented transaction type deserialization: {x}" - ))), - } -} - impl RpcState { /// Requests the transaction trace to the Feeder Gateway API. /// It's useful for testing the transaction outputs like: @@ -355,19 +330,7 @@ impl RpcState { "id": 1 }); let result = self.rpc_call::(¶ms).unwrap()["result"].clone(); - - match result["type"].as_str().unwrap() { - "INVOKE" => match result["version"].as_str().unwrap() { - "0x0" => SNTransaction::Invoke(InvokeTransaction::V0( - serde_json::from_value(result).unwrap(), - )), - "0x1" => SNTransaction::Invoke(InvokeTransaction::V1( - serde_json::from_value(result).unwrap(), - )), - _ => unreachable!(), - }, - _ => unimplemented!(), - } + utils::deserialize_transaction_json(result).unwrap() } /// Gets the gas price of a given block. @@ -413,7 +376,7 @@ impl RpcState { .as_array() .unwrap() .iter() - .filter_map(|result| deserialize_transaction_json(result.clone()).ok()) + .filter_map(|result| utils::deserialize_transaction_json(result.clone()).ok()) .collect(); RpcBlockInfo { @@ -543,8 +506,8 @@ mod utils { entry_points_by_type_map } - // Uncompresses a Gz Encoded vector of bytes and returns a string or error - // Here &[u8] implements BufRead + /// Uncompresses a Gz Encoded vector of bytes and returns a string or error + /// Here &[u8] implements BufRead pub(crate) fn decode_reader(bytes: Vec) -> io::Result { use flate2::bufread; let mut gz = bufread::GzDecoder::new(&bytes[..]); @@ -552,6 +515,31 @@ mod utils { gz.read_to_string(&mut s)?; Ok(s) } + + /// Freestanding deserialize method to avoid a new type. + pub(crate) fn deserialize_transaction_json( + transaction: serde_json::Value, + ) -> serde_json::Result { + let tx_type: String = serde_json::from_value(transaction["type"].clone())?; + let tx_version: String = serde_json::from_value(transaction["version"].clone())?; + + match tx_type.as_str() { + "INVOKE" => match tx_version.as_str() { + "0x0" => Ok(SNTransaction::Invoke(InvokeTransaction::V0( + serde_json::from_value(transaction)?, + ))), + "0x1" => Ok(SNTransaction::Invoke(InvokeTransaction::V1( + serde_json::from_value(transaction)?, + ))), + x => Err(serde::de::Error::custom(format!( + "unimplemented invoke version: {x}" + ))), + }, + x => Err(serde::de::Error::custom(format!( + "unimplemented transaction type deserialization: {x}" + ))), + } + } } #[cfg(test)] @@ -1018,7 +1006,6 @@ mod blockifier_transaction_tests { } #[test] - //#[ignore = "working on fixes"] fn test_recent_tx() { let (tx_info, trace, receipt) = execute_tx( "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", @@ -1229,7 +1216,7 @@ mod starknet_in_rust_transaction_tests { } #[test] - //#[ignore = "working on fixes"] + #[ignore = "working on fixes"] fn test_recent_tx() { let (tx_info, trace, receipt) = execute_tx( "0x05d200ef175ba15d676a68b36f7a7b72c17c17604eda4c1efc2ed5e4973e2c91", From 2b8d647a2ea5c7baed28c156a78dcafe7fcefc34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Est=C3=A9fano=20Bargas?= Date: Mon, 4 Sep 2023 13:20:44 -0300 Subject: [PATCH 29/29] Added support for reverted --- rpc_state_reader_sn_api/src/lib.rs | 96 ++++++++++++++++++------------ 1 file changed, 57 insertions(+), 39 deletions(-) diff --git a/rpc_state_reader_sn_api/src/lib.rs b/rpc_state_reader_sn_api/src/lib.rs index af85f0b25..61393d32a 100644 --- a/rpc_state_reader_sn_api/src/lib.rs +++ b/rpc_state_reader_sn_api/src/lib.rs @@ -185,12 +185,13 @@ impl RpcState { } } -#[derive(Debug)] +#[derive(Debug, Deserialize)] pub struct TransactionTrace { pub validate_invocation: RpcCallInfo, - pub function_invocation: RpcCallInfo, + pub function_invocation: Option, pub fee_transfer_invocation: RpcCallInfo, pub signature: Vec, + pub revert_error: Option, } #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] @@ -277,30 +278,6 @@ impl<'de> Deserialize<'de> for RpcCallInfo { } } -impl<'de> Deserialize<'de> for TransactionTrace { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let value: serde_json::Value = Deserialize::deserialize(deserializer)?; - - let validate_invocation = value["validate_invocation"].clone(); - let function_invocation = value["function_invocation"].clone(); - let fee_transfer_invocation = value["fee_transfer_invocation"].clone(); - let signature_value = value["signature"].clone(); - - Ok(TransactionTrace { - validate_invocation: serde_json::from_value(validate_invocation) - .map_err(serde::de::Error::custom)?, - function_invocation: serde_json::from_value(function_invocation) - .map_err(serde::de::Error::custom)?, - fee_transfer_invocation: serde_json::from_value(fee_transfer_invocation) - .map_err(serde::de::Error::custom)?, - signature: serde_json::from_value(signature_value).map_err(serde::de::Error::custom)?, - }) - } -} - impl RpcState { /// Requests the transaction trace to the Feeder Gateway API. /// It's useful for testing the transaction outputs like: @@ -318,7 +295,7 @@ impl RpcState { .call() .unwrap(); - serde_json::from_str(&response.into_string().unwrap()).unwrap() + serde_json::from_value(response.into_json().unwrap()).unwrap() } /// Requests the given transaction to the Feeder Gateway API. @@ -724,7 +701,7 @@ mod tests { assert_eq!(tx_trace.validate_invocation.internal_calls.len(), 1); assert_eq!( - tx_trace.function_invocation.calldata, + tx_trace.function_invocation.as_ref().unwrap().calldata, Some(vec![ stark_felt!("1"), stark_felt!("690c876e61beda61e994543af68038edac4e1cb1990ab06e52a2d27e56a1232"), @@ -744,11 +721,15 @@ mod tests { ]) ); assert_eq!( - tx_trace.function_invocation.retdata, + tx_trace.function_invocation.as_ref().unwrap().retdata, Some(vec![0u128.into()]) ); assert_eq!( - tx_trace.function_invocation.execution_resources, + tx_trace + .function_invocation + .as_ref() + .unwrap() + .execution_resources, VmExecutionResources { n_steps: 2808, n_memory_holes: 136, @@ -758,15 +739,32 @@ mod tests { ]), } ); - assert_eq!(tx_trace.function_invocation.internal_calls.len(), 1); assert_eq!( - tx_trace.function_invocation.internal_calls[0] + tx_trace + .function_invocation + .as_ref() + .unwrap() + .internal_calls + .len(), + 1 + ); + assert_eq!( + tx_trace + .function_invocation + .as_ref() + .unwrap() + .internal_calls[0] .internal_calls .len(), 1 ); assert_eq!( - tx_trace.function_invocation.internal_calls[0].internal_calls[0] + tx_trace + .function_invocation + .as_ref() + .unwrap() + .internal_calls[0] + .internal_calls[0] .internal_calls .len(), 7 @@ -1025,13 +1023,24 @@ mod blockifier_transaction_tests { .. } = execute_call_info.unwrap(); - assert_eq!(vm_resources, trace.function_invocation.execution_resources); + assert_eq!(actual_fee.0, receipt.actual_fee); + assert_eq!( + vm_resources, + trace + .function_invocation + .as_ref() + .unwrap() + .execution_resources + ); assert_eq!( inner_calls.len(), - trace.function_invocation.internal_calls.len() + trace + .function_invocation + .as_ref() + .unwrap() + .internal_calls + .len() ); - - assert_eq!(actual_fee.0, receipt.actual_fee); } } } @@ -1238,11 +1247,20 @@ mod starknet_in_rust_transaction_tests { assert_eq!( execution_resources, - trace.function_invocation.execution_resources + trace + .function_invocation + .as_ref() + .unwrap() + .execution_resources ); assert_eq!( internal_calls.len(), - trace.function_invocation.internal_calls.len() + trace + .function_invocation + .as_ref() + .unwrap() + .internal_calls + .len() ); assert_eq!(actual_fee, receipt.actual_fee);