diff --git a/.changelog/unreleased/improvements/3265-split-up-node.md b/.changelog/unreleased/improvements/3265-split-up-node.md new file mode 100644 index 0000000000..24a24b15bc --- /dev/null +++ b/.changelog/unreleased/improvements/3265-split-up-node.md @@ -0,0 +1,2 @@ +- Separated the node library code from other apps lib code into a new crate + `namada_node`. ([\#3265](https://github.com/anoma/namada/pull/3265)) \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 14c80d2622..825a4235cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4475,6 +4475,7 @@ dependencies = [ "git2", "namada", "namada_apps_lib", + "namada_node", "namada_test_utils", "proptest", "test-log", @@ -4492,31 +4493,18 @@ dependencies = [ name = "namada_apps_lib" version = "0.35.1" dependencies = [ - "ark-serialize", - "ark-std", "assert_matches", "async-trait", "base64 0.13.1", - "bech32 0.8.1", - "bimap", "bit-set", - "blake2b-rs", "borsh 1.2.1", "borsh-ext", - "byte-unit", - "byteorder", - "bytes", "clap", "color-eyre", "config", "data-encoding", "derivative", "directories", - "drain_filter_polyfill", - "ed25519-consensus", - "ethabi", - "ethbridge-bridge-events", - "ethbridge-events", "eyre", "fd-lock", "flate2", @@ -4526,42 +4514,23 @@ dependencies = [ "lazy_static", "ledger-namada-rs", "ledger-transport-hid", - "libc", - "libloading", "linkme", "masp_primitives", - "masp_proofs", "namada", "namada_macros", "namada_migrations", "namada_sdk", "namada_test_utils", - "num-rational", - "num-traits 0.2.17", - "num256", - "num_cpus", - "once_cell", - "orion", "pretty_assertions", "proptest", "prost 0.12.3", - "prost-types 0.12.3", "rand 0.8.5", "rand_core 0.6.4", - "rayon", - "regex", "reqwest", - "ripemd", - "rlimit", - "rocksdb", "rpassword", "serde 1.0.193", - "serde_bytes", "serde_json", "sha2 0.9.9", - "smooth-operator", - "sparse-merkle-tree", - "sysinfo", "tar", "tempfile", "tendermint-config", @@ -4572,14 +4541,10 @@ dependencies = [ "tokio", "tokio-test", "toml 0.5.11", - "tower", - "tower-abci", "tracing", "tracing-appender", "tracing-log", "tracing-subscriber", - "warp", - "winapi", "zeroize", ] @@ -4594,6 +4559,7 @@ dependencies = [ "masp_primitives", "namada", "namada_apps_lib", + "namada_node", "prost 0.12.3", "rand 0.8.5", "rand_core 0.6.4", @@ -4873,6 +4839,67 @@ dependencies = [ "namada_macros", ] +[[package]] +name = "namada_node" +version = "0.35.1" +dependencies = [ + "assert_matches", + "async-trait", + "blake2b-rs", + "borsh 1.2.1", + "borsh-ext", + "byte-unit", + "bytes", + "clap", + "color-eyre", + "data-encoding", + "drain_filter_polyfill", + "ethabi", + "ethbridge-bridge-events", + "ethbridge-events", + "eyre", + "futures", + "itertools 0.12.1", + "lazy_static", + "linkme", + "masp_primitives", + "masp_proofs", + "namada", + "namada_apps_lib", + "namada_migrations", + "namada_sdk", + "namada_test_utils", + "num-rational", + "num-traits 0.2.17", + "num256", + "num_cpus", + "once_cell", + "proptest", + "prost 0.12.3", + "rand 0.8.5", + "rand_core 0.6.4", + "rayon", + "regex", + "rlimit", + "rocksdb", + "serde_json", + "sha2 0.9.9", + "smooth-operator", + "sparse-merkle-tree", + "sysinfo", + "tempfile", + "test-log", + "thiserror", + "tokio", + "tokio-test", + "toml 0.5.11", + "tower", + "tower-abci", + "tracing", + "tracing-subscriber", + "warp", +] + [[package]] name = "namada_parameters" version = "0.35.1" @@ -5107,6 +5134,7 @@ dependencies = [ "namada", "namada_apps_lib", "namada_core", + "namada_node", "namada_sdk", "namada_test_utils", "namada_tx_prelude", diff --git a/Cargo.toml b/Cargo.toml index 1848a5cc73..a89ff0eceb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,8 +21,9 @@ members = [ "crates/parameters", "crates/proof_of_stake", "crates/replay_protection", - "crates/sdk", "crates/namada", + "crates/node", + "crates/sdk", "crates/shielded_token", "crates/state", "crates/storage", diff --git a/Makefile b/Makefile index 9df1a9d282..97128c1264 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,7 @@ crates += namada_merkle_tree crates += namada_parameters crates += namada_proof_of_stake crates += namada_replay_protection +crates += namada_node crates += namada_sdk crates += namada_shielded_token crates += namada_state diff --git a/crates/apps/Cargo.toml b/crates/apps/Cargo.toml index a41350d198..52d63759d8 100644 --- a/crates/apps/Cargo.toml +++ b/crates/apps/Cargo.toml @@ -46,13 +46,14 @@ path = "src/bin/namada-relayer/main.rs" [features] default = ["namada/mainnet", "migrations"] mainnet = ["namada_apps_lib/mainnet"] -jemalloc = ["namada_apps_lib/jemalloc"] +jemalloc = ["namada_node/jemalloc"] migrations = ["namada/migrations", "namada_apps_lib/migrations"] namada-eth-bridge = ["namada_apps_lib/namada-eth-bridge"] [dependencies] namada = {path = "../namada"} namada_apps_lib = {path = "../apps_lib"} +namada_node = {path = "../node"} color-eyre.workspace = true eyre.workspace = true @@ -71,7 +72,7 @@ winapi.workspace = true namada = {path = "../namada", default-features = false, features = ["testing", "wasm-runtime"]} namada_test_utils = {path = "../test_utils"} -assert_matches = "1.5.0" +assert_matches.workspace = true bit-set.workspace = true proptest.workspace = true test-log.workspace = true diff --git a/crates/apps/src/bin/namada-node/cli.rs b/crates/apps/src/bin/namada-node/cli.rs index c9fab41d7c..eb941e0d62 100644 --- a/crates/apps/src/bin/namada-node/cli.rs +++ b/crates/apps/src/bin/namada-node/cli.rs @@ -2,9 +2,10 @@ use eyre::{Context, Result}; use namada::core::time::{DateTimeUtc, Utc}; +use namada_apps_lib::cli::cmds::TestGenesis; use namada_apps_lib::cli::{self, cmds}; use namada_apps_lib::config::{Action, ActionAtHeight, ValidatorLocalConfig}; -use namada_apps_lib::node::ledger; +use namada_node as node; #[cfg(not(feature = "migrations"))] use namada_sdk::display_line; @@ -16,7 +17,7 @@ pub fn main() -> Result<()> { let chain_ctx = ctx.take_chain_or_exit(); let wasm_dir = chain_ctx.wasm_dir(); sleep_until(args.start_time); - ledger::run(chain_ctx.config.ledger, wasm_dir); + node::run(chain_ctx.config.ledger, wasm_dir); } cmds::Ledger::RunUntil(cmds::LedgerRunUntil(args)) => { let mut chain_ctx = ctx.take_chain_or_exit(); @@ -24,20 +25,20 @@ pub fn main() -> Result<()> { sleep_until(args.time); chain_ctx.config.ledger.shell.action_at_height = Some(args.action_at_height); - ledger::run(chain_ctx.config.ledger, wasm_dir); + node::run(chain_ctx.config.ledger, wasm_dir); } cmds::Ledger::Reset(_) => { let chain_ctx = ctx.take_chain_or_exit(); - ledger::reset(chain_ctx.config.ledger) + node::reset(chain_ctx.config.ledger) .wrap_err("Failed to reset Namada node")?; } cmds::Ledger::DumpDb(cmds::LedgerDumpDb(args)) => { let chain_ctx = ctx.take_chain_or_exit(); - ledger::dump_db(chain_ctx.config.ledger, args); + node::dump_db(chain_ctx.config.ledger, args); } cmds::Ledger::RollBack(_) => { let chain_ctx = ctx.take_chain_or_exit(); - ledger::rollback(chain_ctx.config.ledger) + node::rollback(chain_ctx.config.ledger) .wrap_err("Failed to rollback the Namada node")?; } cmds::Ledger::UpdateDB(cmds::LedgerUpdateDB(args)) => { @@ -50,7 +51,7 @@ pub fn main() -> Result<()> { } let mut chain_ctx = ctx.take_chain_or_exit(); #[cfg(feature = "migrations")] - ledger::update_db_keys( + node::update_db_keys( chain_ctx.config.ledger.clone(), args.updates, args.dry_run, @@ -68,7 +69,7 @@ pub fn main() -> Result<()> { ); // don't stop on panics let handle = std::thread::spawn(|| { - ledger::run(chain_ctx.config.ledger, wasm_dir) + node::run(chain_ctx.config.ledger, wasm_dir) }); _ = handle.join(); std::env::remove_var("NAMADA_INITIAL_HEIGHT"); @@ -84,7 +85,7 @@ pub fn main() -> Result<()> { } let chain_ctx = ctx.take_chain_or_exit(); #[cfg(feature = "migrations")] - ledger::query_db( + node::query_db( chain_ctx.config.ledger, &args.key, &args.hash, @@ -129,6 +130,11 @@ pub fn main() -> Result<()> { std::fs::write(config_path, updated_config).unwrap(); } }, + cmds::NamadaNode::Utils(sub) => match sub { + cmds::NodeUtils::TestGenesis(TestGenesis(args)) => { + node::utils::test_genesis(args) + } + }, } Ok(()) } diff --git a/crates/apps_lib/Cargo.toml b/crates/apps_lib/Cargo.toml index 31a720fdf5..c769cff7fe 100644 --- a/crates/apps_lib/Cargo.toml +++ b/crates/apps_lib/Cargo.toml @@ -18,15 +18,14 @@ mainnet = [ "namada/mainnet", ] # for integration tests and test utilities -testing = ["namada_test_utils"] -benches = ["namada_test_utils"] +testing = ["namada_test_utils", "lazy_static"] +benches = ["namada_test_utils", "lazy_static"] integration = [] -jemalloc = ["rocksdb/jemalloc"] migrations = [ "namada_migrations", "namada_sdk/migrations", "namada/migrations", - "linkme", + "linkme" ] namada-eth-bridge = [ "namada/namada-eth-bridge", @@ -40,67 +39,34 @@ namada_migrations = {path = "../migrations", optional = true} namada_sdk = {path = "../sdk", default-features = false, features = ["download-params", "std", "rand"]} namada_test_utils = {path = "../test_utils", optional = true} -ark-serialize.workspace = true -ark-std.workspace = true -arse-merkle-tree = { workspace = true, features = ["blake2b"] } -assert_matches.workspace = true async-trait.workspace = true base64.workspace = true -bech32.workspace = true -bimap.workspace = true -blake2b-rs.workspace = true borsh.workspace = true borsh-ext.workspace = true -byte-unit.workspace = true -byteorder.workspace = true clap.workspace = true color-eyre.workspace = true config.workspace = true data-encoding.workspace = true derivative.workspace = true directories.workspace = true -drain_filter_polyfill.workspace = true -ed25519-consensus = { workspace = true, features = ["std"] } -ethabi.workspace = true -ethbridge-bridge-events.workspace = true -ethbridge-events.workspace = true eyre.workspace = true fd-lock.workspace = true flate2.workspace = true futures.workspace = true itertools.workspace = true -lazy_static.workspace= true +lazy_static = { workspace = true, optional = true } +linkme = { workspace = true, optional = true } ledger-namada-rs.workspace = true ledger-transport-hid.workspace = true -libc.workspace = true -libloading.workspace = true -linkme = { workspace = true, optional = true } masp_primitives = { workspace = true, features = ["transparent-inputs"] } -masp_proofs = { workspace = true, features = ["bundled-prover", "download-params"] } -num_cpus.workspace = true -num256.workspace = true -num-rational.workspace = true -num-traits.workspace = true -once_cell.workspace = true -orion.workspace = true -pretty_assertions.workspace = true -prost-types.workspace = true prost.workspace = true rand_core = { workspace = true, features = ["std"] } rand = { workspace = true, features = ["std"] } -rayon.workspace = true -regex.workspace = true reqwest.workspace = true -ripemd.workspace = true -rlimit.workspace = true -rocksdb.workspace = true rpassword.workspace = true -serde_bytes.workspace = true serde_json = {workspace = true, features = ["raw_value"]} serde.workspace = true sha2.workspace = true -smooth-operator.workspace = true -sysinfo.workspace = true tar.workspace = true tempfile.workspace = true tendermint-config.workspace = true @@ -109,25 +75,23 @@ textwrap-macros = "0.3.0" thiserror.workspace = true tokio = {workspace = true, features = ["full"]} toml.workspace = true -tower-abci.workspace = true -tower.workspace = true tracing-appender.workspace = true tracing-log.workspace = true tracing-subscriber = { workspace = true, features = ["std", "json", "ansi", "tracing-log"]} tracing.workspace = true -winapi.workspace = true zeroize.workspace = true -warp = "0.3.2" -bytes = "1.1.0" [dev-dependencies] -assert_matches = "1.5.0" namada = {path = "../namada", default-features = false, features = ["testing", "wasm-runtime"]} namada_test_utils = {path = "../test_utils"} + +assert_matches.workspace = true bit-set.workspace = true proptest.workspace = true test-log.workspace = true tokio-test.workspace = true +lazy_static.workspace= true +pretty_assertions.workspace = true [build-dependencies] git2.workspace = true diff --git a/crates/apps_lib/src/cli.rs b/crates/apps_lib/src/cli.rs index ea1a13dd2a..7b855547ff 100644 --- a/crates/apps_lib/src/cli.rs +++ b/crates/apps_lib/src/cli.rs @@ -123,17 +123,21 @@ pub mod cmds { pub enum NamadaNode { Ledger(Ledger), Config(Config), + Utils(NodeUtils), } impl Cmd for NamadaNode { fn add_sub(app: App) -> App { - app.subcommand(Ledger::def()).subcommand(Config::def()) + app.subcommand(Ledger::def()) + .subcommand(Config::def()) + .subcommand(NodeUtils::def()) } fn parse(matches: &ArgMatches) -> Option { let ledger = SubCmd::parse(matches).map(Self::Ledger); let config = SubCmd::parse(matches).map(Self::Config); - ledger.or(config) + let utils = SubCmd::parse(matches).map(Self::Utils); + ledger.or(config).or(utils) } } impl SubCmd for NamadaNode { @@ -206,7 +210,7 @@ pub mod cmds { /// don't exist. WithContext(NamadaClientWithContext), /// Utils don't have [`super::Context`], only the global arguments. - WithoutContext(Utils), + WithoutContext(ClientUtils), } impl Cmd for NamadaClient { @@ -270,7 +274,7 @@ pub mod cmds { .subcommand(SignTx::def().display_order(6)) .subcommand(ShieldedSync::def().display_order(6)) // Utils - .subcommand(Utils::def().display_order(7)) + .subcommand(ClientUtils::def().display_order(7)) } fn parse(matches: &ArgMatches) -> Option { @@ -2174,7 +2178,30 @@ pub mod cmds { } #[derive(Clone, Debug)] - pub enum Utils { + pub enum NodeUtils { + TestGenesis(TestGenesis), + } + + impl SubCmd for NodeUtils { + const CMD: &'static str = "utils"; + + fn parse(matches: &ArgMatches) -> Option { + matches.subcommand_matches(Self::CMD).and_then(|matches| { + SubCmd::parse(matches).map(Self::TestGenesis) + }) + } + + fn def() -> App { + App::new(Self::CMD) + .about(wrap!("Utilities.")) + .subcommand(TestGenesis::def()) + .subcommand_required(true) + .arg_required_else_help(true) + } + } + + #[derive(Clone, Debug)] + pub enum ClientUtils { JoinNetwork(JoinNetwork), ValidateWasm(ValidateWasm), InitNetwork(InitNetwork), @@ -2186,12 +2213,11 @@ pub mod cmds { DefaultBaseDir(DefaultBaseDir), EpochSleep(EpochSleep), ValidateGenesisTemplates(ValidateGenesisTemplates), - TestGenesis(TestGenesis), SignGenesisTxs(SignGenesisTxs), ParseMigrationJson(MigrationJson), } - impl SubCmd for Utils { + impl SubCmd for ClientUtils { const CMD: &'static str = "utils"; fn parse(matches: &ArgMatches) -> Option { @@ -2219,8 +2245,6 @@ pub mod cmds { SubCmd::parse(matches).map(Self::ValidateGenesisTemplates); let genesis_tx = SubCmd::parse(matches).map(Self::SignGenesisTxs); - let test_genesis = - SubCmd::parse(matches).map(Self::TestGenesis); let parse_migrations_json = SubCmd::parse(matches).map(Self::ParseMigrationJson); join_network @@ -2234,7 +2258,6 @@ pub mod cmds { .or(default_base_dir) .or(epoch_sleep) .or(validate_genesis_templates) - .or(test_genesis) .or(genesis_tx) .or(parse_migrations_json) }) @@ -2254,7 +2277,6 @@ pub mod cmds { .subcommand(DefaultBaseDir::def()) .subcommand(EpochSleep::def()) .subcommand(ValidateGenesisTemplates::def()) - .subcommand(TestGenesis::def()) .subcommand(SignGenesisTxs::def()) .subcommand(MigrationJson::def()) .subcommand_required(true) @@ -7701,7 +7723,7 @@ pub fn namada_node_cli() -> Result<(cmds::NamadaNode, Context)> { #[allow(clippy::large_enum_variant)] pub enum NamadaClient { - WithoutContext(cmds::Utils, args::Global), + WithoutContext(cmds::ClientUtils, args::Global), WithContext(Box<(cmds::NamadaClientWithContext, Context)>), } diff --git a/crates/apps_lib/src/cli/client.rs b/crates/apps_lib/src/cli/client.rs index df20f803ab..222653d406 100644 --- a/crates/apps_lib/src/cli/client.rs +++ b/crates/apps_lib/src/cli/client.rs @@ -724,34 +724,34 @@ impl CliApi { } cli::NamadaClient::WithoutContext(cmd, global_args) => match cmd { // Utils cmds - Utils::JoinNetwork(JoinNetwork(args)) => { + ClientUtils::JoinNetwork(JoinNetwork(args)) => { utils::join_network(global_args, args).await } - Utils::ValidateWasm(ValidateWasm(args)) => { + ClientUtils::ValidateWasm(ValidateWasm(args)) => { utils::validate_wasm(args) } - Utils::InitNetwork(InitNetwork(args)) => { + ClientUtils::InitNetwork(InitNetwork(args)) => { utils::init_network(args); } - Utils::GenesisBond(GenesisBond(args)) => { + ClientUtils::GenesisBond(GenesisBond(args)) => { utils::genesis_bond(args) } - Utils::DeriveGenesisAddresses(DeriveGenesisAddresses(args)) => { - utils::derive_genesis_addresses(global_args, args) - } - Utils::InitGenesisEstablishedAccount( + ClientUtils::DeriveGenesisAddresses( + DeriveGenesisAddresses(args), + ) => utils::derive_genesis_addresses(global_args, args), + ClientUtils::InitGenesisEstablishedAccount( InitGenesisEstablishedAccount(args), ) => utils::init_genesis_established_account(global_args, args), - Utils::InitGenesisValidator(InitGenesisValidator(args)) => { - utils::init_genesis_validator(global_args, args) - } - Utils::PkToTmAddress(PkToTmAddress(args)) => { + ClientUtils::InitGenesisValidator(InitGenesisValidator( + args, + )) => utils::init_genesis_validator(global_args, args), + ClientUtils::PkToTmAddress(PkToTmAddress(args)) => { utils::pk_to_tm_address(global_args, args) } - Utils::DefaultBaseDir(DefaultBaseDir(args)) => { + ClientUtils::DefaultBaseDir(DefaultBaseDir(args)) => { utils::default_base_dir(global_args, args) } - Utils::EpochSleep(EpochSleep(args)) => { + ClientUtils::EpochSleep(EpochSleep(args)) => { let mut ctx = cli::Context::new::(global_args) .expect("expected to construct a context"); let chain_ctx = ctx.borrow_mut_chain_or_exit(); @@ -762,16 +762,13 @@ impl CliApi { let namada = ctx.to_sdk(client, io); rpc::epoch_sleep(&namada, args).await; } - Utils::ValidateGenesisTemplates(ValidateGenesisTemplates( - args, - )) => utils::validate_genesis_templates(global_args, args), - Utils::TestGenesis(TestGenesis(args)) => { - utils::test_genesis(args) - } - Utils::SignGenesisTxs(SignGenesisTxs(args)) => { + ClientUtils::ValidateGenesisTemplates( + ValidateGenesisTemplates(args), + ) => utils::validate_genesis_templates(global_args, args), + ClientUtils::SignGenesisTxs(SignGenesisTxs(args)) => { utils::sign_genesis_tx(global_args, args).await } - Utils::ParseMigrationJson(MigrationJson(args)) => { + ClientUtils::ParseMigrationJson(MigrationJson(args)) => { #[cfg(feature = "migrations")] { let mut update_json = String::new(); diff --git a/crates/apps_lib/src/cli/wallet.rs b/crates/apps_lib/src/cli/wallet.rs index db950cf05e..4eeab319f6 100644 --- a/crates/apps_lib/src/cli/wallet.rs +++ b/crates/apps_lib/src/cli/wallet.rs @@ -28,7 +28,7 @@ use crate::cli::api::CliApi; use crate::cli::args::CliToSdk; use crate::cli::{args, cmds, Context}; use crate::client::utils::PRE_GENESIS_DIR; -use crate::node::ledger::tendermint_node::validator_key_to_json; +use crate::tendermint_node::validator_key_to_json; use crate::wallet::{ self, read_and_confirm_encryption_password, CliWalletUtils, }; diff --git a/crates/apps_lib/src/client/tx.rs b/crates/apps_lib/src/client/tx.rs index bd1c7cdb96..df826c6b33 100644 --- a/crates/apps_lib/src/client/tx.rs +++ b/crates/apps_lib/src/client/tx.rs @@ -28,7 +28,7 @@ use crate::client::tx::signing::{default_sign, SigningTxData}; use crate::client::tx::tx::ProcessTxResponse; use crate::config::TendermintMode; use crate::facade::tendermint_rpc::endpoint::broadcast::tx_sync::Response; -use crate::node::ledger::tendermint_node; +use crate::tendermint_node; use crate::wallet::{gen_validator_keys, read_and_confirm_encryption_password}; /// Wrapper around `signing::aux_signing_data` that stores the optional diff --git a/crates/apps_lib/src/client/utils.rs b/crates/apps_lib/src/client/utils.rs index b99e7bf3dc..d7c112dc85 100644 --- a/crates/apps_lib/src/client/utils.rs +++ b/crates/apps_lib/src/client/utils.rs @@ -2,7 +2,6 @@ use std::env; use std::fs::{self, File, OpenOptions}; use std::io::Write; use std::path::{Path, PathBuf}; -use std::str::FromStr; use borsh_ext::BorshSerializeExt; use color_eyre::owo_colors::OwoColorize; @@ -24,7 +23,6 @@ use sha2::{Digest, Sha256}; use tokio::sync::RwLock; use crate::cli::args; -use crate::cli::args::TestGenesis; use crate::cli::context::wasm_dir_from_env_or; use crate::config::genesis::chain::DeriveEstablishedAddress; use crate::config::genesis::transactions::{ @@ -33,9 +31,8 @@ use crate::config::genesis::transactions::{ use crate::config::global::GlobalConfig; use crate::config::{self, genesis, get_default_namada_folder, TendermintMode}; use crate::facade::tendermint::node::Id as TendermintNodeId; -use crate::node::ledger::tendermint_node; use crate::wallet::{pre_genesis, CliWalletUtils}; -use crate::wasm_loader; +use crate::{tendermint_node, wasm_loader}; pub const NET_ACCOUNTS_DIR: &str = "setup"; pub const NET_OTHER_ACCOUNTS_DIR: &str = "other"; @@ -439,29 +436,6 @@ pub fn init_network( release_file } -pub fn test_genesis(args: TestGenesis) { - use crate::facade::tendermint::Timeout; - - let templates = genesis::templates::load_and_validate(&args.path).unwrap(); - let genesis = genesis::chain::finalize( - templates, - FromStr::from_str("namada-dryrun").unwrap(), - Default::default(), - Timeout::from_str("30s").unwrap(), - ); - let chain_id = &genesis.metadata.chain_id; - let test_dir = tempfile::tempdir().unwrap(); - let config = crate::config::Config::load(test_dir.path(), chain_id, None); - genesis - .write_toml_files(&test_dir.path().join(chain_id.to_string())) - .unwrap(); - crate::node::ledger::test_genesis_files( - config.ledger, - genesis, - args.wasm_dir, - ); -} - pub fn pk_to_tm_address( _global_args: args::Global, args::PkToTmAddress { public_key }: args::PkToTmAddress, diff --git a/crates/apps_lib/src/config/genesis.rs b/crates/apps_lib/src/config/genesis.rs index 04ea662e97..08db754c1b 100644 --- a/crates/apps_lib/src/config/genesis.rs +++ b/crates/apps_lib/src/config/genesis.rs @@ -31,9 +31,6 @@ use namada_macros::BorshDeserializer; use namada_migrations::*; use serde::{Deserialize, Serialize}; -#[cfg(all(any(test, feature = "benches"), not(feature = "integration")))] -use crate::config::genesis::chain::{Finalized, FinalizedEstablishedAccountTx}; - #[derive( Clone, Debug, @@ -326,11 +323,14 @@ pub struct Parameters { /// This includes adding the Ethereum bridge parameters and /// adding a specified number of validators. #[allow(clippy::arithmetic_side_effects)] -#[cfg(all(any(test, feature = "benches"), not(feature = "integration")))] +#[cfg(all( + any(test, feature = "benches", feature = "testing"), + not(feature = "integration") +))] pub fn make_dev_genesis( num_validators: u64, target_chain_dir: &std::path::Path, -) -> Finalized { +) -> crate::config::genesis::chain::Finalized { use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::time::Duration; @@ -343,7 +343,9 @@ pub fn make_dev_genesis( use namada::tx::standalone_signature; use namada_sdk::wallet::alias::Alias; - use crate::config::genesis::chain::{finalize, DeriveEstablishedAddress}; + use crate::config::genesis::chain::{ + finalize, DeriveEstablishedAddress, FinalizedEstablishedAccountTx, + }; use crate::wallet::defaults; let mut current_path = std::env::current_dir() diff --git a/crates/apps_lib/src/config/genesis/chain.rs b/crates/apps_lib/src/config/genesis/chain.rs index d4f6fb9322..a47c37d9de 100644 --- a/crates/apps_lib/src/config/genesis/chain.rs +++ b/crates/apps_lib/src/config/genesis/chain.rs @@ -29,7 +29,7 @@ use crate::config::utils::{set_ip, set_port}; use crate::config::{Config, TendermintMode}; use crate::facade::tendermint::node::Id as TendermintNodeId; use crate::facade::tendermint_config::net::Address as TendermintAddress; -use crate::node::ledger::tendermint_node::id_from_pk; +use crate::tendermint_node::id_from_pk; use crate::wallet::{Alias, CliWalletUtils}; use crate::wasm_loader; diff --git a/crates/apps_lib/src/lib.rs b/crates/apps_lib/src/lib.rs index eedbd17e99..0240b28ad8 100644 --- a/crates/apps_lib/src/lib.rs +++ b/crates/apps_lib/src/lib.rs @@ -1,4 +1,4 @@ -//! Shared code for the node, client etc. +//! Shared code for the Namada apps. #![doc(html_favicon_url = "https://dev.namada.net/master/favicon.png")] #![doc(html_logo_url = "https://dev.namada.net/master/rustdoc-logo.png")] @@ -14,13 +14,11 @@ clippy::dbg_macro )] -#[cfg(feature = "benches")] -pub mod bench_utils; pub mod cli; pub mod client; pub mod config; pub mod logging; -pub mod node; +pub mod tendermint_node; pub mod wallet; pub mod wasm_loader; @@ -33,8 +31,4 @@ pub mod facade { // TODO: re-import v0_37 only pub use namada::{tendermint, tendermint_proto, tendermint_rpc}; pub use tendermint_config; - pub mod tower_abci { - pub use tower_abci::v037::*; - pub use tower_abci::BoxError; - } } diff --git a/crates/apps_lib/src/node/mod.rs b/crates/apps_lib/src/node/mod.rs deleted file mode 100644 index 370e1150a2..0000000000 --- a/crates/apps_lib/src/node/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod ledger; diff --git a/crates/apps_lib/src/tendermint_node.rs b/crates/apps_lib/src/tendermint_node.rs new file mode 100644 index 0000000000..17b6d4a9ec --- /dev/null +++ b/crates/apps_lib/src/tendermint_node.rs @@ -0,0 +1,183 @@ +use std::path::{Path, PathBuf}; + +use borsh_ext::BorshSerializeExt; +use namada::core::key::*; +use serde_json::json; +use sha2::{Digest, Sha256}; +use thiserror::Error; + +use crate::facade::tendermint::node::Id as TendermintNodeId; +use crate::facade::tendermint_config::Error as TendermintError; + +/// Env. var to output Tendermint log to stdout +pub const ENV_VAR_TM_STDOUT: &str = "NAMADA_CMT_STDOUT"; + +#[derive(Error, Debug)] +pub enum Error { + #[error("Failed to initialize CometBFT: {0}")] + Init(std::io::Error), + #[error("Failed to load CometBFT config file: {0}")] + LoadConfig(TendermintError), + #[error("Failed to open CometBFT config for writing: {0}")] + OpenWriteConfig(std::io::Error), + #[error("Failed to serialize CometBFT config TOML to string: {0}")] + ConfigSerializeToml(toml::ser::Error), + #[error("Failed to write CometBFT config: {0}")] + WriteConfig(std::io::Error), + #[error("Failed to start up CometBFT node: {0}")] + StartUp(std::io::Error), + #[error("{0}")] + Runtime(String), + #[error("Failed to rollback CometBFT state: {0}")] + RollBack(String), + #[error("Failed to convert to String: {0:?}")] + TendermintPath(std::ffi::OsString), + #[error("Couldn't write {0}")] + CantWrite(String), + #[error("Couldn't create {0}")] + CantCreate(String), + #[error("Couldn't encode {0}")] + CantEncode(&'static str), +} + +pub type Result = std::result::Result; + +/// Convert a common signing scheme validator key into JSON for +/// Tendermint +pub fn validator_key_to_json( + sk: &common::SecretKey, +) -> std::result::Result { + let raw_hash = tm_consensus_key_raw_hash(&sk.ref_to()); + let (id_str, pk_arr, kp_arr) = match sk { + common::SecretKey::Ed25519(_) => { + let sk_ed: ed25519::SecretKey = sk.try_to_sk().unwrap(); + let keypair = + [sk_ed.serialize_to_vec(), sk_ed.ref_to().serialize_to_vec()] + .concat(); + ("Ed25519", sk_ed.ref_to().serialize_to_vec(), keypair) + } + common::SecretKey::Secp256k1(_) => { + let sk_sec: secp256k1::SecretKey = sk.try_to_sk().unwrap(); + ( + "Secp256k1", + sk_sec.ref_to().serialize_to_vec(), + sk_sec.serialize_to_vec(), + ) + } + }; + + Ok(json!({ + "address": raw_hash, + "pub_key": { + "type": format!("tendermint/PubKey{}",id_str), + "value": base64::encode(pk_arr), + }, + "priv_key": { + "type": format!("tendermint/PrivKey{}",id_str), + "value": base64::encode(kp_arr), + } + })) +} + +/// Initialize validator private key for Tendermint +pub fn write_validator_key( + home_dir: impl AsRef, + consensus_key: &common::SecretKey, +) -> Result<()> { + let key = validator_key_to_json(consensus_key).unwrap(); + write_validator(validator_key(home_dir), KEY_DIR, KEY_FILE, key) +} + +/// Initialize validator private state for Tendermint +pub fn write_validator_state(home_dir: impl AsRef) -> Result<()> { + let state = json!({ + "height": "0", + "round": 0, + "step": 0 + }); + write_validator(validator_state(home_dir), STATE_DIR, STATE_FILE, state) +} + +/// Abstract over the initialization of validator data for Tendermint +pub fn write_validator( + path: PathBuf, + err_dir: &'static str, + err_file: &'static str, + data: serde_json::Value, +) -> Result<()> { + let parent_dir = path.parent().unwrap(); + // Make sure the dir exists + std::fs::create_dir_all(parent_dir).map_err(|err| { + Error::CantCreate(format!( + "{} at {}. Caused by {err}", + err_dir, + parent_dir.to_string_lossy() + )) + })?; + let file = ensure_empty(&path).map_err(|err| { + Error::CantCreate(format!( + "{} at {}. Caused by {err}", + err_dir, + path.to_string_lossy() + )) + })?; + serde_json::to_writer_pretty(file, &data).map_err(|err| { + Error::CantWrite(format!( + "{} to {}. Caused by {err}", + err_file, + path.to_string_lossy() + )) + }) +} + +/// Length of a Tendermint Node ID in bytes +const TENDERMINT_NODE_ID_LENGTH: usize = 20; + +/// Derive Tendermint node ID from public key +pub fn id_from_pk(pk: &common::PublicKey) -> TendermintNodeId { + let mut bytes = [0u8; TENDERMINT_NODE_ID_LENGTH]; + + match pk { + common::PublicKey::Ed25519(_) => { + let _pk: ed25519::PublicKey = pk.try_to_pk().unwrap(); + let digest = Sha256::digest(_pk.serialize_to_vec().as_slice()); + bytes.copy_from_slice(&digest[..TENDERMINT_NODE_ID_LENGTH]); + } + common::PublicKey::Secp256k1(_) => { + let _pk: secp256k1::PublicKey = pk.try_to_pk().unwrap(); + let digest = Sha256::digest(_pk.serialize_to_vec().as_slice()); + bytes.copy_from_slice(&digest[..TENDERMINT_NODE_ID_LENGTH]); + } + } + TendermintNodeId::new(bytes) +} + +fn ensure_empty(path: &PathBuf) -> std::io::Result { + std::fs::OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(path) +} + +fn validator_key(home_dir: impl AsRef) -> PathBuf { + home_dir + .as_ref() + .join("config") + .join("priv_validator_key.json") +} + +fn validator_state(home_dir: impl AsRef) -> PathBuf { + home_dir + .as_ref() + .join("data") + .join("priv_validator_state.json") +} + +// Constant strings to avoid repeating our magic words + +const KEY_FILE: &str = "private validator key file"; +const KEY_DIR: &str = "private validator key directory"; + +const STATE_FILE: &str = "private validator state file"; +const STATE_DIR: &str = "private validator state directory"; diff --git a/crates/benches/Cargo.toml b/crates/benches/Cargo.toml index ae5daaa92b..965e67b502 100644 --- a/crates/benches/Cargo.toml +++ b/crates/benches/Cargo.toml @@ -48,7 +48,8 @@ namada-eth-bridge = [ # NOTE: this crate MUST NOT import any dependency with testing features to prevent benchmarking non-production code [dev-dependencies] namada = { path = "../namada", features = ["rand", "benches"] } -namada_apps_lib = { path = "../apps_lib", features = ["benches"] } +namada_apps_lib = { path = "../apps_lib" } +namada_node = { path = "../node", features = ["benches"] } masp_primitives.workspace = true borsh.workspace = true borsh-ext.workspace = true diff --git a/crates/benches/host_env.rs b/crates/benches/host_env.rs index 9b2870e962..8b13760964 100644 --- a/crates/benches/host_env.rs +++ b/crates/benches/host_env.rs @@ -6,12 +6,12 @@ use namada::ledger::storage::DB; use namada::token::{Amount, Transfer}; use namada::tx::Authorization; use namada::vm::wasm::TxCache; -use namada_apps_lib::bench_utils::{ +use namada_apps_lib::wallet::defaults; +use namada_apps_lib::wasm_loader; +use namada_node::bench_utils::{ BenchShell, TX_INIT_PROPOSAL_WASM, TX_REVEAL_PK_WASM, TX_TRANSFER_WASM, TX_UPDATE_ACCOUNT_WASM, VP_USER_WASM, WASM_DIR, }; -use namada_apps_lib::wallet::defaults; -use namada_apps_lib::wasm_loader; // Benchmarks the validation of a single signature on a single `Section` of a // transaction diff --git a/crates/benches/native_vps.rs b/crates/benches/native_vps.rs index 0287065d1c..0a0d08a1dd 100644 --- a/crates/benches/native_vps.rs +++ b/crates/benches/native_vps.rs @@ -56,13 +56,13 @@ use namada::sdk::masp_proofs::sapling::SaplingVerificationContext; use namada::state::{Epoch, StorageRead, StorageWrite, TxIndex}; use namada::token::{Amount, Transfer}; use namada::tx::{BatchedTx, Code, Section, Tx}; -use namada_apps_lib::bench_utils::{ +use namada_apps_lib::wallet::defaults; +use namada_node::bench_utils::{ generate_foreign_key_tx, BenchShell, BenchShieldedCtx, ALBERT_PAYMENT_ADDRESS, ALBERT_SPENDING_KEY, BERTHA_PAYMENT_ADDRESS, TX_BRIDGE_POOL_WASM, TX_IBC_WASM, TX_INIT_PROPOSAL_WASM, TX_RESIGN_STEWARD, TX_TRANSFER_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL_WASM, }; -use namada_apps_lib::wallet::defaults; fn governance(c: &mut Criterion) { let mut group = c.benchmark_group("vp_governance"); diff --git a/crates/benches/process_wrapper.rs b/crates/benches/process_wrapper.rs index bc79a0d6dc..26ad6d2e74 100644 --- a/crates/benches/process_wrapper.rs +++ b/crates/benches/process_wrapper.rs @@ -6,9 +6,9 @@ use namada::core::time::DateTimeUtc; use namada::token::{Amount, DenominatedAmount, Transfer}; use namada::tx::data::{Fee, WrapperTx}; use namada::tx::Authorization; -use namada_apps_lib::bench_utils::{BenchShell, TX_TRANSFER_WASM}; -use namada_apps_lib::node::ledger::shell::process_proposal::ValidationMeta; use namada_apps_lib::wallet::defaults; +use namada_node::bench_utils::{BenchShell, TX_TRANSFER_WASM}; +use namada_node::shell::process_proposal::ValidationMeta; fn process_tx(c: &mut Criterion) { let mut shell = BenchShell::default(); diff --git a/crates/benches/txs.rs b/crates/benches/txs.rs index be963966a4..58ade0d01b 100644 --- a/crates/benches/txs.rs +++ b/crates/benches/txs.rs @@ -16,10 +16,10 @@ use namada::ibc::core::host::types::identifiers::{ use namada::ibc::primitives::ToProto; use namada::proof_of_stake::KeySeg; use namada::token::Amount; -use namada_apps_lib::bench_utils::{ +use namada_apps_lib::wallet::defaults; +use namada_node::bench_utils::{ BenchShieldedCtx, ALBERT_PAYMENT_ADDRESS, ALBERT_SPENDING_KEY, TX_IBC_WASM, }; -use namada_apps_lib::wallet::defaults; fn ibc(c: &mut Criterion) { let mut group = c.benchmark_group("tx_ibc"); diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml new file mode 100644 index 0000000000..7e4d13b9c5 --- /dev/null +++ b/crates/node/Cargo.toml @@ -0,0 +1,110 @@ +[package] +name = "namada_node" +description = "Namada node library code" +resolver = "2" +authors.workspace = true +edition.workspace = true +documentation.workspace = true +homepage.workspace = true +keywords.workspace = true +license.workspace = true +readme.workspace = true +repository.workspace = true +version.workspace = true + +[features] +default = ["migrations"] +mainnet = [ + "namada/mainnet", +] +# for integration tests and test utilities +testing = [ + "namada_apps_lib/testing", + "namada_test_utils", + "clap", + "lazy_static", +] +benches = [ + "namada_apps_lib/benches", + "namada_test_utils", + "tracing-subscriber", + "rand_core" +] +integration = ["namada_apps_lib/integration"] +jemalloc = ["rocksdb/jemalloc"] +migrations = [ + "namada_migrations", + "namada_sdk/migrations", + "namada/migrations", + "linkme", +] +namada-eth-bridge = [ + "namada/namada-eth-bridge", + "namada_sdk/namada-eth-bridge", +] + +[dependencies] +namada = {path = "../namada", features = ["multicore", "http-client", "tendermint-rpc", "std"]} +namada_apps_lib = {path = "../apps_lib"} +namada_migrations = {path = "../migrations", optional = true} +namada_sdk = {path = "../sdk", default-features = false, features = ["download-params", "std", "rand"]} +namada_test_utils = {path = "../test_utils", optional = true} + +arse-merkle-tree = { workspace = true, features = ["blake2b"] } +async-trait.workspace = true +blake2b-rs.workspace = true +borsh.workspace = true +borsh-ext.workspace = true +byte-unit.workspace = true +bytes = "1.1.0" +clap = { workspace = true, optional = true } +color-eyre.workspace = true +data-encoding.workspace = true +drain_filter_polyfill.workspace = true +ethabi.workspace = true +ethbridge-bridge-events.workspace = true +ethbridge-events.workspace = true +eyre.workspace = true +futures.workspace = true +itertools.workspace = true +lazy_static = { workspace = true, optional = true } +linkme = { workspace = true, optional = true } +masp_primitives = { workspace = true, features = ["transparent-inputs"] } +masp_proofs = { workspace = true, features = ["bundled-prover", "download-params"] } +num_cpus.workspace = true +num256.workspace = true +num-rational.workspace = true +num-traits.workspace = true +once_cell.workspace = true +prost.workspace = true +rand_core = { workspace = true, optional = true, features = ["std"] } +rayon.workspace = true +regex.workspace = true +rlimit.workspace = true +rocksdb.workspace = true +serde_json = {workspace = true, features = ["raw_value"]} +sha2.workspace = true +smooth-operator.workspace = true +sysinfo.workspace = true +tempfile.workspace = true +thiserror.workspace = true +tokio = {workspace = true, features = ["full"]} +toml.workspace = true +tower-abci.workspace = true +tower.workspace = true +tracing-subscriber = { workspace = true, optional = true, features = ["std", "json", "ansi", "tracing-log"]} +tracing.workspace = true +warp = "0.3.2" + +[dev-dependencies] +namada = {path = "../namada", default-features = false, features = ["testing", "wasm-runtime"]} +namada_apps_lib = {path = "../apps_lib", features = ["testing"]} +namada_test_utils = {path = "../test_utils"} + +assert_matches.workspace = true +clap.workspace = true +lazy_static.workspace= true +proptest.workspace = true +rand = { workspace = true, features = ["std"] } +test-log.workspace = true +tokio-test.workspace = true diff --git a/crates/apps_lib/src/node/ledger/abortable.rs b/crates/node/src/abortable.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/abortable.rs rename to crates/node/src/abortable.rs diff --git a/crates/apps_lib/src/bench_utils.rs b/crates/node/src/bench_utils.rs similarity index 98% rename from crates/apps_lib/src/bench_utils.rs rename to crates/node/src/bench_utils.rs index a0a7488719..8053609298 100644 --- a/crates/apps_lib/src/bench_utils.rs +++ b/crates/node/src/bench_utils.rs @@ -85,6 +85,10 @@ use namada::tx::{ }; use namada::vm::wasm::run; use namada::{proof_of_stake, tendermint}; +use namada_apps_lib::cli; +use namada_apps_lib::cli::context::FromContext; +use namada_apps_lib::cli::Context; +use namada_apps_lib::wallet::{defaults, CliWalletUtils}; use namada_sdk::masp::{ self, ContextSyncStatus, ShieldedContext, ShieldedTransfer, ShieldedUtils, }; @@ -108,15 +112,13 @@ use rand_core::OsRng; use sha2::{Digest, Sha256}; use tempfile::TempDir; -use crate::cli::context::FromContext; -use crate::cli::Context; use crate::config; use crate::config::global::GlobalConfig; use crate::config::TendermintMode; use crate::facade::tendermint::v0_37::abci::request::InitChain; use crate::facade::tendermint_proto::google::protobuf::Timestamp; -use crate::node::ledger::shell::Shell; -use crate::wallet::{defaults, CliWalletUtils}; +use crate::facade::tendermint_rpc; +use crate::shell::Shell; pub const WASM_DIR: &str = "../../wasm"; @@ -959,12 +961,12 @@ impl Default for BenchShieldedCtx { // needed in `Context::new` let config = GlobalConfig::new(shell.inner.chain_id.clone()); config.write(&base_dir).unwrap(); - let wallet = crate::wallet::CliWalletUtils::new( + let wallet = namada_apps_lib::wallet::CliWalletUtils::new( base_dir.join(shell.inner.chain_id.as_str()), ); wallet.save().unwrap(); - let ctx = Context::new::(crate::cli::args::Global { + let ctx = Context::new::(cli::args::Global { is_pre_genesis: false, chain_id: Some(shell.inner.chain_id.clone()), base_dir, @@ -987,7 +989,7 @@ impl Default for BenchShieldedCtx { true, &mut OsRng, ); - crate::wallet::save(&chain_ctx.wallet).unwrap(); + namada_apps_lib::wallet::save(&chain_ctx.wallet).unwrap(); // Generate payment addresses for both Albert and Bertha for (alias, viewing_alias) in [ @@ -1021,7 +1023,7 @@ impl Default for BenchShieldedCtx { .unwrap(); } - crate::wallet::save(&chain_ctx.wallet).unwrap(); + namada_apps_lib::wallet::save(&chain_ctx.wallet).unwrap(); Self { shielded: ShieldedContext::default(), @@ -1045,7 +1047,7 @@ impl BenchShieldedCtx { .find_spending_key(ALBERT_SPENDING_KEY, None) .unwrap(); self.shielded = async_runtime - .block_on(crate::client::masp::syncing( + .block_on(namada_apps_lib::client::masp::syncing( self.shielded, &self.shell, &StdIo, diff --git a/crates/apps_lib/src/node/ledger/broadcaster.rs b/crates/node/src/broadcaster.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/broadcaster.rs rename to crates/node/src/broadcaster.rs diff --git a/crates/apps_lib/src/node/ledger/ethereum_oracle/control.rs b/crates/node/src/ethereum_oracle/control.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/ethereum_oracle/control.rs rename to crates/node/src/ethereum_oracle/control.rs diff --git a/crates/apps_lib/src/node/ledger/ethereum_oracle/events.rs b/crates/node/src/ethereum_oracle/events.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/ethereum_oracle/events.rs rename to crates/node/src/ethereum_oracle/events.rs index 7ecfe51906..64e94a1757 100644 --- a/crates/apps_lib/src/node/ledger/ethereum_oracle/events.rs +++ b/crates/node/src/ethereum_oracle/events.rs @@ -306,7 +306,7 @@ pub mod eth_events { use namada::eth_bridge::ethers::contract::EthEvent; use super::*; - use crate::node::ledger::ethereum_oracle::test_tools::event_log::GetLog; + use crate::ethereum_oracle::test_tools::event_log::GetLog; /// Test that for Ethereum events for which a custom number of /// confirmations may be specified, if a value lower than the diff --git a/crates/apps_lib/src/node/ledger/ethereum_oracle/mod.rs b/crates/node/src/ethereum_oracle/mod.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/ethereum_oracle/mod.rs rename to crates/node/src/ethereum_oracle/mod.rs index 97e52d5ef3..c0b49a4db4 100644 --- a/crates/apps_lib/src/node/ledger/ethereum_oracle/mod.rs +++ b/crates/node/src/ethereum_oracle/mod.rs @@ -23,7 +23,7 @@ use tokio::task::LocalSet; use self::events::PendingEvent; use super::abortable::AbortableSpawner; -use crate::node::ledger::oracle::control::Command; +use crate::oracle::control::Command; /// The default amount of time the oracle will wait between processing blocks const DEFAULT_BACKOFF: Duration = Duration::from_millis(500); @@ -631,8 +631,8 @@ mod test_oracle { use tokio::time::timeout; use super::*; - use crate::node::ledger::ethereum_oracle::test_tools::event_log::GetLog; - use crate::node::ledger::ethereum_oracle::test_tools::mock_web3_client::{ + use crate::ethereum_oracle::test_tools::event_log::GetLog; + use crate::ethereum_oracle::test_tools::mock_web3_client::{ event_signature, TestCmd, TestOracle, Web3Client, Web3Controller, }; diff --git a/crates/apps_lib/src/node/ledger/ethereum_oracle/test_tools/events_endpoint.rs b/crates/node/src/ethereum_oracle/test_tools/events_endpoint.rs similarity index 98% rename from crates/apps_lib/src/node/ledger/ethereum_oracle/test_tools/events_endpoint.rs rename to crates/node/src/ethereum_oracle/test_tools/events_endpoint.rs index 2826bc8dbd..23f77d9301 100644 --- a/crates/apps_lib/src/node/ledger/ethereum_oracle/test_tools/events_endpoint.rs +++ b/crates/node/src/ethereum_oracle/test_tools/events_endpoint.rs @@ -7,7 +7,7 @@ use tokio::sync::oneshot::{Receiver, Sender}; use warp::reply::WithStatus; use warp::Filter; -use crate::node::ledger::ethereum_oracle as oracle; +use crate::ethereum_oracle as oracle; /// The endpoint to which Borsh-serialized Ethereum events should be sent to, /// via an HTTP POST request. diff --git a/crates/apps_lib/src/node/ledger/ethereum_oracle/test_tools/mod.rs b/crates/node/src/ethereum_oracle/test_tools/mod.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/ethereum_oracle/test_tools/mod.rs rename to crates/node/src/ethereum_oracle/test_tools/mod.rs index 4d853a9515..46425c4362 100644 --- a/crates/apps_lib/src/node/ledger/ethereum_oracle/test_tools/mod.rs +++ b/crates/node/src/ethereum_oracle/test_tools/mod.rs @@ -76,7 +76,7 @@ pub mod mock_web3_client { use tokio::sync::oneshot::Sender; use super::super::super::ethereum_oracle::{Error, Oracle, RpcClient}; - use crate::node::ledger::ethereum_oracle::SyncStatus; + use crate::ethereum_oracle::SyncStatus; /// Mock oracle used during unit tests. pub type TestOracle = Oracle; diff --git a/crates/apps_lib/src/node/ledger/mod.rs b/crates/node/src/lib.rs similarity index 96% rename from crates/apps_lib/src/node/ledger/mod.rs rename to crates/node/src/lib.rs index 8e4a384d16..bac9eb2062 100644 --- a/crates/apps_lib/src/node/ledger/mod.rs +++ b/crates/node/src/lib.rs @@ -1,10 +1,28 @@ +//! Library code for a Namada node. + +#![doc(html_favicon_url = "https://dev.namada.net/master/favicon.png")] +#![doc(html_logo_url = "https://dev.namada.net/master/rustdoc-logo.png")] +#![deny(rustdoc::broken_intra_doc_links)] +#![deny(rustdoc::private_intra_doc_links)] +#![warn( + rust_2018_idioms, + clippy::cast_sign_loss, + clippy::cast_possible_truncation, + clippy::cast_possible_wrap, + clippy::cast_lossless, + clippy::arithmetic_side_effects +)] + mod abortable; +#[cfg(feature = "benches")] +pub mod bench_utils; mod broadcaster; pub mod ethereum_oracle; pub mod shell; pub mod shims; pub mod storage; pub mod tendermint_node; +pub mod utils; use std::convert::TryInto; use std::net::SocketAddr; @@ -20,6 +38,11 @@ use namada::eth_bridge::ethers::providers::{Http, Provider}; use namada::state::DB; use namada::storage::DbColFam; use namada::tendermint::abci::request::CheckTxKind; +use namada_apps_lib::cli::args; +use namada_apps_lib::config::utils::{ + convert_tm_addr_to_socket_addr, num_of_threads, +}; +use namada_apps_lib::{config, wasm_loader}; use namada_sdk::state::StateRead; use once_cell::unsync::Lazy; use sysinfo::{RefreshKind, System, SystemExt}; @@ -31,17 +54,22 @@ use self::abortable::AbortableSpawner; use self::ethereum_oracle::last_processed_block; use self::shell::EthereumOracleChannels; use self::shims::abcipp_shim::AbciService; -use crate::cli::args; -use crate::config::utils::{convert_tm_addr_to_socket_addr, num_of_threads}; +use crate::broadcaster::Broadcaster; use crate::config::{ethereum_bridge, TendermintMode}; +use crate::ethereum_oracle as oracle; use crate::facade::tendermint::v0_37::abci::response; use crate::facade::tower_abci::{split, Server}; -use crate::node::ledger::broadcaster::Broadcaster; -use crate::node::ledger::ethereum_oracle as oracle; -use crate::node::ledger::shell::{Error, MempoolTxType, Shell}; -use crate::node::ledger::shims::abcipp_shim::AbcippShim; -use crate::node::ledger::shims::abcipp_shim_types::shim::{Request, Response}; -use crate::{config, wasm_loader}; +use crate::shell::{Error, MempoolTxType, Shell}; +use crate::shims::abcipp_shim::AbcippShim; +use crate::shims::abcipp_shim_types::shim::{Request, Response}; + +pub mod facade { + pub use namada_apps_lib::facade::*; + pub mod tower_abci { + pub use tower_abci::v037::*; + pub use tower_abci::BoxError; + } +} /// Env. var to set a number of Tokio RT worker threads const ENV_VAR_TOKIO_THREADS: &str = "NAMADA_TOKIO_THREADS"; diff --git a/crates/apps_lib/src/node/ledger/shell/block_alloc.rs b/crates/node/src/shell/block_alloc.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/shell/block_alloc.rs rename to crates/node/src/shell/block_alloc.rs index 7f57094c43..321e5d8cd6 100644 --- a/crates/apps_lib/src/node/ledger/shell/block_alloc.rs +++ b/crates/node/src/shell/block_alloc.rs @@ -50,7 +50,7 @@ use namada::state::{self, WlState}; #[allow(unused_imports)] use crate::facade::tendermint_proto::abci::RequestPrepareProposal; -use crate::node::ledger::shell::block_alloc::states::WithNormalTxs; +use crate::shell::block_alloc::states::WithNormalTxs; /// Block allocation failure status responses. #[derive(Debug, Copy, Clone, Eq, PartialEq)] @@ -357,7 +357,7 @@ mod tests { BuildingNormalTxBatch, BuildingProtocolTxBatch, NextState, TryAlloc, }; use super::*; - use crate::node::ledger::shims::abcipp_shim_types::shim::TxBytes; + use crate::shims::abcipp_shim_types::shim::TxBytes; /// Convenience alias for a block space allocator at a state with protocol /// txs. diff --git a/crates/apps_lib/src/node/ledger/shell/block_alloc/states.rs b/crates/node/src/shell/block_alloc/states.rs similarity index 87% rename from crates/apps_lib/src/node/ledger/shell/block_alloc/states.rs rename to crates/node/src/shell/block_alloc/states.rs index ed5d5e3004..3fcc57a0ad 100644 --- a/crates/apps_lib/src/node/ledger/shell/block_alloc/states.rs +++ b/crates/node/src/shell/block_alloc/states.rs @@ -26,7 +26,7 @@ use super::AllocFailure; /// up any remaining space with un-allocated protocol txs. /// /// For more info, read the module docs of -/// [`crate::node::ledger::shell::block_alloc::states`]. +/// [`crate::shell::block_alloc::states`]. pub struct BuildingProtocolTxBatch { /// One of [`WithNormalTxs`] and [`WithoutNormalTxs`]. _mode: Mode, @@ -35,26 +35,26 @@ pub struct BuildingProtocolTxBatch { /// Allow block proposals to include user submitted txs. /// /// For more info, read the module docs of -/// [`crate::node::ledger::shell::block_alloc::states`]. +/// [`crate::shell::block_alloc::states`]. pub enum WithNormalTxs {} /// Allow block proposals to include encrypted txs. /// /// For more info, read the module docs of -/// [`crate::node::ledger::shell::block_alloc::states`]. +/// [`crate::shell::block_alloc::states`]. pub enum WithoutNormalTxs {} /// The leader of the current Tendermint round is building /// a new batch of user submitted (non-protocol) transactions. /// /// For more info, read the module docs of -/// [`crate::node::ledger::shell::block_alloc::states`]. +/// [`crate::shell::block_alloc::states`]. pub struct BuildingNormalTxBatch {} /// Try to allocate a new transaction on a `BlockAllocator` state. /// /// For more info, read the module docs of -/// [`crate::node::ledger::shell::block_alloc::states`]. +/// [`crate::shell::block_alloc::states`]. pub trait TryAlloc { type Resources<'tx>; @@ -71,7 +71,7 @@ pub trait TryAlloc { /// [`NextState`]. /// /// For more info, read the module docs of -/// [`crate::node::ledger::shell::block_alloc::states`]. +/// [`crate::shell::block_alloc::states`]. pub trait NextStateImpl { /// The next state in the `BlockAllocator` state machine. type Next; @@ -85,7 +85,7 @@ pub trait NextStateImpl { /// state with a null transition function. /// /// For more info, read the module docs of -/// [`crate::node::ledger::shell::block_alloc::states`]. +/// [`crate::shell::block_alloc::states`]. pub trait NextState: NextStateImpl { /// Transition to the next state in the `BlockAllocator` state, /// using a null transiiton function. diff --git a/crates/apps_lib/src/node/ledger/shell/block_alloc/states/normal_txs.rs b/crates/node/src/shell/block_alloc/states/normal_txs.rs similarity index 95% rename from crates/apps_lib/src/node/ledger/shell/block_alloc/states/normal_txs.rs rename to crates/node/src/shell/block_alloc/states/normal_txs.rs index e15333216f..1b84d08a16 100644 --- a/crates/apps_lib/src/node/ledger/shell/block_alloc/states/normal_txs.rs +++ b/crates/node/src/shell/block_alloc/states/normal_txs.rs @@ -5,7 +5,7 @@ use super::{ BuildingNormalTxBatch, BuildingProtocolTxBatch, NextStateImpl, TryAlloc, WithoutNormalTxs, }; -use crate::node::ledger::shell::block_alloc::BlockResources; +use crate::shell::block_alloc::BlockResources; impl TryAlloc for BlockAllocator { type Resources<'tx> = BlockResources<'tx>; diff --git a/crates/apps_lib/src/node/ledger/shell/block_alloc/states/protocol_txs.rs b/crates/node/src/shell/block_alloc/states/protocol_txs.rs similarity index 95% rename from crates/apps_lib/src/node/ledger/shell/block_alloc/states/protocol_txs.rs rename to crates/node/src/shell/block_alloc/states/protocol_txs.rs index 302dc83824..81aaba9942 100644 --- a/crates/apps_lib/src/node/ledger/shell/block_alloc/states/protocol_txs.rs +++ b/crates/node/src/shell/block_alloc/states/protocol_txs.rs @@ -5,7 +5,7 @@ use super::{ BuildingNormalTxBatch, BuildingProtocolTxBatch, NextStateImpl, TryAlloc, WithNormalTxs, }; -use crate::node::ledger::shell::block_alloc::TxBin; +use crate::shell::block_alloc::TxBin; impl TryAlloc for BlockAllocator> { type Resources<'tx> = &'tx [u8]; diff --git a/crates/apps_lib/src/node/ledger/shell/finalize_block.rs b/crates/node/src/shell/finalize_block.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/shell/finalize_block.rs rename to crates/node/src/shell/finalize_block.rs index f1505ad874..be1fb8d531 100644 --- a/crates/apps_lib/src/node/ledger/shell/finalize_block.rs +++ b/crates/node/src/shell/finalize_block.rs @@ -32,7 +32,7 @@ use namada::vote_ext::ethereum_tx_data_variants; use super::*; use crate::facade::tendermint::abci::types::VoteInfo; -use crate::node::ledger::shell::stats::InternalStats; +use crate::shell::stats::InternalStats; impl Shell where @@ -1040,9 +1040,9 @@ mod test_finalize_block { use super::*; use crate::facade::tendermint::abci::types::Validator; - use crate::node::ledger::oracle::control::Command; - use crate::node::ledger::shell::test_utils::*; - use crate::node::ledger::shims::abcipp_shim_types::shim::request::{ + use crate::oracle::control::Command; + use crate::shell::test_utils::*; + use crate::shims::abcipp_shim_types::shim::request::{ FinalizeBlock, ProcessedTx, }; @@ -1469,7 +1469,7 @@ mod test_finalize_block { test_bp(|shell: &mut TestShell| { let asset = EthAddress([0xff; 20]); let receiver = EthAddress([0xaa; 20]); - let bertha = crate::wallet::defaults::bertha_address(); + let bertha = namada_apps_lib::wallet::defaults::bertha_address(); // add bertha's escrowed `asset` to the pool { let token = wrapped_erc20s::token(&asset); @@ -1526,8 +1526,10 @@ mod test_finalize_block { transfers: vec![transfer], relayer: bertha, }; - let (protocol_key, _) = crate::wallet::defaults::validator_keys(); - let validator_addr = crate::wallet::defaults::validator_address(); + let (protocol_key, _) = + namada_apps_lib::wallet::defaults::validator_keys(); + let validator_addr = + namada_apps_lib::wallet::defaults::validator_address(); let ext = { let ext = ethereum_events::Vext { validator_addr, @@ -2770,8 +2772,10 @@ mod test_finalize_block { fn test_replay_keys_not_merklized() { let (mut shell, _, _, _) = setup(); - let (wrapper_tx, processed_tx) = - mk_wrapper_tx(&shell, &crate::wallet::defaults::albert_keypair()); + let (wrapper_tx, processed_tx) = mk_wrapper_tx( + &shell, + &namada_apps_lib::wallet::defaults::albert_keypair(), + ); let wrapper_hash_key = replay_protection::current_key(&wrapper_tx.header_hash()); @@ -2877,8 +2881,8 @@ mod test_finalize_block { #[test] fn test_duplicated_tx_same_block() { let (mut shell, _broadcaster, _, _) = setup(); - let keypair = crate::wallet::defaults::albert_keypair(); - let keypair_2 = crate::wallet::defaults::bertha_keypair(); + let keypair = namada_apps_lib::wallet::defaults::albert_keypair(); + let keypair_2 = namada_apps_lib::wallet::defaults::bertha_keypair(); let tx_code = TestWasms::TxNoOp.read_bytes(); let mut wrapper = @@ -2984,8 +2988,8 @@ mod test_finalize_block { #[test] fn test_duplicated_tx_same_block_with_failure() { let (mut shell, _, _, _) = setup(); - let keypair = crate::wallet::defaults::albert_keypair(); - let keypair_2 = crate::wallet::defaults::bertha_keypair(); + let keypair = namada_apps_lib::wallet::defaults::albert_keypair(); + let keypair_2 = namada_apps_lib::wallet::defaults::bertha_keypair(); let tx_code = TestWasms::TxWriteStorageKey.read_bytes(); let mut wrapper = @@ -3092,7 +3096,7 @@ mod test_finalize_block { #[test] fn test_tx_hash_handling() { let (mut shell, _broadcaster, _, _) = setup(); - let keypair = crate::wallet::defaults::bertha_keypair(); + let keypair = namada_apps_lib::wallet::defaults::bertha_keypair(); let mut out_of_gas_wrapper = { let tx_code = TestWasms::TxNoOp.read_bytes(); let mut wrapper_tx = @@ -3393,7 +3397,7 @@ mod test_finalize_block { #[test] fn test_fee_payment_if_invalid_inner_tx() { let (mut shell, _, _, _) = setup(); - let keypair = crate::wallet::defaults::albert_keypair(); + let keypair = namada_apps_lib::wallet::defaults::albert_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( @@ -3591,7 +3595,7 @@ mod test_finalize_block { amount_per_gas_unit: DenominatedAmount::native(1.into()), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), 5_000_000.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -3599,7 +3603,7 @@ mod test_finalize_block { wrapper.set_data(Data::new("Transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -5354,7 +5358,7 @@ mod test_finalize_block { #[test] fn test_successful_batch() { let (mut shell, _broadcaster, _, _) = setup(); - let sk = crate::wallet::defaults::bertha_keypair(); + let sk = wallet::defaults::bertha_keypair(); let (batch, processed_tx) = mk_tx_batch(&shell, &sk, false, false, false); @@ -5400,7 +5404,7 @@ mod test_finalize_block { #[test] fn test_failing_atomic_batch() { let (mut shell, _broadcaster, _, _) = setup(); - let sk = crate::wallet::defaults::bertha_keypair(); + let sk = wallet::defaults::bertha_keypair(); let (batch, processed_tx) = mk_tx_batch(&shell, &sk, true, true, false); @@ -5449,7 +5453,7 @@ mod test_finalize_block { #[test] fn test_failing_non_atomic_batch() { let (mut shell, _broadcaster, _, _) = setup(); - let sk = crate::wallet::defaults::bertha_keypair(); + let sk = wallet::defaults::bertha_keypair(); let (batch, processed_tx) = mk_tx_batch(&shell, &sk, false, true, false); @@ -5518,7 +5522,7 @@ mod test_finalize_block { #[test] fn test_gas_error_atomic_batch() { let (mut shell, _, _, _) = setup(); - let sk = crate::wallet::defaults::bertha_keypair(); + let sk = wallet::defaults::bertha_keypair(); let (batch, processed_tx) = mk_tx_batch(&shell, &sk, true, false, true); @@ -5566,7 +5570,7 @@ mod test_finalize_block { #[test] fn test_gas_error_non_atomic_batch() { let (mut shell, _, _, _) = setup(); - let sk = crate::wallet::defaults::bertha_keypair(); + let sk = wallet::defaults::bertha_keypair(); let (batch, processed_tx) = mk_tx_batch(&shell, &sk, false, false, true); diff --git a/crates/apps_lib/src/node/ledger/shell/governance.rs b/crates/node/src/shell/governance.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/shell/governance.rs rename to crates/node/src/shell/governance.rs diff --git a/crates/apps_lib/src/node/ledger/shell/init_chain.rs b/crates/node/src/shell/init_chain.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/shell/init_chain.rs rename to crates/node/src/shell/init_chain.rs index e3bae81805..3f81d9b3fe 100644 --- a/crates/apps_lib/src/node/ledger/shell/init_chain.rs +++ b/crates/node/src/shell/init_chain.rs @@ -29,7 +29,6 @@ use crate::config::genesis::transactions::{ BondTx, EstablishedAccountTx, Signed as SignedTx, ValidatorAccountTx, }; use crate::facade::tendermint_proto::google::protobuf; -use crate::node::ledger; use crate::wasm_loader; /// Errors that represent panics in normal flow but get demoted to errors @@ -98,7 +97,7 @@ where chain_id, init.chain_id ))); } - if ledger::migrating_state().is_some() { + if crate::migrating_state().is_some() { let rsp = response::InitChain { validators: self .get_abci_validator_updates(true, |pk, power| { @@ -973,12 +972,12 @@ mod test { use std::str::FromStr; use namada::core::string_encoding::StringEncoded; + use namada_apps_lib::wallet::defaults; use namada_sdk::wallet::alias::Alias; use super::*; use crate::config::genesis::{transactions, GenesisAddress}; - use crate::node::ledger::shell::test_utils::TestShell; - use crate::wallet::defaults; + use crate::shell::test_utils::TestShell; /// Test that the init-chain handler never commits changes directly to the /// DB. diff --git a/crates/apps_lib/src/node/ledger/shell/mod.rs b/crates/node/src/shell/mod.rs similarity index 98% rename from crates/apps_lib/src/node/ledger/shell/mod.rs rename to crates/node/src/shell/mod.rs index d27b2e1ed6..99c98b3ff8 100644 --- a/crates/apps_lib/src/node/ledger/shell/mod.rs +++ b/crates/node/src/shell/mod.rs @@ -62,6 +62,7 @@ use namada::tx::{Section, Tx}; use namada::vm::wasm::{TxCache, VpCache}; use namada::vm::{WasmCacheAccess, WasmCacheRwAccess}; use namada::vote_ext::EthereumTxData; +use namada_apps_lib::wallet::{self, ValidatorData, ValidatorKeys}; use namada_sdk::eth_bridge::{EthBridgeQueries, EthereumOracleConfig}; use namada_sdk::tendermint::AppHash; use thiserror::Error; @@ -72,11 +73,9 @@ use crate::config::{self, genesis, TendermintMode, ValidatorLocalConfig}; use crate::facade::tendermint::v0_37::abci::{request, response}; use crate::facade::tendermint::{self, validator}; use crate::facade::tendermint_proto::v0_37::crypto::public_key; -use crate::node::ledger; -use crate::node::ledger::shims::abcipp_shim_types::shim; -use crate::node::ledger::shims::abcipp_shim_types::shim::response::TxResult; -use crate::node::ledger::{storage, tendermint_node}; -use crate::wallet::{ValidatorData, ValidatorKeys}; +use crate::shims::abcipp_shim_types::shim; +use crate::shims::abcipp_shim_types::shim::response::TxResult; +use crate::{storage, tendermint_node}; fn key_to_tendermint( pk: &common::PublicKey, @@ -458,7 +457,7 @@ where "Loading wallet from {}", wallet_path.to_string_lossy() ); - let mut wallet = crate::wallet::load(wallet_path) + let mut wallet = wallet::load(wallet_path) .expect("Validator node must have a wallet"); let validator_local_config_path = wallet_path.join("validator_local_config.toml"); @@ -492,11 +491,10 @@ where #[cfg(test)] { let (protocol_keypair, eth_bridge_keypair) = - crate::wallet::defaults::validator_keys(); + wallet::defaults::validator_keys(); ShellMode::Validator { data: ValidatorData { - address: crate::wallet::defaults::validator_address( - ), + address: wallet::defaults::validator_address(), keys: ValidatorKeys { protocol_keypair, eth_bridge_keypair, @@ -553,7 +551,7 @@ where /// Load the Merkle root hash and the height of the last committed block, if /// any. This is returned when ABCI sends an `info` request. pub fn last_state(&self) -> response::Info { - if ledger::migrating_state().is_some() { + if crate::migrating_state().is_some() { // When migrating state, return a height of 0, such // that CometBFT calls InitChain and subsequently // updates the apphash in its state. @@ -711,7 +709,7 @@ where /// Broadcast any pending protocol transactions. fn broadcast_protocol_txs(&mut self) { - use crate::node::ledger::shell::vote_extensions::iter_protocol_txs; + use crate::shell::vote_extensions::iter_protocol_txs; let ext = self.craft_extension(); @@ -1356,8 +1354,8 @@ mod test_utils { use crate::facade::tendermint_proto::v0_37::abci::{ RequestPrepareProposal, RequestProcessProposal, }; - use crate::node::ledger::shims::abcipp_shim_types; - use crate::node::ledger::shims::abcipp_shim_types::shim::request::{ + use crate::shims::abcipp_shim_types; + use crate::shims::abcipp_shim_types::shim::request::{ FinalizeBlock, ProcessedTx, }; @@ -1374,7 +1372,7 @@ mod test_utils { .expect("Current directory should exist") .canonicalize() .expect("Current directory should exist"); - while current_path.file_name().unwrap() != "apps_lib" { + while current_path.file_name().unwrap() != "node" { current_path.pop(); } // Two-dirs up to root @@ -1570,7 +1568,7 @@ mod test_utils { .collect(), proposer_address: HEXUPPER .decode( - crate::wallet::defaults::validator_keypair() + wallet::defaults::validator_keypair() .to_public() .tm_raw_hash() .as_bytes(), @@ -1618,7 +1616,7 @@ mod test_utils { ) -> abcipp_shim_types::shim::response::PrepareProposal { req.proposer_address = HEXUPPER .decode( - crate::wallet::defaults::validator_keypair() + wallet::defaults::validator_keypair() .to_public() .tm_raw_hash() .as_bytes(), @@ -1800,7 +1798,7 @@ mod test_utils { txs: vec![], proposer_address: HEXUPPER .decode( - crate::wallet::defaults::validator_keypair() + wallet::defaults::validator_keypair() .to_public() .tm_raw_hash() .as_bytes(), @@ -1876,10 +1874,10 @@ mod shell_tests { bridge_pool_roots, ethereum_events, ethereum_tx_data_variants, }; use namada::{address, replay_protection}; + use wallet; use super::*; - use crate::node::ledger::shell::token::DenominatedAmount; - use crate::wallet; + use crate::shell::token::DenominatedAmount; const GAS_LIMIT_MULTIPLIER: u64 = 100_000; @@ -2321,7 +2319,7 @@ mod shell_tests { ), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -2329,7 +2327,7 @@ mod shell_tests { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -2381,12 +2379,12 @@ mod shell_tests { ), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::bertha_keypair().ref_to(), + wallet::defaults::bertha_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), )))); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::bertha_keypair())] + [(0, wallet::defaults::bertha_keypair())] .into_iter() .collect(), None, @@ -2560,7 +2558,7 @@ mod shell_tests { ), token: address::testing::apfel(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -2568,7 +2566,7 @@ mod shell_tests { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -2593,7 +2591,7 @@ mod shell_tests { amount_per_gas_unit: DenominatedAmount::native(0.into()), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -2601,7 +2599,7 @@ mod shell_tests { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -2627,7 +2625,7 @@ mod shell_tests { ), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + wallet::defaults::albert_keypair().ref_to(), 150_000.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -2635,7 +2633,7 @@ mod shell_tests { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -2661,7 +2659,7 @@ mod shell_tests { ), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -2669,7 +2667,7 @@ mod shell_tests { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, wallet::defaults::albert_keypair())] .into_iter() .collect(), None, diff --git a/crates/apps_lib/src/node/ledger/shell/prepare_proposal.rs b/crates/node/src/shell/prepare_proposal.rs similarity index 97% rename from crates/apps_lib/src/node/ledger/shell/prepare_proposal.rs rename to crates/node/src/shell/prepare_proposal.rs index 4eaf93855e..6b5f5e9a3e 100644 --- a/crates/apps_lib/src/node/ledger/shell/prepare_proposal.rs +++ b/crates/node/src/shell/prepare_proposal.rs @@ -24,8 +24,8 @@ use super::block_alloc::{AllocFailure, BlockAllocator, BlockResources}; use crate::config::ValidatorLocalConfig; use crate::facade::tendermint_proto::google::protobuf::Timestamp; use crate::facade::tendermint_proto::v0_37::abci::RequestPrepareProposal; -use crate::node::ledger::shell::ShellMode; -use crate::node::ledger::shims::abcipp_shim_types::shim::{response, TxBytes}; +use crate::shell::ShellMode; +use crate::shims::abcipp_shim_types::shim::{response, TxBytes}; impl Shell where @@ -423,15 +423,15 @@ mod test_prepare_proposal { use namada::tx::{Authorization, Code, Data, Section, Signed}; use namada::vote_ext::{ethereum_events, ethereum_tx_data_variants}; use namada::{replay_protection, token}; + use namada_apps_lib::wallet; use namada_sdk::storage::StorageWrite; use super::*; - use crate::node::ledger::shell::test_utils::{ + use crate::shell::test_utils::{ self, gen_keypair, get_pkh_from_address, TestShell, }; - use crate::node::ledger::shell::EthereumTxData; - use crate::node::ledger::shims::abcipp_shim_types::shim::request::FinalizeBlock; - use crate::wallet; + use crate::shell::EthereumTxData; + use crate::shims::abcipp_shim_types::shim::request::FinalizeBlock; /// Check if we are filtering out an invalid vote extension `vext` fn check_eth_events_filtering( @@ -749,7 +749,7 @@ mod test_prepare_proposal { fn test_wrapper_tx_hash() { let (mut shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { @@ -791,7 +791,7 @@ mod test_prepare_proposal { fn test_wrapper_tx_hash_same_block() { let (shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { @@ -824,7 +824,7 @@ mod test_prepare_proposal { fn test_inner_tx_hash() { let (mut shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { @@ -868,8 +868,8 @@ mod test_prepare_proposal { fn test_inner_tx_hash_same_block() { let (shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); - let keypair_2 = crate::wallet::defaults::albert_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); + let keypair_2 = namada_apps_lib::wallet::defaults::albert_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( Fee { @@ -1061,7 +1061,7 @@ mod test_prepare_proposal { ), token: address::testing::btc(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), ); @@ -1072,7 +1072,7 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Authorization(Authorization::new( wrapper_tx.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -1107,7 +1107,7 @@ mod test_prepare_proposal { ), token: address::testing::apfel(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), ); @@ -1118,7 +1118,7 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Authorization(Authorization::new( wrapper_tx.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -1158,7 +1158,7 @@ mod test_prepare_proposal { amount_per_gas_unit: DenominatedAmount::native(10.into()), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), ); let mut wrapper_tx = Tx::from_type(TxType::Wrapper(Box::new(wrapper))); @@ -1168,7 +1168,7 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Authorization(Authorization::new( wrapper_tx.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -1196,7 +1196,7 @@ mod test_prepare_proposal { amount_per_gas_unit: DenominatedAmount::native(0.into()), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), ); let mut wrapper_tx = Tx::from_type(TxType::Wrapper(Box::new(wrapper))); @@ -1206,7 +1206,7 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Authorization(Authorization::new( wrapper_tx.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -1235,7 +1235,7 @@ mod test_prepare_proposal { ), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), ); let mut wrapper_tx = Tx::from_type(TxType::Wrapper(Box::new(wrapper))); @@ -1245,7 +1245,7 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Authorization(Authorization::new( wrapper_tx.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -1274,7 +1274,7 @@ mod test_prepare_proposal { ), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), ); let mut wrapper_tx = Tx::from_type(TxType::Wrapper(Box::new(wrapper))); @@ -1284,7 +1284,7 @@ mod test_prepare_proposal { .set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper_tx.add_section(Section::Authorization(Authorization::new( wrapper_tx.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, diff --git a/crates/apps_lib/src/node/ledger/shell/process_proposal.rs b/crates/node/src/shell/process_proposal.rs similarity index 97% rename from crates/apps_lib/src/node/ledger/shell/process_proposal.rs rename to crates/node/src/shell/process_proposal.rs index f14fed4d3b..bc211c6aec 100644 --- a/crates/apps_lib/src/node/ledger/shell/process_proposal.rs +++ b/crates/node/src/shell/process_proposal.rs @@ -11,9 +11,9 @@ use namada::vote_ext::ethereum_tx_data_variants; use super::block_alloc::{BlockGas, BlockSpace}; use super::*; use crate::facade::tendermint_proto::v0_37::abci::RequestProcessProposal; -use crate::node::ledger::shell::block_alloc::{AllocFailure, TxBin}; -use crate::node::ledger::shims::abcipp_shim_types::shim::response::ProcessProposal; -use crate::node::ledger::shims::abcipp_shim_types::shim::TxBytes; +use crate::shell::block_alloc::{AllocFailure, TxBin}; +use crate::shims::abcipp_shim_types::shim::response::ProcessProposal; +use crate::shims::abcipp_shim_types::shim::TxBytes; /// Validation metadata, to keep track of used resources or /// transaction numbers, in a block proposal. @@ -564,14 +564,14 @@ mod test_process_proposal { bridge_pool_roots, ethereum_events, validator_set_update, }; use namada::{address, replay_protection}; + use namada_apps_lib::wallet; use super::*; - use crate::node::ledger::shell::test_utils::{ + use crate::shell::test_utils::{ deactivate_bridge, gen_keypair, get_bp_bytes_to_sign, ProcessProposal, TestError, TestShell, }; - use crate::node::ledger::shims::abcipp_shim_types::shim::request::ProcessedTx; - use crate::wallet; + use crate::shims::abcipp_shim_types::shim::request::ProcessedTx; const GAS_LIMIT_MULTIPLIER: u64 = 100_000; @@ -1035,7 +1035,7 @@ mod test_process_proposal { #[test] fn test_wrapper_insufficient_balance_address() { let (mut shell, _recv, _, _) = test_utils::setup_at_height(3u64); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); // reduce address balance to match the 100 token min fee let balance_key = token::storage_key::balance_key( &shell.state.in_mem().native_token, @@ -1100,7 +1100,7 @@ mod test_process_proposal { fn test_raw_tx_rejected() { let (shell, _recv, _, _) = test_utils::setup_at_height(3u64); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); let mut tx = Tx::new(shell.chain_id.clone(), None); tx.add_code("wasm_code".as_bytes().to_owned(), None) @@ -1139,7 +1139,7 @@ mod test_process_proposal { fn test_wrapper_tx_hash() { let (mut shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( @@ -1199,7 +1199,7 @@ mod test_process_proposal { fn test_wrapper_tx_hash_same_block() { let (mut shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); // Add unshielded balance for fee payment let balance_key = token::storage_key::balance_key( @@ -1259,7 +1259,7 @@ mod test_process_proposal { fn test_inner_tx_hash() { let (mut shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( @@ -1319,8 +1319,8 @@ mod test_process_proposal { fn test_inner_tx_hash_same_block() { let (shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); - let keypair_2 = crate::wallet::defaults::albert_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); + let keypair_2 = namada_apps_lib::wallet::defaults::albert_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( @@ -1370,7 +1370,7 @@ mod test_process_proposal { #[test] fn test_wrong_chain_id() { let (shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( @@ -1432,7 +1432,7 @@ mod test_process_proposal { #[test] fn test_expired_wrapper() { let (shell, _recv, _, _) = test_utils::setup(); - let keypair = crate::wallet::defaults::daewon_keypair(); + let keypair = namada_apps_lib::wallet::defaults::daewon_keypair(); let mut wrapper = Tx::from_type(TxType::Wrapper(Box::new(WrapperTx::new( @@ -1570,7 +1570,7 @@ mod test_process_proposal { ), token: address::testing::apfel(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -1578,7 +1578,7 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -1611,7 +1611,7 @@ mod test_process_proposal { amount_per_gas_unit: DenominatedAmount::native(0.into()), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -1619,7 +1619,7 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -1654,7 +1654,7 @@ mod test_process_proposal { ), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), 150_000.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -1662,7 +1662,7 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, @@ -1697,7 +1697,7 @@ mod test_process_proposal { ), token: shell.state.in_mem().native_token.clone(), }, - crate::wallet::defaults::albert_keypair().ref_to(), + namada_apps_lib::wallet::defaults::albert_keypair().ref_to(), GAS_LIMIT_MULTIPLIER.into(), )))); wrapper.header.chain_id = shell.chain_id.clone(); @@ -1705,7 +1705,7 @@ mod test_process_proposal { wrapper.set_data(Data::new("transaction data".as_bytes().to_owned())); wrapper.add_section(Section::Authorization(Authorization::new( wrapper.sechashes(), - [(0, crate::wallet::defaults::albert_keypair())] + [(0, namada_apps_lib::wallet::defaults::albert_keypair())] .into_iter() .collect(), None, diff --git a/crates/apps_lib/src/node/ledger/shell/queries.rs b/crates/node/src/shell/queries.rs similarity index 98% rename from crates/apps_lib/src/node/ledger/shell/queries.rs rename to crates/node/src/shell/queries.rs index 7dab7cb27e..fe9c5d5935 100644 --- a/crates/apps_lib/src/node/ledger/shell/queries.rs +++ b/crates/node/src/shell/queries.rs @@ -78,8 +78,8 @@ mod test_queries { use namada_sdk::eth_bridge::SendValsetUpd; use super::*; - use crate::node::ledger::shell::test_utils::get_pkh_from_address; - use crate::node::ledger::shims::abcipp_shim_types::shim::request::FinalizeBlock; + use crate::shell::test_utils::get_pkh_from_address; + use crate::shims::abcipp_shim_types::shim::request::FinalizeBlock; macro_rules! test_must_send_valset_upd { (epoch_assertions: $epoch_assertions:expr $(,)?) => { diff --git a/crates/apps_lib/src/node/ledger/shell/stats.rs b/crates/node/src/shell/stats.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/shell/stats.rs rename to crates/node/src/shell/stats.rs diff --git a/crates/apps_lib/src/node/ledger/shell/testing/client.rs b/crates/node/src/shell/testing/client.rs similarity index 91% rename from crates/apps_lib/src/node/ledger/shell/testing/client.rs rename to crates/node/src/shell/testing/client.rs index 5f1df9be2b..037c390bd4 100644 --- a/crates/apps_lib/src/node/ledger/shell/testing/client.rs +++ b/crates/node/src/shell/testing/client.rs @@ -1,13 +1,15 @@ use clap::Command as App; use eyre::Report; use namada::io::Io; +use namada_apps_lib::cli::api::{CliApi, CliClient}; +use namada_apps_lib::cli::args::Global; +use namada_apps_lib::cli::{ + args, cmds, Cmd, Context, NamadaClient, NamadaRelayer, +}; use namada_sdk::error::Error as SdkError; use super::node::MockNode; -use crate::cli::api::{CliApi, CliClient}; -use crate::cli::args::Global; -use crate::cli::{args, cmds, Cmd, Context, NamadaClient, NamadaRelayer}; -use crate::node::ledger::shell::testing::utils::{Bin, TestingIo}; +use crate::shell::testing::utils::{Bin, TestingIo}; pub fn run( node: &MockNode, @@ -92,7 +94,7 @@ pub fn run( #[async_trait::async_trait(?Send)] impl<'a> CliClient for &'a MockNode { - fn from_tendermint_address(_: &tendermint_rpc::Url) -> Self { + fn from_tendermint_address(_: &crate::facade::tendermint_rpc::Url) -> Self { unreachable!("MockNode should always be instantiated at test start.") } diff --git a/crates/apps_lib/src/node/ledger/shell/testing/mod.rs b/crates/node/src/shell/testing/mod.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/shell/testing/mod.rs rename to crates/node/src/shell/testing/mod.rs diff --git a/crates/apps_lib/src/node/ledger/shell/testing/node.rs b/crates/node/src/shell/testing/node.rs similarity index 98% rename from crates/apps_lib/src/node/ledger/shell/testing/node.rs rename to crates/node/src/shell/testing/node.rs index dd190774c8..be308531f9 100644 --- a/crates/apps_lib/src/node/ledger/shell/testing/node.rs +++ b/crates/node/src/shell/testing/node.rs @@ -42,28 +42,28 @@ use namada_sdk::queries::Client; use namada_sdk::tendermint_proto::google::protobuf::Timestamp; use namada_sdk::tx::data::ResultCode; use regex::Regex; -use tendermint_rpc::endpoint::block; -use tendermint_rpc::SimpleRequest; use tokio::sync::mpsc; -use crate::facade::tendermint; -use crate::facade::tendermint_proto::v0_37::abci::{ - RequestPrepareProposal, RequestProcessProposal, -}; -use crate::facade::tendermint_rpc::error::Error as RpcError; -use crate::node::ledger::ethereum_oracle::test_tools::mock_web3_client::{ +use crate::ethereum_oracle::test_tools::mock_web3_client::{ TestOracle, Web3Client, Web3Controller, }; -use crate::node::ledger::ethereum_oracle::{ +use crate::ethereum_oracle::{ control, last_processed_block, try_process_eth_events, }; -use crate::node::ledger::shell::testing::utils::TestDir; -use crate::node::ledger::shell::{EthereumOracleChannels, Shell}; -use crate::node::ledger::shims::abcipp_shim_types::shim::request::{ +use crate::facade::tendermint_proto::v0_37::abci::{ + RequestPrepareProposal, RequestProcessProposal, +}; +use crate::facade::tendermint_rpc::endpoint::block; +use crate::facade::tendermint_rpc::error::Error as RpcError; +use crate::facade::tendermint_rpc::SimpleRequest; +use crate::facade::{tendermint, tendermint_rpc}; +use crate::shell::testing::utils::TestDir; +use crate::shell::{EthereumOracleChannels, Shell}; +use crate::shims::abcipp_shim_types::shim::request::{ FinalizeBlock, ProcessedTx, }; -use crate::node::ledger::shims::abcipp_shim_types::shim::response::TxResult; -use crate::node::ledger::storage; +use crate::shims::abcipp_shim_types::shim::response::TxResult; +use crate::storage; /// Mock Ethereum oracle used for testing purposes. struct MockEthOracle { diff --git a/crates/apps_lib/src/node/ledger/shell/testing/utils.rs b/crates/node/src/shell/testing/utils.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/shell/testing/utils.rs rename to crates/node/src/shell/testing/utils.rs diff --git a/crates/apps_lib/src/node/ledger/shell/utils.rs b/crates/node/src/shell/utils.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/shell/utils.rs rename to crates/node/src/shell/utils.rs diff --git a/crates/apps_lib/src/node/ledger/shell/vote_extensions.rs b/crates/node/src/shell/vote_extensions.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/shell/vote_extensions.rs rename to crates/node/src/shell/vote_extensions.rs index fa6fdbfcf9..705c6ade0a 100644 --- a/crates/apps_lib/src/node/ledger/shell/vote_extensions.rs +++ b/crates/node/src/shell/vote_extensions.rs @@ -15,7 +15,7 @@ use namada::vote_ext::{ }; use super::*; -use crate::node::ledger::shims::abcipp_shim_types::shim::TxBytes; +use crate::shims::abcipp_shim_types::shim::TxBytes; /// Message to be passed to `.expect()` calls in this module. const VALIDATOR_EXPECT_MSG: &str = "Only validators receive this method call."; diff --git a/crates/apps_lib/src/node/ledger/shell/vote_extensions/bridge_pool_vext.rs b/crates/node/src/shell/vote_extensions/bridge_pool_vext.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/shell/vote_extensions/bridge_pool_vext.rs rename to crates/node/src/shell/vote_extensions/bridge_pool_vext.rs index 892bc7ad5f..59ced93374 100644 --- a/crates/apps_lib/src/node/ledger/shell/vote_extensions/bridge_pool_vext.rs +++ b/crates/node/src/shell/vote_extensions/bridge_pool_vext.rs @@ -76,10 +76,10 @@ mod test_bp_vote_extensions { use namada::tendermint::abci::types::VoteInfo; use namada::tx::Signed; use namada::vote_ext::bridge_pool_roots; + use namada_apps_lib::wallet::defaults::{bertha_address, bertha_keypair}; - use crate::node::ledger::shell::test_utils::*; - use crate::node::ledger::shims::abcipp_shim_types::shim::request::FinalizeBlock; - use crate::wallet::defaults::{bertha_address, bertha_keypair}; + use crate::shell::test_utils::*; + use crate::shims::abcipp_shim_types::shim::request::FinalizeBlock; /// Make Bertha a validator. fn add_validator(shell: &mut TestShell) { diff --git a/crates/apps_lib/src/node/ledger/shell/vote_extensions/eth_events.rs b/crates/node/src/shell/vote_extensions/eth_events.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/shell/vote_extensions/eth_events.rs rename to crates/node/src/shell/vote_extensions/eth_events.rs index f8cd28dec7..6e39450389 100644 --- a/crates/apps_lib/src/node/ledger/shell/vote_extensions/eth_events.rs +++ b/crates/node/src/shell/vote_extensions/eth_events.rs @@ -159,8 +159,8 @@ mod test_vote_extensions { use namada_sdk::storage::StorageWrite; use super::validate_eth_events_vext; - use crate::node::ledger::shell::test_utils::*; - use crate::node::ledger::shims::abcipp_shim_types::shim::request::FinalizeBlock; + use crate::shell::test_utils::*; + use crate::shims::abcipp_shim_types::shim::request::FinalizeBlock; /// Test validating Ethereum events. #[test] diff --git a/crates/apps_lib/src/node/ledger/shell/vote_extensions/val_set_update.rs b/crates/node/src/shell/vote_extensions/val_set_update.rs similarity index 98% rename from crates/apps_lib/src/node/ledger/shell/vote_extensions/val_set_update.rs rename to crates/node/src/shell/vote_extensions/val_set_update.rs index dcbf4e7c0f..389ee7eba8 100644 --- a/crates/apps_lib/src/node/ledger/shell/vote_extensions/val_set_update.rs +++ b/crates/node/src/shell/vote_extensions/val_set_update.rs @@ -122,12 +122,12 @@ mod test_vote_extensions { use namada::state::collections::lazy_map::{NestedSubKey, SubKey}; use namada::tendermint::abci::types::VoteInfo; use namada::vote_ext::validator_set_update; + use namada_apps_lib::wallet; use namada_sdk::eth_bridge::EthBridgeQueries; use super::validate_valset_upd_vext; - use crate::node::ledger::shell::test_utils::{self, get_pkh_from_address}; - use crate::node::ledger::shims::abcipp_shim_types::shim::request::FinalizeBlock; - use crate::wallet; + use crate::shell::test_utils::{self, get_pkh_from_address}; + use crate::shims::abcipp_shim_types::shim::request::FinalizeBlock; /// Test if a [`validator_set_update::Vext`] that incorrectly labels what /// epoch it was included on in a vote extension is rejected diff --git a/crates/apps_lib/src/node/ledger/shims/abcipp_shim.rs b/crates/node/src/shims/abcipp_shim.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/shims/abcipp_shim.rs rename to crates/node/src/shims/abcipp_shim.rs index 0632969633..4583666472 100644 --- a/crates/apps_lib/src/node/ledger/shims/abcipp_shim.rs +++ b/crates/node/src/shims/abcipp_shim.rs @@ -22,7 +22,7 @@ use crate::facade::tendermint::v0_37::abci::{ request, Request as Req, Response as Resp, }; use crate::facade::tower_abci::BoxError; -use crate::node::ledger::shell::{EthereumOracleChannels, Shell}; +use crate::shell::{EthereumOracleChannels, Shell}; /// The shim wraps the shell, which implements ABCI++. /// The shim makes a crude translation between the ABCI interface currently used diff --git a/crates/apps_lib/src/node/ledger/shims/abcipp_shim_types.rs b/crates/node/src/shims/abcipp_shim_types.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/shims/abcipp_shim_types.rs rename to crates/node/src/shims/abcipp_shim_types.rs index af94ae8723..6decadeb6b 100644 --- a/crates/apps_lib/src/node/ledger/shims/abcipp_shim_types.rs +++ b/crates/node/src/shims/abcipp_shim_types.rs @@ -9,7 +9,7 @@ pub mod shim { use crate::facade::tendermint::v0_37::abci::{ request as tm_request, response as tm_response, }; - use crate::node::ledger::shell; + use crate::shell; pub type TxBytes = prost::bytes::Bytes; diff --git a/crates/apps_lib/src/node/ledger/shims/mod.rs b/crates/node/src/shims/mod.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/shims/mod.rs rename to crates/node/src/shims/mod.rs diff --git a/crates/apps_lib/src/node/ledger/storage/mod.rs b/crates/node/src/storage/mod.rs similarity index 99% rename from crates/apps_lib/src/node/ledger/storage/mod.rs rename to crates/node/src/storage/mod.rs index 144326599d..610e87b57b 100644 --- a/crates/apps_lib/src/node/ledger/storage/mod.rs +++ b/crates/node/src/storage/mod.rs @@ -79,7 +79,7 @@ mod tests { use tempfile::TempDir; use super::*; - use crate::node::ledger::shell::is_merklized_storage_key; + use crate::shell::is_merklized_storage_key; #[test] fn test_crud_value() { diff --git a/crates/apps_lib/src/node/ledger/storage/rocksdb.rs b/crates/node/src/storage/rocksdb.rs similarity index 100% rename from crates/apps_lib/src/node/ledger/storage/rocksdb.rs rename to crates/node/src/storage/rocksdb.rs diff --git a/crates/apps_lib/src/node/ledger/tendermint_node.rs b/crates/node/src/tendermint_node.rs similarity index 75% rename from crates/apps_lib/src/node/ledger/tendermint_node.rs rename to crates/node/src/tendermint_node.rs index b5a01fa9a7..b0a4164ba8 100644 --- a/crates/apps_lib/src/node/ledger/tendermint_node.rs +++ b/crates/node/src/tendermint_node.rs @@ -3,13 +3,12 @@ use std::path::{Path, PathBuf}; use std::process::Stdio; use std::str::FromStr; -use borsh_ext::BorshSerializeExt; use namada::core::chain::{ChainId, ProposalBytes}; -use namada::core::key::*; use namada::core::storage::BlockHeight; use namada::core::time::DateTimeUtc; -use serde_json::json; -use sha2::{Digest, Sha256}; +use namada_apps_lib::cli::namada_version; +use namada_apps_lib::config; +pub use namada_apps_lib::tendermint_node::*; use thiserror::Error; use tokio::fs::{File, OpenOptions}; use tokio::io::{AsyncReadExt, AsyncWriteExt}; @@ -17,9 +16,6 @@ use tokio::process::{Child, Command}; use tokio::sync::oneshot::error::RecvError; use tokio::sync::oneshot::{Receiver, Sender}; -use crate::cli::namada_version; -use crate::config; -use crate::facade::tendermint::node::Id as TendermintNodeId; use crate::facade::tendermint::{block, Genesis, Moniker}; use crate::facade::tendermint_config::{ Error as TendermintError, TendermintConfig, @@ -276,116 +272,6 @@ pub fn rollback(tendermint_dir: impl AsRef) -> Result { .into()) } -/// Convert a common signing scheme validator key into JSON for -/// Tendermint -pub fn validator_key_to_json( - sk: &common::SecretKey, -) -> std::result::Result { - let raw_hash = tm_consensus_key_raw_hash(&sk.ref_to()); - let (id_str, pk_arr, kp_arr) = match sk { - common::SecretKey::Ed25519(_) => { - let sk_ed: ed25519::SecretKey = sk.try_to_sk().unwrap(); - let keypair = - [sk_ed.serialize_to_vec(), sk_ed.ref_to().serialize_to_vec()] - .concat(); - ("Ed25519", sk_ed.ref_to().serialize_to_vec(), keypair) - } - common::SecretKey::Secp256k1(_) => { - let sk_sec: secp256k1::SecretKey = sk.try_to_sk().unwrap(); - ( - "Secp256k1", - sk_sec.ref_to().serialize_to_vec(), - sk_sec.serialize_to_vec(), - ) - } - }; - - Ok(json!({ - "address": raw_hash, - "pub_key": { - "type": format!("tendermint/PubKey{}",id_str), - "value": base64::encode(pk_arr), - }, - "priv_key": { - "type": format!("tendermint/PrivKey{}",id_str), - "value": base64::encode(kp_arr), - } - })) -} - -/// Initialize validator private key for Tendermint -pub fn write_validator_key( - home_dir: impl AsRef, - consensus_key: &common::SecretKey, -) -> Result<()> { - let key = validator_key_to_json(consensus_key).unwrap(); - write_validator(validator_key(home_dir), KEY_DIR, KEY_FILE, key) -} - -/// Initialize validator private state for Tendermint -pub fn write_validator_state(home_dir: impl AsRef) -> Result<()> { - let state = json!({ - "height": "0", - "round": 0, - "step": 0 - }); - write_validator(validator_state(home_dir), STATE_DIR, STATE_FILE, state) -} - -/// Abstract over the initialization of validator data for Tendermint -pub fn write_validator( - path: PathBuf, - err_dir: &'static str, - err_file: &'static str, - data: serde_json::Value, -) -> Result<()> { - let parent_dir = path.parent().unwrap(); - // Make sure the dir exists - std::fs::create_dir_all(parent_dir).map_err(|err| { - Error::CantCreate(format!( - "{} at {}. Caused by {err}", - err_dir, - parent_dir.to_string_lossy() - )) - })?; - let file = ensure_empty(&path).map_err(|err| { - Error::CantCreate(format!( - "{} at {}. Caused by {err}", - err_dir, - path.to_string_lossy() - )) - })?; - serde_json::to_writer_pretty(file, &data).map_err(|err| { - Error::CantWrite(format!( - "{} to {}. Caused by {err}", - err_file, - path.to_string_lossy() - )) - }) -} - -/// Length of a Tendermint Node ID in bytes -const TENDERMINT_NODE_ID_LENGTH: usize = 20; - -/// Derive Tendermint node ID from public key -pub fn id_from_pk(pk: &common::PublicKey) -> TendermintNodeId { - let mut bytes = [0u8; TENDERMINT_NODE_ID_LENGTH]; - - match pk { - common::PublicKey::Ed25519(_) => { - let _pk: ed25519::PublicKey = pk.try_to_pk().unwrap(); - let digest = Sha256::digest(_pk.serialize_to_vec().as_slice()); - bytes.copy_from_slice(&digest[..TENDERMINT_NODE_ID_LENGTH]); - } - common::PublicKey::Secp256k1(_) => { - let _pk: secp256k1::PublicKey = pk.try_to_pk().unwrap(); - let digest = Sha256::digest(_pk.serialize_to_vec().as_slice()); - bytes.copy_from_slice(&digest[..TENDERMINT_NODE_ID_LENGTH]); - } - } - TendermintNodeId::new(bytes) -} - async fn update_tendermint_config( home_dir: impl AsRef, mut config: TendermintConfig, @@ -520,40 +406,14 @@ async fn tracing_kill(node: &mut Child) { node.kill().await.unwrap(); } -fn ensure_empty(path: &PathBuf) -> std::io::Result { - std::fs::OpenOptions::new() - .create(true) - .write(true) - .truncate(true) - .open(path) -} -fn validator_key(home_dir: impl AsRef) -> PathBuf { - home_dir - .as_ref() - .join("config") - .join("priv_validator_key.json") -} - -fn validator_state(home_dir: impl AsRef) -> PathBuf { - home_dir - .as_ref() - .join("data") - .join("priv_validator_state.json") -} - fn configuration(home_dir: impl AsRef) -> PathBuf { home_dir.as_ref().join("config").join("config.toml") } + fn genesis(home_dir: impl AsRef) -> PathBuf { home_dir.as_ref().join("config").join("genesis.json") } // Constant strings to avoid repeating our magic words -const KEY_FILE: &str = "private validator key file"; -const KEY_DIR: &str = "private validator key directory"; - -const STATE_FILE: &str = "private validator state file"; -const STATE_DIR: &str = "private validator state directory"; - const GENESIS_FILE: &str = "CometBFT genesis file"; diff --git a/crates/node/src/utils.rs b/crates/node/src/utils.rs new file mode 100644 index 0000000000..5e8e4c3964 --- /dev/null +++ b/crates/node/src/utils.rs @@ -0,0 +1,25 @@ +//! Node utils commands handlers + +use std::str::FromStr; + +use namada_apps_lib::cli::args::TestGenesis; +use namada_apps_lib::config::genesis; + +pub fn test_genesis(args: TestGenesis) { + use crate::facade::tendermint::Timeout; + + let templates = genesis::templates::load_and_validate(&args.path).unwrap(); + let genesis = genesis::chain::finalize( + templates, + FromStr::from_str("namada-dryrun").unwrap(), + Default::default(), + Timeout::from_str("30s").unwrap(), + ); + let chain_id = &genesis.metadata.chain_id; + let test_dir = tempfile::tempdir().unwrap(); + let config = crate::config::Config::load(test_dir.path(), chain_id, None); + genesis + .write_toml_files(&test_dir.path().join(chain_id.to_string())) + .unwrap(); + crate::test_genesis_files(config.ledger, genesis, args.wasm_dir); +} diff --git a/crates/tests/Cargo.toml b/crates/tests/Cargo.toml index 470268934d..6b3f6e07bf 100644 --- a/crates/tests/Cargo.toml +++ b/crates/tests/Cargo.toml @@ -18,7 +18,7 @@ mainnet = [ "namada/mainnet", ] wasm-runtime = ["namada/wasm-runtime"] -integration = ["namada_apps_lib/integration"] +integration = ["namada_node/integration", "namada_apps_lib/integration"] migrations = [ "namada/migrations", "namada_sdk/migrations", @@ -35,8 +35,8 @@ namada = {path = "../namada", features = ["testing"]} namada_core = {path = "../core", features = ["testing"]} namada_sdk = {path = "../sdk", default-features = false, features = ["tendermint-rpc", "download-params", "std", "rand"]} namada_test_utils = {path = "../test_utils"} -namada_vp_prelude = {path = "../vp_prelude"} namada_tx_prelude = {path = "../tx_prelude"} +namada_vp_prelude = {path = "../vp_prelude"} async-trait.workspace = true chrono.workspace = true concat-idents.workspace = true @@ -61,6 +61,7 @@ tracing.workspace = true [dev-dependencies] namada_apps_lib = {path = "../apps_lib", features = ["testing"]} +namada_node = { path = "../node", features = ["testing"] } namada_vm_env = {path = "../vm_env"} assert_cmd.workspace = true assert_matches.workspace = true diff --git a/crates/tests/src/e2e/ledger_tests.rs b/crates/tests/src/e2e/ledger_tests.rs index 199c2c293b..e0a69364e9 100644 --- a/crates/tests/src/e2e/ledger_tests.rs +++ b/crates/tests/src/e2e/ledger_tests.rs @@ -1877,11 +1877,8 @@ fn change_consensus_key() -> Result<()> { let new_sk = wallet.find_secret_key(new_key_alias, None).unwrap(); // Write the key to CometBFT dir let cometbft_dir = test.get_cometbft_home(Who::Validator(0)); - namada_apps_lib::node::ledger::tendermint_node::write_validator_key( - cometbft_dir, - &new_sk, - ) - .unwrap(); + namada_node::tendermint_node::write_validator_key(cometbft_dir, &new_sk) + .unwrap(); println!( "{}", "Done setting up the new validator consensus key in CometBFT.".blue() diff --git a/crates/tests/src/integration/helpers.rs b/crates/tests/src/integration/helpers.rs index 26ba4fcb4c..3b49ccbaea 100644 --- a/crates/tests/src/integration/helpers.rs +++ b/crates/tests/src/integration/helpers.rs @@ -2,12 +2,10 @@ use std::path::PathBuf; use std::str::FromStr; use eyre::eyre; -use namada_apps_lib::node::ledger::shell::testing::client::run; -use namada_apps_lib::node::ledger::shell::testing::node::MockNode; -use namada_apps_lib::node::ledger::shell::testing::utils::{ - Bin, CapturedOutput, -}; use namada_core::address::Address; +use namada_node::shell::testing::client::run; +use namada_node::shell::testing::node::MockNode; +use namada_node::shell::testing::utils::{Bin, CapturedOutput}; /// Query the wallet to get an address from a given alias. pub fn find_address( diff --git a/crates/tests/src/integration/ledger_tests.rs b/crates/tests/src/integration/ledger_tests.rs index feee8217a2..0c17b5b73b 100644 --- a/crates/tests/src/integration/ledger_tests.rs +++ b/crates/tests/src/integration/ledger_tests.rs @@ -7,14 +7,12 @@ use color_eyre::eyre::Result; use data_encoding::HEXLOWER; use namada::core::collections::HashMap; use namada::token; -use namada_apps_lib::node::ledger::shell::testing::client::run; -use namada_apps_lib::node::ledger::shell::testing::utils::{ - Bin, CapturedOutput, -}; use namada_apps_lib::wallet::defaults; use namada_core::dec::Dec; use namada_core::storage::Epoch; use namada_core::token::NATIVE_MAX_DECIMAL_PLACES; +use namada_node::shell::testing::client::run; +use namada_node::shell::testing::utils::{Bin, CapturedOutput}; use namada_sdk::tx::{TX_TRANSFER_WASM, VP_USER_WASM}; use namada_test_utils::TestWasms; use test_log::test; diff --git a/crates/tests/src/integration/masp.rs b/crates/tests/src/integration/masp.rs index d8d59a0f86..4912e3624a 100644 --- a/crates/tests/src/integration/masp.rs +++ b/crates/tests/src/integration/masp.rs @@ -6,14 +6,12 @@ use color_eyre::owo_colors::OwoColorize; use namada::state::{StorageRead, StorageWrite}; use namada::token::storage_key::masp_token_map_key; use namada::token::{self, DenominatedAmount}; -use namada_apps_lib::node::ledger::shell::testing::client::run; -use namada_apps_lib::node::ledger::shell::testing::node::NodeResults; -use namada_apps_lib::node::ledger::shell::testing::utils::{ - Bin, CapturedOutput, -}; use namada_apps_lib::wallet::defaults::christel_keypair; use namada_core::dec::Dec; use namada_core::masp::TokenMap; +use namada_node::shell::testing::client::run; +use namada_node::shell::testing::node::NodeResults; +use namada_node::shell::testing::utils::{Bin, CapturedOutput}; use namada_sdk::masp::fs::FsShieldedUtils; use test_log::test; diff --git a/crates/tests/src/integration/setup.rs b/crates/tests/src/integration/setup.rs index 0b52661c74..448ef59c08 100644 --- a/crates/tests/src/integration/setup.rs +++ b/crates/tests/src/integration/setup.rs @@ -16,15 +16,15 @@ use namada_apps_lib::config::genesis::templates::load_and_validate; use namada_apps_lib::config::TendermintMode; use namada_apps_lib::facade::tendermint::Timeout; use namada_apps_lib::facade::tendermint_proto::google::protobuf::Timestamp; -use namada_apps_lib::node::ledger::shell::testing::node::{ - mock_services, MockNode, MockServicesCfg, MockServicesController, - MockServicesPackage, -}; -use namada_apps_lib::node::ledger::shell::testing::utils::TestDir; -use namada_apps_lib::node::ledger::shell::Shell; use namada_apps_lib::wallet::pre_genesis; use namada_core::chain::ChainIdPrefix; use namada_core::collections::HashMap; +use namada_node::shell::testing::node::{ + mock_services, MockNode, MockServicesCfg, MockServicesController, + MockServicesPackage, +}; +use namada_node::shell::testing::utils::TestDir; +use namada_node::shell::Shell; use namada_sdk::wallet::alias::Alias; use crate::e2e::setup::{copy_wasm_to_chain_dir, SINGLE_NODE_NET_GENESIS}; diff --git a/wasm_for_tests/Cargo.lock b/wasm_for_tests/Cargo.lock index 5e6476438f..4ae5c8553d 100644 --- a/wasm_for_tests/Cargo.lock +++ b/wasm_for_tests/Cargo.lock @@ -205,7 +205,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -216,7 +216,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -568,7 +568,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", "syn_derive", ] @@ -851,7 +851,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -1200,7 +1200,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -1211,7 +1211,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -1316,7 +1316,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -1517,7 +1517,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -1701,7 +1701,7 @@ dependencies = [ "regex", "serde", "serde_json", - "syn 2.0.39", + "syn 2.0.65", "toml 0.8.2", "walkdir", ] @@ -1719,7 +1719,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -1745,7 +1745,7 @@ dependencies = [ "serde", "serde_json", "strum 0.25.0", - "syn 2.0.39", + "syn 2.0.65", "tempfile", "thiserror", "tiny-keccak", @@ -2049,7 +2049,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -2890,7 +2890,7 @@ checksum = "23d961d2194fd5229961835d2eb78091906ef8afbaaa55bce7ad41bf3ead8aa9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -4228,7 +4228,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -4324,7 +4324,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -4625,7 +4625,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -4680,7 +4680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -4752,9 +4752,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] @@ -4806,7 +4806,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.39", + "syn 2.0.65", "tempfile", "which", ] @@ -4821,7 +4821,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -4861,9 +4861,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -5539,7 +5539,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -5572,7 +5572,7 @@ checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -5731,7 +5731,7 @@ source = "git+https://github.com/heliaxdev/smooth-operator?tag=v0.6.0#1e9e2382dd dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -5841,7 +5841,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -5878,9 +5878,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -5896,7 +5896,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -6144,7 +6144,7 @@ checksum = "7ba277e77219e9eea169e8508942db1bf5d8a41ff2db9b20aab5a5aadc9fa25d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -6164,7 +6164,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -6297,7 +6297,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -6416,7 +6416,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -6471,7 +6471,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -6707,7 +6707,7 @@ checksum = "982ee4197351b5c9782847ef5ec1fdcaf50503fb19d68f9771adae314e72b492" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ] [[package]] @@ -7016,7 +7016,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", "wasm-bindgen-shared", ] @@ -7050,7 +7050,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7727,5 +7727,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.65", ]