From d83fe5270a94f029303c8bc7648bab5af970a38c Mon Sep 17 00:00:00 2001 From: bexan Date: Fri, 9 Aug 2024 13:48:14 +0200 Subject: [PATCH 1/5] fix(fmt): apply cargo fmt --- Cargo.lock | 7 ++ bin/solis/Cargo.toml | 1 + bin/solis/src/args.rs | 5 +- bin/solis/src/contracts/account.rs | 13 +- bin/solis/src/hooker.rs | 59 +++------ bin/solis/src/main.rs | 22 ++-- crates/dojo-lang/src/plugin.rs | 12 +- crates/dojo-world/src/metadata_test.rs | 25 ++-- crates/katana/core/src/lib.rs | 2 +- .../core/src/service/messaging/starknet.rs | 26 ++-- .../src/implementation/blockifier/state.rs | 6 +- crates/katana/executor/tests/executor.rs | 6 +- crates/katana/primitives/src/genesis/json.rs | 10 +- crates/katana/rpc/rpc-api/src/lib.rs | 2 +- crates/katana/rpc/rpc-api/src/torii.rs | 2 +- crates/katana/rpc/rpc-types/src/error/mod.rs | 2 +- crates/katana/rpc/rpc/src/solis.rs | 2 +- crates/katana/rpc/rpc/src/starknet.rs | 9 +- crates/katana/runner/runner-macro/src/lib.rs | 6 +- crates/katana/runner/src/lib.rs | 6 +- crates/katana/storage/db/src/mdbx/cursor.rs | 6 +- .../provider/src/providers/db/state.rs | 6 +- .../storage/provider/src/traits/contract.rs | 2 +- .../storage/provider/src/traits/state.rs | 2 +- crates/sozo/ops/src/tests/call.rs | 114 +++++++++--------- crates/sozo/ops/src/tests/migration.rs | 18 ++- crates/torii/client/src/client/storage.rs | 8 +- .../torii/client/src/client/subscription.rs | 6 +- crates/torii/graphql/src/object/entity.rs | 12 +- crates/torii/graphql/src/object/event.rs | 12 +- .../torii/graphql/src/object/event_message.rs | 54 ++++----- crates/torii/graphql/src/object/model.rs | 12 +- crates/torii/libp2p/src/typed_data.rs | 6 +- 33 files changed, 244 insertions(+), 237 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9f0bcd44a0..ace78f9245 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3863,6 +3863,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + [[package]] name = "dotenvy" version = "0.15.7" @@ -11403,6 +11409,7 @@ dependencies = [ "common", "console", "dojo-metrics", + "dotenv", "katana-core", "katana-executor", "katana-primitives", diff --git a/bin/solis/Cargo.toml b/bin/solis/Cargo.toml index 5b8debb1c2..0a0c5a07d9 100644 --- a/bin/solis/Cargo.toml +++ b/bin/solis/Cargo.toml @@ -19,6 +19,7 @@ clap_complete.workspace = true common.workspace = true console.workspace = true dojo-metrics.workspace = true +dotenv = "0.15.0" katana-core.workspace = true katana-executor.workspace = true katana-primitives.workspace = true diff --git a/bin/solis/src/args.rs b/bin/solis/src/args.rs index f2fb8b6b01..cb31691377 100644 --- a/bin/solis/src/args.rs +++ b/bin/solis/src/args.rs @@ -9,7 +9,7 @@ //! and leak detection functionality. See [jemalloc's opt.prof](https://jemalloc.net/jemalloc.3.html#opt.prof) //! documentation for usage details. This is **not recommended on Windows**. See [here](https://rust-lang.github.io/rfcs/1974-global-allocators.html#jemalloc) //! for more info. - +use std::env; use std::net::SocketAddr; use std::path::PathBuf; @@ -230,7 +230,8 @@ impl KatanaArgs { } pub fn server_config(&self) -> ServerConfig { - let mut apis = vec![ApiKind::Starknet, ApiKind::Katana, ApiKind::Torii, ApiKind::Saya, ApiKind::Solis]; + let mut apis = + vec![ApiKind::Starknet, ApiKind::Katana, ApiKind::Torii, ApiKind::Saya, ApiKind::Solis]; // only enable `katana` API in dev mode if self.dev { apis.push(ApiKind::Dev); diff --git a/bin/solis/src/contracts/account.rs b/bin/solis/src/contracts/account.rs index f19a7d9c6c..ec17fb5d46 100644 --- a/bin/solis/src/contracts/account.rs +++ b/bin/solis/src/contracts/account.rs @@ -25,18 +25,9 @@ pub async fn new_account( AnyProvider::JsonRpcHttp(JsonRpcClient::new(HttpTransport::new(rpc_url.clone()))); // TODO: need error instead of expect. - let chain_id = provider - .chain_id() - .await - .expect("couldn't get chain_id from provider"); + let chain_id = provider.chain_id().await.expect("couldn't get chain_id from provider"); let signer = LocalWallet::from(SigningKey::from_secret_scalar(private_key)); - SingleOwnerAccount::new( - provider, - signer, - account_address, - chain_id, - ExecutionEncoding::Legacy, - ) + SingleOwnerAccount::new(provider, signer, account_address, chain_id, ExecutionEncoding::Legacy) } diff --git a/bin/solis/src/hooker.rs b/bin/solis/src/hooker.rs index 4068940884..d64ca57806 100644 --- a/bin/solis/src/hooker.rs +++ b/bin/solis/src/hooker.rs @@ -12,24 +12,22 @@ use katana_primitives::chain::ChainId; use katana_primitives::contract::ContractAddress; use katana_primitives::transaction::{ExecutableTx, ExecutableTxWithHash, L1HandlerTx}; use katana_primitives::utils::transaction::compute_l1_message_hash; +use serde_json::json; +use serde_json::Value; use starknet::accounts::Call; use starknet::core::types::BroadcastedInvokeTransaction; use starknet::core::types::FieldElement; use starknet::macros::selector; use starknet::providers::Provider; -use std::sync::Arc; use std::fs::File; use std::fs::OpenOptions; -use std::io::Write; use std::io::Read; -use serde_json::Value; +use std::io::Write; use std::path::Path; -use serde_json::json; - +use std::sync::Arc; const FILE_PATH_ADDRESSES: &str = "addresses.json"; - use crate::contracts::orderbook::{OrderV1, RouteType}; use crate::contracts::starknet_utils::StarknetUtilsReader; use crate::CHAIN_ID_SOLIS; @@ -92,10 +90,7 @@ impl ); // check the current owner of the token. - let owner = sn_utils_reader_nft_address - .ownerOf(&ownership_verifier.token_id) - .call() - .await; + let owner = sn_utils_reader_nft_address.ownerOf(&ownership_verifier.token_id).call().await; if let Ok(owner_address) = owner { if owner_address != ownership_verifier.current_owner { @@ -145,10 +140,8 @@ impl } // check the balance - let balance = sn_utils_reader_erc20_address - .balanceOf(&balance_verifier.offerer) - .call() - .await; + let balance = + sn_utils_reader_erc20_address.balanceOf(&balance_verifier.offerer).call().await; if let Ok(balance) = balance { if balance < balance_verifier.start_amount { tracing::trace!( @@ -179,10 +172,7 @@ impl // ERC721 to ERC20 if order.route == RouteType::Erc721ToErc20 { let token_id = order.token_id.clone().unwrap(); - let n_token_id = U256 { - low: token_id.low, - high: token_id.high, - }; + let n_token_id = U256 { low: token_id.low, high: token_id.high }; let verifier = OwnershipVerifier { token_address: ContractAddress(order.token_address.into()), @@ -220,7 +210,8 @@ impl impl SolisHooker { - fn get_addresses_from_file() -> Result<(FieldElement, FieldElement), Box> { + fn get_addresses_from_file() -> Result<(FieldElement, FieldElement), Box> + { let mut file = match File::open(FILE_PATH_ADDRESSES) { Ok(file) => file, Err(_) => return Err("File not found".into()), @@ -264,7 +255,9 @@ impl orderbook_address: FieldElement, sn_executor_address: FieldElement, ) -> Self { - let (orderbook_address, sn_executor_address) = if orderbook_address == FieldElement::ZERO && sn_executor_address == FieldElement::ZERO { + let (orderbook_address, sn_executor_address) = if orderbook_address == FieldElement::ZERO + && sn_executor_address == FieldElement::ZERO + { match Self::get_addresses_from_file() { Ok((orderbook, executor)) => (orderbook, executor), Err(e) => { @@ -276,12 +269,7 @@ impl (orderbook_address, sn_executor_address) }; - Self { - orderbook_address, - sn_utils_reader, - sn_executor_address, - sequencer: None, - } + Self { orderbook_address, sn_utils_reader, sn_executor_address, sequencer: None } } /// Retrieves a reference to the sequencer. @@ -289,9 +277,7 @@ impl pub fn sequencer_ref(&self) -> &Arc> { // The expect is used here as it must always be set by Katana core. // If not set, the merge on Katana may be revised. - self.sequencer - .as_ref() - .expect("Sequencer must be set to get a reference to it") + self.sequencer.as_ref().expect("Sequencer must be set to get a reference to it") } /// Adds a `L1HandlerTransaction` to the transaction pool that is directed to the @@ -369,10 +355,7 @@ impl self.sn_executor_address = addresses.executor_starknet; let path = Path::new(FILE_PATH_ADDRESSES); - let file = OpenOptions::new() - .write(true) - .create(true) - .open(&path); + let file = OpenOptions::new().write(true).create(true).open(&path); match file { Ok(mut file) => { @@ -418,19 +401,13 @@ impl &self, transaction: BroadcastedInvokeTransaction, ) -> bool { - info!( - "HOOKER: verify_invoke_tx_before_pool called with transaction: {:?}", - transaction - ); + info!("HOOKER: verify_invoke_tx_before_pool called with transaction: {:?}", transaction); let calldata = match transaction { BroadcastedInvokeTransaction::V1(v1_transaction) => v1_transaction.calldata, BroadcastedInvokeTransaction::V3(v3_transaction) => v3_transaction.calldata, }; - info!( - "HOOKER: cairo_deserialize called with transaction: {:?}", - calldata - ); + info!("HOOKER: cairo_deserialize called with transaction: {:?}", calldata); let calls = match Vec::::cairo_deserialize(&calldata, 0) { Ok(calls) => calls, diff --git a/bin/solis/src/main.rs b/bin/solis/src/main.rs index ce806b1e34..7ae9c8f89b 100644 --- a/bin/solis/src/main.rs +++ b/bin/solis/src/main.rs @@ -24,9 +24,9 @@ use tokio::sync::RwLock as AsyncRwLock; use tracing::info; mod args; -mod utils; -mod hooker; mod contracts; +mod hooker; +mod utils; // Chain ID: 'SOLIS' cairo short string. pub const CHAIN_ID_SOLIS: FieldElement = FieldElement::from_mont([ @@ -116,17 +116,19 @@ async fn main() -> Result<(), Box> { let executor_address = FieldElement::ZERO; let orderbook_address = FieldElement::ZERO; - let hooker:Arc + Send + Sync>> = - Arc::new(AsyncRwLock::new(SolisHooker::new( - sn_utils_reader, - orderbook_address, - executor_address, - ))); + let hooker: Arc + Send + Sync>> = Arc::new( + AsyncRwLock::new(SolisHooker::new(sn_utils_reader, orderbook_address, executor_address)), + ); // ** let sequencer = Arc::new( - KatanaSequencer::new(executor_factory, sequencer_config, starknet_config, Some(hooker.clone())) - .await?, + KatanaSequencer::new( + executor_factory, + sequencer_config, + starknet_config, + Some(hooker.clone()), + ) + .await?, ); let NodeHandle { addr, handle, .. } = spawn(Arc::clone(&sequencer), server_config).await?; diff --git a/crates/dojo-lang/src/plugin.rs b/crates/dojo-lang/src/plugin.rs index 9341807f78..af884f2a37 100644 --- a/crates/dojo-lang/src/plugin.rs +++ b/crates/dojo-lang/src/plugin.rs @@ -70,7 +70,11 @@ impl GeneratedFileAuxData for DojoAuxData { self } fn eq(&self, other: &dyn GeneratedFileAuxData) -> bool { - if let Some(other) = other.as_any().downcast_ref::() { self == other } else { false } + if let Some(other) = other.as_any().downcast_ref::() { + self == other + } else { + false + } } } @@ -88,7 +92,11 @@ impl GeneratedFileAuxData for ComputedValuesAuxData { self } fn eq(&self, other: &dyn GeneratedFileAuxData) -> bool { - if let Some(other) = other.as_any().downcast_ref::() { self == other } else { false } + if let Some(other) = other.as_any().downcast_ref::() { + self == other + } else { + false + } } } diff --git a/crates/dojo-world/src/metadata_test.rs b/crates/dojo-world/src/metadata_test.rs index ec48befb6f..6f34df68b6 100644 --- a/crates/dojo-world/src/metadata_test.rs +++ b/crates/dojo-world/src/metadata_test.rs @@ -132,23 +132,22 @@ async fn get_full_dojo_metadata_from_workspace() { assert!(env.rpc_url.unwrap().eq("http://localhost:5050/")); assert!(env.account_address.is_some()); - assert!( - env.account_address - .unwrap() - .eq("0x6162896d1d7ab204c7ccac6dd5f8e9e7c25ecd5ae4fcb4ad32e57786bb46e03") - ); + assert!(env + .account_address + .unwrap() + .eq("0x6162896d1d7ab204c7ccac6dd5f8e9e7c25ecd5ae4fcb4ad32e57786bb46e03")); assert!(env.private_key.is_some()); - assert!( - env.private_key.unwrap().eq("0x1800000000300000180000000000030000000000003006001800006600") - ); + assert!(env + .private_key + .unwrap() + .eq("0x1800000000300000180000000000030000000000003006001800006600")); assert!(env.world_address.is_some()); - assert!( - env.world_address - .unwrap() - .eq("0x3898144a24151443f0c6501a1de46a6e9e27abd9fb5d08cdeeff5a5127d1d25") - ); + assert!(env + .world_address + .unwrap() + .eq("0x3898144a24151443f0c6501a1de46a6e9e27abd9fb5d08cdeeff5a5127d1d25")); assert!(env.keystore_path.is_none()); assert!(env.keystore_password.is_none()); diff --git a/crates/katana/core/src/lib.rs b/crates/katana/core/src/lib.rs index 099e04b025..f202735ea8 100644 --- a/crates/katana/core/src/lib.rs +++ b/crates/katana/core/src/lib.rs @@ -1,10 +1,10 @@ pub mod backend; pub mod constants; pub mod env; +pub mod hooker; pub mod pool; pub mod sequencer; pub mod service; pub mod utils; -pub mod hooker; pub mod sequencer_error; diff --git a/crates/katana/core/src/service/messaging/starknet.rs b/crates/katana/core/src/service/messaging/starknet.rs index 6375f78227..b0ece4ce22 100644 --- a/crates/katana/core/src/service/messaging/starknet.rs +++ b/crates/katana/core/src/service/messaging/starknet.rs @@ -108,25 +108,25 @@ impl StarknetMessaging { if let Ok(tx) = l1_handler_tx_from_event(&event, chain_id) { if let Ok((from, to, selector)) = info_from_event(&event) { - let hooker = Arc::clone(&self.hooker); - let is_message_accepted = hooker - .read() - .await - .verify_message_to_appchain(from, to, selector) - .await; + let hooker = Arc::clone(&self.hooker); + let is_message_accepted = hooker + .read() + .await + .verify_message_to_appchain(from, to, selector) + .await; if is_message_accepted { debug!(target: LOG_TARGET, "Event ID: {} accepted, adding to transactions", event_id); l1_handler_txs.push(tx); let mut cache = self.event_cache.write().await; cache.insert(event_id); } else { - debug!( - target: LOG_TARGET, - "Event ID: {} not accepted by hooker, check the contract addresses defined in the hooker: executor address: {:?}, orderbook address: {:?}", - event_id, - from, - to - ); + debug!( + target: LOG_TARGET, + "Event ID: {} not accepted by hooker, check the contract addresses defined in the hooker: executor address: {:?}, orderbook address: {:?}", + event_id, + from, + to + ); } } } diff --git a/crates/katana/executor/src/implementation/blockifier/state.rs b/crates/katana/executor/src/implementation/blockifier/state.rs index c6d7f27572..cbe21e1e45 100644 --- a/crates/katana/executor/src/implementation/blockifier/state.rs +++ b/crates/katana/executor/src/implementation/blockifier/state.rs @@ -171,7 +171,11 @@ impl StateProvider for CachedState { }; let hash = hash.0.into(); - if hash == FieldElement::ZERO { Ok(None) } else { Ok(Some(hash)) } + if hash == FieldElement::ZERO { + Ok(None) + } else { + Ok(Some(hash)) + } } fn nonce( diff --git a/crates/katana/executor/tests/executor.rs b/crates/katana/executor/tests/executor.rs index b35c9ae409..00f86b010c 100644 --- a/crates/katana/executor/tests/executor.rs +++ b/crates/katana/executor/tests/executor.rs @@ -55,7 +55,11 @@ fn test_executor_with_valid_blocks_impl( // ensure that all transactions succeeded, if not panic with the error message and tx index let has_failed = transactions.iter().enumerate().find_map(|(i, (_, res))| { - if let ExecutionResult::Failed { error } = res { Some((i, error)) } else { None } + if let ExecutionResult::Failed { error } = res { + Some((i, error)) + } else { + None + } }); if let Some((pos, error)) = has_failed { diff --git a/crates/katana/primitives/src/genesis/json.rs b/crates/katana/primitives/src/genesis/json.rs index 102020e7c9..5a65d9059a 100644 --- a/crates/katana/primitives/src/genesis/json.rs +++ b/crates/katana/primitives/src/genesis/json.rs @@ -1071,12 +1071,10 @@ mod tests { fn genesis_from_json_with_unresolved_paths() { let file = File::open("./src/genesis/test-genesis.json").unwrap(); let json: GenesisJson = serde_json::from_reader(file).unwrap(); - assert!( - Genesis::try_from(json) - .unwrap_err() - .to_string() - .contains("Unresolved class artifact path") - ); + assert!(Genesis::try_from(json) + .unwrap_err() + .to_string() + .contains("Unresolved class artifact path")); } #[test] diff --git a/crates/katana/rpc/rpc-api/src/lib.rs b/crates/katana/rpc/rpc-api/src/lib.rs index c56f5cbd27..f568a9e4ce 100644 --- a/crates/katana/rpc/rpc-api/src/lib.rs +++ b/crates/katana/rpc/rpc-api/src/lib.rs @@ -13,5 +13,5 @@ pub enum ApiKind { Torii, Dev, Saya, - Solis + Solis, } diff --git a/crates/katana/rpc/rpc-api/src/torii.rs b/crates/katana/rpc/rpc-api/src/torii.rs index 272497041a..3308806004 100644 --- a/crates/katana/rpc/rpc-api/src/torii.rs +++ b/crates/katana/rpc/rpc-api/src/torii.rs @@ -7,5 +7,5 @@ use katana_rpc_types::transaction::{TransactionsPage, TransactionsPageCursor}; pub trait ToriiApi { #[method(name = "getTransactions")] async fn get_transactions(&self, cursor: TransactionsPageCursor) - -> RpcResult; + -> RpcResult; } diff --git a/crates/katana/rpc/rpc-types/src/error/mod.rs b/crates/katana/rpc/rpc-types/src/error/mod.rs index c68defcea8..82686bf94f 100644 --- a/crates/katana/rpc/rpc-types/src/error/mod.rs +++ b/crates/katana/rpc/rpc-types/src/error/mod.rs @@ -1,5 +1,5 @@ pub mod katana; pub mod saya; +pub mod solis; pub mod starknet; pub mod torii; -pub mod solis; \ No newline at end of file diff --git a/crates/katana/rpc/rpc/src/solis.rs b/crates/katana/rpc/rpc/src/solis.rs index 16d4690674..35da1dedc4 100644 --- a/crates/katana/rpc/rpc/src/solis.rs +++ b/crates/katana/rpc/rpc/src/solis.rs @@ -3,11 +3,11 @@ use std::sync::Arc; use crate::config::ServerConfig; use jsonrpsee::core::{async_trait, Error as RpcError}; -use katana_rpc_types::error::solis::SolisApiError; use katana_core::hooker::HookerAddresses; use katana_core::sequencer::KatanaSequencer; use katana_executor::ExecutorFactory; use katana_rpc_api::solis::SolisApiServer; +use katana_rpc_types::error::solis::SolisApiError; pub struct SolisApi { sequencer: Arc>, pub rpc_user: String, diff --git a/crates/katana/rpc/rpc/src/starknet.rs b/crates/katana/rpc/rpc/src/starknet.rs index a0fde82e7e..296d9c8db6 100644 --- a/crates/katana/rpc/rpc/src/starknet.rs +++ b/crates/katana/rpc/rpc/src/starknet.rs @@ -36,9 +36,9 @@ use katana_rpc_types::{ use katana_rpc_types_builder::ReceiptBuilder; use katana_tasks::{BlockingTaskPool, TokioTaskSpawner}; use starknet::core::types::{ - BlockTag, BroadcastedInvokeTransaction, DeclareTransactionTrace, DeployAccountTransactionTrace, ExecuteInvocation, - InvokeTransactionTrace, L1HandlerTransactionTrace, RevertedInvocation, SimulatedTransaction, - TransactionExecutionStatus, TransactionStatus, TransactionTrace, + BlockTag, BroadcastedInvokeTransaction, DeclareTransactionTrace, DeployAccountTransactionTrace, + ExecuteInvocation, InvokeTransactionTrace, L1HandlerTransactionTrace, RevertedInvocation, + SimulatedTransaction, TransactionExecutionStatus, TransactionStatus, TransactionTrace, }; pub struct StarknetApi { @@ -675,11 +675,10 @@ impl StarknetApiServer for StarknetApi { &self, invoke_transaction: BroadcastedInvokeTx, ) -> RpcResult { - if let Some(hooker) = &self.inner.sequencer.hooker { let tx = invoke_transaction.0.clone(); if !hooker.read().await.verify_invoke_tx_before_pool(tx).await { - return Err(StarknetApiError::SolisAssetFault.into()); + return Err(StarknetApiError::SolisAssetFault.into()); } } self.on_io_blocking_task(move |this| { diff --git a/crates/katana/runner/runner-macro/src/lib.rs b/crates/katana/runner/runner-macro/src/lib.rs index 77867a284f..8cb426c16e 100644 --- a/crates/katana/runner/runner-macro/src/lib.rs +++ b/crates/katana/runner/runner-macro/src/lib.rs @@ -28,7 +28,11 @@ fn parse_metadata(metadata: String) -> (u16, Option, Option) { // if set to `true`, we use a default block time. let block_time = if args.len() >= 2 { if let Ok(b) = args[1].trim().parse::() { - if !b { None } else { Some(DEFAULT_BLOCK_TIME) } + if !b { + None + } else { + Some(DEFAULT_BLOCK_TIME) + } } else if let Ok(block_time_ms) = args[1].trim().parse::() { Some(block_time_ms) } else { diff --git a/crates/katana/runner/src/lib.rs b/crates/katana/runner/src/lib.rs index 13a19fe771..adf9051ad2 100644 --- a/crates/katana/runner/src/lib.rs +++ b/crates/katana/runner/src/lib.rs @@ -185,7 +185,11 @@ impl Drop for KatanaRunner { /// Determines the default program path for the katana runner based on the KATANA_RUNNER_BIN /// environment variable. If not set, try to to use katana from the PATH. fn determine_default_program_path() -> String { - if let Ok(bin) = std::env::var("KATANA_RUNNER_BIN") { bin } else { "katana".to_string() } + if let Ok(bin) = std::env::var("KATANA_RUNNER_BIN") { + bin + } else { + "katana".to_string() + } } #[cfg(test)] diff --git a/crates/katana/storage/db/src/mdbx/cursor.rs b/crates/katana/storage/db/src/mdbx/cursor.rs index 9cac3876e3..e08ca8499a 100644 --- a/crates/katana/storage/db/src/mdbx/cursor.rs +++ b/crates/katana/storage/db/src/mdbx/cursor.rs @@ -304,7 +304,11 @@ impl Walker<'_, RW, T> { impl std::iter::Iterator for Walker<'_, K, T> { type Item = Result, DatabaseError>; fn next(&mut self) -> Option { - if let value @ Some(_) = self.start.take() { value } else { self.cursor.next().transpose() } + if let value @ Some(_) = self.start.take() { + value + } else { + self.cursor.next().transpose() + } } } diff --git a/crates/katana/storage/provider/src/providers/db/state.rs b/crates/katana/storage/provider/src/providers/db/state.rs index bb8f070646..286b16920d 100644 --- a/crates/katana/storage/provider/src/providers/db/state.rs +++ b/crates/katana/storage/provider/src/providers/db/state.rs @@ -292,7 +292,11 @@ fn recent_change_from_block( // 1. the list is empty // 2. there are no prior changes occured before/at `block_number` let rank = block_list.rank(block_number); - if rank == 0 { None } else { block_list.select(rank - 1) } + if rank == 0 { + None + } else { + block_list.select(rank - 1) + } } #[cfg(test)] diff --git a/crates/katana/storage/provider/src/traits/contract.rs b/crates/katana/storage/provider/src/traits/contract.rs index 7ff77f1999..b0a09d61aa 100644 --- a/crates/katana/storage/provider/src/traits/contract.rs +++ b/crates/katana/storage/provider/src/traits/contract.rs @@ -40,5 +40,5 @@ pub trait ContractClassWriter: Send + Sync { /// Retrieves the Sierra class definition of a contract class given its class hash. fn set_sierra_class(&self, hash: ClassHash, sierra: FlattenedSierraClass) - -> ProviderResult<()>; + -> ProviderResult<()>; } diff --git a/crates/katana/storage/provider/src/traits/state.rs b/crates/katana/storage/provider/src/traits/state.rs index 3ec9aade09..c18d4f72d1 100644 --- a/crates/katana/storage/provider/src/traits/state.rs +++ b/crates/katana/storage/provider/src/traits/state.rs @@ -26,7 +26,7 @@ pub trait StateProvider: ContractClassProvider + Send + Sync { /// Returns the class hash of a contract. fn class_hash_of_contract(&self, address: ContractAddress) - -> ProviderResult>; + -> ProviderResult>; } /// A type which can create [`StateProvider`] for states at a particular block. diff --git a/crates/sozo/ops/src/tests/call.rs b/crates/sozo/ops/src/tests/call.rs index 84d6c4f5bc..f93b498fd3 100644 --- a/crates/sozo/ops/src/tests/call.rs +++ b/crates/sozo/ops/src/tests/call.rs @@ -20,17 +20,15 @@ async fn call_with_bad_address() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!( - call::call( - world_reader, - "0xBadCoffeeBadCode".to_string(), - ENTRYPOINT.to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None - ) - .await - .is_err() - ); + assert!(call::call( + world_reader, + "0xBadCoffeeBadCode".to_string(), + ENTRYPOINT.to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None + ) + .await + .is_err()); } #[tokio::test] @@ -41,17 +39,15 @@ async fn call_with_bad_name() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!( - call::call( - world_reader, - "BadName".to_string(), - ENTRYPOINT.to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None - ) - .await - .is_err() - ); + assert!(call::call( + world_reader, + "BadName".to_string(), + ENTRYPOINT.to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None + ) + .await + .is_err()); } #[tokio::test] @@ -62,17 +58,15 @@ async fn call_with_bad_entrypoint() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!( - call::call( - world_reader, - CONTRACT_NAME.to_string(), - "BadEntryPoint".to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None - ) - .await - .is_err() - ); + assert!(call::call( + world_reader, + CONTRACT_NAME.to_string(), + "BadEntryPoint".to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None + ) + .await + .is_err()); } #[tokio::test] @@ -83,11 +77,15 @@ async fn call_with_bad_calldata() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!( - call::call(world_reader, CONTRACT_NAME.to_string(), ENTRYPOINT.to_string(), vec![], None) - .await - .is_err() - ); + assert!(call::call( + world_reader, + CONTRACT_NAME.to_string(), + ENTRYPOINT.to_string(), + vec![], + None + ) + .await + .is_err()); } #[tokio::test] @@ -98,17 +96,15 @@ async fn call_with_contract_name() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!( - call::call( - world_reader, - CONTRACT_NAME.to_string(), - ENTRYPOINT.to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None, - ) - .await - .is_ok() - ); + assert!(call::call( + world_reader, + CONTRACT_NAME.to_string(), + ENTRYPOINT.to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None, + ) + .await + .is_ok()); } #[tokio::test] @@ -125,15 +121,13 @@ async fn call_with_contract_address() { .await .unwrap(); - assert!( - call::call( - world_reader, - format!("{:#x}", contract_address), - ENTRYPOINT.to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None, - ) - .await - .is_ok() - ); + assert!(call::call( + world_reader, + format!("{:#x}", contract_address), + ENTRYPOINT.to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None, + ) + .await + .is_ok()); } diff --git a/crates/sozo/ops/src/tests/migration.rs b/crates/sozo/ops/src/tests/migration.rs index 06903c5f37..84c45e90ba 100644 --- a/crates/sozo/ops/src/tests/migration.rs +++ b/crates/sozo/ops/src/tests/migration.rs @@ -81,16 +81,14 @@ async fn migrate_with_small_fee_multiplier_will_fail() { let account = sequencer.account(0); - assert!( - execute_strategy( - &ws, - &migration, - &account, - TxnConfig { fee_estimate_multiplier: Some(0.2f64), ..Default::default() }, - ) - .await - .is_err() - ); + assert!(execute_strategy( + &ws, + &migration, + &account, + TxnConfig { fee_estimate_multiplier: Some(0.2f64), ..Default::default() }, + ) + .await + .is_err()); } #[tokio::test] diff --git a/crates/torii/client/src/client/storage.rs b/crates/torii/client/src/client/storage.rs index 48541a2314..caa00dee5c 100644 --- a/crates/torii/client/src/client/storage.rs +++ b/crates/torii/client/src/client/storage.rs @@ -264,10 +264,8 @@ mod tests { ); assert!(actual_values == expected_values); assert!(storage.storage.read().len() == model.packed_size as usize); - assert!( - actual_storage_addresses - .into_iter() - .all(|address| expected_storage_addresses.contains(&address)) - ); + assert!(actual_storage_addresses + .into_iter() + .all(|address| expected_storage_addresses.contains(&address))); } } diff --git a/crates/torii/client/src/client/subscription.rs b/crates/torii/client/src/client/subscription.rs index ac21707104..b167e6a614 100644 --- a/crates/torii/client/src/client/subscription.rs +++ b/crates/torii/client/src/client/subscription.rs @@ -192,7 +192,11 @@ impl SubscriptionService { let storage_entries = diff.storage_diffs.into_iter().find_map(|d| { let expected = self.world_metadata.read().world_address; let current = d.address; - if current == expected { Some(d.storage_entries) } else { None } + if current == expected { + Some(d.storage_entries) + } else { + None + } }); let Some(entries) = storage_entries else { diff --git a/crates/torii/graphql/src/object/entity.rs b/crates/torii/graphql/src/object/entity.rs index dd73c9c6fd..209fd28141 100644 --- a/crates/torii/graphql/src/object/entity.rs +++ b/crates/torii/graphql/src/object/entity.rs @@ -63,8 +63,10 @@ impl ResolvableObject for EntityObject { } fn subscriptions(&self) -> Option> { - Some(vec![ - SubscriptionField::new("entityUpdated", TypeRef::named_nn(self.type_name()), |ctx| { + Some(vec![SubscriptionField::new( + "entityUpdated", + TypeRef::named_nn(self.type_name()), + |ctx| { SubscriptionFieldFuture::new(async move { let id = match ctx.args.get("id") { Some(id) => Some(id.string()?.to_string()), @@ -81,9 +83,9 @@ impl ResolvableObject for EntityObject { } })) }) - }) - .argument(InputValue::new("id", TypeRef::named(TypeRef::ID))), - ]) + }, + ) + .argument(InputValue::new("id", TypeRef::named(TypeRef::ID)))]) } } diff --git a/crates/torii/graphql/src/object/event.rs b/crates/torii/graphql/src/object/event.rs index f0063f76c1..975d98afe9 100644 --- a/crates/torii/graphql/src/object/event.rs +++ b/crates/torii/graphql/src/object/event.rs @@ -44,15 +44,17 @@ impl ResolvableObject for EventObject { } fn subscriptions(&self) -> Option> { - Some(vec![ - SubscriptionField::new("eventEmitted", TypeRef::named_nn(self.type_name()), |ctx| { + Some(vec![SubscriptionField::new( + "eventEmitted", + TypeRef::named_nn(self.type_name()), + |ctx| { SubscriptionFieldFuture::new(async move { let input_keys = parse_keys_argument(&ctx)?; Ok(EventObject::subscription_stream(input_keys)) }) - }) - .argument(InputValue::new("keys", TypeRef::named_list(TypeRef::STRING))), - ]) + }, + ) + .argument(InputValue::new("keys", TypeRef::named_list(TypeRef::STRING)))]) } } diff --git a/crates/torii/graphql/src/object/event_message.rs b/crates/torii/graphql/src/object/event_message.rs index 007573b3ca..11da937cfb 100644 --- a/crates/torii/graphql/src/object/event_message.rs +++ b/crates/torii/graphql/src/object/event_message.rs @@ -63,35 +63,31 @@ impl ResolvableObject for EventMessageObject { } fn subscriptions(&self) -> Option> { - Some(vec![ - SubscriptionField::new( - "eventMessageUpdated", - TypeRef::named_nn(self.type_name()), - |ctx| { - SubscriptionFieldFuture::new(async move { - let id = match ctx.args.get("id") { - Some(id) => Some(id.string()?.to_string()), - None => None, - }; - // if id is None, then subscribe to all entities - // if id is Some, then subscribe to only the entity with that id - Ok(SimpleBroker::::subscribe().filter_map( - move |entity: EventMessage| { - if id.is_none() || id == Some(entity.id.clone()) { - Some(Ok(Value::Object(EventMessageObject::value_mapping( - entity, - )))) - } else { - // id != entity.id , then don't send anything, still listening - None - } - }, - )) - }) - }, - ) - .argument(InputValue::new("id", TypeRef::named(TypeRef::ID))), - ]) + Some(vec![SubscriptionField::new( + "eventMessageUpdated", + TypeRef::named_nn(self.type_name()), + |ctx| { + SubscriptionFieldFuture::new(async move { + let id = match ctx.args.get("id") { + Some(id) => Some(id.string()?.to_string()), + None => None, + }; + // if id is None, then subscribe to all entities + // if id is Some, then subscribe to only the entity with that id + Ok(SimpleBroker::::subscribe().filter_map( + move |entity: EventMessage| { + if id.is_none() || id == Some(entity.id.clone()) { + Some(Ok(Value::Object(EventMessageObject::value_mapping(entity)))) + } else { + // id != entity.id , then don't send anything, still listening + None + } + }, + )) + }) + }, + ) + .argument(InputValue::new("id", TypeRef::named(TypeRef::ID)))]) } } diff --git a/crates/torii/graphql/src/object/model.rs b/crates/torii/graphql/src/object/model.rs index a9ecb13607..4b326b0207 100644 --- a/crates/torii/graphql/src/object/model.rs +++ b/crates/torii/graphql/src/object/model.rs @@ -74,8 +74,10 @@ impl ResolvableObject for ModelObject { } fn subscriptions(&self) -> Option> { - Some(vec![ - SubscriptionField::new("modelRegistered", TypeRef::named_nn(self.type_name()), |ctx| { + Some(vec![SubscriptionField::new( + "modelRegistered", + TypeRef::named_nn(self.type_name()), + |ctx| { { SubscriptionFieldFuture::new(async move { let id = match ctx.args.get("id") { @@ -94,9 +96,9 @@ impl ResolvableObject for ModelObject { })) }) } - }) - .argument(InputValue::new("id", TypeRef::named(TypeRef::ID))), - ]) + }, + ) + .argument(InputValue::new("id", TypeRef::named(TypeRef::ID)))]) } } diff --git a/crates/torii/libp2p/src/typed_data.rs b/crates/torii/libp2p/src/typed_data.rs index dc752f751b..e018184814 100644 --- a/crates/torii/libp2p/src/typed_data.rs +++ b/crates/torii/libp2p/src/typed_data.rs @@ -149,7 +149,11 @@ pub fn encode_type(name: &str, types: &IndexMap>) -> Result>() .join(","); From 34a96092a137012ecff8191970dd7871f751a68e Mon Sep 17 00:00:00 2001 From: bexan Date: Fri, 9 Aug 2024 14:35:29 +0200 Subject: [PATCH 2/5] clippy & cargo fmt --- bin/solis/src/contracts/account.rs | 12 +- bin/solis/src/contracts/orderbook.rs | 3 +- bin/solis/src/contracts/starknet_utils.rs | 8 +- bin/solis/src/hooker.rs | 36 +++--- bin/solis/src/main.rs | 3 +- crates/dojo-lang/src/plugin.rs | 12 +- crates/dojo-world/src/metadata_test.rs | 25 ++-- crates/katana/core/src/hooker.rs | 14 ++- crates/katana/core/src/sequencer.rs | 24 ++-- .../katana/core/src/service/messaging/mod.rs | 4 +- .../core/src/service/messaging/service.rs | 21 ++-- .../core/src/service/messaging/starknet.rs | 13 +- .../src/implementation/blockifier/state.rs | 6 +- crates/katana/executor/tests/executor.rs | 6 +- crates/katana/primitives/src/genesis/json.rs | 10 +- crates/katana/rpc/rpc-api/src/torii.rs | 2 +- crates/katana/rpc/rpc/src/solis.rs | 5 +- crates/katana/runner/runner-macro/src/lib.rs | 6 +- crates/katana/runner/src/lib.rs | 6 +- crates/katana/storage/db/src/mdbx/cursor.rs | 6 +- .../provider/src/providers/db/state.rs | 6 +- .../storage/provider/src/traits/contract.rs | 2 +- .../storage/provider/src/traits/state.rs | 2 +- crates/sozo/ops/src/tests/call.rs | 114 +++++++++--------- crates/sozo/ops/src/tests/migration.rs | 18 +-- crates/torii/client/src/client/storage.rs | 8 +- .../torii/client/src/client/subscription.rs | 6 +- crates/torii/graphql/src/object/entity.rs | 12 +- crates/torii/graphql/src/object/event.rs | 12 +- .../torii/graphql/src/object/event_message.rs | 54 +++++---- crates/torii/graphql/src/object/model.rs | 12 +- crates/torii/libp2p/src/typed_data.rs | 6 +- 32 files changed, 228 insertions(+), 246 deletions(-) diff --git a/bin/solis/src/contracts/account.rs b/bin/solis/src/contracts/account.rs index ec17fb5d46..1b8356bb2f 100644 --- a/bin/solis/src/contracts/account.rs +++ b/bin/solis/src/contracts/account.rs @@ -1,10 +1,8 @@ -use starknet::{ - accounts::{ExecutionEncoding, SingleOwnerAccount}, - core::types::FieldElement, - providers::{jsonrpc::HttpTransport, AnyProvider, JsonRpcClient, Provider}, - signers::{LocalWallet, SigningKey}, -}; - +use starknet::accounts::{ExecutionEncoding, SingleOwnerAccount}; +use starknet::core::types::FieldElement; +use starknet::providers::jsonrpc::HttpTransport; +use starknet::providers::{AnyProvider, JsonRpcClient, Provider}; +use starknet::signers::{LocalWallet, SigningKey}; use url::Url; /// Initializes a new account to interact with Starknet. diff --git a/bin/solis/src/contracts/orderbook.rs b/bin/solis/src/contracts/orderbook.rs index 9bc801643b..b20a97a7ed 100644 --- a/bin/solis/src/contracts/orderbook.rs +++ b/bin/solis/src/contracts/orderbook.rs @@ -1,5 +1,6 @@ use cainome::rs::abigen; -use starknet::{accounts::ConnectedAccount, core::types::FieldElement}; +use starknet::accounts::ConnectedAccount; +use starknet::core::types::FieldElement; abigen!(OrderbookContract, "./artifacts/orderbook.abi.json"); diff --git a/bin/solis/src/contracts/starknet_utils.rs b/bin/solis/src/contracts/starknet_utils.rs index 280c9f2e6d..7dfe38ab71 100644 --- a/bin/solis/src/contracts/starknet_utils.rs +++ b/bin/solis/src/contracts/starknet_utils.rs @@ -1,9 +1,7 @@ use cainome::rs::abigen; -use starknet::{ - core::types::FieldElement, - providers::{jsonrpc::HttpTransport, AnyProvider, JsonRpcClient}, -}; - +use starknet::core::types::FieldElement; +use starknet::providers::jsonrpc::HttpTransport; +use starknet::providers::{AnyProvider, JsonRpcClient}; use url::Url; abigen!(StarknetUtils, "./artifacts/starknet_utils.json"); diff --git a/bin/solis/src/hooker.rs b/bin/solis/src/hooker.rs index d64ca57806..1ba52d5b69 100644 --- a/bin/solis/src/hooker.rs +++ b/bin/solis/src/hooker.rs @@ -1,37 +1,34 @@ //! Solis hooker on Katana transaction lifecycle. -//! -use crate::contracts::starknet_utils::{ExecutionInfo, U256}; +use std::fs::{File, OpenOptions}; +use std::io::{Read, Write}; +use std::path::Path; +use std::sync::Arc; + use async_trait::async_trait; use cainome::cairo_serde::CairoSerde; use cainome::rs::abigen; use katana_core::hooker::{HookerAddresses, KatanaHooker}; use katana_core::sequencer::KatanaSequencer; use katana_executor::ExecutorFactory; - use katana_primitives::chain::ChainId; use katana_primitives::contract::ContractAddress; use katana_primitives::transaction::{ExecutableTx, ExecutableTxWithHash, L1HandlerTx}; use katana_primitives::utils::transaction::compute_l1_message_hash; -use serde_json::json; -use serde_json::Value; +use serde_json::{json, Value}; use starknet::accounts::Call; -use starknet::core::types::BroadcastedInvokeTransaction; -use starknet::core::types::FieldElement; +use starknet::core::types::{BroadcastedInvokeTransaction, FieldElement}; use starknet::macros::selector; use starknet::providers::Provider; -use std::fs::File; -use std::fs::OpenOptions; -use std::io::Read; -use std::io::Write; -use std::path::Path; -use std::sync::Arc; + +use crate::contracts::starknet_utils::{ExecutionInfo, U256}; const FILE_PATH_ADDRESSES: &str = "addresses.json"; +use tracing::info; + use crate::contracts::orderbook::{OrderV1, RouteType}; use crate::contracts::starknet_utils::StarknetUtilsReader; use crate::CHAIN_ID_SOLIS; -use tracing::info; #[allow(dead_code)] pub enum CancelStatus { @@ -287,8 +284,8 @@ impl /// /// In the case of Solis, `L1HandlerTransaction` are sent by Solis for two purposes: /// 1. A message was collected from the L2, and it must be executed. - /// 2. A transaction has been rejected by Solis (asset faults), and the order - /// must then be updated. + /// 2. A transaction has been rejected by Solis (asset faults), and the order must then be + /// updated. /// /// This function is used for the scenario 2. For this reason, the `from_address` /// field is automatically filled up by the sequencer to use the executor address @@ -395,8 +392,8 @@ impl /// Verifies an invoke transaction that is: /// 1. Directed to the orderbook only. - /// 2. With the selector `create_order` only as the fulfill - /// is verified by `verify_message_to_starknet_before_tx`. + /// 2. With the selector `create_order` only as the fulfill is verified by + /// `verify_message_to_starknet_before_tx`. async fn verify_invoke_tx_before_pool( &self, transaction: BroadcastedInvokeTransaction, @@ -513,9 +510,10 @@ impl #[cfg(test)] mod test { - use super::*; use starknet::macros::{felt, selector}; + use super::*; + #[test] fn test_calldata_calls_parsing_new_encoding() { // Calldata for a transaction to starkgate: diff --git a/bin/solis/src/main.rs b/bin/solis/src/main.rs index 7ae9c8f89b..2ddc2ecb5d 100644 --- a/bin/solis/src/main.rs +++ b/bin/solis/src/main.rs @@ -2,7 +2,6 @@ use std::io; use std::net::SocketAddr; use std::sync::Arc; -use crate::hooker::SolisHooker; use clap::{CommandFactory, Parser}; use clap_complete::{generate, Shell}; use console::Style; @@ -23,6 +22,8 @@ use tokio::signal::ctrl_c; use tokio::sync::RwLock as AsyncRwLock; use tracing::info; +use crate::hooker::SolisHooker; + mod args; mod contracts; mod hooker; diff --git a/crates/dojo-lang/src/plugin.rs b/crates/dojo-lang/src/plugin.rs index af884f2a37..9341807f78 100644 --- a/crates/dojo-lang/src/plugin.rs +++ b/crates/dojo-lang/src/plugin.rs @@ -70,11 +70,7 @@ impl GeneratedFileAuxData for DojoAuxData { self } fn eq(&self, other: &dyn GeneratedFileAuxData) -> bool { - if let Some(other) = other.as_any().downcast_ref::() { - self == other - } else { - false - } + if let Some(other) = other.as_any().downcast_ref::() { self == other } else { false } } } @@ -92,11 +88,7 @@ impl GeneratedFileAuxData for ComputedValuesAuxData { self } fn eq(&self, other: &dyn GeneratedFileAuxData) -> bool { - if let Some(other) = other.as_any().downcast_ref::() { - self == other - } else { - false - } + if let Some(other) = other.as_any().downcast_ref::() { self == other } else { false } } } diff --git a/crates/dojo-world/src/metadata_test.rs b/crates/dojo-world/src/metadata_test.rs index 6f34df68b6..ec48befb6f 100644 --- a/crates/dojo-world/src/metadata_test.rs +++ b/crates/dojo-world/src/metadata_test.rs @@ -132,22 +132,23 @@ async fn get_full_dojo_metadata_from_workspace() { assert!(env.rpc_url.unwrap().eq("http://localhost:5050/")); assert!(env.account_address.is_some()); - assert!(env - .account_address - .unwrap() - .eq("0x6162896d1d7ab204c7ccac6dd5f8e9e7c25ecd5ae4fcb4ad32e57786bb46e03")); + assert!( + env.account_address + .unwrap() + .eq("0x6162896d1d7ab204c7ccac6dd5f8e9e7c25ecd5ae4fcb4ad32e57786bb46e03") + ); assert!(env.private_key.is_some()); - assert!(env - .private_key - .unwrap() - .eq("0x1800000000300000180000000000030000000000003006001800006600")); + assert!( + env.private_key.unwrap().eq("0x1800000000300000180000000000030000000000003006001800006600") + ); assert!(env.world_address.is_some()); - assert!(env - .world_address - .unwrap() - .eq("0x3898144a24151443f0c6501a1de46a6e9e27abd9fb5d08cdeeff5a5127d1d25")); + assert!( + env.world_address + .unwrap() + .eq("0x3898144a24151443f0c6501a1de46a6e9e27abd9fb5d08cdeeff5a5127d1d25") + ); assert!(env.keystore_path.is_none()); assert!(env.keystore_password.is_none()); diff --git a/crates/katana/core/src/hooker.rs b/crates/katana/core/src/hooker.rs index a7724a96bb..64da247d0c 100644 --- a/crates/katana/core/src/hooker.rs +++ b/crates/katana/core/src/hooker.rs @@ -1,14 +1,16 @@ //! This module contains a hooker trait, that is added to katana in order to //! allow external code to react at some precise moment of katana processing. -use crate::sequencer::KatanaSequencer; +use std::sync::Arc; + use async_trait::async_trait; use katana_executor::ExecutorFactory; use starknet::accounts::Call; use starknet::core::types::{BroadcastedInvokeTransaction, FieldElement}; -use std::sync::Arc; use tracing::{error, info}; +use crate::sequencer::KatanaSequencer; + #[derive(Debug, Clone, serde::Deserialize, serde::Serialize, Copy, PartialEq, Eq)] pub struct HookerAddresses { pub orderbook_arkchain: FieldElement, @@ -45,7 +47,7 @@ pub trait KatanaHooker { /// /// * `transaction` - The invoke transaction to be verified. async fn verify_invoke_tx_before_pool(&self, transaction: BroadcastedInvokeTransaction) - -> bool; + -> bool; /// Runs code right before a message to starknet /// is being sent via a direct transaction. @@ -86,6 +88,12 @@ impl DefaultKatanaHooker { } } +impl Default for DefaultKatanaHooker { + fn default() -> Self { + Self::new() + } +} + #[async_trait] impl KatanaHooker for DefaultKatanaHooker { fn set_sequencer(&mut self, sequencer: Arc>) { diff --git a/crates/katana/core/src/sequencer.rs b/crates/katana/core/src/sequencer.rs index cf1815eaed..68b323ed98 100644 --- a/crates/katana/core/src/sequencer.rs +++ b/crates/katana/core/src/sequencer.rs @@ -1,6 +1,3 @@ -use crate::hooker::KatanaHooker; -use tokio::sync::RwLock as AsyncRwLock; - use std::cmp::Ordering; use std::iter::Skip; use std::slice::Iter; @@ -27,11 +24,13 @@ use katana_provider::traits::transaction::{ ReceiptProvider, TransactionProvider, TransactionsProviderExt, }; use starknet::core::types::{BlockTag, EmittedEvent, EventsPage}; +use tokio::sync::RwLock as AsyncRwLock; use tracing::error; use crate::backend::config::StarknetConfig; use crate::backend::contract::StarknetContract; use crate::backend::Backend; +use crate::hooker::KatanaHooker; use crate::pool::TransactionPool; use crate::sequencer_error::SequencerError; use crate::service::block_producer::{BlockProducer, BlockProducerMode, PendingExecutor}; @@ -94,7 +93,10 @@ impl KatanaSequencer { .await .ok(), None => { - error!("Messaging service is enabled but no hooker is provided. Messaging service will not be started."); + error!( + "Messaging service is enabled but no hooker is provided. Messaging \ + service will not be started." + ); None } } @@ -305,13 +307,10 @@ impl KatanaSequencer { let tx @ Some(_) = tx else { return Ok(self.pending_executor().as_ref().and_then(|exec| { - exec.read().transactions().iter().find_map(|tx| { - if tx.0.hash == *hash { - Some(tx.0.clone()) - } else { - None - } - }) + exec.read() + .transactions() + .iter() + .find_map(|tx| if tx.0.hash == *hash { Some(tx.0.clone()) } else { None }) })); }; @@ -519,9 +518,10 @@ fn filter_events_by_params( #[cfg(test)] mod tests { - use super::*; use katana_executor::implementation::noop::NoopExecutorFactory; use katana_provider::traits::block::BlockNumberProvider; + + use super::*; #[tokio::test] async fn init_interval_block_producer_with_correct_block_env() { let executor_factory = NoopExecutorFactory::default(); diff --git a/crates/katana/core/src/service/messaging/mod.rs b/crates/katana/core/src/service/messaging/mod.rs index 259cb483f1..27e317a836 100644 --- a/crates/katana/core/src/service/messaging/mod.rs +++ b/crates/katana/core/src/service/messaging/mod.rs @@ -32,10 +32,12 @@ //! configuration file following the `MessagingConfig` format. An example of this file can be found //! in the messaging contracts. -use crate::hooker::KatanaHooker; use std::sync::Arc; + use tokio::sync::RwLock as AsyncRwLock; +use crate::hooker::KatanaHooker; + mod ethereum; mod service; mod starknet; diff --git a/crates/katana/core/src/service/messaging/service.rs b/crates/katana/core/src/service/messaging/service.rs index 3bed0e18ea..e4854db463 100644 --- a/crates/katana/core/src/service/messaging/service.rs +++ b/crates/katana/core/src/service/messaging/service.rs @@ -1,5 +1,7 @@ -use crate::hooker::KatanaHooker; -use tokio::sync::RwLock as AsyncRwLock; +use std::pin::Pin; +use std::sync::Arc; +use std::task::{Context, Poll}; +use std::time::Duration; use futures::{Future, FutureExt, Stream}; use katana_executor::ExecutorFactory; @@ -8,15 +10,13 @@ use katana_primitives::receipt::MessageToL1; use katana_primitives::transaction::{ExecutableTxWithHash, L1HandlerTx, TxHash}; use katana_provider::traits::block::BlockNumberProvider; use katana_provider::traits::transaction::ReceiptProvider; -use std::pin::Pin; -use std::sync::Arc; -use std::task::{Context, Poll}; -use std::time::Duration; +use tokio::sync::RwLock as AsyncRwLock; use tokio::time::{interval_at, Instant, Interval}; use tracing::{error, info}; use super::{MessagingConfig, Messenger, MessengerMode, MessengerResult, LOG_TARGET}; use crate::backend::Backend; +use crate::hooker::KatanaHooker; use crate::pool::TransactionPool; type MessagingFuture = Pin + Send>>; @@ -149,7 +149,8 @@ impl MessagingService { } Err(e) => { error!(target: LOG_TARGET, error = %e, "Error sending messages from block {}", block_num); - // Even if there's an error, we should move to the next block to avoid infinite retries + // Even if there's an error, we should move to the next block to avoid + // infinite retries Ok(Some((block_num, 0))) // Marking as processed to avoid retries } } @@ -165,7 +166,8 @@ impl MessagingService { } Err(e) => { error!(target: LOG_TARGET, error = %e, "Error sending messages from block {}", block_num); - // Even if there's an error, we should move to the next block to avoid infinite retries + // Even if there's an error, we should move to the next block to avoid + // infinite retries Ok(Some((block_num, 0))) // Marking as processed to avoid retries } } @@ -247,7 +249,8 @@ impl Stream for MessagingService { } Poll::Ready(Err(e)) => { error!(target: LOG_TARGET, block = %pin.send_from_block, error = %e, "Error sending messages for block."); - // Even if there's an error, we should move to the next block to avoid infinite retries + // Even if there's an error, we should move to the next block to avoid infinite + // retries pin.send_from_block += 1; return Poll::Pending; } diff --git a/crates/katana/core/src/service/messaging/starknet.rs b/crates/katana/core/src/service/messaging/starknet.rs index b0ece4ce22..387714d3e5 100644 --- a/crates/katana/core/src/service/messaging/starknet.rs +++ b/crates/katana/core/src/service/messaging/starknet.rs @@ -1,4 +1,7 @@ -use crate::hooker::KatanaHooker; +use std::collections::HashSet; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::Arc; + use anyhow::Result; use async_trait::async_trait; use katana_primitives::chain::ChainId; @@ -12,14 +15,12 @@ use starknet::macros::{felt, selector}; use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::{AnyProvider, JsonRpcClient, Provider}; use starknet::signers::{LocalWallet, SigningKey}; -use std::collections::HashSet; -use std::sync::atomic::{AtomicU64, Ordering}; -use std::sync::Arc; use tokio::sync::RwLock as AsyncRwLock; use tracing::{debug, error, info, trace, warn}; use url::Url; use super::{Error, MessagingConfig, Messenger, MessengerResult, LOG_TARGET}; +use crate::hooker::KatanaHooker; const MSG_MAGIC: FieldElement = felt!("0x4d5347"); const EXE_MAGIC: FieldElement = felt!("0x455845"); @@ -225,8 +226,8 @@ impl Messenger for StarknetM async fn gather_messages( &self, - from_block: u64, - max_blocks: u64, + _from_block: u64, + _max_blocks: u64, chain_id: ChainId, ) -> MessengerResult<(u64, Vec)> { debug!(target: LOG_TARGET, "Gathering messages"); diff --git a/crates/katana/executor/src/implementation/blockifier/state.rs b/crates/katana/executor/src/implementation/blockifier/state.rs index cbe21e1e45..c6d7f27572 100644 --- a/crates/katana/executor/src/implementation/blockifier/state.rs +++ b/crates/katana/executor/src/implementation/blockifier/state.rs @@ -171,11 +171,7 @@ impl StateProvider for CachedState { }; let hash = hash.0.into(); - if hash == FieldElement::ZERO { - Ok(None) - } else { - Ok(Some(hash)) - } + if hash == FieldElement::ZERO { Ok(None) } else { Ok(Some(hash)) } } fn nonce( diff --git a/crates/katana/executor/tests/executor.rs b/crates/katana/executor/tests/executor.rs index 00f86b010c..b35c9ae409 100644 --- a/crates/katana/executor/tests/executor.rs +++ b/crates/katana/executor/tests/executor.rs @@ -55,11 +55,7 @@ fn test_executor_with_valid_blocks_impl( // ensure that all transactions succeeded, if not panic with the error message and tx index let has_failed = transactions.iter().enumerate().find_map(|(i, (_, res))| { - if let ExecutionResult::Failed { error } = res { - Some((i, error)) - } else { - None - } + if let ExecutionResult::Failed { error } = res { Some((i, error)) } else { None } }); if let Some((pos, error)) = has_failed { diff --git a/crates/katana/primitives/src/genesis/json.rs b/crates/katana/primitives/src/genesis/json.rs index 5a65d9059a..102020e7c9 100644 --- a/crates/katana/primitives/src/genesis/json.rs +++ b/crates/katana/primitives/src/genesis/json.rs @@ -1071,10 +1071,12 @@ mod tests { fn genesis_from_json_with_unresolved_paths() { let file = File::open("./src/genesis/test-genesis.json").unwrap(); let json: GenesisJson = serde_json::from_reader(file).unwrap(); - assert!(Genesis::try_from(json) - .unwrap_err() - .to_string() - .contains("Unresolved class artifact path")); + assert!( + Genesis::try_from(json) + .unwrap_err() + .to_string() + .contains("Unresolved class artifact path") + ); } #[test] diff --git a/crates/katana/rpc/rpc-api/src/torii.rs b/crates/katana/rpc/rpc-api/src/torii.rs index 3308806004..272497041a 100644 --- a/crates/katana/rpc/rpc-api/src/torii.rs +++ b/crates/katana/rpc/rpc-api/src/torii.rs @@ -7,5 +7,5 @@ use katana_rpc_types::transaction::{TransactionsPage, TransactionsPageCursor}; pub trait ToriiApi { #[method(name = "getTransactions")] async fn get_transactions(&self, cursor: TransactionsPageCursor) - -> RpcResult; + -> RpcResult; } diff --git a/crates/katana/rpc/rpc/src/solis.rs b/crates/katana/rpc/rpc/src/solis.rs index 35da1dedc4..0c0f4d8dab 100644 --- a/crates/katana/rpc/rpc/src/solis.rs +++ b/crates/katana/rpc/rpc/src/solis.rs @@ -1,13 +1,14 @@ -use base64::decode; use std::sync::Arc; -use crate::config::ServerConfig; +use base64::decode; use jsonrpsee::core::{async_trait, Error as RpcError}; use katana_core::hooker::HookerAddresses; use katana_core::sequencer::KatanaSequencer; use katana_executor::ExecutorFactory; use katana_rpc_api::solis::SolisApiServer; use katana_rpc_types::error::solis::SolisApiError; + +use crate::config::ServerConfig; pub struct SolisApi { sequencer: Arc>, pub rpc_user: String, diff --git a/crates/katana/runner/runner-macro/src/lib.rs b/crates/katana/runner/runner-macro/src/lib.rs index 8cb426c16e..77867a284f 100644 --- a/crates/katana/runner/runner-macro/src/lib.rs +++ b/crates/katana/runner/runner-macro/src/lib.rs @@ -28,11 +28,7 @@ fn parse_metadata(metadata: String) -> (u16, Option, Option) { // if set to `true`, we use a default block time. let block_time = if args.len() >= 2 { if let Ok(b) = args[1].trim().parse::() { - if !b { - None - } else { - Some(DEFAULT_BLOCK_TIME) - } + if !b { None } else { Some(DEFAULT_BLOCK_TIME) } } else if let Ok(block_time_ms) = args[1].trim().parse::() { Some(block_time_ms) } else { diff --git a/crates/katana/runner/src/lib.rs b/crates/katana/runner/src/lib.rs index adf9051ad2..13a19fe771 100644 --- a/crates/katana/runner/src/lib.rs +++ b/crates/katana/runner/src/lib.rs @@ -185,11 +185,7 @@ impl Drop for KatanaRunner { /// Determines the default program path for the katana runner based on the KATANA_RUNNER_BIN /// environment variable. If not set, try to to use katana from the PATH. fn determine_default_program_path() -> String { - if let Ok(bin) = std::env::var("KATANA_RUNNER_BIN") { - bin - } else { - "katana".to_string() - } + if let Ok(bin) = std::env::var("KATANA_RUNNER_BIN") { bin } else { "katana".to_string() } } #[cfg(test)] diff --git a/crates/katana/storage/db/src/mdbx/cursor.rs b/crates/katana/storage/db/src/mdbx/cursor.rs index e08ca8499a..9cac3876e3 100644 --- a/crates/katana/storage/db/src/mdbx/cursor.rs +++ b/crates/katana/storage/db/src/mdbx/cursor.rs @@ -304,11 +304,7 @@ impl Walker<'_, RW, T> { impl std::iter::Iterator for Walker<'_, K, T> { type Item = Result, DatabaseError>; fn next(&mut self) -> Option { - if let value @ Some(_) = self.start.take() { - value - } else { - self.cursor.next().transpose() - } + if let value @ Some(_) = self.start.take() { value } else { self.cursor.next().transpose() } } } diff --git a/crates/katana/storage/provider/src/providers/db/state.rs b/crates/katana/storage/provider/src/providers/db/state.rs index 286b16920d..bb8f070646 100644 --- a/crates/katana/storage/provider/src/providers/db/state.rs +++ b/crates/katana/storage/provider/src/providers/db/state.rs @@ -292,11 +292,7 @@ fn recent_change_from_block( // 1. the list is empty // 2. there are no prior changes occured before/at `block_number` let rank = block_list.rank(block_number); - if rank == 0 { - None - } else { - block_list.select(rank - 1) - } + if rank == 0 { None } else { block_list.select(rank - 1) } } #[cfg(test)] diff --git a/crates/katana/storage/provider/src/traits/contract.rs b/crates/katana/storage/provider/src/traits/contract.rs index b0a09d61aa..7ff77f1999 100644 --- a/crates/katana/storage/provider/src/traits/contract.rs +++ b/crates/katana/storage/provider/src/traits/contract.rs @@ -40,5 +40,5 @@ pub trait ContractClassWriter: Send + Sync { /// Retrieves the Sierra class definition of a contract class given its class hash. fn set_sierra_class(&self, hash: ClassHash, sierra: FlattenedSierraClass) - -> ProviderResult<()>; + -> ProviderResult<()>; } diff --git a/crates/katana/storage/provider/src/traits/state.rs b/crates/katana/storage/provider/src/traits/state.rs index c18d4f72d1..3ec9aade09 100644 --- a/crates/katana/storage/provider/src/traits/state.rs +++ b/crates/katana/storage/provider/src/traits/state.rs @@ -26,7 +26,7 @@ pub trait StateProvider: ContractClassProvider + Send + Sync { /// Returns the class hash of a contract. fn class_hash_of_contract(&self, address: ContractAddress) - -> ProviderResult>; + -> ProviderResult>; } /// A type which can create [`StateProvider`] for states at a particular block. diff --git a/crates/sozo/ops/src/tests/call.rs b/crates/sozo/ops/src/tests/call.rs index f93b498fd3..84d6c4f5bc 100644 --- a/crates/sozo/ops/src/tests/call.rs +++ b/crates/sozo/ops/src/tests/call.rs @@ -20,15 +20,17 @@ async fn call_with_bad_address() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!(call::call( - world_reader, - "0xBadCoffeeBadCode".to_string(), - ENTRYPOINT.to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None - ) - .await - .is_err()); + assert!( + call::call( + world_reader, + "0xBadCoffeeBadCode".to_string(), + ENTRYPOINT.to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None + ) + .await + .is_err() + ); } #[tokio::test] @@ -39,15 +41,17 @@ async fn call_with_bad_name() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!(call::call( - world_reader, - "BadName".to_string(), - ENTRYPOINT.to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None - ) - .await - .is_err()); + assert!( + call::call( + world_reader, + "BadName".to_string(), + ENTRYPOINT.to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None + ) + .await + .is_err() + ); } #[tokio::test] @@ -58,15 +62,17 @@ async fn call_with_bad_entrypoint() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!(call::call( - world_reader, - CONTRACT_NAME.to_string(), - "BadEntryPoint".to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None - ) - .await - .is_err()); + assert!( + call::call( + world_reader, + CONTRACT_NAME.to_string(), + "BadEntryPoint".to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None + ) + .await + .is_err() + ); } #[tokio::test] @@ -77,15 +83,11 @@ async fn call_with_bad_calldata() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!(call::call( - world_reader, - CONTRACT_NAME.to_string(), - ENTRYPOINT.to_string(), - vec![], - None - ) - .await - .is_err()); + assert!( + call::call(world_reader, CONTRACT_NAME.to_string(), ENTRYPOINT.to_string(), vec![], None) + .await + .is_err() + ); } #[tokio::test] @@ -96,15 +98,17 @@ async fn call_with_contract_name() { let provider = sequencer.provider(); let world_reader = WorldContractReader::new(world.address, provider); - assert!(call::call( - world_reader, - CONTRACT_NAME.to_string(), - ENTRYPOINT.to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None, - ) - .await - .is_ok()); + assert!( + call::call( + world_reader, + CONTRACT_NAME.to_string(), + ENTRYPOINT.to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None, + ) + .await + .is_ok() + ); } #[tokio::test] @@ -121,13 +125,15 @@ async fn call_with_contract_address() { .await .unwrap(); - assert!(call::call( - world_reader, - format!("{:#x}", contract_address), - ENTRYPOINT.to_string(), - vec![FieldElement::ZERO, FieldElement::ZERO], - None, - ) - .await - .is_ok()); + assert!( + call::call( + world_reader, + format!("{:#x}", contract_address), + ENTRYPOINT.to_string(), + vec![FieldElement::ZERO, FieldElement::ZERO], + None, + ) + .await + .is_ok() + ); } diff --git a/crates/sozo/ops/src/tests/migration.rs b/crates/sozo/ops/src/tests/migration.rs index 84c45e90ba..06903c5f37 100644 --- a/crates/sozo/ops/src/tests/migration.rs +++ b/crates/sozo/ops/src/tests/migration.rs @@ -81,14 +81,16 @@ async fn migrate_with_small_fee_multiplier_will_fail() { let account = sequencer.account(0); - assert!(execute_strategy( - &ws, - &migration, - &account, - TxnConfig { fee_estimate_multiplier: Some(0.2f64), ..Default::default() }, - ) - .await - .is_err()); + assert!( + execute_strategy( + &ws, + &migration, + &account, + TxnConfig { fee_estimate_multiplier: Some(0.2f64), ..Default::default() }, + ) + .await + .is_err() + ); } #[tokio::test] diff --git a/crates/torii/client/src/client/storage.rs b/crates/torii/client/src/client/storage.rs index caa00dee5c..48541a2314 100644 --- a/crates/torii/client/src/client/storage.rs +++ b/crates/torii/client/src/client/storage.rs @@ -264,8 +264,10 @@ mod tests { ); assert!(actual_values == expected_values); assert!(storage.storage.read().len() == model.packed_size as usize); - assert!(actual_storage_addresses - .into_iter() - .all(|address| expected_storage_addresses.contains(&address))); + assert!( + actual_storage_addresses + .into_iter() + .all(|address| expected_storage_addresses.contains(&address)) + ); } } diff --git a/crates/torii/client/src/client/subscription.rs b/crates/torii/client/src/client/subscription.rs index b167e6a614..ac21707104 100644 --- a/crates/torii/client/src/client/subscription.rs +++ b/crates/torii/client/src/client/subscription.rs @@ -192,11 +192,7 @@ impl SubscriptionService { let storage_entries = diff.storage_diffs.into_iter().find_map(|d| { let expected = self.world_metadata.read().world_address; let current = d.address; - if current == expected { - Some(d.storage_entries) - } else { - None - } + if current == expected { Some(d.storage_entries) } else { None } }); let Some(entries) = storage_entries else { diff --git a/crates/torii/graphql/src/object/entity.rs b/crates/torii/graphql/src/object/entity.rs index 209fd28141..dd73c9c6fd 100644 --- a/crates/torii/graphql/src/object/entity.rs +++ b/crates/torii/graphql/src/object/entity.rs @@ -63,10 +63,8 @@ impl ResolvableObject for EntityObject { } fn subscriptions(&self) -> Option> { - Some(vec![SubscriptionField::new( - "entityUpdated", - TypeRef::named_nn(self.type_name()), - |ctx| { + Some(vec![ + SubscriptionField::new("entityUpdated", TypeRef::named_nn(self.type_name()), |ctx| { SubscriptionFieldFuture::new(async move { let id = match ctx.args.get("id") { Some(id) => Some(id.string()?.to_string()), @@ -83,9 +81,9 @@ impl ResolvableObject for EntityObject { } })) }) - }, - ) - .argument(InputValue::new("id", TypeRef::named(TypeRef::ID)))]) + }) + .argument(InputValue::new("id", TypeRef::named(TypeRef::ID))), + ]) } } diff --git a/crates/torii/graphql/src/object/event.rs b/crates/torii/graphql/src/object/event.rs index 975d98afe9..f0063f76c1 100644 --- a/crates/torii/graphql/src/object/event.rs +++ b/crates/torii/graphql/src/object/event.rs @@ -44,17 +44,15 @@ impl ResolvableObject for EventObject { } fn subscriptions(&self) -> Option> { - Some(vec![SubscriptionField::new( - "eventEmitted", - TypeRef::named_nn(self.type_name()), - |ctx| { + Some(vec![ + SubscriptionField::new("eventEmitted", TypeRef::named_nn(self.type_name()), |ctx| { SubscriptionFieldFuture::new(async move { let input_keys = parse_keys_argument(&ctx)?; Ok(EventObject::subscription_stream(input_keys)) }) - }, - ) - .argument(InputValue::new("keys", TypeRef::named_list(TypeRef::STRING)))]) + }) + .argument(InputValue::new("keys", TypeRef::named_list(TypeRef::STRING))), + ]) } } diff --git a/crates/torii/graphql/src/object/event_message.rs b/crates/torii/graphql/src/object/event_message.rs index 11da937cfb..007573b3ca 100644 --- a/crates/torii/graphql/src/object/event_message.rs +++ b/crates/torii/graphql/src/object/event_message.rs @@ -63,31 +63,35 @@ impl ResolvableObject for EventMessageObject { } fn subscriptions(&self) -> Option> { - Some(vec![SubscriptionField::new( - "eventMessageUpdated", - TypeRef::named_nn(self.type_name()), - |ctx| { - SubscriptionFieldFuture::new(async move { - let id = match ctx.args.get("id") { - Some(id) => Some(id.string()?.to_string()), - None => None, - }; - // if id is None, then subscribe to all entities - // if id is Some, then subscribe to only the entity with that id - Ok(SimpleBroker::::subscribe().filter_map( - move |entity: EventMessage| { - if id.is_none() || id == Some(entity.id.clone()) { - Some(Ok(Value::Object(EventMessageObject::value_mapping(entity)))) - } else { - // id != entity.id , then don't send anything, still listening - None - } - }, - )) - }) - }, - ) - .argument(InputValue::new("id", TypeRef::named(TypeRef::ID)))]) + Some(vec![ + SubscriptionField::new( + "eventMessageUpdated", + TypeRef::named_nn(self.type_name()), + |ctx| { + SubscriptionFieldFuture::new(async move { + let id = match ctx.args.get("id") { + Some(id) => Some(id.string()?.to_string()), + None => None, + }; + // if id is None, then subscribe to all entities + // if id is Some, then subscribe to only the entity with that id + Ok(SimpleBroker::::subscribe().filter_map( + move |entity: EventMessage| { + if id.is_none() || id == Some(entity.id.clone()) { + Some(Ok(Value::Object(EventMessageObject::value_mapping( + entity, + )))) + } else { + // id != entity.id , then don't send anything, still listening + None + } + }, + )) + }) + }, + ) + .argument(InputValue::new("id", TypeRef::named(TypeRef::ID))), + ]) } } diff --git a/crates/torii/graphql/src/object/model.rs b/crates/torii/graphql/src/object/model.rs index 4b326b0207..a9ecb13607 100644 --- a/crates/torii/graphql/src/object/model.rs +++ b/crates/torii/graphql/src/object/model.rs @@ -74,10 +74,8 @@ impl ResolvableObject for ModelObject { } fn subscriptions(&self) -> Option> { - Some(vec![SubscriptionField::new( - "modelRegistered", - TypeRef::named_nn(self.type_name()), - |ctx| { + Some(vec![ + SubscriptionField::new("modelRegistered", TypeRef::named_nn(self.type_name()), |ctx| { { SubscriptionFieldFuture::new(async move { let id = match ctx.args.get("id") { @@ -96,9 +94,9 @@ impl ResolvableObject for ModelObject { })) }) } - }, - ) - .argument(InputValue::new("id", TypeRef::named(TypeRef::ID)))]) + }) + .argument(InputValue::new("id", TypeRef::named(TypeRef::ID))), + ]) } } diff --git a/crates/torii/libp2p/src/typed_data.rs b/crates/torii/libp2p/src/typed_data.rs index e018184814..dc752f751b 100644 --- a/crates/torii/libp2p/src/typed_data.rs +++ b/crates/torii/libp2p/src/typed_data.rs @@ -149,11 +149,7 @@ pub fn encode_type(name: &str, types: &IndexMap>) -> Result>() .join(","); From a5829a63090df4ef94ad9a166af2e3621464a74b Mon Sep 17 00:00:00 2001 From: bexan Date: Fri, 9 Aug 2024 14:52:23 +0200 Subject: [PATCH 3/5] starknet: remove BroadcastedInvokeTransaction --- crates/katana/rpc/rpc/src/starknet.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/katana/rpc/rpc/src/starknet.rs b/crates/katana/rpc/rpc/src/starknet.rs index 296d9c8db6..9f03e4f87a 100644 --- a/crates/katana/rpc/rpc/src/starknet.rs +++ b/crates/katana/rpc/rpc/src/starknet.rs @@ -36,7 +36,7 @@ use katana_rpc_types::{ use katana_rpc_types_builder::ReceiptBuilder; use katana_tasks::{BlockingTaskPool, TokioTaskSpawner}; use starknet::core::types::{ - BlockTag, BroadcastedInvokeTransaction, DeclareTransactionTrace, DeployAccountTransactionTrace, + BlockTag, DeclareTransactionTrace, DeployAccountTransactionTrace, ExecuteInvocation, InvokeTransactionTrace, L1HandlerTransactionTrace, RevertedInvocation, SimulatedTransaction, TransactionExecutionStatus, TransactionStatus, TransactionTrace, }; From a63f93fca964bfd62c3da90918ba6ba6730ca693 Mon Sep 17 00:00:00 2001 From: bexan Date: Fri, 9 Aug 2024 15:05:57 +0200 Subject: [PATCH 4/5] hooker: clippy changes --- bin/solis/src/hooker.rs | 56 ++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/bin/solis/src/hooker.rs b/bin/solis/src/hooker.rs index 1ba52d5b69..46a4a35ae3 100644 --- a/bin/solis/src/hooker.rs +++ b/bin/solis/src/hooker.rs @@ -32,19 +32,19 @@ use crate::CHAIN_ID_SOLIS; #[allow(dead_code)] pub enum CancelStatus { - CancelledUser, - CancelledByNewOrder, - CancelledAssetFault, - CancelledOwnership, + User, + ByNewOrder, + AssetFault, + Ownership, } impl CancelStatus { fn to_u32(&self) -> u32 { match self { - CancelStatus::CancelledUser => 1, - CancelStatus::CancelledByNewOrder => 2, - CancelStatus::CancelledAssetFault => 3, - CancelStatus::CancelledOwnership => 4, + CancelStatus::User => 1, + CancelStatus::ByNewOrder => 2, + CancelStatus::AssetFault => 3, + CancelStatus::Ownership => 4, } } } @@ -184,23 +184,21 @@ impl } // ERC20 to ERC721 : we check the allowance and the offerer balance. - if order.route == RouteType::Erc20ToErc721 { - if !self - .verify_balance(&BalanceVerifier { - currency_address: ContractAddress(order.currency_address.into()), - offerer: cainome::cairo_serde::ContractAddress(order.offerer.into()), - start_amount: U256 { - low: order.start_amount.low, - high: order.start_amount.high, - }, - }) - .await - { - println!("verify balance for starknet before failed"); - return false; - } + if order.route == RouteType::Erc20ToErc721 && !self + .verify_balance(&BalanceVerifier { + currency_address: ContractAddress(order.currency_address.into()), + offerer: cainome::cairo_serde::ContractAddress(order.offerer.into()), + start_amount: U256 { + low: order.start_amount.low, + high: order.start_amount.high, + }, + }) + .await + { + println!("verify balance for starknet before failed"); + return false; } - return true; + true } } @@ -312,7 +310,7 @@ impl // The calldata always starts with the from_address. let mut calldata: Vec = vec![from_address]; - for p in payload.into_iter() { + for p in payload.iter() { calldata.push(*p); } @@ -352,7 +350,7 @@ impl self.sn_executor_address = addresses.executor_starknet; let path = Path::new(FILE_PATH_ADDRESSES); - let file = OpenOptions::new().write(true).create(true).open(&path); + let file = OpenOptions::new().write(true).create(true).open(path); match file { Ok(mut file) => { @@ -361,7 +359,7 @@ impl "sn_executor_address": format!("{:#x}", self.sn_executor_address) }); - if let Err(e) = writeln!(file, "{}", data.to_string()) { + if let Err(e) = writeln!(file, "{}", data) { eprintln!("Error writing file : {}", e); } } @@ -456,7 +454,7 @@ impl let owner_ship_verification = self.verify_ownership(&verifier).await; if !owner_ship_verification { // rollback the status - let status = CancelStatus::CancelledOwnership; + let status = CancelStatus::Ownership; self.add_l1_handler_transaction_for_orderbook( selector!("rollback_status_order"), @@ -477,7 +475,7 @@ impl .await { // rollback the status - let status = CancelStatus::CancelledAssetFault; + let status = CancelStatus::AssetFault; self.add_l1_handler_transaction_for_orderbook( selector!("rollback_status_order"), From 1e013561aab254aa3abc9e5e609343ef6abca463 Mon Sep 17 00:00:00 2001 From: bexan Date: Fri, 9 Aug 2024 15:06:47 +0200 Subject: [PATCH 5/5] hooker: cargo changes --- bin/solis/src/hooker.rs | 21 +++++++++++---------- crates/katana/rpc/rpc/src/starknet.rs | 6 +++--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/bin/solis/src/hooker.rs b/bin/solis/src/hooker.rs index 46a4a35ae3..d39a7e733d 100644 --- a/bin/solis/src/hooker.rs +++ b/bin/solis/src/hooker.rs @@ -184,16 +184,17 @@ impl } // ERC20 to ERC721 : we check the allowance and the offerer balance. - if order.route == RouteType::Erc20ToErc721 && !self - .verify_balance(&BalanceVerifier { - currency_address: ContractAddress(order.currency_address.into()), - offerer: cainome::cairo_serde::ContractAddress(order.offerer.into()), - start_amount: U256 { - low: order.start_amount.low, - high: order.start_amount.high, - }, - }) - .await + if order.route == RouteType::Erc20ToErc721 + && !self + .verify_balance(&BalanceVerifier { + currency_address: ContractAddress(order.currency_address.into()), + offerer: cainome::cairo_serde::ContractAddress(order.offerer.into()), + start_amount: U256 { + low: order.start_amount.low, + high: order.start_amount.high, + }, + }) + .await { println!("verify balance for starknet before failed"); return false; diff --git a/crates/katana/rpc/rpc/src/starknet.rs b/crates/katana/rpc/rpc/src/starknet.rs index 9f03e4f87a..18f0888652 100644 --- a/crates/katana/rpc/rpc/src/starknet.rs +++ b/crates/katana/rpc/rpc/src/starknet.rs @@ -36,9 +36,9 @@ use katana_rpc_types::{ use katana_rpc_types_builder::ReceiptBuilder; use katana_tasks::{BlockingTaskPool, TokioTaskSpawner}; use starknet::core::types::{ - BlockTag, DeclareTransactionTrace, DeployAccountTransactionTrace, - ExecuteInvocation, InvokeTransactionTrace, L1HandlerTransactionTrace, RevertedInvocation, - SimulatedTransaction, TransactionExecutionStatus, TransactionStatus, TransactionTrace, + BlockTag, DeclareTransactionTrace, DeployAccountTransactionTrace, ExecuteInvocation, + InvokeTransactionTrace, L1HandlerTransactionTrace, RevertedInvocation, SimulatedTransaction, + TransactionExecutionStatus, TransactionStatus, TransactionTrace, }; pub struct StarknetApi {