diff --git a/Cargo.lock b/Cargo.lock index 272ba6c..539c8da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -365,6 +365,56 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + [[package]] name = "anyhow" version = "1.0.98" @@ -627,17 +677,6 @@ dependencies = [ "critical-section", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "auto_ops" version = "0.3.0" @@ -961,42 +1000,43 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.25" +version = "4.5.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882" dependencies = [ - "atty", - "bitflags 1.3.2", + "clap_builder", "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966" +dependencies = [ + "anstream", + "anstyle", "clap_lex", - "indexmap 1.9.3", - "once_cell", - "strsim 0.10.0", - "termcolor", - "textwrap", + "strsim", ] [[package]] name = "clap_derive" -version = "3.2.25" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ - "heck 0.4.1", - "proc-macro-error", + "heck 0.5.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.104", ] [[package]] name = "clap_lex" -version = "0.2.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "cobs" @@ -1007,6 +1047,12 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + [[package]] name = "common" version = "0.1.0" @@ -1237,7 +1283,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", + "strsim", "syn 2.0.104", ] @@ -1927,7 +1973,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.10.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -2005,15 +2051,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.5.2" @@ -2340,16 +2377,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - [[package]] name = "indexmap" version = "2.10.0" @@ -2435,11 +2462,17 @@ version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.5.2", + "hermit-abi", "libc", "windows-sys 0.59.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.10.5" @@ -2943,6 +2976,7 @@ dependencies = [ "actix-rt", "anyhow", "bincode", + "clap", "common", "elliptic-curve", "env_logger", @@ -3085,6 +3119,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "opaque-debug" version = "0.3.1" @@ -3141,12 +3181,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - [[package]] name = "parking_lot" version = "0.12.4" @@ -4610,12 +4644,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -4754,12 +4782,6 @@ dependencies = [ "risc0-build", ] -[[package]] -name = "textwrap" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" - [[package]] name = "thiserror" version = "1.0.69" @@ -4956,7 +4978,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.10.0", + "indexmap", "serde", "serde_spanned", "toml_datetime", @@ -4969,7 +4991,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.10.0", + "indexmap", "serde", "serde_spanned", "toml_datetime", @@ -5167,6 +5189,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "utxo" version = "0.1.0" @@ -5821,7 +5849,7 @@ dependencies = [ "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.10.0", + "indexmap", "memchr", "thiserror 2.0.12", "zopfli", diff --git a/Cargo.toml b/Cargo.toml index 41c5309..a7d82a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,7 +70,7 @@ version = "=4.1.0" [workspace.dependencies.clap] features = ["derive", "env"] -version = "3.1.6" +version = "4.5.42" [workspace.dependencies.tokio-retry] version = "0.3.0" diff --git a/ci_scripts/test-ubuntu.sh b/ci_scripts/test-ubuntu.sh index 47d79fa..34b97b7 100644 --- a/ci_scripts/test-ubuntu.sh +++ b/ci_scripts/test-ubuntu.sh @@ -6,4 +6,5 @@ source env.sh cargo test --release cd integration_tests +export HOME_DIR=$(pwd)/configs/debug/node/ cargo run $(pwd)/configs/debug all \ No newline at end of file diff --git a/integration_tests/configs/debug/node/node_config.json b/integration_tests/configs/debug/node/node_config.json index ec27ac4..ef07b4f 100644 --- a/integration_tests/configs/debug/node/node_config.json +++ b/integration_tests/configs/debug/node/node_config.json @@ -3,17 +3,6 @@ "override_rust_log": null, "sequencer_addr": "http://127.0.0.1:3040", "seq_poll_timeout_secs": 10, - "port": 3041, - "gas_config": { - "gas_fee_per_byte_deploy": 100, - "gas_fee_per_input_buffer_runtime": 1000, - "gas_fee_per_byte_runtime": 10, - "gas_cost_runtime": 100, - "gas_cost_deploy": 1000, - "gas_limit_deploy": 30000000, - "gas_limit_runtime": 30000000 - }, - "shapshot_frequency_in_blocks": 10, "initial_accounts": [ { "address": [ diff --git a/integration_tests/src/lib.rs b/integration_tests/src/lib.rs index 6438542..7678f4f 100644 --- a/integration_tests/src/lib.rs +++ b/integration_tests/src/lib.rs @@ -1,14 +1,14 @@ -use std::{path::PathBuf, sync::Arc, time::Duration}; +use std::{path::PathBuf, time::Duration}; use actix_web::dev::ServerHandle; use anyhow::Result; use clap::Parser; use log::info; -use node_core::{NodeCore, config::NodeConfig}; +use node_core::{Command, fetch_config, sequencer_client::SequencerClient}; use sequencer_core::config::SequencerConfig; use sequencer_runner::startup_sequencer; use tempfile::TempDir; -use tokio::{sync::Mutex, task::JoinHandle}; +use tokio::task::JoinHandle; #[derive(Parser, Debug)] #[clap(version)] @@ -27,65 +27,38 @@ pub const TIME_TO_WAIT_FOR_BLOCK_SECONDS: u64 = 12; #[allow(clippy::type_complexity)] pub async fn pre_test( home_dir: PathBuf, -) -> Result<( - ServerHandle, - JoinHandle>, - TempDir, - TempDir, - Arc>, -)> { +) -> Result<(ServerHandle, JoinHandle>, TempDir)> { let home_dir_sequencer = home_dir.join("sequencer"); - let home_dir_node = home_dir.join("node"); let mut sequencer_config = sequencer_runner::config::from_file(home_dir_sequencer.join("sequencer_config.json")) .unwrap(); - let mut node_config = - node_core::config::from_file(home_dir_node.join("node_config.json")).unwrap(); - let (temp_dir_node, temp_dir_sequencer) = - replace_home_dir_with_temp_dir_in_configs(&mut node_config, &mut sequencer_config); + let temp_dir_sequencer = replace_home_dir_with_temp_dir_in_configs(&mut sequencer_config); let (seq_http_server_handle, sequencer_loop_handle) = startup_sequencer(sequencer_config).await?; - let node_core = NodeCore::start_from_config_update_chain(node_config.clone()).await?; - - let wrapped_node_core = Arc::new(Mutex::new(node_core)); - Ok(( seq_http_server_handle, sequencer_loop_handle, - temp_dir_node, temp_dir_sequencer, - wrapped_node_core, )) } pub fn replace_home_dir_with_temp_dir_in_configs( - node_config: &mut NodeConfig, sequencer_config: &mut SequencerConfig, -) -> (TempDir, TempDir) { - let temp_dir_node = tempfile::tempdir().unwrap(); +) -> TempDir { let temp_dir_sequencer = tempfile::tempdir().unwrap(); - node_config.home = temp_dir_node.path().to_path_buf(); sequencer_config.home = temp_dir_sequencer.path().to_path_buf(); - (temp_dir_node, temp_dir_sequencer) + temp_dir_sequencer } #[allow(clippy::type_complexity)] -pub async fn post_test( - residual: ( - ServerHandle, - JoinHandle>, - TempDir, - TempDir, - Arc>, - ), -) { - let (seq_http_server_handle, sequencer_loop_handle, _, _, _) = residual; +pub async fn post_test(residual: (ServerHandle, JoinHandle>, TempDir)) { + let (seq_http_server_handle, sequencer_loop_handle, _) = residual; info!("Cleanup"); @@ -96,28 +69,28 @@ pub async fn post_test( //So they are dropped and tempdirs will be dropped too, } -pub async fn test_success(wrapped_node_core: Arc>) { - let acc_sender = hex::decode(ACC_SENDER).unwrap().try_into().unwrap(); - let acc_receiver = hex::decode(ACC_RECEIVER).unwrap().try_into().unwrap(); +pub async fn test_success() { + let command = Command::SendNativeTokenTransfer { + from: ACC_SENDER.to_string(), + to: ACC_RECEIVER.to_string(), + amount: 100, + }; - let guard = wrapped_node_core.lock().await; + let node_config = fetch_config().unwrap(); - let _res = guard - .send_public_native_token_transfer(acc_sender, 0, acc_receiver, 100) - .await - .unwrap(); + let seq_client = SequencerClient::new(node_config).unwrap(); + + node_core::execute_subcommand(command).await.unwrap(); info!("Waiting for next block creation"); tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await; info!("Checking correct balance move"); - let acc_1_balance = guard - .sequencer_client + let acc_1_balance = seq_client .get_account_balance(ACC_SENDER.to_string()) .await .unwrap(); - let acc_2_balance = guard - .sequencer_client + let acc_2_balance = seq_client .get_account_balance(ACC_RECEIVER.to_string()) .await .unwrap(); @@ -131,30 +104,30 @@ pub async fn test_success(wrapped_node_core: Arc>) { info!("Success!"); } -pub async fn test_success_move_to_another_account(wrapped_node_core: Arc>) { - let acc_sender = hex::decode(ACC_SENDER).unwrap().try_into().unwrap(); - let acc_receiver_new_acc = [42; 32]; +pub async fn test_success_move_to_another_account() { + let hex_acc_receiver_new_acc = hex::encode([42; 32]); - let hex_acc_receiver_new_acc = hex::encode(acc_receiver_new_acc); + let command = Command::SendNativeTokenTransfer { + from: ACC_SENDER.to_string(), + to: hex_acc_receiver_new_acc.clone(), + amount: 100, + }; - let guard = wrapped_node_core.lock().await; + let node_config = fetch_config().unwrap(); - let _res = guard - .send_public_native_token_transfer(acc_sender, 0, acc_receiver_new_acc, 100) - .await - .unwrap(); + let seq_client = SequencerClient::new(node_config).unwrap(); + + node_core::execute_subcommand(command).await.unwrap(); info!("Waiting for next block creation"); tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await; info!("Checking correct balance move"); - let acc_1_balance = guard - .sequencer_client + let acc_1_balance = seq_client .get_account_balance(ACC_SENDER.to_string()) .await .unwrap(); - let acc_2_balance = guard - .sequencer_client + let acc_2_balance = seq_client .get_account_balance(hex_acc_receiver_new_acc) .await .unwrap(); @@ -168,28 +141,28 @@ pub async fn test_success_move_to_another_account(wrapped_node_core: Arc>) { - let acc_sender = hex::decode(ACC_SENDER).unwrap().try_into().unwrap(); - let acc_receiver = hex::decode(ACC_RECEIVER).unwrap().try_into().unwrap(); +pub async fn test_failure() { + let command = Command::SendNativeTokenTransfer { + from: ACC_SENDER.to_string(), + to: ACC_RECEIVER.to_string(), + amount: 1000000, + }; - let guard = wrapped_node_core.lock().await; + let node_config = fetch_config().unwrap(); - let _res = guard - .send_public_native_token_transfer(acc_sender, 0, acc_receiver, 100000) - .await - .unwrap(); + let seq_client = SequencerClient::new(node_config).unwrap(); + + node_core::execute_subcommand(command).await.unwrap(); info!("Waiting for next block creation"); tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await; info!("Checking correct balance move"); - let acc_1_balance = guard - .sequencer_client + let acc_1_balance = seq_client .get_account_balance(ACC_SENDER.to_string()) .await .unwrap(); - let acc_2_balance = guard - .sequencer_client + let acc_2_balance = seq_client .get_account_balance(ACC_RECEIVER.to_string()) .await .unwrap(); @@ -207,12 +180,10 @@ macro_rules! test_cleanup_wrap { ($home_dir:ident, $test_func:ident) => {{ let res = pre_test($home_dir.clone()).await.unwrap(); - let wrapped_node_core = res.4.clone(); - info!("Waiting for first block creation"); tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await; - $test_func(wrapped_node_core.clone()).await; + $test_func().await; post_test(res).await; }}; diff --git a/node_core/Cargo.toml b/node_core/Cargo.toml index 969e4ec..a9c8b23 100644 --- a/node_core/Cargo.toml +++ b/node_core/Cargo.toml @@ -21,6 +21,7 @@ tempfile.workspace = true risc0-zkvm = { git = "https://github.com/risc0/risc0.git", branch = "release-2.3" } hex.workspace = true actix-rt.workspace = true +clap.workspace = true [dependencies.sc_core] path = "../sc_core" diff --git a/node_core/src/chain_storage/mod.rs b/node_core/src/chain_storage/mod.rs index ba20504..446df2f 100644 --- a/node_core/src/chain_storage/mod.rs +++ b/node_core/src/chain_storage/mod.rs @@ -89,7 +89,6 @@ impl NodeChainStore { #[cfg(test)] mod tests { use super::*; - use crate::config::GasConfig; use accounts::account_core::Account; use std::path::PathBuf; use tempfile::tempdir; @@ -268,42 +267,16 @@ mod tests { initial_accounts } - // fn create_genesis_block() -> Block { - // Block { - // block_id: 0, - // prev_block_id: 0, - // prev_block_hash: [0; 32], - // hash: [1; 32], - // transactions: vec![], - // data: Data::default(), - // } - // } - fn create_sample_node_config(home: PathBuf) -> NodeConfig { NodeConfig { home, override_rust_log: None, sequencer_addr: "http://127.0.0.1".to_string(), seq_poll_timeout_secs: 1, - port: 8000, - gas_config: create_sample_gas_config(), - shapshot_frequency_in_blocks: 1, initial_accounts: create_initial_accounts(), } } - fn create_sample_gas_config() -> GasConfig { - GasConfig { - gas_fee_per_byte_deploy: 0, - gas_fee_per_input_buffer_runtime: 0, - gas_fee_per_byte_runtime: 0, - gas_cost_runtime: 0, - gas_cost_deploy: 0, - gas_limit_deploy: 0, - gas_limit_runtime: 0, - } - } - #[test] fn test_new_initializes_correctly() { let temp_dir = tempdir().unwrap(); diff --git a/node_core/src/config.rs b/node_core/src/config.rs index 8aa08ad..29a22f9 100644 --- a/node_core/src/config.rs +++ b/node_core/src/config.rs @@ -4,11 +4,6 @@ use accounts::account_core::Account; use serde::{Deserialize, Serialize}; use zkvm::gas_calculator::GasCalculator; -use anyhow::Result; - -use std::fs::File; -use std::io::BufReader; - #[derive(Debug, Clone, Serialize, Deserialize)] pub struct GasConfig { /// Gas spent per deploying one byte of data @@ -51,19 +46,6 @@ pub struct NodeConfig { pub sequencer_addr: String, ///Sequencer polling duration for new blocks in seconds pub seq_poll_timeout_secs: u64, - ///Port to listen - pub port: u16, - ///Gas config - pub gas_config: GasConfig, - ///Frequency of snapshots - pub shapshot_frequency_in_blocks: u64, ///Initial accounts for wallet pub initial_accounts: Vec, } - -pub fn from_file(config_home: PathBuf) -> Result { - let file = File::open(config_home)?; - let reader = BufReader::new(file); - - Ok(serde_json::from_reader(reader)?) -} diff --git a/node_core/src/lib.rs b/node_core/src/lib.rs index cceed8c..c94776f 100644 --- a/node_core/src/lib.rs +++ b/node_core/src/lib.rs @@ -1,22 +1,25 @@ -use std::sync::Arc; +use std::{fs::File, io::BufReader, path::PathBuf, str::FromStr, sync::Arc}; use common::{ execution_input::PublicNativeTokenSend, transaction::Transaction, ExecutionFailureKind, }; use accounts::account_core::{address::AccountAddress, Account}; -use anyhow::Result; +use anyhow::{anyhow, Result}; use chain_storage::NodeChainStore; use common::transaction::TransactionBody; use config::NodeConfig; +use log::info; use sc_core::proofs_circuits::{generate_commitments, pedersen_commitment_vec}; use sequencer_client::{json::SendTxResponse, SequencerClient}; use serde::{Deserialize, Serialize}; use storage::sc_db_utils::DataBlobChangeVariant; use tokio::sync::RwLock; use utxo::utxo_core::UTXO; -use zkvm::gas_calculator::GasCalculator; +use clap::{Parser, Subcommand}; + +pub const HOME_DIR_ENV_VAR: &str = "HOME_DIR"; pub const BLOCK_GEN_DELAY_SECS: u64 = 20; pub mod chain_storage; @@ -74,7 +77,6 @@ pub struct NodeCore { pub storage: Arc>, pub node_config: NodeConfig, pub sequencer_client: Arc, - pub gas_calculator: GasCalculator, } impl NodeCore { @@ -92,7 +94,6 @@ impl NodeCore { storage: wrapped_storage, node_config: config.clone(), sequencer_client: client.clone(), - gas_calculator: GasCalculator::from(config.gas_config), }) } @@ -190,3 +191,67 @@ pub fn generate_commitments_helper(input_utxos: &[UTXO]) -> Vec<[u8; 32]> { .map(|comm_raw| comm_raw.try_into().unwrap()) .collect() } + +///Represents CLI command for a wallet +#[derive(Subcommand, Debug, Clone)] +pub enum Command { + SendNativeTokenTransfer { + #[arg(long)] + from: String, + #[arg(long)] + to: String, + #[arg(long)] + amount: u64, + }, +} + +#[derive(Parser, Debug)] +#[clap(version)] +pub struct Args { + /// Wallet command + #[command(subcommand)] + pub command: Command, +} + +pub fn get_home() -> Result { + Ok(PathBuf::from_str(&std::env::var(HOME_DIR_ENV_VAR)?)?) +} + +pub fn fetch_config() -> Result { + let config_home = get_home()?; + let file = File::open(config_home.join("node_config.json"))?; + let reader = BufReader::new(file); + + Ok(serde_json::from_reader(reader)?) +} + +//ToDo: Replace with structures in future +pub fn produce_account_addr_from_hex(hex_str: String) -> Result<[u8; 32]> { + hex::decode(hex_str)? + .try_into() + .map_err(|_| anyhow!("Failed conversion to 32 bytes")) +} + +pub async fn execute_subcommand(command: Command) -> Result<()> { + //env_logger::init(); + + match command { + Command::SendNativeTokenTransfer { from, to, amount } => { + let node_config = fetch_config()?; + + let from = produce_account_addr_from_hex(from)?; + let to = produce_account_addr_from_hex(to)?; + + let wallet_core = NodeCore::start_from_config_update_chain(node_config).await?; + + //ToDo: Nonce management + let res = wallet_core + .send_public_native_token_transfer(from, 0, to, amount) + .await?; + + info!("Results of tx send is {res:#?}"); + } + } + + Ok(()) +} diff --git a/node_core/src/main.rs b/node_core/src/main.rs new file mode 100644 index 0000000..c8a8049 --- /dev/null +++ b/node_core/src/main.rs @@ -0,0 +1,22 @@ +use anyhow::Result; +use clap::Parser; +use node_core::{execute_subcommand, Args}; +use tokio::runtime::Builder; + +pub const NUM_THREADS: usize = 2; + +fn main() -> Result<()> { + let runtime = Builder::new_multi_thread() + .worker_threads(NUM_THREADS) + .enable_all() + .build() + .unwrap(); + + let args = Args::parse(); + + runtime.block_on(async move { + execute_subcommand(args.command).await.unwrap(); + }); + + Ok(()) +}