diff --git a/.tool-versions b/.tool-versions index 0d5a08917b..498bf59ba2 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ scarb 2.9.4 -starknet-devnet 0.4.3 +starknet-devnet 0.5.0-rc.4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 2347fe9b07..942f237dc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Max steps in tests (configured via the `--max-n-steps` argument) now defaults to `usize::MAX` when not specified (previously 10 million). +### Cast + +#### Changed + +- The supported RPC version is now 0.9.0 + ## [0.47.0] - 2025-07-28 ### Forge @@ -39,6 +45,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 #### Changed - Braavos accounts with all class hashes are now supported +- The supported RPC version is now 0.9.0 #### Deprecated diff --git a/Cargo.lock b/Cargo.lock index db1568af14..84ca999b23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5946,14 +5946,15 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "starknet" -version = "0.14.0" -source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce#a70f4cef2032ea0ea839d615426e42a74993bf0b" +version = "0.17.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c9e90938ff10648a2ef87d1fee28fccdcc428f6ded1f9b64657ccfbbfeff64" dependencies = [ "starknet-accounts", "starknet-contract", "starknet-core", "starknet-core-derive", - "starknet-crypto 0.7.4 (git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce)", + "starknet-crypto 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "starknet-macros", "starknet-providers", "starknet-signers", @@ -5961,13 +5962,14 @@ dependencies = [ [[package]] name = "starknet-accounts" -version = "0.13.0" -source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce#a70f4cef2032ea0ea839d615426e42a74993bf0b" +version = "0.16.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b0a53f50fff55946699637e930eb764bb18ddabd392cbe4fd7271b2b223b40" dependencies = [ "async-trait", "auto_impl", "starknet-core", - "starknet-crypto 0.7.4 (git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce)", + "starknet-crypto 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "starknet-providers", "starknet-signers", "thiserror 1.0.69", @@ -5975,8 +5977,9 @@ dependencies = [ [[package]] name = "starknet-contract" -version = "0.13.0" -source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce#a70f4cef2032ea0ea839d615426e42a74993bf0b" +version = "0.16.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25948c499faf8de208ff6a64be5a87be8bb58cb30138dc578311ea7071190af8" dependencies = [ "serde", "serde_json", @@ -5989,8 +5992,9 @@ dependencies = [ [[package]] name = "starknet-core" -version = "0.13.0" -source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce#a70f4cef2032ea0ea839d615426e42a74993bf0b" +version = "0.16.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6266bffbcf0ccfde812f9497dc847e2ea269bd4316e5373ec562165ceba014f" dependencies = [ "base64 0.21.7", "crypto-bigint", @@ -6005,14 +6009,15 @@ dependencies = [ "serde_with", "sha3", "starknet-core-derive", - "starknet-crypto 0.7.4 (git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce)", + "starknet-crypto 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "starknet-types-core", ] [[package]] name = "starknet-core-derive" version = "0.1.0" -source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce#a70f4cef2032ea0ea839d615426e42a74993bf0b" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b08520b7d80eda7bf1a223e8db4f9bb5779a12846f15ebf8f8d76667eca7f5ad" dependencies = [ "proc-macro2", "quote", @@ -6075,8 +6080,9 @@ dependencies = [ [[package]] name = "starknet-macros" -version = "0.2.2" -source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce#a70f4cef2032ea0ea839d615426e42a74993bf0b" +version = "0.2.5-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7b5b575473d4734c3b736735a2099cc14f66be26c6f9895c1a345f436012ed" dependencies = [ "starknet-core", "syn 2.0.104", @@ -6084,8 +6090,9 @@ dependencies = [ [[package]] name = "starknet-providers" -version = "0.13.0" -source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce#a70f4cef2032ea0ea839d615426e42a74993bf0b" +version = "0.16.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfab31dd85ecaef7d9d15e1c3bbefc06c7f0fe6fbe56a8bc2b26c9c1ba7d42f9" dependencies = [ "async-trait", "auto_impl", @@ -6104,8 +6111,9 @@ dependencies = [ [[package]] name = "starknet-signers" -version = "0.11.0" -source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce#a70f4cef2032ea0ea839d615426e42a74993bf0b" +version = "0.14.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd907b1e3da29d9215f8a41e980f5965c4bb28eb43ca55902d37ee2ccc032575" dependencies = [ "async-trait", "auto_impl", @@ -6114,7 +6122,7 @@ dependencies = [ "getrandom 0.2.16", "rand 0.8.5", "starknet-core", - "starknet-crypto 0.7.4 (git+https://github.com/xJonathanLEI/starknet-rs?rev=a70f4ce)", + "starknet-crypto 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 1.0.69", ] diff --git a/Cargo.toml b/Cargo.toml index bea55d9873..c44e42cb8e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,7 +63,7 @@ rayon = "1.10" regex = "1.11.1" serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.140" -starknet = { git = "https://github.com/xJonathanLEI/starknet-rs", rev = "a70f4ce" } +starknet = "0.17.0-rc.2" starknet-crypto = { git = "https://github.com/xJonathanLEI/starknet-rs", rev = "a70f4ce" } tempfile = "3.20.0" thiserror = "2.0.12" diff --git a/crates/cheatnet/src/forking/state.rs b/crates/cheatnet/src/forking/state.rs index b5e77809d4..92667690b5 100644 --- a/crates/cheatnet/src/forking/state.rs +++ b/crates/cheatnet/src/forking/state.rs @@ -15,7 +15,7 @@ use flate2::read::GzDecoder; use num_bigint::BigUint; use runtime::starknet::context::SerializableGasPrices; use starknet::core::types::{ - ContractClass as ContractClassStarknet, MaybePendingBlockWithTxHashes, StarknetError, + ContractClass as ContractClassStarknet, MaybePreConfirmedBlockWithTxHashes, StarknetError, }; use starknet::core::utils::parse_cairo_short_string; use starknet::providers::ProviderError; @@ -81,7 +81,7 @@ impl BlockInfoReader for ForkStateReader { } match self.client.get_block_with_tx_hashes() { - Ok(MaybePendingBlockWithTxHashes::Block(block)) => { + Ok(MaybePreConfirmedBlockWithTxHashes::Block(block)) => { let block_info = BlockInfo { block_number: BlockNumber(block.block_number), sequencer_address: block.sequencer_address.into_(), @@ -96,8 +96,8 @@ impl BlockInfoReader for ForkStateReader { Ok(block_info) } - Ok(MaybePendingBlockWithTxHashes::PendingBlock(_)) => { - unreachable!("Pending block is not be allowed at the configuration level") + Ok(MaybePreConfirmedBlockWithTxHashes::PreConfirmedBlock(_)) => { + unreachable!("Preconfirmed block is not be allowed at the configuration level") } Err(ProviderError::Other(boxed)) => other_provider_error(boxed), Err(err) => Err(StateReadError(format!( diff --git a/crates/cheatnet/src/sync_client.rs b/crates/cheatnet/src/sync_client.rs index 5baacf5cf4..97f5d66aae 100644 --- a/crates/cheatnet/src/sync_client.rs +++ b/crates/cheatnet/src/sync_client.rs @@ -1,4 +1,4 @@ -use starknet::core::types::{BlockId, ContractClass, MaybePendingBlockWithTxHashes}; +use starknet::core::types::{BlockId, ContractClass, MaybePreConfirmedBlockWithTxHashes}; use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::{JsonRpcClient, Provider, ProviderError}; use starknet_api::block::BlockNumber; @@ -27,7 +27,9 @@ impl SyncClient { self.sync(self.client.chain_id()) } - pub fn get_block_with_tx_hashes(&self) -> Result { + pub fn get_block_with_tx_hashes( + &self, + ) -> Result { self.sync(self.client.get_block_with_tx_hashes(self.block_id)) } diff --git a/crates/data-transformer/tests/integration/mod.rs b/crates/data-transformer/tests/integration/mod.rs index a44f2c3b6c..2551749b26 100644 --- a/crates/data-transformer/tests/integration/mod.rs +++ b/crates/data-transformer/tests/integration/mod.rs @@ -22,7 +22,7 @@ static CLASS: OnceCell = OnceCell::const_new(); async fn init_class(class_hash: Felt) -> ContractClass { let client = JsonRpcClient::new(HttpTransport::new( - Url::parse("http://188.34.188.184:7070/rpc/v0_8").unwrap(), + Url::parse("http://188.34.188.184:7070/rpc/v0_9").unwrap(), )); client diff --git a/crates/forge/src/block_number_map.rs b/crates/forge/src/block_number_map.rs index 74a2ac5c97..d1a38212ed 100644 --- a/crates/forge/src/block_number_map.rs +++ b/crates/forge/src/block_number_map.rs @@ -1,7 +1,7 @@ use anyhow::{Result, anyhow}; use conversions::{IntoConv, string::IntoHexStr}; use starknet::{ - core::types::{BlockId, MaybePendingBlockWithTxHashes}, + core::types::{BlockId, MaybePreConfirmedBlockWithTxHashes}, providers::{JsonRpcClient, Provider, jsonrpc::HttpTransport}, }; use starknet_api::block::BlockNumber; @@ -73,7 +73,7 @@ async fn fetch_block_number_for_hash(url: Url, block_hash: Felt) -> Result Ok(BlockNumber(block.block_number)), + Ok(MaybePreConfirmedBlockWithTxHashes::Block(block)) => Ok(BlockNumber(block.block_number)), _ => Err(anyhow!( "Could not get the block number for block with hash 0x{}", block_hash.into_hex_string() diff --git a/crates/forge/src/scarb.rs b/crates/forge/src/scarb.rs index bb48960015..0bd7d7cb56 100644 --- a/crates/forge/src/scarb.rs +++ b/crates/forge/src/scarb.rs @@ -413,7 +413,7 @@ mod tests { [[tool.snforge.fork]] name = "SAME_NAME" url = "http://some.rpc.url" - block_id.tag = "Pending" + block_id.tag = "Preconfirmed" "# ); temp.child("Scarb.toml").write_str(content).unwrap(); diff --git a/crates/forge/tests/data/forking/.snfoundry_cache/http___188_34_188_184_7070_rpc_v0_8_54060_v0_47_0.json b/crates/forge/tests/data/forking/.snfoundry_cache/http___188_34_188_184_7070_rpc_v0_9_54060_v0_47_0.json similarity index 100% rename from crates/forge/tests/data/forking/.snfoundry_cache/http___188_34_188_184_7070_rpc_v0_8_54060_v0_47_0.json rename to crates/forge/tests/data/forking/.snfoundry_cache/http___188_34_188_184_7070_rpc_v0_9_54060_v0_47_0.json diff --git a/crates/shared/src/consts.rs b/crates/shared/src/consts.rs index 2652da460d..d51fab618c 100644 --- a/crates/shared/src/consts.rs +++ b/crates/shared/src/consts.rs @@ -1,4 +1,4 @@ -pub const EXPECTED_RPC_VERSION: &str = "0.8.1"; -pub const RPC_URL_VERSION: &str = "v0_8"; +pub const EXPECTED_RPC_VERSION: &str = "0.9.0-rc.1"; +pub const RPC_URL_VERSION: &str = "v0_9"; pub const SNFORGE_TEST_FILTER: &str = "SNFORGE_TEST_FILTER"; pub const FREE_RPC_PROVIDER_URL: &str = "https://starknet-sepolia.public.blastapi.io/rpc/v0_8"; diff --git a/crates/shared/src/test_utils/node_url.rs b/crates/shared/src/test_utils/node_url.rs index 1bf35aeaf1..1647edb21b 100644 --- a/crates/shared/src/test_utils/node_url.rs +++ b/crates/shared/src/test_utils/node_url.rs @@ -5,7 +5,7 @@ use url::Url; /// - `node_url()` -> #[must_use] pub fn node_rpc_url() -> Url { - Url::parse("http://188.34.188.184:7070/rpc/v0_8").expect("Failed to parse the sepolia RPC URL") + Url::parse("http://188.34.188.184:7070/rpc/v0_9").expect("Failed to parse the sepolia RPC URL") } /// returning URL with no slug (`rpc/v0_7` suffix). diff --git a/crates/sncast/src/helpers/fee.rs b/crates/sncast/src/helpers/fee.rs index ebd1f3359d..483d843bc0 100644 --- a/crates/sncast/src/helpers/fee.rs +++ b/crates/sncast/src/helpers/fee.rs @@ -143,7 +143,7 @@ fn parse_non_zero_felt(s: &str) -> Result { #[cfg(test)] mod tests { use super::FeeSettings; - use starknet::core::types::{FeeEstimate, PriceUnit}; + use starknet::core::types::FeeEstimate; use std::convert::TryFrom; #[tokio::test] @@ -155,7 +155,6 @@ mod tests { l2_gas_price: 4, l1_data_gas_consumed: 5, l1_data_gas_price: 6, - unit: PriceUnit::Fri, overall_fee: 44, }; let settings = FeeSettings::try_from(mock_fee_estimate).unwrap(); diff --git a/crates/sncast/src/lib.rs b/crates/sncast/src/lib.rs index a3f3cf432c..798e1dc458 100644 --- a/crates/sncast/src/lib.rs +++ b/crates/sncast/src/lib.rs @@ -16,7 +16,7 @@ use shared::rpc::create_rpc_client; use starknet::accounts::{AccountFactory, AccountFactoryError}; use starknet::core::types::{ BlockId, BlockTag, - BlockTag::{Latest, Pending}, + BlockTag::{Latest, PreConfirmed}, ContractClass, ContractErrorData, StarknetError::{ClassHashNotFound, ContractNotFound, TransactionHashNotFound}, }; @@ -305,7 +305,7 @@ async fn build_account( let mut account = SingleOwnerAccount::new(provider, signer, address, chain_id, account_encoding); - account.set_block_id(BlockId::Tag(Pending)); + account.set_block_id(BlockId::Tag(PreConfirmed)); Ok(account) } @@ -315,7 +315,10 @@ async fn verify_account_address( chain_id: Felt, provider: &JsonRpcClient, ) -> Result<()> { - match provider.get_nonce(BlockId::Tag(Pending), address).await { + match provider + .get_nonce(BlockId::Tag(PreConfirmed), address) + .await + { Ok(_) => Ok(()), Err(error) => { if let StarknetError(ContractNotFound) = error { @@ -476,8 +479,16 @@ pub async fn check_if_legacy_contract( provider: &JsonRpcClient, ) -> Result { let contract_class = match class_hash { - Some(class_hash) => provider.get_class(BlockId::Tag(Pending), class_hash).await, - None => provider.get_class_at(BlockId::Tag(Pending), address).await, + Some(class_hash) => { + provider + .get_class(BlockId::Tag(PreConfirmed), class_hash) + .await + } + None => { + provider + .get_class_at(BlockId::Tag(PreConfirmed), address) + .await + } } .map_err(handle_rpc_error)?; @@ -489,7 +500,7 @@ pub async fn get_class_hash_by_address( address: Felt, ) -> Result { let result = provider - .get_class_hash_at(BlockId::Tag(Pending), address) + .get_class_hash_at(BlockId::Tag(PreConfirmed), address) .await; if let Err(ProviderError::StarknetError(ContractNotFound)) = result { @@ -528,13 +539,13 @@ fn map_encoding(legacy: bool) -> ExecutionEncoding { pub fn get_block_id(value: &str) -> Result { match value { - "pending" => Ok(BlockId::Tag(Pending)), + "pre_confirmed" => Ok(BlockId::Tag(PreConfirmed)), "latest" => Ok(BlockId::Tag(Latest)), _ if value.starts_with("0x") => Ok(BlockId::Hash(Felt::from_hex(value)?)), _ => match value.parse::() { Ok(value) => Ok(BlockId::Number(value)), Err(_) => Err(anyhow::anyhow!( - "Incorrect value passed for block_id = {value}. Possible values are pending, latest, block hash (hex) and block number (u64)" + "Incorrect value passed for block_id = {value}. Possible values are `pre_confirmed`, `latest`, block hash (hex) and block number (u64)" )), }, } @@ -547,8 +558,6 @@ pub struct ErrorData { #[derive(Error, Debug, CairoSerialize)] pub enum TransactionError { - #[error("Transaction has been rejected")] - Rejected, #[error("Transaction has been reverted = {}", .0.data)] Reverted(ErrorData), } @@ -574,9 +583,13 @@ pub async fn wait_for_tx( let retries = wait_params.get_retries(); for i in (1..retries).rev() { match provider.get_transaction_status(tx_hash).await { - Ok(starknet::core::types::TransactionStatus::Rejected) => { + Ok(starknet::core::types::TransactionStatus::PreConfirmed( + ExecutionResult::Reverted { reason }, + )) => { return Err(WaitForTransactionError::TransactionError( - TransactionError::Rejected, + TransactionError::Reverted(ErrorData { + data: ByteArray::from(reason.as_str()), + }), )); } Ok( @@ -594,7 +607,19 @@ pub async fn wait_for_tx( } }; } - Ok(starknet::core::types::TransactionStatus::Received) + Ok(starknet::core::types::TransactionStatus::PreConfirmed( + ExecutionResult::Succeeded, + )) => { + let remaining_time = wait_params.remaining_time(i); + ui.println(&"Transaction status: PRE_CONFIRMED".to_string()); + ui.println(&format!( + "Waiting for transaction to be accepted ({i} retries / {remaining_time}s left until timeout)" + )); + } + Ok( + starknet::core::types::TransactionStatus::Received + | starknet::core::types::TransactionStatus::Candidate, + ) | Err(StarknetError(TransactionHashNotFound)) => { let remaining_time = wait_params.remaining_time(i); ui.println(&format!( @@ -736,7 +761,7 @@ mod tests { use conversions::string::IntoHexStr; use starknet::core::types::{ BlockId, - BlockTag::{Latest, Pending}, + BlockTag::{Latest, PreConfirmed}, Felt, }; use starknet::core::utils::UdcUniqueSettings; @@ -745,10 +770,10 @@ mod tests { #[test] fn test_get_block_id() { - let pending_block = get_block_id("pending").unwrap(); + let pending_block = get_block_id("pre_confirmed").unwrap(); let latest_block = get_block_id("latest").unwrap(); - assert_eq!(pending_block, BlockId::Tag(Pending)); + assert_eq!(pending_block, BlockId::Tag(PreConfirmed)); assert_eq!(latest_block, BlockId::Tag(Latest)); } @@ -779,7 +804,7 @@ mod tests { let block = get_block_id("mariusz").unwrap_err(); assert!(block .to_string() - .contains("Incorrect value passed for block_id = mariusz. Possible values are pending, latest, block hash (hex) and block number (u64)")); + .contains("Incorrect value passed for block_id = mariusz. Possible values are `pre_confirmed`, `latest`, block hash (hex) and block number (u64)")); } #[test] diff --git a/crates/sncast/src/response/account/create.rs b/crates/sncast/src/response/account/create.rs index 33aca415f6..48c2db9742 100644 --- a/crates/sncast/src/response/account/create.rs +++ b/crates/sncast/src/response/account/create.rs @@ -9,7 +9,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::{Serialize, Serializer}; use serde_json::Value; -use serde_json::json; fn as_str(value: &u128, serializer: S) -> Result where @@ -48,13 +47,7 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/account/delete.rs b/crates/sncast/src/response/account/delete.rs index 18f829a3e2..c1c53d94bb 100644 --- a/crates/sncast/src/response/account/delete.rs +++ b/crates/sncast/src/response/account/delete.rs @@ -4,7 +4,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; #[derive(Serialize, Clone)] pub struct AccountDeleteResponse { @@ -23,12 +22,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/account/deploy.rs b/crates/sncast/src/response/account/deploy.rs index 19b0b55098..33ba8c9ce9 100644 --- a/crates/sncast/src/response/account/deploy.rs +++ b/crates/sncast/src/response/account/deploy.rs @@ -9,7 +9,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::{Deserialize, Serialize}; use serde_json::Value; -use serde_json::json; #[derive(Serialize, Deserialize, CairoSerialize, Clone, Debug, PartialEq)] pub struct AccountDeployResponse { pub transaction_hash: PaddedFelt, @@ -37,13 +36,7 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/account/import.rs b/crates/sncast/src/response/account/import.rs index bf03f35cca..1021473f78 100644 --- a/crates/sncast/src/response/account/import.rs +++ b/crates/sncast/src/response/account/import.rs @@ -4,7 +4,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; #[derive(Serialize, Clone)] pub struct AccountImportResponse { @@ -28,12 +27,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/call.rs b/crates/sncast/src/response/call.rs index 35f04c86d7..8fca9b8ab0 100644 --- a/crates/sncast/src/response/call.rs +++ b/crates/sncast/src/response/call.rs @@ -6,7 +6,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; use starknet_types_core::felt::Felt; #[derive(Serialize, CairoSerialize, Clone)] @@ -34,12 +33,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/cast_message.rs b/crates/sncast/src/response/cast_message.rs index fc47e585ed..d6703cde0c 100644 --- a/crates/sncast/src/response/cast_message.rs +++ b/crates/sncast/src/response/cast_message.rs @@ -6,3 +6,31 @@ pub struct SncastMessage { pub command: String, pub command_response: T, } + +impl SncastMessage { + pub fn to_json(&self) -> serde_json::Value { + match serde_json::to_value(&self.command_response) { + Ok(serde_json::Value::Object(mut map)) => { + map.insert( + "command".to_string(), + serde_json::Value::String(self.command.clone()), + ); + serde_json::Value::Object(map) + } + Ok(other) => { + serde_json::json!({ + "error": "Expected a map for `command_response`", + "command": self.command, + "details": other.to_string() + }) + } + Err(err) => { + serde_json::json!({ + "error": "Failed to serialize response", + "command": self.command, + "details": err.to_string() + }) + } + } + } +} diff --git a/crates/sncast/src/response/declare.rs b/crates/sncast/src/response/declare.rs index b4f77b2faf..2a4da1cbfa 100644 --- a/crates/sncast/src/response/declare.rs +++ b/crates/sncast/src/response/declare.rs @@ -8,7 +8,6 @@ use foundry_ui::styling; use indoc::formatdoc; use serde::{Deserialize, Serialize}; use serde_json::Value; -use serde_json::json; #[derive(Clone, Serialize, Deserialize, CairoSerialize, Debug, PartialEq)] pub struct DeclareTransactionResponse { pub class_hash: PaddedFelt, @@ -34,13 +33,7 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } @@ -64,13 +57,7 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } @@ -105,13 +92,7 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/deploy.rs b/crates/sncast/src/response/deploy.rs index eebddedbe5..3258e39a53 100644 --- a/crates/sncast/src/response/deploy.rs +++ b/crates/sncast/src/response/deploy.rs @@ -6,7 +6,6 @@ use foundry_ui::styling; use indoc::formatdoc; use serde::{Deserialize, Serialize}; use serde_json::Value; -use serde_json::json; use super::{command::CommandResponse, explorer_link::OutputLink}; use crate::response::cast_message::SncastMessage; @@ -36,13 +35,7 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/errors.rs b/crates/sncast/src/response/errors.rs index de2a62955e..834327215d 100644 --- a/crates/sncast/src/response/errors.rs +++ b/crates/sncast/src/response/errors.rs @@ -148,7 +148,9 @@ impl From for SNCastStarknetError { SNCastStarknetError::TransactionExecutionError(err) } StarknetError::ClassAlreadyDeclared => SNCastStarknetError::ClassAlreadyDeclared, - StarknetError::InvalidTransactionNonce => SNCastStarknetError::InvalidTransactionNonce, + StarknetError::InvalidTransactionNonce(_) => { + SNCastStarknetError::InvalidTransactionNonce + } StarknetError::InsufficientResourcesForValidate => { SNCastStarknetError::InsufficientResourcesForValidate } diff --git a/crates/sncast/src/response/invoke.rs b/crates/sncast/src/response/invoke.rs index c93a408bb3..06d2088474 100644 --- a/crates/sncast/src/response/invoke.rs +++ b/crates/sncast/src/response/invoke.rs @@ -8,7 +8,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::{Deserialize, Serialize}; use serde_json::Value; -use serde_json::json; #[derive(Serialize, Deserialize, CairoSerialize, Clone, Debug, PartialEq)] pub struct InvokeResponse { @@ -30,13 +29,7 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/multicall/new.rs b/crates/sncast/src/response/multicall/new.rs index 968cab2351..cfd141863a 100644 --- a/crates/sncast/src/response/multicall/new.rs +++ b/crates/sncast/src/response/multicall/new.rs @@ -5,7 +5,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; #[derive(Serialize, Clone)] pub struct MulticallNewResponse { @@ -26,12 +25,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/multicall/run.rs b/crates/sncast/src/response/multicall/run.rs index 9963f0ab45..b7b458d1e8 100644 --- a/crates/sncast/src/response/multicall/run.rs +++ b/crates/sncast/src/response/multicall/run.rs @@ -11,7 +11,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::{Deserialize, Serialize}; use serde_json::Value; -use serde_json::json; #[derive(Serialize, Deserialize, CairoSerialize, Clone, Debug, PartialEq)] pub struct MulticallRunResponse { @@ -33,13 +32,7 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/script/init.rs b/crates/sncast/src/response/script/init.rs index d2cbfe15fb..5e16919d16 100644 --- a/crates/sncast/src/response/script/init.rs +++ b/crates/sncast/src/response/script/init.rs @@ -4,7 +4,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; #[derive(Serialize, Clone)] pub struct ScriptInitResponse { @@ -23,12 +22,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/script/run.rs b/crates/sncast/src/response/script/run.rs index 1b67768838..847e8273ec 100644 --- a/crates/sncast/src/response/script/run.rs +++ b/crates/sncast/src/response/script/run.rs @@ -4,7 +4,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; #[derive(Serialize, Debug, Clone)] pub struct ScriptRunResponse { @@ -29,12 +28,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/serialize.rs b/crates/sncast/src/response/serialize.rs index 47bb56afa2..23d26c7cae 100644 --- a/crates/sncast/src/response/serialize.rs +++ b/crates/sncast/src/response/serialize.rs @@ -5,7 +5,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::{Deserialize, Serialize}; use serde_json::Value; -use serde_json::json; use starknet_types_core::felt::Felt; #[derive(Serialize, Deserialize, CairoSerialize, Clone, Debug, PartialEq)] @@ -25,12 +24,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/show_config.rs b/crates/sncast/src/response/show_config.rs index fb3a248866..4a72cd4c12 100644 --- a/crates/sncast/src/response/show_config.rs +++ b/crates/sncast/src/response/show_config.rs @@ -4,7 +4,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; use super::command::CommandResponse; use crate::response::cast_message::SncastMessage; @@ -67,12 +66,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/transformed_call.rs b/crates/sncast/src/response/transformed_call.rs index f55a6184b2..0be0db8f15 100644 --- a/crates/sncast/src/response/transformed_call.rs +++ b/crates/sncast/src/response/transformed_call.rs @@ -8,7 +8,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; use starknet::core::types::{ContractClass, contract::AbiEntry}; use starknet_types_core::felt::Felt; @@ -39,13 +38,7 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/tx_status.rs b/crates/sncast/src/response/tx_status.rs index cbbd54e26a..67af468a66 100644 --- a/crates/sncast/src/response/tx_status.rs +++ b/crates/sncast/src/response/tx_status.rs @@ -5,12 +5,12 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; #[derive(Serialize, CairoSerialize, Clone)] pub enum FinalityStatus { Received, - Rejected, + Candidate, + PreConfirmed, AcceptedOnL2, AcceptedOnL1, } @@ -33,7 +33,8 @@ impl Message for SncastMessage { fn text(&self) -> String { let finality_status = match &self.command_response.finality_status { FinalityStatus::Received => "Received", - FinalityStatus::Rejected => "Rejected", + FinalityStatus::Candidate => "Candidate", + FinalityStatus::PreConfirmed => "Pre confirmed", FinalityStatus::AcceptedOnL2 => "Accepted on L2", FinalityStatus::AcceptedOnL1 => "Accepted on L1", }; @@ -55,12 +56,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/response/verify.rs b/crates/sncast/src/response/verify.rs index dd87adb913..8f4e23143b 100644 --- a/crates/sncast/src/response/verify.rs +++ b/crates/sncast/src/response/verify.rs @@ -2,7 +2,6 @@ use foundry_ui::Message; use foundry_ui::styling; use serde::Serialize; use serde_json::Value; -use serde_json::json; use super::command::CommandResponse; use crate::response::cast_message::SncastMessage; @@ -24,12 +23,6 @@ impl Message for SncastMessage { } fn json(&self) -> Value { - serde_json::to_value(&self.command_response).unwrap_or_else(|err| { - json!({ - "error": "Failed to serialize response", - "command": self.command, - "details": err.to_string() - }) - }) + self.to_json() } } diff --git a/crates/sncast/src/starknet_commands/account/deploy.rs b/crates/sncast/src/starknet_commands/account/deploy.rs index 0f8172e0c2..9a5349f747 100644 --- a/crates/sncast/src/starknet_commands/account/deploy.rs +++ b/crates/sncast/src/starknet_commands/account/deploy.rs @@ -18,7 +18,7 @@ use sncast::{ }; use starknet::accounts::{AccountDeploymentV3, AccountFactory, OpenZeppelinAccountFactory}; use starknet::accounts::{AccountFactoryError, ArgentAccountFactory}; -use starknet::core::types::BlockTag::Pending; +use starknet::core::types::BlockTag::PreConfirmed; use starknet::core::types::{BlockId, StarknetError::ClassHashNotFound}; use starknet::core::utils::get_contract_address; use starknet::providers::ProviderError::StarknetError; @@ -131,7 +131,7 @@ async fn deploy_from_keystore( let address = compute_account_address(salt, &private_key, class_hash, account_type, chain_id); let result = if provider - .get_class_hash_at(BlockId::Tag(Pending), address) + .get_class_hash_at(BlockId::Tag(PreConfirmed), address) .await .is_ok() { diff --git a/crates/sncast/src/starknet_commands/account/import.rs b/crates/sncast/src/starknet_commands/account/import.rs index 2703de6a93..cf02fca37c 100644 --- a/crates/sncast/src/starknet_commands/account/import.rs +++ b/crates/sncast/src/starknet_commands/account/import.rs @@ -97,7 +97,7 @@ pub async fn import( .unwrap_or_else(|| generate_account_name(accounts_file).unwrap()); let fetched_class_hash = match provider - .get_class_hash_at(BlockId::Tag(BlockTag::Pending), import.address) + .get_class_hash_at(BlockId::Tag(BlockTag::PreConfirmed), import.address) .await { Ok(class_hash) => Ok(Some(class_hash)), diff --git a/crates/sncast/src/starknet_commands/call.rs b/crates/sncast/src/starknet_commands/call.rs index 9c0cdd5771..d9fccc1913 100644 --- a/crates/sncast/src/starknet_commands/call.rs +++ b/crates/sncast/src/starknet_commands/call.rs @@ -24,9 +24,9 @@ pub struct Call { pub arguments: Arguments, /// Block identifier on which call should be performed. - /// Possible values: pending, latest, block hash (0x prefixed string) + /// Possible values: `pre_confirmed`, `latest`, block hash (0x prefixed string) /// and block number (u64) - #[arg(short, long, default_value = "pending")] + #[arg(short, long, default_value = "pre_confirmed")] pub block_id: String, #[command(flatten)] diff --git a/crates/sncast/src/starknet_commands/script/run.rs b/crates/sncast/src/starknet_commands/script/run.rs index eb314550f4..9200067779 100644 --- a/crates/sncast/src/starknet_commands/script/run.rs +++ b/crates/sncast/src/starknet_commands/script/run.rs @@ -48,7 +48,7 @@ use sncast::state::hashing::{ }; use sncast::state::state_file::StateManager; use starknet::accounts::{Account, SingleOwnerAccount}; -use starknet::core::types::{BlockId, BlockTag::Pending}; +use starknet::core::types::{BlockId, BlockTag::PreConfirmed}; use starknet::providers::JsonRpcClient; use starknet::providers::jsonrpc::HttpTransport; use starknet::signers::LocalWallet; @@ -118,7 +118,7 @@ impl<'a> ExtensionLogic for CastScriptExtension<'a> { function_selector, calldata_felts, self.provider, - &BlockId::Tag(Pending), + &BlockId::Tag(PreConfirmed), )); Ok(CheatcodeHandlingResult::from_serializable(call_result)) } diff --git a/crates/sncast/src/starknet_commands/tx_status.rs b/crates/sncast/src/starknet_commands/tx_status.rs index dc2b6ddf08..fcc5887632 100644 --- a/crates/sncast/src/starknet_commands/tx_status.rs +++ b/crates/sncast/src/starknet_commands/tx_status.rs @@ -34,10 +34,14 @@ fn build_transaction_status_response(status: &TransactionStatus) -> TransactionS finality_status: FinalityStatus::Received, execution_status: None, }, - TransactionStatus::Rejected => TransactionStatusResponse { - finality_status: FinalityStatus::Rejected, + TransactionStatus::Candidate => TransactionStatusResponse { + finality_status: FinalityStatus::Candidate, execution_status: None, }, + TransactionStatus::PreConfirmed(tx_exec_result) => TransactionStatusResponse { + finality_status: FinalityStatus::PreConfirmed, + execution_status: Some(build_execution_status(tx_exec_result.status())), + }, TransactionStatus::AcceptedOnL2(tx_exec_result) => TransactionStatusResponse { finality_status: FinalityStatus::AcceptedOnL2, execution_status: Some(build_execution_status(tx_exec_result.status())), diff --git a/crates/sncast/src/starknet_commands/utils/mod.rs b/crates/sncast/src/starknet_commands/utils/mod.rs index 097729c87d..bbb1746695 100644 --- a/crates/sncast/src/starknet_commands/utils/mod.rs +++ b/crates/sncast/src/starknet_commands/utils/mod.rs @@ -28,7 +28,7 @@ pub async fn utils(utils: Utils, config: CastConfig, ui: &UI) -> anyhow::Result< .await .map_err(handle_starknet_command_error)?; - process_command_result("serialize", Ok(result), ui, None); + process_command_result("utils serialize", Ok(result), ui, None); } } diff --git a/crates/sncast/tests/data/scripts/declare/src/with_invalid_nonce.cairo b/crates/sncast/tests/data/scripts/declare/src/with_invalid_nonce.cairo index 038785b3b1..f868c5181d 100644 --- a/crates/sncast/tests/data/scripts/declare/src/with_invalid_nonce.cairo +++ b/crates/sncast/tests/data/scripts/declare/src/with_invalid_nonce.cairo @@ -6,7 +6,7 @@ fn main() { let fee_settings = FeeSettingsTrait::resource_bounds( 100000, 10000000000000, 1000000000, 100000000000000000000, 100000, 10000000000000, ); - let declare_nonce = get_nonce('pending') + 100; + let declare_nonce = get_nonce('pre_confirmed') + 100; let declare_result = declare("Mapa", fee_settings, Option::Some(declare_nonce)).unwrap_err(); println!("{:?}", declare_result); diff --git a/crates/sncast/tests/data/scripts/deploy/src/invalid_calldata.cairo b/crates/sncast/tests/data/scripts/deploy/src/invalid_calldata.cairo index b7493fc31b..a1a57b18ad 100644 --- a/crates/sncast/tests/data/scripts/deploy/src/invalid_calldata.cairo +++ b/crates/sncast/tests/data/scripts/deploy/src/invalid_calldata.cairo @@ -11,7 +11,7 @@ fn main() { .try_into() .expect('Invalid class hash value'); - let deploy_nonce = get_nonce('pending'); + let deploy_nonce = get_nonce('pre_confirmed'); let deploy_result = deploy( class_hash, array![0x2], Option::Some(salt), true, fee_settings, Option::Some(deploy_nonce), ) diff --git a/crates/sncast/tests/data/scripts/deploy/src/invalid_class_hash.cairo b/crates/sncast/tests/data/scripts/deploy/src/invalid_class_hash.cairo index a44c7f2320..1aaa4bdc2c 100644 --- a/crates/sncast/tests/data/scripts/deploy/src/invalid_class_hash.cairo +++ b/crates/sncast/tests/data/scripts/deploy/src/invalid_class_hash.cairo @@ -9,7 +9,7 @@ fn main() { let class_hash: ClassHash = 0xdddd.try_into().expect('Invalid class hash value'); - let deploy_nonce = get_nonce('pending'); + let deploy_nonce = get_nonce('pre_confirmed'); let deploy_result = deploy( class_hash, array![0x2, 0x2, 0x0], diff --git a/crates/sncast/tests/data/scripts/deploy/src/invalid_nonce.cairo b/crates/sncast/tests/data/scripts/deploy/src/invalid_nonce.cairo index 4eec7b6397..b96953a71d 100644 --- a/crates/sncast/tests/data/scripts/deploy/src/invalid_nonce.cairo +++ b/crates/sncast/tests/data/scripts/deploy/src/invalid_nonce.cairo @@ -14,7 +14,7 @@ fn main() { .try_into() .expect('Invalid class hash value'); - let deploy_nonce = get_nonce('pending') + 100; + let deploy_nonce = get_nonce('pre_confirmed') + 100; let deploy_result = deploy( class_hash, array![0x2, 0x2, 0x0], diff --git a/crates/sncast/tests/data/scripts/deploy/src/same_class_hash_and_salt.cairo b/crates/sncast/tests/data/scripts/deploy/src/same_class_hash_and_salt.cairo index 71f2153111..df5ff9395d 100644 --- a/crates/sncast/tests/data/scripts/deploy/src/same_class_hash_and_salt.cairo +++ b/crates/sncast/tests/data/scripts/deploy/src/same_class_hash_and_salt.cairo @@ -11,7 +11,7 @@ fn main() { .try_into() .expect('Invalid class hash value'); - let deploy_nonce = get_nonce('pending'); + let deploy_nonce = get_nonce('pre_confirmed'); deploy( class_hash, array![0x2, 0x2, 0x0], @@ -26,7 +26,7 @@ fn main() { .try_into() .expect('Invalid class hash value'); - let deploy_nonce = get_nonce('pending'); + let deploy_nonce = get_nonce('pre_confirmed'); let deploy_result = deploy( class_hash, array![0x2, 0x2, 0x0], diff --git a/crates/sncast/tests/data/scripts/map_script/scripts/src/display_debug_traits_for_subcommand_responses.cairo b/crates/sncast/tests/data/scripts/map_script/scripts/src/display_debug_traits_for_subcommand_responses.cairo index 9ab90b1663..452c99161b 100644 --- a/crates/sncast/tests/data/scripts/map_script/scripts/src/display_debug_traits_for_subcommand_responses.cairo +++ b/crates/sncast/tests/data/scripts/map_script/scripts/src/display_debug_traits_for_subcommand_responses.cairo @@ -18,7 +18,7 @@ fn main() { println!("debug declare_result: {:?}", declare_result); let class_hash = declare_result.class_hash(); - let deploy_nonce = get_nonce('pending'); + let deploy_nonce = get_nonce('pre_confirmed'); let deploy_result = deploy( *class_hash, ArrayTrait::new(), @@ -33,7 +33,7 @@ fn main() { assert(deploy_result.transaction_hash != 0, deploy_result.transaction_hash); - let invoke_nonce = get_nonce('pending'); + let invoke_nonce = get_nonce('pre_confirmed'); let invoke_result = invoke( deploy_result.contract_address, selector!("put"), diff --git a/crates/sncast/tests/data/scripts/map_script/scripts/src/map_script.cairo b/crates/sncast/tests/data/scripts/map_script/scripts/src/map_script.cairo index cef75baa0a..adb5933299 100644 --- a/crates/sncast/tests/data/scripts/map_script/scripts/src/map_script.cairo +++ b/crates/sncast/tests/data/scripts/map_script/scripts/src/map_script.cairo @@ -45,7 +45,7 @@ fn main() { .expect('mapa declare failed'); let class_hash = declare_result.class_hash(); - let deploy_nonce = get_nonce('pending'); + let deploy_nonce = get_nonce('pre_confirmed'); let deploy_result = deploy( *class_hash, ArrayTrait::new(), @@ -57,7 +57,7 @@ fn main() { .expect('mapa deploy failed'); assert(deploy_result.transaction_hash != 0, deploy_result.transaction_hash); - let invoke_nonce = get_nonce('pending'); + let invoke_nonce = get_nonce('pre_confirmed'); let invoke_result = invoke( deploy_result.contract_address, selector!("put"), diff --git a/crates/sncast/tests/data/scripts/state_file/src/all_tx_fail.cairo b/crates/sncast/tests/data/scripts/state_file/src/all_tx_fail.cairo index 5702549577..0895869d47 100644 --- a/crates/sncast/tests/data/scripts/state_file/src/all_tx_fail.cairo +++ b/crates/sncast/tests/data/scripts/state_file/src/all_tx_fail.cairo @@ -17,7 +17,7 @@ fn main() { declare("Not_this_time", fee_settings, Option::Some(declare_nonce)) .expect_err('error expected declare'); - let deploy_nonce = get_nonce('pending'); + let deploy_nonce = get_nonce('pre_confirmed'); deploy( nonexistent_class_hash, ArrayTrait::new(), @@ -28,7 +28,7 @@ fn main() { ) .expect_err('error expected deploy'); - let invoke_nonce = get_nonce('pending'); + let invoke_nonce = get_nonce('pre_confirmed'); invoke( map_contract_address, selector!("put"), diff --git a/crates/sncast/tests/data/scripts/state_script/scripts/src/state_script.cairo b/crates/sncast/tests/data/scripts/state_script/scripts/src/state_script.cairo index c517609472..6d95b1457a 100644 --- a/crates/sncast/tests/data/scripts/state_script/scripts/src/state_script.cairo +++ b/crates/sncast/tests/data/scripts/state_script/scripts/src/state_script.cairo @@ -11,7 +11,7 @@ fn main() { .expect('state declare failed'); let class_hash = declare_result.class_hash(); - let deploy_nonce = get_nonce('pending'); + let deploy_nonce = get_nonce('pre_confirmed'); let deploy_result = deploy( *class_hash, ArrayTrait::new(), @@ -23,7 +23,7 @@ fn main() { .expect('state deploy failed'); assert(deploy_result.transaction_hash != 0, deploy_result.transaction_hash); - let invoke_nonce = get_nonce('pending'); + let invoke_nonce = get_nonce('pre_confirmed'); let invoke_result = invoke( deploy_result.contract_address, selector!("put"), diff --git a/crates/sncast/tests/e2e/account/create.rs b/crates/sncast/tests/e2e/account/create.rs index 3ac251dd7e..c1ad87396f 100644 --- a/crates/sncast/tests/e2e/account/create.rs +++ b/crates/sncast/tests/e2e/account/create.rs @@ -914,7 +914,7 @@ pub async fn test_happy_case_deployment_fee_message() { assert_stdout_contains( output, - "Account successfully created but it needs to be deployed. The estimated deployment fee is 0.000836288000000000 STRK. Prefund the account to cover deployment transaction fee", + "Account successfully created but it needs to be deployed. The estimated deployment fee is [..] STRK. Prefund the account to cover deployment transaction fee", ); } @@ -995,7 +995,7 @@ pub async fn test_json_output_format() { let snapbox = runner(&args).current_dir(temp_dir.path()); snapbox.assert().stdout_matches(indoc! {r#" - {"add_profile":"Profile my_account successfully added to [..]/snfoundry.toml","address":"0x[..]","estimated_fee":"[..]","message":"Account successfully created but it needs to be deployed. The estimated deployment fee is [..] STRK. Prefund the account to cover deployment transaction fee/n/nAfter prefunding the account, run:/nsncast --accounts-file accounts.json account deploy --url [..] --name my_account"} + {"command":"account create","add_profile":"Profile my_account successfully added to [..]/snfoundry.toml","address":"0x[..]","estimated_fee":"[..]","message":"Account successfully created but it needs to be deployed. The estimated deployment fee is [..] STRK. Prefund the account to cover deployment transaction fee/n/nAfter prefunding the account, run:/nsncast --accounts-file accounts.json account deploy --url [..] --name my_account"} {"links":"account: https://sepolia.starkscan.co/contract/0x[..]","title":"account creation"} "#}); } diff --git a/crates/sncast/tests/e2e/account/deploy.rs b/crates/sncast/tests/e2e/account/deploy.rs index 1125aef126..09ae0d3fcd 100644 --- a/crates/sncast/tests/e2e/account/deploy.rs +++ b/crates/sncast/tests/e2e/account/deploy.rs @@ -593,6 +593,6 @@ pub async fn test_json_output_format() { let snapbox = runner(&args).current_dir(tempdir.path()); snapbox.assert().stdout_matches(indoc! {r#" {"transaction_hash":"0x0[..]"} - {"links":"transaction: https://sepolia.starkscan.co/tx/0x0[..]","title":"account deployment"} + {"command":"account deploy","links":"transaction: https://sepolia.starkscan.co/tx/0x0[..]","title":"account deployment"} "#}); } diff --git a/crates/sncast/tests/e2e/call.rs b/crates/sncast/tests/e2e/call.rs index b2aacf42fc..75c3083a73 100644 --- a/crates/sncast/tests/e2e/call.rs +++ b/crates/sncast/tests/e2e/call.rs @@ -289,6 +289,6 @@ fn test_json_output_format() { let snapbox = runner(&args); snapbox.assert().success().stdout_eq(indoc! {r#" - {"response":"0x0","response_raw":["0x0"]} + {"command":"call","response":"0x0","response_raw":["0x0"]} "#}); } diff --git a/crates/sncast/tests/e2e/deploy.rs b/crates/sncast/tests/e2e/deploy.rs index fb45ba9476..3d09082ee0 100644 --- a/crates/sncast/tests/e2e/deploy.rs +++ b/crates/sncast/tests/e2e/deploy.rs @@ -380,7 +380,7 @@ async fn test_json_output_format() { assert_stdout_contains( output, indoc! {r#" - {"contract_address":"0x[..]","transaction_hash":"0x[..]"} + {"command":"deploy","contract_address":"0x[..]","transaction_hash":"0x[..]"} {"links":"contract: https://sepolia.starkscan.co/contract/0x[..]\ntransaction: https://sepolia.starkscan.co/tx/0x[..]\n","title":"deployment"} "#}, ); diff --git a/crates/sncast/tests/e2e/serialize.rs b/crates/sncast/tests/e2e/serialize.rs index 525817152f..300e017c99 100644 --- a/crates/sncast/tests/e2e/serialize.rs +++ b/crates/sncast/tests/e2e/serialize.rs @@ -178,7 +178,7 @@ async fn test_happy_case_json() { let snapbox = runner(&args).current_dir(tempdir.path()); snapbox.assert().success().stdout_eq(indoc! {r#" - {"calldata":["0x24","0x60"]} + {"command":"utils serialize","calldata":["0x24","0x60"]} "#}); } diff --git a/crates/sncast/tests/helpers/constants.rs b/crates/sncast/tests/helpers/constants.rs index 169203d622..320b4ad038 100644 --- a/crates/sncast/tests/helpers/constants.rs +++ b/crates/sncast/tests/helpers/constants.rs @@ -4,7 +4,7 @@ use starknet_types_core::felt::Felt; pub const ACCOUNT: &str = "user1"; pub const ACCOUNT_FILE_PATH: &str = "tests/data/accounts/accounts.json"; -pub const SEPOLIA_RPC_URL: &str = "http://188.34.188.184:7070/rpc/v0_8"; +pub const SEPOLIA_RPC_URL: &str = "http://188.34.188.184:7070/rpc/v0_9"; pub const URL: &str = "http://127.0.0.1:5055/rpc"; pub const NETWORK: &str = "testnet"; diff --git a/crates/sncast/tests/integration/fee.rs b/crates/sncast/tests/integration/fee.rs index 652cd96507..f747301fc5 100644 --- a/crates/sncast/tests/integration/fee.rs +++ b/crates/sncast/tests/integration/fee.rs @@ -1,5 +1,5 @@ use sncast::helpers::fee::{FeeArgs, FeeSettings}; -use starknet::core::types::{FeeEstimate, PriceUnit}; +use starknet::core::types::FeeEstimate; use starknet_types_core::felt::{Felt, NonZeroFelt}; #[tokio::test] @@ -65,7 +65,6 @@ async fn test_max_fee_set() { l2_gas_price: 4, l1_data_gas_consumed: 5, l1_data_gas_price: 6, - unit: PriceUnit::Fri, overall_fee: 44, }; @@ -105,7 +104,6 @@ async fn test_max_fee_set_and_fee_estimate_higher() { l2_gas_price: 40, l1_data_gas_consumed: 50, l1_gas_price: 60, - unit: PriceUnit::Fri, overall_fee: 4400, }; diff --git a/docs/src/appendix/sncast-library/errors.md b/docs/src/appendix/sncast-library/errors.md index 9ee3fe5194..d9fd5ab3a9 100644 --- a/docs/src/appendix/sncast-library/errors.md +++ b/docs/src/appendix/sncast-library/errors.md @@ -88,7 +88,6 @@ pub enum ProviderError { #[derive(Drop, Serde, PartialEq, Debug)] pub enum TransactionError { - Rejected, Reverted: ErrorData, } diff --git a/sncast_std/src/lib.cairo b/sncast_std/src/lib.cairo index 4f6670876d..5e8fdb6874 100644 --- a/sncast_std/src/lib.cairo +++ b/sncast_std/src/lib.cairo @@ -161,7 +161,6 @@ pub enum ProviderError { #[derive(Drop, Serde, PartialEq, Debug)] pub enum TransactionError { - Rejected, Reverted: ErrorData, } @@ -468,7 +467,8 @@ pub fn get_nonce(block_tag: felt252) -> felt252 { #[derive(Drop, Copy, Debug, Serde, PartialEq)] pub enum FinalityStatus { Received, - Rejected, + Candidate, + PreConfirmed, AcceptedOnL2, AcceptedOnL1, } @@ -477,7 +477,8 @@ pub impl DisplayFinalityStatus of Display { fn fmt(self: @FinalityStatus, ref f: Formatter) -> Result<(), Error> { let finality_status: ByteArray = match self { FinalityStatus::Received => "Received", - FinalityStatus::Rejected => "Rejected", + FinalityStatus::Candidate => "Candidate", + FinalityStatus::PreConfirmed => "PreConfirmed", FinalityStatus::AcceptedOnL2 => "AcceptedOnL2", FinalityStatus::AcceptedOnL1 => "AcceptedOnL1", };