diff --git a/contracts/examples/multisig/interact/src/multisig_interact.rs b/contracts/examples/multisig/interact/src/multisig_interact.rs index 0701841b6a..c21a772003 100644 --- a/contracts/examples/multisig/interact/src/multisig_interact.rs +++ b/contracts/examples/multisig/interact/src/multisig_interact.rs @@ -190,9 +190,9 @@ impl MultisigInteract { MultiValueVec::from([ self.wallet_address.to_address(), - carol.address().to_bytes().into(), - dan.address().to_bytes().into(), - eve.address().to_bytes().into(), + carol.to_address(), + dan.to_address(), + eve.to_address(), ]) } diff --git a/framework/base/src/types/interaction/markers/esdt_system_sc_address.rs b/framework/base/src/types/interaction/markers/esdt_system_sc_address.rs index e422553ca4..8487f001cd 100644 --- a/framework/base/src/types/interaction/markers/esdt_system_sc_address.rs +++ b/framework/base/src/types/interaction/markers/esdt_system_sc_address.rs @@ -1,4 +1,5 @@ use hex_literal::hex; +use multiversx_chain_core::types::Address; use multiversx_sc_codec::{EncodeErrorHandler, TopEncode, TopEncodeOutput}; use crate::{ @@ -26,6 +27,10 @@ impl ESDTSystemSCAddress { ManagedAddress::from(SYSTEM_SC_ADDRESS_BYTES) } + pub fn to_address(&self) -> Address { + SYSTEM_SC_ADDRESS_BYTES.into() + } + pub fn to_bech32_str(&self) -> &str { SYSTEM_SC_ADDRESS_BECH32 } diff --git a/framework/meta/src/cmd/wallet.rs b/framework/meta/src/cmd/wallet.rs index 673c00bdec..d8fd1f097c 100644 --- a/framework/meta/src/cmd/wallet.rs +++ b/framework/meta/src/cmd/wallet.rs @@ -1,10 +1,9 @@ use core::str; use crate::cli::{WalletAction, WalletArgs, WalletBech32Args, WalletConvertArgs, WalletNewArgs}; -use multiversx_sc::types::{self}; -use multiversx_sc_snippets::sdk::{ - crypto::public_key::PublicKey, data::sdk_address::SdkAddress, wallet::Wallet, -}; +use multiversx_sc::types::{self, Address}; +use multiversx_sc_snippets::sdk::bech32; +use multiversx_sc_snippets::sdk::{crypto::public_key::PublicKey, wallet::Wallet}; use multiversx_sc_snippets::{hex, imports::Bech32Address}; use std::{ fs::{self, File}, @@ -137,9 +136,9 @@ fn bech32_conversion(bech32_args: &WalletBech32Args) { } } -fn get_wallet_address(private_key: &str) -> SdkAddress { +fn get_wallet_address(private_key: &str) -> Address { let wallet = Wallet::from_private_key(private_key).unwrap(); - wallet.address() + wallet.to_address() } fn new(new_args: &WalletNewArgs) { @@ -151,7 +150,7 @@ fn new(new_args: &WalletNewArgs) { let (private_key_str, public_key_str) = Wallet::get_wallet_keys_mnemonic(mnemonic.to_string()); let address = get_wallet_address(private_key_str.as_str()); - println!("Wallet address: {}", address); + println!("Wallet address: {}", bech32::encode(&address)); match format { Some("pem") => { diff --git a/framework/snippets-base/src/account_tool.rs b/framework/snippets-base/src/account_tool.rs index 1604846e84..b5d80bb1eb 100644 --- a/framework/snippets-base/src/account_tool.rs +++ b/framework/snippets-base/src/account_tool.rs @@ -1,4 +1,4 @@ -use crate::sdk_core::data::{esdt::EsdtBalance, sdk_address::SdkAddress}; +use crate::sdk_core::data::esdt::EsdtBalance; use multiversx_chain_scenario_format::interpret_trait::IntoRaw; use multiversx_sc_scenario::{ imports::Bech32Address, @@ -40,34 +40,31 @@ fn build_scenario(set_state: SetStateStep) -> Scenario { pub async fn retrieve_account_as_scenario_set_state( api: &GatewayProxy, use_chain_simulator: bool, - address: &Bech32Address, + bech32_address: &Bech32Address, ) -> SetStateStep { - let sdk_address = SdkAddress::from_bech32_string(address.to_bech32_str()).unwrap(); - let sdk_account = api - .request(GetAccountRequest::new(&sdk_address)) - .await - .unwrap(); + let address = bech32_address.as_address(); + let sdk_account = api.request(GetAccountRequest::new(address)).await.unwrap(); let (account_esdt, account_esdt_roles, account_storage) = if use_chain_simulator { (HashMap::new(), HashMap::new(), HashMap::new()) } else { let account_esdt = api - .request(GetAccountEsdtTokensRequest::new(&sdk_address)) + .request(GetAccountEsdtTokensRequest::new(address)) .await .unwrap_or_else(|err| { - panic!("failed to retrieve ESDT tokens for address {address}: {err}") + panic!("failed to retrieve ESDT tokens for address {bech32_address}: {err}") }); let account_esdt_roles = api - .request(GetAccountEsdtRolesRequest::new(&sdk_address)) + .request(GetAccountEsdtRolesRequest::new(address)) .await .unwrap_or_else(|err| { - panic!("failed to retrieve ESDT roles for address {address}: {err}") + panic!("failed to retrieve ESDT roles for address {bech32_address}: {err}") }); let account_storage = api - .request(GetAccountStorageRequest::new(&sdk_address)) + .request(GetAccountStorageRequest::new(address)) .await .unwrap_or_else(|err| { - panic!("failed to retrieve storage for address {address}: {err}") + panic!("failed to retrieve storage for address {bech32_address}: {err}") }); (account_esdt, account_esdt_roles, account_storage) @@ -81,7 +78,7 @@ pub async fn retrieve_account_as_scenario_set_state Address { - let wallet_address = wallet.address(); + let address = wallet.to_address(); - self.send_user_funds(&wallet_address).await.unwrap(); - - let address: Address = wallet_address.into(); + self.send_user_funds(&address).await.unwrap(); self.sender_map.insert( address.clone(), Sender { diff --git a/framework/snippets-base/src/interactor_chain_simulator.rs b/framework/snippets-base/src/interactor_chain_simulator.rs index f37e7befb8..44943fe243 100644 --- a/framework/snippets-base/src/interactor_chain_simulator.rs +++ b/framework/snippets-base/src/interactor_chain_simulator.rs @@ -1,9 +1,7 @@ use anyhow::Error; -use multiversx_sdk::{ - data::sdk_address::SdkAddress, - gateway::{ - ChainSimulatorGenerateBlocksRequest, ChainSimulatorSendFundsRequest, GatewayAsyncService, - }, +use multiversx_sc_scenario::imports::Address; +use multiversx_sdk::gateway::{ + ChainSimulatorGenerateBlocksRequest, ChainSimulatorSendFundsRequest, GatewayAsyncService, }; use crate::InteractorBase; @@ -12,15 +10,13 @@ impl InteractorBase where GatewayProxy: GatewayAsyncService, { - pub async fn send_user_funds(&self, receiver: &SdkAddress) -> Result { + pub async fn send_user_funds(&self, receiver: &Address) -> Result { if !self.use_chain_simulator { return Ok(String::from("no-simulator")); } self.proxy - .request(ChainSimulatorSendFundsRequest::to_address( - receiver.to_bech32_string().unwrap(), - )) + .request(ChainSimulatorSendFundsRequest::to_address(receiver)) .await } diff --git a/framework/snippets-base/src/interactor_sender.rs b/framework/snippets-base/src/interactor_sender.rs index 8e81a7d82b..e3877dec0a 100644 --- a/framework/snippets-base/src/interactor_sender.rs +++ b/framework/snippets-base/src/interactor_sender.rs @@ -19,7 +19,7 @@ where pub async fn recall_nonce(&self, address: &Address) -> u64 { let account = self .proxy - .request(GetAccountRequest::new(&address.clone().into())) + .request(GetAccountRequest::new(address)) .await .expect("failed to retrieve account nonce"); account.nonce diff --git a/framework/snippets-base/src/network_response.rs b/framework/snippets-base/src/network_response.rs index fa6f7e1e78..10bc3e2328 100644 --- a/framework/snippets-base/src/network_response.rs +++ b/framework/snippets-base/src/network_response.rs @@ -154,7 +154,7 @@ fn process_new_issued_token_identifier(tx: &TransactionOnNetwork) -> Option Address { + let (_hrp, dest_address_bytes) = bech32::decode(bech32_address) + .unwrap_or_else(|err| panic!("bech32 decode error for {bech32_address}: {err}")); + if dest_address_bytes.len() != 32 { + panic!("Invalid address length after decoding") + } + + Address::from_slice(&dest_address_bytes) +} + +pub fn encode(address: &Address) -> String { + let hrp = Hrp::parse("erd").expect("invalid hrp"); + bech32::encode::(hrp, address.as_bytes()).expect("bech32 encode error") +} diff --git a/sdk/core/src/crypto/public_key.rs b/sdk/core/src/crypto/public_key.rs index 473a0388fe..448bf57e9d 100644 --- a/sdk/core/src/crypto/public_key.rs +++ b/sdk/core/src/crypto/public_key.rs @@ -2,7 +2,7 @@ use std::fmt::Display; use super::private_key::PrivateKey; use anyhow::Result; -use bech32::{self, Bech32, Hrp}; +use multiversx_chain_core::types::Address; use serde::{ de::{Deserialize, Deserializer}, ser::{Serialize, Serializer}, @@ -22,10 +22,8 @@ impl PublicKey { &self.0 } - pub fn to_address(&self) -> Result { - let hrp = Hrp::parse("erd")?; - let address = bech32::encode::(hrp, &self.0)?; - Ok(address) + pub fn to_address(&self) -> Address { + self.0.into() } pub fn from_hex_str(pk: &str) -> Result { diff --git a/sdk/core/src/data/sdk_address.rs b/sdk/core/src/data/sdk_address.rs index 0e9594bb42..0f995faab2 100644 --- a/sdk/core/src/data/sdk_address.rs +++ b/sdk/core/src/data/sdk_address.rs @@ -1,65 +1,52 @@ use std::fmt::{Debug, Display}; -use crate::crypto::public_key::PublicKey; use anyhow::Result; -use bech32::{Bech32, Hrp}; +use multiversx_chain_core::types::Address; use serde::{ de::{Deserialize, Deserializer}, ser::{Serialize, Serializer}, }; +/// Wrapper around a regular Address. +/// +/// Provides: +/// - serde serialization/deserialization as bech32 +/// - conversions to/from bech32 +/// +/// It should only be used in the sdk, to serialize/deserialize to JSON as bech32. +/// +/// It exists primarily because it is currently inconvenient to provide +/// bech32 and serde functionality to the base Address directly. #[derive(Clone)] -pub struct SdkAddress([u8; 32]); +pub struct SdkAddress(pub Address); impl SdkAddress { pub fn from_bytes(bytes: [u8; 32]) -> Self { - Self(bytes) + Self(Address::from(bytes)) } pub fn to_bytes(&self) -> [u8; 32] { - self.0 + *self.0.as_array() } pub fn from_bech32_string(bech32: &str) -> Result { - let (_hrp, data) = bech32::decode(bech32)?; - - let mut bits: [u8; 32] = [0u8; 32]; - bits.copy_from_slice(&data); - - Ok(Self(bits)) + Ok(SdkAddress(crate::bech32::decode(bech32))) } pub fn to_bech32_string(&self) -> Result { - let hrp = Hrp::parse("erd")?; - let address = bech32::encode::(hrp, &self.0)?; - Ok(address) - } - - pub fn is_valid(&self) -> bool { - self.0.len() == 32 + Ok(crate::bech32::encode(&self.0)) } } impl From for SdkAddress { fn from(value: multiversx_chain_core::types::Address) -> Self { - SdkAddress(*value.as_array()) + SdkAddress(value) } } impl From for multiversx_chain_core::types::Address { fn from(value: SdkAddress) -> Self { - multiversx_chain_core::types::Address::new(value.0) - } -} - -impl<'a> From<&'a PublicKey> for SdkAddress { - fn from(public_key: &PublicKey) -> SdkAddress { - let bytes = public_key.to_bytes(); - - let mut bits: [u8; 32] = [0u8; 32]; - bits.copy_from_slice(&bytes); - - SdkAddress(bits) + value.0 } } @@ -77,7 +64,7 @@ impl Debug for SdkAddress { impl Default for SdkAddress { fn default() -> Self { - SdkAddress::from_bytes([0u8; 32]) + SdkAddress(Address::zero()) } } @@ -110,7 +97,7 @@ pub mod tests { "erd1qqqqqqqqqqqqqpgqyfjjn43spw7teklwtpz4x5waygq2mluyj9ts0mdwn6", ) .unwrap(); - let encode = hex::encode(addr.to_bytes()); + let encode = hex::encode(addr.0.as_bytes()); assert_eq!( encode, "00000000000000000500226529d6300bbcbcdbee58455351dd2200adff849157" diff --git a/sdk/core/src/gateway.rs b/sdk/core/src/gateway.rs index c5163510a8..1512717a85 100644 --- a/sdk/core/src/gateway.rs +++ b/sdk/core/src/gateway.rs @@ -41,8 +41,8 @@ pub const DEVNET_GATEWAY: &str = "https://devnet-gateway.multiversx.com"; // MetachainShardId will be used to identify a shard ID as metachain pub const METACHAIN_SHARD_ID: u32 = 0xFFFFFFFF; -const ACCOUNT_ENDPOINT: &str = "address/"; -const KEYS_ENDPOINT: &str = "/keys/"; +const ACCOUNT_ENDPOINT: &str = "address"; +const KEYS_ENDPOINT: &str = "keys"; const NETWORK_CONFIG_ENDPOINT: &str = "network/config"; const NETWORK_ECONOMICS_ENDPOINT: &str = "network/economics"; const GET_NETWORK_STATUS_ENDPOINT: &str = "network/status"; @@ -51,7 +51,7 @@ const GET_HYPER_BLOCK_BY_HASH_ENDPOINT: &str = "hyperblock/by-hash"; const COST_TRANSACTION_ENDPOINT: &str = "transaction/cost"; const SEND_TRANSACTION_ENDPOINT: &str = "transaction/send"; const SEND_MULTIPLE_TRANSACTIONS_ENDPOINT: &str = "transaction/send-multiple"; -const GET_TRANSACTION_INFO_ENDPOINT: &str = "transaction/"; +const GET_TRANSACTION_INFO_ENDPOINT: &str = "transaction"; const WITH_RESULTS_QUERY_PARAM: &str = "?withResults=true"; const VM_VALUES_ENDPOINT: &str = "vm-values/query"; diff --git a/sdk/core/src/gateway/gateway_account.rs b/sdk/core/src/gateway/gateway_account.rs index daeaa3fd41..76eee4c736 100644 --- a/sdk/core/src/gateway/gateway_account.rs +++ b/sdk/core/src/gateway/gateway_account.rs @@ -1,19 +1,17 @@ -use crate::data::{ - account::{Account, AccountResponse}, - sdk_address::SdkAddress, -}; +use crate::data::account::{Account, AccountResponse}; use anyhow::anyhow; +use multiversx_chain_core::types::Address; use super::ACCOUNT_ENDPOINT; use super::{GatewayRequest, GatewayRequestType}; /// Retrieves an account info from the network (nonce, balance). pub struct GetAccountRequest<'a> { - pub address: &'a SdkAddress, + pub address: &'a Address, } impl<'a> GetAccountRequest<'a> { - pub fn new(address: &'a SdkAddress) -> Self { + pub fn new(address: &'a Address) -> Self { Self { address } } } @@ -28,7 +26,7 @@ impl<'a> GatewayRequest for GetAccountRequest<'a> { } fn get_endpoint(&self) -> String { - format!("{ACCOUNT_ENDPOINT}{}", self.address) + format!("{ACCOUNT_ENDPOINT}/{}", crate::bech32::encode(self.address)) } fn process_json(&self, decoded: Self::DecodedJson) -> anyhow::Result { diff --git a/sdk/core/src/gateway/gateway_account_esdt_roles.rs b/sdk/core/src/gateway/gateway_account_esdt_roles.rs index 98017843c7..421edd81b2 100644 --- a/sdk/core/src/gateway/gateway_account_esdt_roles.rs +++ b/sdk/core/src/gateway/gateway_account_esdt_roles.rs @@ -1,18 +1,17 @@ -use crate::data::{esdt::EsdtRolesResponse, sdk_address::SdkAddress}; +use crate::data::esdt::EsdtRolesResponse; use anyhow::anyhow; +use multiversx_chain_core::types::Address; use std::collections::HashMap; -use super::{GatewayRequest, GatewayRequestType}; - -const ACCOUNT_ENDPOINT: &str = "address/"; +use super::{GatewayRequest, GatewayRequestType, ACCOUNT_ENDPOINT}; /// Retrieves an all esdt roles of an account from the network. pub struct GetAccountEsdtRolesRequest<'a> { - pub address: &'a SdkAddress, + pub address: &'a Address, } impl<'a> GetAccountEsdtRolesRequest<'a> { - pub fn new(address: &'a SdkAddress) -> Self { + pub fn new(address: &'a Address) -> Self { Self { address } } } @@ -27,7 +26,10 @@ impl<'a> GatewayRequest for GetAccountEsdtRolesRequest<'a> { } fn get_endpoint(&self) -> String { - format!("{ACCOUNT_ENDPOINT}/{}/esdts/roles", self.address) + format!( + "{ACCOUNT_ENDPOINT}/{}/esdts/roles", + crate::bech32::encode(self.address) + ) } fn process_json(&self, decoded: Self::DecodedJson) -> anyhow::Result { diff --git a/sdk/core/src/gateway/gateway_account_esdt_tokens.rs b/sdk/core/src/gateway/gateway_account_esdt_tokens.rs index 5fbb37614a..72e27e54a9 100644 --- a/sdk/core/src/gateway/gateway_account_esdt_tokens.rs +++ b/sdk/core/src/gateway/gateway_account_esdt_tokens.rs @@ -1,19 +1,17 @@ -use crate::data::{ - esdt::{EsdtBalance, EsdtBalanceResponse}, - sdk_address::SdkAddress, -}; +use crate::data::esdt::{EsdtBalance, EsdtBalanceResponse}; use anyhow::anyhow; +use multiversx_chain_core::types::Address; use std::collections::HashMap; use super::{GatewayRequest, GatewayRequestType, ACCOUNT_ENDPOINT}; /// Retrieves an all esdt tokens of an account from the network. pub struct GetAccountEsdtTokensRequest<'a> { - pub address: &'a SdkAddress, + pub address: &'a Address, } impl<'a> GetAccountEsdtTokensRequest<'a> { - pub fn new(address: &'a SdkAddress) -> Self { + pub fn new(address: &'a Address) -> Self { Self { address } } } @@ -28,7 +26,10 @@ impl<'a> GatewayRequest for GetAccountEsdtTokensRequest<'a> { } fn get_endpoint(&self) -> String { - format!("{ACCOUNT_ENDPOINT}{}/esdt", self.address) + format!( + "{ACCOUNT_ENDPOINT}/{}/esdt", + crate::bech32::encode(self.address) + ) } fn process_json(&self, decoded: Self::DecodedJson) -> anyhow::Result { diff --git a/sdk/core/src/gateway/gateway_account_storage.rs b/sdk/core/src/gateway/gateway_account_storage.rs index 57f69943ad..6c1bffe55f 100644 --- a/sdk/core/src/gateway/gateway_account_storage.rs +++ b/sdk/core/src/gateway/gateway_account_storage.rs @@ -1,16 +1,17 @@ -use crate::data::{account_storage::AccountStorageResponse, sdk_address::SdkAddress}; +use crate::data::account_storage::AccountStorageResponse; use anyhow::anyhow; +use multiversx_chain_core::types::Address; use std::collections::HashMap; use super::{GatewayRequest, GatewayRequestType, ACCOUNT_ENDPOINT, KEYS_ENDPOINT}; /// Retrieves an account storage from the network. pub struct GetAccountStorageRequest<'a> { - pub address: &'a SdkAddress, + pub address: &'a Address, } impl<'a> GetAccountStorageRequest<'a> { - pub fn new(address: &'a SdkAddress) -> Self { + pub fn new(address: &'a Address) -> Self { Self { address } } } @@ -25,7 +26,10 @@ impl<'a> GatewayRequest for GetAccountStorageRequest<'a> { } fn get_endpoint(&self) -> String { - format!("{ACCOUNT_ENDPOINT}{}{KEYS_ENDPOINT}", self.address) + format!( + "{ACCOUNT_ENDPOINT}/{}/{KEYS_ENDPOINT}", + crate::bech32::encode(self.address) + ) } fn process_json(&self, decoded: Self::DecodedJson) -> anyhow::Result { diff --git a/sdk/core/src/gateway/gateway_chain_simulator_send_funds.rs b/sdk/core/src/gateway/gateway_chain_simulator_send_funds.rs index 5dd5ec5da6..32e9163428 100644 --- a/sdk/core/src/gateway/gateway_chain_simulator_send_funds.rs +++ b/sdk/core/src/gateway/gateway_chain_simulator_send_funds.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use anyhow::anyhow; +use multiversx_chain_core::types::Address; use super::{ gateway_chain_simulator_blocks::GenerateBlocksResponse, GatewayRequest, GatewayRequestType, @@ -13,10 +14,9 @@ pub struct ChainSimulatorSendFundsRequest { } impl ChainSimulatorSendFundsRequest { - /// TODO: convert to argument to Address - pub fn to_address(receiver: String) -> Self { + pub fn to_address(receiver: &Address) -> Self { let mut payload = HashMap::new(); - payload.insert("receiver", receiver); + payload.insert("receiver", crate::bech32::encode(receiver)); Self { payload } } } diff --git a/sdk/core/src/gateway/gateway_tx_info.rs b/sdk/core/src/gateway/gateway_tx_info.rs index 64ec5c31b5..f4d26e9d44 100644 --- a/sdk/core/src/gateway/gateway_tx_info.rs +++ b/sdk/core/src/gateway/gateway_tx_info.rs @@ -37,7 +37,7 @@ impl<'a> GatewayRequest for GetTxInfo<'a> { } fn get_endpoint(&self) -> String { - let mut endpoint = format!("{GET_TRANSACTION_INFO_ENDPOINT}{}", self.hash); + let mut endpoint = format!("{GET_TRANSACTION_INFO_ENDPOINT}/{}", self.hash); if self.with_results { endpoint += WITH_RESULTS_QUERY_PARAM; diff --git a/sdk/core/src/lib.rs b/sdk/core/src/lib.rs index 5e984580fd..9724d7ed54 100644 --- a/sdk/core/src/lib.rs +++ b/sdk/core/src/lib.rs @@ -1,3 +1,4 @@ +pub mod bech32; pub mod crypto; pub mod data; pub mod gateway; @@ -6,4 +7,5 @@ pub mod test_wallets; pub mod utils; pub mod wallet; +pub use multiversx_chain_core as chain_core; pub use retrieve_tx_on_network::retrieve_tx_on_network; diff --git a/sdk/core/src/wallet.rs b/sdk/core/src/wallet.rs index 3f9de1f350..d846b803a4 100644 --- a/sdk/core/src/wallet.rs +++ b/sdk/core/src/wallet.rs @@ -11,6 +11,7 @@ use anyhow::Result; use bip39::{Language, Mnemonic}; use ctr::{cipher::StreamCipher, Ctr128BE}; use hmac::{Hmac, Mac}; +use multiversx_chain_core::types::Address; use pbkdf2::pbkdf2; use rand::RngCore; use scrypt::{scrypt, Params}; @@ -24,7 +25,7 @@ use crate::{ private_key::{PrivateKey, PRIVATE_KEY_LENGTH}, public_key::PublicKey, }, - data::{keystore::*, sdk_address::SdkAddress, transaction::Transaction}, + data::{keystore::*, transaction::Transaction}, utils::*, }; @@ -192,9 +193,16 @@ impl Wallet { Ok(priv_key) } - pub fn address(&self) -> SdkAddress { - let public_key = PublicKey::from(&self.priv_key); - SdkAddress::from(&public_key) + #[deprecated( + since = "0.54.0", + note = "Renamed to `to_address`, type changed to multiversx_chain_core::types::Address" + )] + pub fn address(&self) -> crate::data::sdk_address::SdkAddress { + crate::data::sdk_address::SdkAddress(self.to_address()) + } + + pub fn to_address(&self) -> Address { + PublicKey::from(&self.priv_key).to_address() } pub fn sign_tx(&self, unsign_tx: &Transaction) -> [u8; 64] { @@ -287,7 +295,7 @@ impl Wallet { pub fn encrypt_keystore( data: &[u8], - address: &SdkAddress, + address: &Address, public_key: &str, password: &str, ) -> String { @@ -336,7 +344,7 @@ impl Wallet { version: KEYSTORE_VERSION, kind: "secretKey".to_string(), address: public_key.to_string(), - bech32: address.to_string(), + bech32: crate::bech32::encode(address), }; let mut keystore_json: String = serde_json::to_string_pretty(&keystore).unwrap(); @@ -344,11 +352,7 @@ impl Wallet { keystore_json } - pub fn generate_pem_content( - address: &SdkAddress, - private_key: &str, - public_key: &str, - ) -> String { + pub fn generate_pem_content(address: &Address, private_key: &str, public_key: &str) -> String { let concat_keys = format!("{}{}", private_key, public_key); let concat_keys_b64 = base64_encode(concat_keys); @@ -360,11 +364,9 @@ impl Wallet { .collect::>() .join("\n"); + let address_bech32 = crate::bech32::encode(address); let pem_content = format!( - "-----BEGIN PRIVATE KEY for {}-----\n{}\n-----END PRIVATE KEY for {}-----\n", - address.to_bech32_string().unwrap(), - formatted_key, - address.to_bech32_string().unwrap() + "-----BEGIN PRIVATE KEY for {address_bech32}-----\n{formatted_key}\n-----END PRIVATE KEY for {address_bech32}-----\n" ); pem_content diff --git a/sdk/core/tests/wallet_test.rs b/sdk/core/tests/wallet_test.rs index 6149996852..e82c6aa689 100644 --- a/sdk/core/tests/wallet_test.rs +++ b/sdk/core/tests/wallet_test.rs @@ -1,8 +1,8 @@ use bip39::Mnemonic; -use multiversx_sdk::{ - crypto::public_key::PublicKey, data::sdk_address::SdkAddress, wallet::Wallet, -}; +use multiversx_chain_core::types::Address; +use multiversx_sdk::bech32; +use multiversx_sdk::{crypto::public_key::PublicKey, wallet::Wallet}; use std::fs::{self, File}; use std::io::Write; @@ -20,7 +20,7 @@ fn test_private_key_from_mnemonic() { let private_key = Wallet::get_private_key_from_mnemonic(mnemonic.clone(), 0, 0); let public_key = PublicKey::from(&private_key); - let address = SdkAddress::from(&public_key); + let address = public_key.to_address(); assert_eq!( "0b7966138e80b8f3bb64046f56aea4250fd7bacad6ed214165cea6767fd0bc2c", private_key.to_string() @@ -31,12 +31,12 @@ fn test_private_key_from_mnemonic() { ); assert_eq!( "erd1mlh7q3fcgrjeq0et65vaaxcw6m5ky8jhu296pdxpk9g32zga6uhsemxx2a", - address.to_string() + bech32::encode(&address) ); let private_key = Wallet::get_private_key_from_mnemonic(mnemonic, 0, 1); let public_key = PublicKey::from(&private_key); - let address = SdkAddress::from(&public_key); + let address = public_key.to_address(); assert_eq!( "1648ad209d6b157a289884933e3bb30f161ec7113221ec16f87c3578b05830b0", private_key.to_string() @@ -47,17 +47,17 @@ fn test_private_key_from_mnemonic() { ); assert_eq!( "erd147877pc2tqv88yfvewhmdfuth845uqpsskky8kaalglzp6unem0qpwh982", - address.to_string() + bech32::encode(&address) ); } #[test] fn test_load_from_pem() { let wallet = Wallet::from_pem_file("tests/alice.pem").unwrap(); - let addr = wallet.address(); + let address = wallet.to_address(); assert_eq!( - addr.to_bech32_string().unwrap(), - "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th" + "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", + bech32::encode(&address) ); } @@ -66,9 +66,9 @@ fn write_to_file(content: &str, file: &str) { file.write_all(content.as_bytes()).unwrap(); } -fn create_keystore_file_from_scratch(file: &str) -> SdkAddress { +fn create_keystore_file_from_scratch(file: &str) -> Address { let wallet = Wallet::from_private_key(ALICE_PRIVATE_KEY).unwrap(); - let address = wallet.address(); + let address = wallet.to_address(); let concatenated_keys = format!("{}{}", ALICE_PRIVATE_KEY, ALICE_PUBLIC_KEY); let hex_decoded_keys = hex::decode(concatenated_keys).unwrap(); diff --git a/sdk/http/examples/account.rs b/sdk/http/examples/account.rs index 86e72e2d42..c9020b79ce 100644 --- a/sdk/http/examples/account.rs +++ b/sdk/http/examples/account.rs @@ -9,7 +9,7 @@ async fn main() { .unwrap(); let blockchain = GatewayHttpProxy::new(DEVNET_GATEWAY.to_string()); - let account = blockchain.get_account(&addr).await.unwrap(); + let account = blockchain.get_account(&addr.0).await.unwrap(); println!("account: {account:#?}"); } diff --git a/sdk/http/examples/account_storage.rs b/sdk/http/examples/account_storage.rs index a5825e5140..2a91ba34c2 100644 --- a/sdk/http/examples/account_storage.rs +++ b/sdk/http/examples/account_storage.rs @@ -9,7 +9,7 @@ async fn main() { .unwrap(); let blockchain = GatewayHttpProxy::new(DEVNET_GATEWAY.to_string()); - let account_storage = blockchain.get_account_storage_keys(&addr).await.unwrap(); + let account_storage = blockchain.get_account_storage_keys(&addr.0).await.unwrap(); println!("Account Storage: {account_storage:#?}"); } diff --git a/sdk/http/examples/get_esdt_tokens.rs b/sdk/http/examples/get_esdt_tokens.rs index 9c175931f0..a95e810507 100644 --- a/sdk/http/examples/get_esdt_tokens.rs +++ b/sdk/http/examples/get_esdt_tokens.rs @@ -9,7 +9,7 @@ async fn main() { .unwrap(); let blockchain = GatewayHttpProxy::new(DEVNET_GATEWAY.to_string()); - let balances = blockchain.get_account_esdt_tokens(&addr).await.unwrap(); + let balances = blockchain.get_account_esdt_tokens(&addr.0).await.unwrap(); println!("{balances:#?}"); } diff --git a/sdk/http/examples/sign_tx.rs b/sdk/http/examples/sign_tx.rs index a2e15d4226..c0106abf87 100644 --- a/sdk/http/examples/sign_tx.rs +++ b/sdk/http/examples/sign_tx.rs @@ -1,4 +1,7 @@ -use multiversx_sdk::{data::transaction::Transaction, wallet::Wallet}; +use multiversx_sdk::{ + data::{sdk_address::SdkAddress, transaction::Transaction}, + wallet::Wallet, +}; use multiversx_sdk_http::{GatewayHttpProxy, DEVNET_GATEWAY}; #[tokio::main] @@ -7,7 +10,7 @@ async fn main() { "1648ad209d6b157a289884933e3bb30f161ec7113221ec16f87c3578b05830b0", ) .unwrap(); - let addr = wl.address(); + let addr = wl.to_address(); let blockchain = GatewayHttpProxy::new(DEVNET_GATEWAY.to_string()); let network_config = blockchain.get_network_config().await.unwrap(); @@ -19,8 +22,8 @@ async fn main() { let mut unsign_tx = Transaction { nonce: arg.nonce, value: "0".to_string(), - receiver: addr.clone(), - sender: addr.clone(), + receiver: SdkAddress(addr.clone()), + sender: SdkAddress(addr.clone()), gas_price: arg.gas_price, gas_limit: arg.gas_limit, data: arg.data, diff --git a/sdk/http/examples/sign_txs.rs b/sdk/http/examples/sign_txs.rs index 272a89f720..2ac2715591 100644 --- a/sdk/http/examples/sign_txs.rs +++ b/sdk/http/examples/sign_txs.rs @@ -1,4 +1,7 @@ -use multiversx_sdk::{data::transaction::Transaction, wallet::Wallet}; +use multiversx_sdk::{ + data::{sdk_address::SdkAddress, transaction::Transaction}, + wallet::Wallet, +}; use multiversx_sdk_http::{GatewayHttpProxy, DEVNET_GATEWAY}; #[tokio::main] @@ -7,7 +10,7 @@ async fn main() { "1648ad209d6b157a289884933e3bb30f161ec7113221ec16f87c3578b05830b0", ) .unwrap(); - let addr = wl.address(); + let addr = wl.to_address(); let blockchain = GatewayHttpProxy::new(DEVNET_GATEWAY.to_string()); let network_config = blockchain.get_network_config().await.unwrap(); @@ -19,8 +22,8 @@ async fn main() { let mut unsign_tx = Transaction { nonce: arg.nonce, value: "1000000000000000000".to_string(), - receiver: addr.clone(), - sender: addr.clone(), + receiver: SdkAddress(addr.clone()), + sender: SdkAddress(addr.clone()), gas_price: arg.gas_price, gas_limit: arg.gas_limit, data: arg.data, diff --git a/sdk/http/examples/tx_default_args.rs b/sdk/http/examples/tx_default_args.rs index 49e58cfea9..6dc3e90f17 100644 --- a/sdk/http/examples/tx_default_args.rs +++ b/sdk/http/examples/tx_default_args.rs @@ -11,7 +11,7 @@ async fn main() { .unwrap(); let arg = blockchain - .get_default_transaction_arguments(&addr, &network_config) + .get_default_transaction_arguments(&addr.0, &network_config) .await .unwrap(); diff --git a/sdk/http/src/gateway_http_proxy/http_account.rs b/sdk/http/src/gateway_http_proxy/http_account.rs index 41e8b24160..95001afd73 100644 --- a/sdk/http/src/gateway_http_proxy/http_account.rs +++ b/sdk/http/src/gateway_http_proxy/http_account.rs @@ -1,6 +1,7 @@ use anyhow::Result; use multiversx_sdk::{ - data::{account::Account, esdt::EsdtBalance, sdk_address::SdkAddress}, + chain_core::types::Address, + data::{account::Account, esdt::EsdtBalance}, gateway::{ GetAccountEsdtRolesRequest, GetAccountEsdtTokensRequest, GetAccountRequest, GetAccountStorageRequest, @@ -12,14 +13,14 @@ use super::GatewayHttpProxy; impl GatewayHttpProxy { // get_account retrieves an account info from the network (nonce, balance) - pub async fn get_account(&self, address: &SdkAddress) -> Result { + pub async fn get_account(&self, address: &Address) -> Result { self.http_request(GetAccountRequest::new(address)).await } // get_account_esdt_roles retrieves an all esdt roles of an account from the network pub async fn get_account_esdt_roles( &self, - address: &SdkAddress, + address: &Address, ) -> Result>> { self.http_request(GetAccountEsdtRolesRequest::new(address)) .await @@ -28,7 +29,7 @@ impl GatewayHttpProxy { // get_account_esdt_tokens retrieves an all esdt token of an account from the network pub async fn get_account_esdt_tokens( &self, - address: &SdkAddress, + address: &Address, ) -> Result> { self.http_request(GetAccountEsdtTokensRequest::new(address)) .await @@ -37,7 +38,7 @@ impl GatewayHttpProxy { // get_account_esdt_tokens retrieves an all esdt token of an account from the network pub async fn get_account_storage_keys( &self, - address: &SdkAddress, + address: &Address, ) -> Result> { self.http_request(GetAccountStorageRequest::new(address)) .await diff --git a/sdk/http/src/gateway_http_proxy/http_chain_simulator.rs b/sdk/http/src/gateway_http_proxy/http_chain_simulator.rs index 7da3940fad..32cc83ef3a 100644 --- a/sdk/http/src/gateway_http_proxy/http_chain_simulator.rs +++ b/sdk/http/src/gateway_http_proxy/http_chain_simulator.rs @@ -1,15 +1,16 @@ use super::GatewayHttpProxy; use anyhow::Error; -use multiversx_sdk::gateway::{ - ChainSimulatorGenerateBlocksRequest, ChainSimulatorSendFundsRequest, GatewayAsyncService, +use multiversx_sdk::{ + chain_core::types::Address, + gateway::{ + ChainSimulatorGenerateBlocksRequest, ChainSimulatorSendFundsRequest, GatewayAsyncService, + }, }; impl GatewayHttpProxy { - pub async fn send_user_funds(&self, receiver: &str) -> Result { - self.request(ChainSimulatorSendFundsRequest::to_address( - receiver.to_owned(), - )) - .await + pub async fn send_user_funds(&self, receiver: &Address) -> Result { + self.request(ChainSimulatorSendFundsRequest::to_address(receiver)) + .await } pub async fn generate_blocks(&self, num_blocks: u64) -> Result { diff --git a/sdk/http/src/gateway_http_proxy/http_tx.rs b/sdk/http/src/gateway_http_proxy/http_tx.rs index 36da680b05..1c0ffaf60c 100644 --- a/sdk/http/src/gateway_http_proxy/http_tx.rs +++ b/sdk/http/src/gateway_http_proxy/http_tx.rs @@ -1,5 +1,6 @@ use anyhow::Result; use multiversx_sdk::{ + chain_core::types::Address, data::{ network_config::NetworkConfig, sdk_address::SdkAddress, @@ -48,7 +49,7 @@ impl GatewayHttpProxy { // get_default_transaction_arguments will prepare the transaction creation argument by querying the account's info pub async fn get_default_transaction_arguments( &self, - address: &SdkAddress, + address: &Address, network_configs: &NetworkConfig, ) -> Result { let account = self.get_account(address).await?; @@ -56,8 +57,8 @@ impl GatewayHttpProxy { Ok(ArgCreateTransaction { nonce: account.nonce, value: "".to_string(), - rcv_addr: address.clone(), - snd_addr: address.clone(), + rcv_addr: SdkAddress(address.clone()), + snd_addr: SdkAddress(address.clone()), gas_price: network_configs.min_gas_price, gas_limit: network_configs.min_gas_limit, data: None,