From 4e36ae46792750816f6a3ae6d921320f20e6dc3c Mon Sep 17 00:00:00 2001 From: Oleksandr Pravdyvyi Date: Thu, 23 Oct 2025 17:33:25 +0300 Subject: [PATCH] fix; first refactor --- Cargo.toml | 1 + common/Cargo.toml | 3 +- common/src/transaction.rs | 9 +- integration_tests/src/test_suite_map.rs | 128 ++++++++++++------------ key_protocol/Cargo.toml | 3 +- key_protocol/src/key_management/mod.rs | 3 +- nssa/core/Cargo.toml | 5 +- nssa/core/src/address.rs | 15 ++- sequencer_core/Cargo.toml | 2 +- sequencer_core/src/lib.rs | 97 +++++++++++++----- sequencer_rpc/Cargo.toml | 3 +- sequencer_rpc/src/process.rs | 16 +-- wallet/Cargo.toml | 3 +- wallet/src/cli/account.rs | 21 ++-- wallet/src/cli/chain.rs | 12 +-- wallet/src/lib.rs | 16 +-- 16 files changed, 202 insertions(+), 135 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2019628..9ceb790 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,7 @@ bip39 = "2.2.0" hmac-sha512 = "1.1.7" chrono = "0.4.41" borsh = "1.5.7" +base58 = "0.2.0" rocksdb = { version = "0.21.0", default-features = false, features = [ "snappy", diff --git a/common/Cargo.toml b/common/Cargo.toml index d0d145f..95d1c02 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -15,7 +15,8 @@ rs_merkle.workspace = true sha2.workspace = true log.workspace = true elliptic-curve.workspace = true -hex.workspace = true +base58.workspace = true +hex = "0.4.3" nssa-core = { path = "../nssa/core", features = ["host"] } borsh.workspace = true diff --git a/common/src/transaction.rs b/common/src/transaction.rs index c99cf31..65c55c9 100644 --- a/common/src/transaction.rs +++ b/common/src/transaction.rs @@ -1,3 +1,4 @@ +use base58::ToBase58; use borsh::{BorshDeserialize, BorshSerialize}; use k256::ecdsa::{Signature, SigningKey, VerifyingKey}; use log::info; @@ -125,7 +126,7 @@ impl From for OwnedUTXOForPublication { fn from(value: OwnedUTXO) -> Self { Self { hash: hex::encode(value.hash), - owner: hex::encode(value.owner), + owner: value.owner.to_base58(), amount: value.amount, } } @@ -150,7 +151,7 @@ impl ActionData { ActionData::MintMoneyPublicTx(action) => { format!( "Account {:?} minted {:?} balance", - hex::encode(action.acc), + action.acc.to_base58(), action.amount ) } @@ -160,14 +161,14 @@ impl ActionData { action .receiver_data .into_iter() - .map(|(amount, rec)| (amount, hex::encode(rec))) + .map(|(amount, rec)| (amount, rec.to_base58())) .collect::>() ) } ActionData::SendMoneyShieldedTx(action) => { format!( "Shielded send from {:?} for {:?} balance", - hex::encode(action.acc_sender), + action.acc_sender.to_base58(), action.amount ) } diff --git a/integration_tests/src/test_suite_map.rs b/integration_tests/src/test_suite_map.rs index 99a1371..80bf894 100644 --- a/integration_tests/src/test_suite_map.rs +++ b/integration_tests/src/test_suite_map.rs @@ -7,7 +7,7 @@ use nssa_core::{NullifierPublicKey, encryption::shared_key_derivation::Secp256k1 use wallet::{ Command, SubcommandReturnValue, WalletCore, cli::{ - account::{AccountSubcommand, FetchSubcommand, RegisterSubcommand}, + account::{AccountSubcommand, FetchSubcommand, NewSubcommand}, native_token_transfer_program::{ NativeTokenTransferProgramSubcommand, NativeTokenTransferProgramSubcommandPrivate, NativeTokenTransferProgramSubcommandShielded, @@ -40,7 +40,7 @@ pub fn prepare_function_map() -> HashMap { #[test_suite_fn] pub async fn test_success() { info!("test_success"); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Public { + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Public { from: ACC_SENDER.to_string(), to: ACC_RECEIVER.to_string(), amount: 100, @@ -77,7 +77,7 @@ pub fn prepare_function_map() -> HashMap { #[test_suite_fn] pub async fn test_success_move_to_another_account() { info!("test_success_move_to_another_account"); - let command = Command::Account(AccountSubcommand::Register(RegisterSubcommand::Public {})); + let command = Command::Account(AccountSubcommand::New(NewSubcommand::Public {})); let wallet_config = fetch_config().await.unwrap(); @@ -101,7 +101,7 @@ pub fn prepare_function_map() -> HashMap { panic!("Failed to produce new account, not present in persistent accounts"); } - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Public { + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Public { from: ACC_SENDER.to_string(), to: new_persistent_account_addr.clone(), amount: 100, @@ -134,7 +134,7 @@ pub fn prepare_function_map() -> HashMap { #[test_suite_fn] pub async fn test_failure() { info!("test_failure"); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Public { + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Public { from: ACC_SENDER.to_string(), to: ACC_RECEIVER.to_string(), amount: 1000000, @@ -173,7 +173,7 @@ pub fn prepare_function_map() -> HashMap { #[test_suite_fn] pub async fn test_success_two_transactions() { info!("test_success_two_transactions"); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Public { + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Public { from: ACC_SENDER.to_string(), to: ACC_RECEIVER.to_string(), amount: 100, @@ -206,7 +206,7 @@ pub fn prepare_function_map() -> HashMap { info!("First TX Success!"); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Public { + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Public { from: ACC_SENDER.to_string(), to: ACC_RECEIVER.to_string(), amount: 100, @@ -264,20 +264,20 @@ pub fn prepare_function_map() -> HashMap { let wallet_config = fetch_config().await.unwrap(); // Create new account for the token definition - wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Public {}, + wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Public {}, ))) .await .unwrap(); // Create new account for the token supply holder - wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Public {}, + wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Public {}, ))) .await .unwrap(); // Create new account for receiving a token transaction - wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Public {}, + wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Public {}, ))) .await .unwrap(); @@ -311,7 +311,7 @@ pub fn prepare_function_map() -> HashMap { name: "A NAME".to_string(), total_supply: 37, }); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); info!("Waiting for next block creation"); @@ -365,7 +365,7 @@ pub fn prepare_function_map() -> HashMap { recipient_addr: recipient_addr.to_string(), balance_to_move: 7, }); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); info!("Waiting for next block creation"); @@ -416,8 +416,8 @@ pub fn prepare_function_map() -> HashMap { // Create new account for the token definition (public) let SubcommandReturnValue::RegisterAccount { addr: definition_addr, - } = wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Public {}, + } = wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Public {}, ))) .await .unwrap() @@ -426,8 +426,8 @@ pub fn prepare_function_map() -> HashMap { }; // Create new account for the token supply holder (private) let SubcommandReturnValue::RegisterAccount { addr: supply_addr } = - wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Private {}, + wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Private {}, ))) .await .unwrap() @@ -437,8 +437,8 @@ pub fn prepare_function_map() -> HashMap { // Create new account for receiving a token transaction let SubcommandReturnValue::RegisterAccount { addr: recipient_addr, - } = wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Private {}, + } = wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Private {}, ))) .await .unwrap() @@ -456,7 +456,7 @@ pub fn prepare_function_map() -> HashMap { }, ); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -501,7 +501,7 @@ pub fn prepare_function_map() -> HashMap { }, ); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -532,7 +532,7 @@ pub fn prepare_function_map() -> HashMap { }, ); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -564,8 +564,8 @@ pub fn prepare_function_map() -> HashMap { // Create new account for the token definition (public) let SubcommandReturnValue::RegisterAccount { addr: definition_addr, - } = wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Public {}, + } = wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Public {}, ))) .await .unwrap() @@ -574,8 +574,8 @@ pub fn prepare_function_map() -> HashMap { }; // Create new account for the token supply holder (private) let SubcommandReturnValue::RegisterAccount { addr: supply_addr } = - wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Private {}, + wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Private {}, ))) .await .unwrap() @@ -585,8 +585,8 @@ pub fn prepare_function_map() -> HashMap { // Create new account for receiving a token transaction let SubcommandReturnValue::RegisterAccount { addr: recipient_addr, - } = wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Private {}, + } = wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Private {}, ))) .await .unwrap() @@ -604,7 +604,7 @@ pub fn prepare_function_map() -> HashMap { }, ); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -657,7 +657,7 @@ pub fn prepare_function_map() -> HashMap { ); let SubcommandReturnValue::PrivacyPreservingTransfer { tx_hash } = - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap() else { @@ -700,8 +700,8 @@ pub fn prepare_function_map() -> HashMap { // Create new account for the token definition (public) let SubcommandReturnValue::RegisterAccount { addr: definition_addr, - } = wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Public {}, + } = wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Public {}, ))) .await .unwrap() @@ -710,8 +710,8 @@ pub fn prepare_function_map() -> HashMap { }; // Create new account for the token supply holder (public) let SubcommandReturnValue::RegisterAccount { addr: supply_addr } = - wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Public {}, + wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Public {}, ))) .await .unwrap() @@ -721,8 +721,8 @@ pub fn prepare_function_map() -> HashMap { // Create new account for receiving a token transaction let SubcommandReturnValue::RegisterAccount { addr: recipient_addr, - } = wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Private {}, + } = wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Private {}, ))) .await .unwrap() @@ -739,7 +739,7 @@ pub fn prepare_function_map() -> HashMap { total_supply: 37, }); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -774,7 +774,7 @@ pub fn prepare_function_map() -> HashMap { }, ); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -800,7 +800,7 @@ pub fn prepare_function_map() -> HashMap { }, ); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -827,8 +827,8 @@ pub fn prepare_function_map() -> HashMap { // Create new account for the token definition (public) let SubcommandReturnValue::RegisterAccount { addr: definition_addr, - } = wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Public {}, + } = wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Public {}, ))) .await .unwrap() @@ -837,8 +837,8 @@ pub fn prepare_function_map() -> HashMap { }; // Create new account for the token supply holder (private) let SubcommandReturnValue::RegisterAccount { addr: supply_addr } = - wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Private {}, + wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Private {}, ))) .await .unwrap() @@ -848,8 +848,8 @@ pub fn prepare_function_map() -> HashMap { // Create new account for receiving a token transaction let SubcommandReturnValue::RegisterAccount { addr: recipient_addr, - } = wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Public {}, + } = wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Public {}, ))) .await .unwrap() @@ -867,7 +867,7 @@ pub fn prepare_function_map() -> HashMap { }, ); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -912,7 +912,7 @@ pub fn prepare_function_map() -> HashMap { }, ); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -938,7 +938,7 @@ pub fn prepare_function_map() -> HashMap { }, ); - wallet::execute_subcommand(Command::TokenProgram(subcommand)) + wallet::execute_subcommand(Command::Token(subcommand)) .await .unwrap(); @@ -962,7 +962,7 @@ pub fn prepare_function_map() -> HashMap { let from: Address = ACC_SENDER_PRIVATE.parse().unwrap(); let to: Address = ACC_RECEIVER_PRIVATE.parse().unwrap(); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Private( + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Private( NativeTokenTransferProgramSubcommandPrivate::PrivateOwned { from: from.to_string(), to: to.to_string(), @@ -1000,7 +1000,7 @@ pub fn prepare_function_map() -> HashMap { let to_npk_string = hex::encode(to_npk.0); let to_ipk = Secp256k1Point::from_scalar(to_npk.0); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Private( + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Private( NativeTokenTransferProgramSubcommandPrivate::PrivateForeign { from: from.to_string(), to_npk: to_npk_string, @@ -1044,7 +1044,7 @@ pub fn prepare_function_map() -> HashMap { info!("test_success_private_transfer_to_another_owned_account_claiming_path"); let from: Address = ACC_SENDER_PRIVATE.parse().unwrap(); - let command = Command::Account(AccountSubcommand::Register(RegisterSubcommand::Private {})); + let command = Command::Account(AccountSubcommand::New(NewSubcommand::Private {})); let sub_ret = wallet::execute_subcommand(command).await.unwrap(); let SubcommandReturnValue::RegisterAccount { addr: to_addr } = sub_ret else { @@ -1065,7 +1065,7 @@ pub fn prepare_function_map() -> HashMap { .cloned() .unwrap(); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Private( + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Private( NativeTokenTransferProgramSubcommandPrivate::PrivateForeign { from: from.to_string(), to_npk: hex::encode(to_keys.nullifer_public_key.0), @@ -1115,7 +1115,7 @@ pub fn prepare_function_map() -> HashMap { let from: Address = ACC_SENDER_PRIVATE.parse().unwrap(); - let command = Command::Account(AccountSubcommand::Register(RegisterSubcommand::Private {})); + let command = Command::Account(AccountSubcommand::New(NewSubcommand::Private {})); let sub_ret = wallet::execute_subcommand(command).await.unwrap(); let SubcommandReturnValue::RegisterAccount { addr: to_addr } = sub_ret else { @@ -1136,7 +1136,7 @@ pub fn prepare_function_map() -> HashMap { .cloned() .unwrap(); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Private( + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Private( NativeTokenTransferProgramSubcommandPrivate::PrivateForeign { from: from.to_string(), to_npk: hex::encode(to_keys.nullifer_public_key.0), @@ -1184,7 +1184,7 @@ pub fn prepare_function_map() -> HashMap { info!("test_success_deshielded_transfer_to_another_account"); let from: Address = ACC_SENDER_PRIVATE.parse().unwrap(); let to: Address = ACC_RECEIVER.parse().unwrap(); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Deshielded { + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Deshielded { from: from.to_string(), to: to.to_string(), amount: 100, @@ -1230,7 +1230,7 @@ pub fn prepare_function_map() -> HashMap { info!("test_success_shielded_transfer_to_another_owned_account"); let from: Address = ACC_SENDER.parse().unwrap(); let to: Address = ACC_RECEIVER_PRIVATE.parse().unwrap(); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Shielded( + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Shielded( NativeTokenTransferProgramSubcommandShielded::ShieldedOwned { from: from.to_string(), to: to.to_string(), @@ -1274,7 +1274,7 @@ pub fn prepare_function_map() -> HashMap { let to_ipk = Secp256k1Point::from_scalar(to_npk.0); let from: Address = ACC_SENDER.parse().unwrap(); - let command = Command::Transfer(NativeTokenTransferProgramSubcommand::Shielded( + let command = Command::AuthTransfer(NativeTokenTransferProgramSubcommand::Shielded( NativeTokenTransferProgramSubcommandShielded::ShieldedForeign { from: from.to_string(), to_npk: to_npk_string, @@ -1318,7 +1318,7 @@ pub fn prepare_function_map() -> HashMap { let pinata_addr = "cafe".repeat(16); let pinata_prize = 150; let solution = 989106; - let command = Command::PinataProgram(PinataProgramSubcommand::Public( + let command = Command::Pinata(PinataProgramSubcommand::Public( PinataProgramSubcommandPublic::Claim { pinata_addr: pinata_addr.clone(), winner_addr: ACC_SENDER.to_string(), @@ -1446,7 +1446,7 @@ pub fn prepare_function_map() -> HashMap { let pinata_prize = 150; let solution = 989106; - let command = Command::PinataProgram(PinataProgramSubcommand::Private( + let command = Command::Pinata(PinataProgramSubcommand::Private( PinataProgramSubcommandPrivate::ClaimPrivateOwned { pinata_addr: pinata_addr.clone(), winner_addr: ACC_SENDER_PRIVATE.to_string(), @@ -1512,8 +1512,8 @@ pub fn prepare_function_map() -> HashMap { // Create new account for the token supply holder (private) let SubcommandReturnValue::RegisterAccount { addr: winner_addr } = - wallet::execute_subcommand(Command::Account(AccountSubcommand::Register( - RegisterSubcommand::Private {}, + wallet::execute_subcommand(Command::Account(AccountSubcommand::New( + NewSubcommand::Private {}, ))) .await .unwrap() @@ -1521,7 +1521,7 @@ pub fn prepare_function_map() -> HashMap { panic!("invalid subcommand return value"); }; - let command = Command::PinataProgram(PinataProgramSubcommand::Private( + let command = Command::Pinata(PinataProgramSubcommand::Private( PinataProgramSubcommandPrivate::ClaimPrivateOwned { pinata_addr: pinata_addr.clone(), winner_addr: winner_addr.to_string(), diff --git a/key_protocol/Cargo.toml b/key_protocol/Cargo.toml index 544a2f8..b0708b4 100644 --- a/key_protocol/Cargo.toml +++ b/key_protocol/Cargo.toml @@ -9,7 +9,8 @@ serde.workspace = true k256.workspace = true sha2.workspace = true rand.workspace = true -hex.workspace = true +base58.workspace = true +hex = "0.4.3" aes-gcm.workspace = true bip39.workspace = true hmac-sha512.workspace = true diff --git a/key_protocol/src/key_management/mod.rs b/key_protocol/src/key_management/mod.rs index 5650fd5..f22a99f 100644 --- a/key_protocol/src/key_management/mod.rs +++ b/key_protocol/src/key_management/mod.rs @@ -55,6 +55,7 @@ impl KeyChain { #[cfg(test)] mod tests { use aes_gcm::aead::OsRng; + use base58::ToBase58; use k256::AffinePoint; use k256::elliptic_curve::group::GroupEncoding; use rand::RngCore; @@ -119,7 +120,7 @@ mod tests { println!("======Public data======"); println!(); - println!("Address{:?}", hex::encode(address.value())); + println!("Address{:?}", address.value().to_base58()); println!( "Nulifier public key {:?}", hex::encode(nullifer_public_key.to_byte_array()) diff --git a/nssa/core/Cargo.toml b/nssa/core/Cargo.toml index e1951c4..5712eaf 100644 --- a/nssa/core/Cargo.toml +++ b/nssa/core/Cargo.toml @@ -10,8 +10,9 @@ thiserror = { version = "2.0.12", optional = true } bytemuck = { version = "1.13", optional = true } chacha20 = { version = "0.9", default-features = false } k256 = { version = "0.13.3", optional = true } -hex = { version = "0.4.3", optional = true } +base58 = { version = "0.2.0", optional = true } +anyhow = { version = "1.0.98", optional = true } [features] default = [] -host = ["thiserror", "bytemuck", "k256", "hex"] +host = ["thiserror", "bytemuck", "k256", "base58", "anyhow"] diff --git a/nssa/core/src/address.rs b/nssa/core/src/address.rs index 2627368..774145e 100644 --- a/nssa/core/src/address.rs +++ b/nssa/core/src/address.rs @@ -3,6 +3,9 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "host")] use std::{fmt::Display, str::FromStr}; +#[cfg(feature = "host")] +use base58::{FromBase58, ToBase58}; + #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] #[cfg_attr( any(feature = "host", test), @@ -31,8 +34,8 @@ impl AsRef<[u8]> for Address { #[cfg(feature = "host")] #[derive(Debug, thiserror::Error)] pub enum AddressError { - #[error("invalid hex")] - InvalidHex(#[from] hex::FromHexError), + #[error("invalid base58")] + InvalidBase58(#[from] anyhow::Error), #[error("invalid length: expected 32 bytes, got {0}")] InvalidLength(usize), } @@ -41,7 +44,9 @@ pub enum AddressError { impl FromStr for Address { type Err = AddressError; fn from_str(s: &str) -> Result { - let bytes = hex::decode(s)?; + let bytes = s + .from_base58() + .map_err(|err| anyhow::anyhow!("Invalid base58 err {err:?}"))?; if bytes.len() != 32 { return Err(AddressError::InvalidLength(bytes.len())); } @@ -54,7 +59,7 @@ impl FromStr for Address { #[cfg(feature = "host")] impl Display for Address { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", hex::encode(self.value)) + write!(f, "{}", self.value.to_base58()) } } @@ -74,7 +79,7 @@ mod tests { fn parse_invalid_hex() { let hex_str = "zz".repeat(32); // invalid hex chars let result = hex_str.parse::
().unwrap_err(); - assert!(matches!(result, AddressError::InvalidHex(_))); + assert!(matches!(result, AddressError::InvalidBase58(_))); } #[test] diff --git a/sequencer_core/Cargo.toml b/sequencer_core/Cargo.toml index 72a8cc4..6e9979c 100644 --- a/sequencer_core/Cargo.toml +++ b/sequencer_core/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] -hex.workspace = true +base58.workspace = true anyhow.workspace = true serde.workspace = true rand.workspace = true diff --git a/sequencer_core/src/lib.rs b/sequencer_core/src/lib.rs index 92d53e7..98ff16d 100644 --- a/sequencer_core/src/lib.rs +++ b/sequencer_core/src/lib.rs @@ -204,6 +204,7 @@ impl SequencerCore { #[cfg(test)] mod tests { + use base58::{FromBase58, ToBase58}; use common::test_utils::sequencer_sign_key_for_testing; use crate::config::AccountInitialData; @@ -237,23 +238,23 @@ mod tests { } fn setup_sequencer_config() -> SequencerConfig { - let acc1_addr = vec![ + let acc1_addr: Vec = vec![ 208, 122, 210, 232, 75, 39, 250, 0, 194, 98, 240, 161, 238, 160, 255, 53, 202, 9, 115, 84, 126, 106, 16, 111, 114, 241, 147, 194, 220, 131, 139, 68, ]; - let acc2_addr = vec![ + let acc2_addr: Vec = vec![ 231, 174, 119, 197, 239, 26, 5, 153, 147, 68, 175, 73, 159, 199, 138, 23, 5, 57, 141, 98, 237, 6, 207, 46, 20, 121, 246, 222, 248, 154, 57, 188, ]; let initial_acc1 = AccountInitialData { - addr: hex::encode(acc1_addr), + addr: acc1_addr.to_base58(), balance: 10000, }; let initial_acc2 = AccountInitialData { - addr: hex::encode(acc2_addr), + addr: acc2_addr.to_base58(), balance: 20000, }; @@ -288,11 +289,17 @@ mod tests { assert_eq!(sequencer.sequencer_config.max_num_tx_in_block, 10); assert_eq!(sequencer.sequencer_config.port, 8080); - let acc1_addr = hex::decode(config.initial_accounts[0].addr.clone()) + let acc1_addr = config.initial_accounts[0] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); - let acc2_addr = hex::decode(config.initial_accounts[1].addr.clone()) + let acc2_addr = config.initial_accounts[1] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); @@ -314,23 +321,23 @@ mod tests { #[test] fn test_start_different_intial_accounts_balances() { - let acc1_addr = vec![ + let acc1_addr: Vec = vec![ 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, ]; - let acc2_addr = vec![ + let acc2_addr: Vec = vec![ 77, 75, 108, 209, 54, 16, 50, 202, 155, 210, 174, 185, 217, 0, 170, 77, 69, 217, 234, 216, 10, 201, 66, 51, 116, 196, 81, 167, 37, 77, 7, 102, ]; let initial_acc1 = AccountInitialData { - addr: hex::encode(acc1_addr), + addr: acc1_addr.to_base58(), balance: 10000, }; let initial_acc2 = AccountInitialData { - addr: hex::encode(acc2_addr), + addr: acc2_addr.to_base58(), balance: 20000, }; @@ -339,11 +346,17 @@ mod tests { let config = setup_sequencer_config_variable_initial_accounts(initial_accounts); let sequencer = SequencerCore::start_from_config(config.clone()); - let acc1_addr = hex::decode(config.initial_accounts[0].addr.clone()) + let acc1_addr = config.initial_accounts[0] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); - let acc2_addr = hex::decode(config.initial_accounts[1].addr.clone()) + let acc2_addr = config.initial_accounts[1] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); @@ -386,11 +399,17 @@ mod tests { common_setup(&mut sequencer); - let acc1 = hex::decode(sequencer.sequencer_config.initial_accounts[0].addr.clone()) + let acc1 = sequencer.sequencer_config.initial_accounts[0] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); - let acc2 = hex::decode(sequencer.sequencer_config.initial_accounts[1].addr.clone()) + let acc2 = sequencer.sequencer_config.initial_accounts[1] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); @@ -412,11 +431,17 @@ mod tests { common_setup(&mut sequencer); - let acc1 = hex::decode(sequencer.sequencer_config.initial_accounts[0].addr.clone()) + let acc1 = sequencer.sequencer_config.initial_accounts[0] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); - let acc2 = hex::decode(sequencer.sequencer_config.initial_accounts[1].addr.clone()) + let acc2 = sequencer.sequencer_config.initial_accounts[1] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); @@ -448,11 +473,17 @@ mod tests { common_setup(&mut sequencer); - let acc1 = hex::decode(sequencer.sequencer_config.initial_accounts[0].addr.clone()) + let acc1 = sequencer.sequencer_config.initial_accounts[0] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); - let acc2 = hex::decode(sequencer.sequencer_config.initial_accounts[1].addr.clone()) + let acc2 = sequencer.sequencer_config.initial_accounts[1] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); @@ -484,11 +515,17 @@ mod tests { common_setup(&mut sequencer); - let acc1 = hex::decode(sequencer.sequencer_config.initial_accounts[0].addr.clone()) + let acc1 = sequencer.sequencer_config.initial_accounts[0] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); - let acc2 = hex::decode(sequencer.sequencer_config.initial_accounts[1].addr.clone()) + let acc2 = sequencer.sequencer_config.initial_accounts[1] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); @@ -576,11 +613,17 @@ mod tests { common_setup(&mut sequencer); - let acc1 = hex::decode(sequencer.sequencer_config.initial_accounts[0].addr.clone()) + let acc1 = sequencer.sequencer_config.initial_accounts[0] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); - let acc2 = hex::decode(sequencer.sequencer_config.initial_accounts[1].addr.clone()) + let acc2 = sequencer.sequencer_config.initial_accounts[1] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); @@ -618,11 +661,17 @@ mod tests { common_setup(&mut sequencer); - let acc1 = hex::decode(sequencer.sequencer_config.initial_accounts[0].addr.clone()) + let acc1 = sequencer.sequencer_config.initial_accounts[0] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); - let acc2 = hex::decode(sequencer.sequencer_config.initial_accounts[1].addr.clone()) + let acc2 = sequencer.sequencer_config.initial_accounts[1] + .addr + .clone() + .from_base58() .unwrap() .try_into() .unwrap(); diff --git a/sequencer_rpc/Cargo.toml b/sequencer_rpc/Cargo.toml index af7e011..557ce6a 100644 --- a/sequencer_rpc/Cargo.toml +++ b/sequencer_rpc/Cargo.toml @@ -10,7 +10,8 @@ log.workspace = true serde.workspace = true actix-cors.workspace = true futures.workspace = true -hex.workspace = true +base58.workspace = true +hex = "0.4.3" tempfile.workspace = true base64.workspace = true diff --git a/sequencer_rpc/src/process.rs b/sequencer_rpc/src/process.rs index cb49d58..faf71ef 100644 --- a/sequencer_rpc/src/process.rs +++ b/sequencer_rpc/src/process.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use actix_web::Error as HttpError; +use base58::FromBase58; use base64::{Engine, engine::general_purpose}; use nssa::{self, program::Program}; use sequencer_core::config::AccountInitialData; @@ -163,8 +164,10 @@ impl JsonHandler { /// The address must be a valid hex string of the correct length. async fn process_get_account_balance(&self, request: Request) -> Result { let get_account_req = GetAccountBalanceRequest::parse(Some(request.params))?; - let address_bytes = hex::decode(get_account_req.address) - .map_err(|_| RpcError::invalid_params("invalid hex".to_string()))?; + let address_bytes = get_account_req + .address + .from_base58() + .map_err(|_| RpcError::invalid_params("invalid base58".to_string()))?; let address = nssa::Address::new( address_bytes .try_into() @@ -312,6 +315,7 @@ mod tests { use std::sync::Arc; use crate::{JsonHandler, rpc_handler}; + use base58::ToBase58; use base64::{Engine, engine::general_purpose}; use common::{ rpc_primitives::RpcPollingConfig, test_utils::sequencer_sign_key_for_testing, @@ -329,23 +333,23 @@ mod tests { fn sequencer_config_for_tests() -> SequencerConfig { let tempdir = tempdir().unwrap(); let home = tempdir.path().to_path_buf(); - let acc1_addr = vec![ + let acc1_addr: Vec = vec![ 208, 122, 210, 232, 75, 39, 250, 0, 194, 98, 240, 161, 238, 160, 255, 53, 202, 9, 115, 84, 126, 106, 16, 111, 114, 241, 147, 194, 220, 131, 139, 68, ]; - let acc2_addr = vec![ + let acc2_addr: Vec = vec![ 231, 174, 119, 197, 239, 26, 5, 153, 147, 68, 175, 73, 159, 199, 138, 23, 5, 57, 141, 98, 237, 6, 207, 46, 20, 121, 246, 222, 248, 154, 57, 188, ]; let initial_acc1 = AccountInitialData { - addr: hex::encode(acc1_addr), + addr: acc1_addr.to_base58(), balance: 10000, }; let initial_acc2 = AccountInitialData { - addr: hex::encode(acc2_addr), + addr: acc2_addr.to_base58(), balance: 20000, }; diff --git a/wallet/Cargo.toml b/wallet/Cargo.toml index 48d79e2..b04d67e 100644 --- a/wallet/Cargo.toml +++ b/wallet/Cargo.toml @@ -16,7 +16,8 @@ nssa-core = { path = "../nssa/core" } base64.workspace = true bytemuck = "1.23.2" borsh.workspace = true -hex.workspace = true +base58.workspace = true +hex = "0.4.3" rand.workspace = true [dependencies.key_protocol] diff --git a/wallet/src/cli/account.rs b/wallet/src/cli/account.rs index 9ec4b20..f801e30 100644 --- a/wallet/src/cli/account.rs +++ b/wallet/src/cli/account.rs @@ -1,6 +1,7 @@ use std::str::FromStr; use anyhow::Result; +use base58::ToBase58; use clap::Subcommand; use common::transaction::NSSATransaction; use nssa::Address; @@ -18,9 +19,9 @@ pub enum AccountSubcommand { ///Fetch #[command(subcommand)] Fetch(FetchSubcommand), - ///Register + ///New #[command(subcommand)] - Register(RegisterSubcommand), + New(NewSubcommand), } ///Represents generic getter CLI subcommand @@ -72,7 +73,7 @@ pub enum FetchSubcommand { ///Represents generic register CLI subcommand #[derive(Subcommand, Debug, Clone)] -pub enum RegisterSubcommand { +pub enum NewSubcommand { ///Register new public account Public {}, ///Register new private account @@ -190,13 +191,13 @@ impl WalletSubcommand for FetchSubcommand { } } -impl WalletSubcommand for RegisterSubcommand { +impl WalletSubcommand for NewSubcommand { async fn handle_subcommand( self, wallet_core: &mut WalletCore, ) -> Result { match self { - RegisterSubcommand::Public {} => { + NewSubcommand::Public {} => { let addr = wallet_core.create_new_account_public(); println!("Generated new account with addr {addr}"); @@ -207,7 +208,7 @@ impl WalletSubcommand for RegisterSubcommand { Ok(SubcommandReturnValue::RegisterAccount { addr }) } - RegisterSubcommand::Private {} => { + NewSubcommand::Private {} => { let addr = wallet_core.create_new_account_private(); let (key, _) = wallet_core @@ -216,8 +217,8 @@ impl WalletSubcommand for RegisterSubcommand { .get_private_account(&addr) .unwrap(); - println!("Generated new account with addr {addr}"); - println!("With npk {}", hex::encode(&key.nullifer_public_key)); + println!("Generated new account with addr {}", addr.to_bytes().to_base58()); + println!("With npk {}", hex::encode(&key.nullifer_public_key.0)); println!( "With ipk {}", hex::encode(key.incoming_viewing_public_key.to_bytes()) @@ -245,8 +246,8 @@ impl WalletSubcommand for AccountSubcommand { AccountSubcommand::Fetch(fetch_subcommand) => { fetch_subcommand.handle_subcommand(wallet_core).await } - AccountSubcommand::Register(register_subcommand) => { - register_subcommand.handle_subcommand(wallet_core).await + AccountSubcommand::New(new_subcommand) => { + new_subcommand.handle_subcommand(wallet_core).await } } } diff --git a/wallet/src/cli/chain.rs b/wallet/src/cli/chain.rs index 4db18fc..aec2c9a 100644 --- a/wallet/src/cli/chain.rs +++ b/wallet/src/cli/chain.rs @@ -6,12 +6,12 @@ use crate::{SubcommandReturnValue, WalletCore, cli::WalletSubcommand}; ///Represents generic chain CLI subcommand #[derive(Subcommand, Debug, Clone)] pub enum ChainSubcommand { - GetLatestBlockId {}, - GetBlockAtId { + CurrentBlockId {}, + Block { #[arg(short, long)] id: u64, }, - GetTransactionAtHash { + Transaction { #[arg(short, long)] hash: String, }, @@ -23,17 +23,17 @@ impl WalletSubcommand for ChainSubcommand { wallet_core: &mut WalletCore, ) -> Result { match self { - ChainSubcommand::GetLatestBlockId {} => { + ChainSubcommand::CurrentBlockId {} => { let latest_block_res = wallet_core.sequencer_client.get_last_block().await?; println!("Last block id is {}", latest_block_res.last_block); } - ChainSubcommand::GetBlockAtId { id } => { + ChainSubcommand::Block { id } => { let block_res = wallet_core.sequencer_client.get_block(id).await?; println!("Last block id is {:#?}", block_res.block); } - ChainSubcommand::GetTransactionAtHash { hash } => { + ChainSubcommand::Transaction { hash } => { let tx_res = wallet_core .sequencer_client .get_transaction_by_hash(hash) diff --git a/wallet/src/lib.rs b/wallet/src/lib.rs index 833422f..5de7f5d 100644 --- a/wallet/src/lib.rs +++ b/wallet/src/lib.rs @@ -193,19 +193,19 @@ impl WalletCore { pub enum Command { ///Transfer command #[command(subcommand)] - Transfer(NativeTokenTransferProgramSubcommand), + AuthTransfer(NativeTokenTransferProgramSubcommand), ///Chain command #[command(subcommand)] - Chain(ChainSubcommand), + ChainInfo(ChainSubcommand), ///Chain command #[command(subcommand)] Account(AccountSubcommand), ///Pinata command #[command(subcommand)] - PinataProgram(PinataProgramSubcommand), + Pinata(PinataProgramSubcommand), ///Token command #[command(subcommand)] - TokenProgram(TokenProgramSubcommand), + Token(TokenProgramSubcommand), AuthenticatedTransferInitializePublicAccount {}, // Check the wallet can connect to the node and builtin local programs // match the remote versions @@ -237,12 +237,12 @@ pub async fn execute_subcommand(command: Command) -> Result { + Command::AuthTransfer(transfer_subcommand) => { transfer_subcommand .handle_subcommand(&mut wallet_core) .await? } - Command::Chain(chain_subcommand) => { + Command::ChainInfo(chain_subcommand) => { chain_subcommand.handle_subcommand(&mut wallet_core).await? } Command::Account(account_subcommand) => { @@ -250,7 +250,7 @@ pub async fn execute_subcommand(command: Command) -> Result { + Command::Pinata(pinata_subcommand) => { pinata_subcommand .handle_subcommand(&mut wallet_core) .await? @@ -304,7 +304,7 @@ pub async fn execute_subcommand(command: Command) -> Result { + Command::Token(token_subcommand) => { token_subcommand.handle_subcommand(&mut wallet_core).await? } };