diff --git a/android/app/src/androidTest/java/com/trustwallet/core/app/blockchains/CoinAddressDerivationTests.kt b/android/app/src/androidTest/java/com/trustwallet/core/app/blockchains/CoinAddressDerivationTests.kt index 763f87020de..104889738ab 100644 --- a/android/app/src/androidTest/java/com/trustwallet/core/app/blockchains/CoinAddressDerivationTests.kt +++ b/android/app/src/androidTest/java/com/trustwallet/core/app/blockchains/CoinAddressDerivationTests.kt @@ -124,7 +124,7 @@ class CoinAddressDerivationTests { NERVOS -> assertEquals("ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqdtyq04tvp02wectaumxn0664yw2jd53lqk4mxg3", address) EVERSCALE -> assertEquals("0:0c39661089f86ec5926ea7d4ee4223d634ba4ed6dcc2e80c7b6a8e6d59f79b04", address) TON -> assertEquals("UQDgEMqToTacHic7SnvnPFmvceG5auFkCcAw0mSCvzvKUaT4", address) - APTOS -> assertEquals("0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", address) + APTOS -> assertEquals("0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", address) NEBL -> assertEquals("NgDVaXAwNgBwb88xLiFKomfBmPkEh9F2d7", address) SUI -> assertEquals("0xada112cfb90b44ba889cc5d39ac2bf46281e4a91f7919c693bcd9b8323e81ed2", address) HEDERA -> assertEquals("0.0.302a300506032b657003210049eba62f64d0d941045595d9433e65d84ecc46bcdb1421de55e05fcf2d8357d5", address) diff --git a/kotlin/wallet-core-kotlin/src/commonTest/kotlin/com/trustwallet/core/test/CoinAddressDerivationTests.kt b/kotlin/wallet-core-kotlin/src/commonTest/kotlin/com/trustwallet/core/test/CoinAddressDerivationTests.kt index 97a01d45f2d..c865dcfb859 100644 --- a/kotlin/wallet-core-kotlin/src/commonTest/kotlin/com/trustwallet/core/test/CoinAddressDerivationTests.kt +++ b/kotlin/wallet-core-kotlin/src/commonTest/kotlin/com/trustwallet/core/test/CoinAddressDerivationTests.kt @@ -117,7 +117,7 @@ class CoinAddressDerivationTests { Nervos -> "ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqdtyq04tvp02wectaumxn0664yw2jd53lqk4mxg3" Everscale -> "0:0c39661089f86ec5926ea7d4ee4223d634ba4ed6dcc2e80c7b6a8e6d59f79b04" TON -> "UQDgEMqToTacHic7SnvnPFmvceG5auFkCcAw0mSCvzvKUaT4" - Aptos -> "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30" + Aptos -> "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30" Nebl -> "NgDVaXAwNgBwb88xLiFKomfBmPkEh9F2d7" Sui -> "0xada112cfb90b44ba889cc5d39ac2bf46281e4a91f7919c693bcd9b8323e81ed2" Hedera -> "0.0.302a300506032b657003210049eba62f64d0d941045595d9433e65d84ecc46bcdb1421de55e05fcf2d8357d5" diff --git a/rust/chains/tw_aptos/src/address.rs b/rust/chains/tw_aptos/src/address.rs index 3915750c625..2a026667321 100644 --- a/rust/chains/tw_aptos/src/address.rs +++ b/rust/chains/tw_aptos/src/address.rs @@ -3,7 +3,9 @@ // Copyright © 2017 Trust Wallet. use move_core_types::account_address::{AccountAddress, AccountAddressParseError}; +use serde::Serialize; use std::fmt::{Display, Formatter}; +use std::ops::RangeInclusive; use std::str::FromStr; use tw_coin_entry::coin_entry::CoinAddress; use tw_coin_entry::error::prelude::*; @@ -11,6 +13,15 @@ use tw_hash::sha3::sha3_256; use tw_keypair::ed25519; use tw_memory::Data; +/// `0x` prefix + 64 hex chars (32 bytes * 2). +const NUM_CHARS: usize = AccountAddress::LENGTH * 2 + 2; +/// There can be up to 10 special addresses in the range of 0x0 to 0xa. +/// https://aptos.dev/network/blockchain/accounts#account-address +const SPECIAL_ADDR_RANGE: RangeInclusive = 0x0..=0xa; +/// 0x + 1 hex char. +const SPECIAL_ADDR_NUM_CHARS: usize = 3; +const RADIX: u32 = 16; + #[repr(u8)] pub enum Scheme { Ed25519 = 0, @@ -38,11 +49,22 @@ impl Address { pub fn inner(&self) -> AccountAddress { self.addr } + + pub fn is_special_address(&self) -> bool { + let bytes = self.addr.as_ref(); + + let prefix = &bytes[..bytes.len() - 1]; + let last_byte = bytes[bytes.len() - 1]; + prefix.iter().all(|&b| b == 0) && SPECIAL_ADDR_RANGE.contains(&last_byte) + } } impl Display for Address { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.addr.to_hex_literal()) + if self.is_special_address() { + return write!(f, "0x{}", self.addr.short_str_lossless()); + } + write!(f, "{:#x}", self.addr) } } @@ -61,34 +83,48 @@ pub fn from_account_error(_err: AccountAddressParseError) -> AddressError { impl FromStr for Address { type Err = AddressError; - // https://github.com/aptos-labs/aptos-core/blob/261019cbdafe1c514c60c2b74357ea2c77d25e67/types/src/account_address.rs#L44 + /// In Trust Wallet Core, we only support the removal of zeros for special addresses ranging from 0x0 to 0xa. + /// All other addresses must be 32 bytes (64 hex characters) with required 0x prefix. + /// https://aptos.dev/network/blockchain/accounts#account-address fn from_str(s: &str) -> Result { - const NUM_CHARS: usize = AccountAddress::LENGTH * 2; - let mut has_0x = false; - let mut working = s.trim(); - - // Checks if it has a 0x at the beginning, which is okay - if working.starts_with("0x") { - has_0x = true; - working = &working[2..]; + if !s.starts_with("0x") { + return Err(AddressError::MissingPrefix); } - if working.len() > NUM_CHARS || (!has_0x && working.len() < NUM_CHARS) { - return Err(AddressError::InvalidInput); + if s.len() == SPECIAL_ADDR_NUM_CHARS { + let special_addr = + u8::from_str_radix(&s[2..], RADIX).map_err(|_| AddressError::FromHexError)?; + if !SPECIAL_ADDR_RANGE.contains(&special_addr) { + return Err(AddressError::InvalidInput); + } + + let mut bytes = [0u8; AccountAddress::LENGTH]; + bytes[AccountAddress::LENGTH - 1] = special_addr; + + return Ok(Address { + addr: AccountAddress::from(bytes), + }); } - if !working.chars().all(|c| char::is_ascii_hexdigit(&c)) { + if s.len() != NUM_CHARS { return Err(AddressError::InvalidInput); } - let addr = if has_0x { - AccountAddress::from_hex_literal(s.trim()) + let addr = AccountAddress::from_hex_literal(s).map_err(from_account_error)?; + Ok(Address { addr }) + } +} + +impl Serialize for Address { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + if serializer.is_human_readable() { + serializer.serialize_str(&self.to_string()) } else { - AccountAddress::from_str(s.trim()) + self.addr.serialize(serializer) } - .map_err(from_account_error)?; - - Ok(Address { addr }) } } diff --git a/rust/chains/tw_aptos/src/aptos_move_packages.rs b/rust/chains/tw_aptos/src/aptos_move_packages.rs index 913b3393b9c..70d4c76d00c 100644 --- a/rust/chains/tw_aptos/src/aptos_move_packages.rs +++ b/rust/chains/tw_aptos/src/aptos_move_packages.rs @@ -4,6 +4,7 @@ use std::str::FromStr; +use crate::address::Address; use crate::transaction_payload::{EntryFunction, TransactionPayload}; use move_core_types::account_address::AccountAddress; use move_core_types::ident_str; @@ -12,10 +13,7 @@ use serde_json::json; use tw_coin_entry::error::prelude::*; use tw_encoding::bcs; -pub fn aptos_account_transfer( - to: AccountAddress, - amount: u64, -) -> SigningResult { +pub fn aptos_account_transfer(to: Address, amount: u64) -> SigningResult { Ok(TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( AccountAddress::new([ @@ -27,11 +25,11 @@ pub fn aptos_account_transfer( ident_str!("transfer").to_owned(), vec![], vec![bcs::encode(&to)?, bcs::encode(&amount)?], - json!([to.to_hex_literal(), amount.to_string()]), + json!([to.to_string(), amount.to_string()]), ))) } -pub fn aptos_account_create_account(auth_key: AccountAddress) -> SigningResult { +pub fn aptos_account_create_account(auth_key: Address) -> SigningResult { Ok(TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( AccountAddress::new([ @@ -43,13 +41,13 @@ pub fn aptos_account_create_account(auth_key: AccountAddress) -> SigningResult SigningResult { Ok(TransactionPayload::EntryFunction(EntryFunction::new( @@ -63,13 +61,13 @@ pub fn coin_transfer( ident_str!("transfer").to_owned(), vec![coin_type], vec![bcs::encode(&to)?, bcs::encode(&amount)?], - json!([to.to_hex_literal(), amount.to_string()]), + json!([to.to_string(), amount.to_string()]), ))) } pub fn aptos_account_transfer_coins( coin_type: TypeTag, - to: AccountAddress, + to: Address, amount: u64, ) -> SigningResult { Ok(TransactionPayload::EntryFunction(EntryFunction::new( @@ -83,13 +81,13 @@ pub fn aptos_account_transfer_coins( ident_str!("transfer_coins").to_owned(), vec![coin_type], vec![bcs::encode(&to)?, bcs::encode(&amount)?], - json!([to.to_hex_literal(), amount.to_string()]), + json!([to.to_string(), amount.to_string()]), ))) } pub fn token_transfers_offer_script( - receiver: AccountAddress, - creator: AccountAddress, + receiver: Address, + creator: Address, collection: Vec, name: Vec, property_version: u64, @@ -114,8 +112,8 @@ pub fn token_transfers_offer_script( bcs::encode(&amount)?, ], json!([ - receiver.to_hex_literal(), - creator.to_hex_literal(), + receiver.to_string(), + creator.to_string(), String::from_utf8_lossy(&collection), String::from_utf8_lossy(&name), property_version.to_string(), @@ -125,8 +123,8 @@ pub fn token_transfers_offer_script( } pub fn token_transfers_cancel_offer_script( - receiver: AccountAddress, - creator: AccountAddress, + receiver: Address, + creator: Address, collection: Vec, name: Vec, property_version: u64, @@ -149,8 +147,8 @@ pub fn token_transfers_cancel_offer_script( bcs::encode(&property_version)?, ], json!([ - receiver.to_hex_literal(), - creator.to_hex_literal(), + receiver.to_string(), + creator.to_string(), String::from_utf8_lossy(&collection), String::from_utf8_lossy(&name), property_version.to_string() @@ -159,8 +157,8 @@ pub fn token_transfers_cancel_offer_script( } pub fn token_transfers_claim_script( - sender: AccountAddress, - creator: AccountAddress, + sender: Address, + creator: Address, collection: Vec, name: Vec, property_version: u64, @@ -183,8 +181,8 @@ pub fn token_transfers_claim_script( bcs::encode(&property_version)?, ], json!([ - sender.to_hex_literal(), - creator.to_hex_literal(), + sender.to_string(), + creator.to_string(), String::from_utf8_lossy(&collection), String::from_utf8_lossy(&name), property_version.to_string() @@ -193,8 +191,8 @@ pub fn token_transfers_claim_script( } pub fn fungible_asset_transfer( - metadata_address: AccountAddress, - to: AccountAddress, + metadata_address: Address, + to: Address, amount: u64, ) -> SigningResult { Ok(TransactionPayload::EntryFunction(EntryFunction::new( @@ -214,8 +212,8 @@ pub fn fungible_asset_transfer( bcs::encode(&amount)?, ], json!([ - metadata_address.to_hex_literal(), - to.to_hex_literal(), + metadata_address.to_string(), + to.to_string(), amount.to_string() ]), ))) diff --git a/rust/chains/tw_aptos/src/aptos_move_types.rs b/rust/chains/tw_aptos/src/aptos_move_types.rs index f364b7f6e42..3e46ffb2055 100644 --- a/rust/chains/tw_aptos/src/aptos_move_types.rs +++ b/rust/chains/tw_aptos/src/aptos_move_types.rs @@ -31,12 +31,6 @@ impl From
for AccountAddress { } } -impl From<&Address> for AccountAddress { - fn from(address: &Address) -> Self { - address.0 - } -} - /// A wrapper of a Move identifier #[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)] pub struct IdentifierWrapper(pub Identifier); @@ -53,12 +47,6 @@ impl From for IdentifierWrapper { } } -impl From<&Identifier> for IdentifierWrapper { - fn from(value: &Identifier) -> IdentifierWrapper { - Self(value.clone()) - } -} - /// A Move struct tag for referencing an onchain struct type #[derive(Clone, Debug, PartialEq, Eq)] pub struct MoveStructTag { @@ -80,17 +68,6 @@ impl From for MoveStructTag { } } -impl From<&StructTag> for MoveStructTag { - fn from(tag: &StructTag) -> Self { - Self { - address: tag.address.into(), - module: IdentifierWrapper::from(&tag.module), - name: IdentifierWrapper::from(&tag.name), - generic_type_params: tag.type_params.iter().map(MoveType::from).collect(), - } - } -} - impl TryFrom for StructTag { type Error = EncodingError; @@ -197,26 +174,6 @@ impl From for MoveType { } } -impl From<&TypeTag> for MoveType { - fn from(tag: &TypeTag) -> Self { - match tag { - TypeTag::Bool => MoveType::Bool, - TypeTag::U8 => MoveType::U8, - TypeTag::U16 => MoveType::U16, - TypeTag::U32 => MoveType::U32, - TypeTag::U64 => MoveType::U64, - TypeTag::U128 => MoveType::U128, - TypeTag::U256 => MoveType::U256, - TypeTag::Address => MoveType::Address, - TypeTag::Signer => MoveType::Signer, - TypeTag::Vector(v) => MoveType::Vector { - items: Box::new(MoveType::from(v.as_ref())), - }, - TypeTag::Struct(v) => MoveType::Struct((&**v).into()), - } - } -} - impl TryFrom for TypeTag { type Error = EncodingError; diff --git a/rust/chains/tw_aptos/src/compiler.rs b/rust/chains/tw_aptos/src/compiler.rs index 53b9df11bd4..5700aa3e870 100644 --- a/rust/chains/tw_aptos/src/compiler.rs +++ b/rust/chains/tw_aptos/src/compiler.rs @@ -26,7 +26,7 @@ impl Compiler { .into_tw() .context("Invalid sender address")?; let signed_tx = builder - .sender(sender.inner()) + .sender(sender) .sequence_number(input.sequence_number as u64) .build()? .pre_image()?; @@ -61,7 +61,7 @@ impl Compiler { .or_tw_err(SigningErrorType::Error_signatures_count)?; let signed_tx = builder - .sender(sender.inner()) + .sender(sender) .sequence_number(input.sequence_number as u64) .build()? .compile(signature.to_vec(), public_key.to_vec())?; diff --git a/rust/chains/tw_aptos/src/liquid_staking.rs b/rust/chains/tw_aptos/src/liquid_staking.rs index 2ce311e4350..ce58a374682 100644 --- a/rust/chains/tw_aptos/src/liquid_staking.rs +++ b/rust/chains/tw_aptos/src/liquid_staking.rs @@ -2,9 +2,9 @@ // // Copyright © 2017 Trust Wallet. -use crate::address::from_account_error; +use crate::address::Address; use crate::transaction_payload::{EntryFunction, TransactionPayload}; -use move_core_types::{account_address::AccountAddress, ident_str, language_storage::ModuleId}; +use move_core_types::{ident_str, language_storage::ModuleId}; use serde_json::json; use std::str::FromStr; use tw_coin_entry::error::prelude::*; @@ -15,12 +15,12 @@ use tw_proto::{ }; pub fn tortuga_stake( - smart_contract_address: AccountAddress, + smart_contract_address: Address, amount: u64, ) -> SigningResult { Ok(TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( - smart_contract_address, + smart_contract_address.inner(), ident_str!("stake_router").to_owned(), ), ident_str!("stake").to_owned(), @@ -31,12 +31,12 @@ pub fn tortuga_stake( } pub fn tortuga_unstake( - smart_contract_address: AccountAddress, + smart_contract_address: Address, amount: u64, ) -> SigningResult { Ok(TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( - smart_contract_address, + smart_contract_address.inner(), ident_str!("stake_router").to_owned(), ), ident_str!("unstake").to_owned(), @@ -47,12 +47,12 @@ pub fn tortuga_unstake( } pub fn tortuga_claim( - smart_contract_address: AccountAddress, + smart_contract_address: Address, idx: u64, ) -> SigningResult { Ok(TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( - smart_contract_address, + smart_contract_address.inner(), ident_str!("stake_router").to_owned(), ), ident_str!("claim").to_owned(), @@ -64,17 +64,17 @@ pub fn tortuga_claim( pub struct Stake { pub amount: u64, - pub smart_contract_address: AccountAddress, + pub smart_contract_address: Address, } pub struct Unstake { pub amount: u64, - pub smart_contract_address: AccountAddress, + pub smart_contract_address: Address, } pub struct Claim { pub idx: u64, - pub smart_contract_address: AccountAddress, + pub smart_contract_address: Address, } pub enum LiquidStakingOperation { @@ -89,33 +89,27 @@ impl TryFrom> for LiquidStakingOperation { fn try_from(value: LiquidStaking) -> SigningResult { match value.liquid_stake_transaction_payload { OneOfliquid_stake_transaction_payload::stake(stake_msg) => { - let smart_contract_address = - AccountAddress::from_str(&value.smart_contract_address) - .map_err(from_account_error) - .into_tw() - .context("Invalid Smart Contract address")?; + let smart_contract_address = Address::from_str(&value.smart_contract_address) + .into_tw() + .context("Invalid Smart Contract address")?; Ok(LiquidStakingOperation::Stake(Stake { amount: stake_msg.amount, smart_contract_address, })) }, OneOfliquid_stake_transaction_payload::unstake(unstake_msg) => { - let smart_contract_address = - AccountAddress::from_str(&value.smart_contract_address) - .map_err(from_account_error) - .into_tw() - .context("Invalid Smart Contract address")?; + let smart_contract_address = Address::from_str(&value.smart_contract_address) + .into_tw() + .context("Invalid Smart Contract address")?; Ok(LiquidStakingOperation::Unstake(Unstake { amount: unstake_msg.amount, smart_contract_address, })) }, OneOfliquid_stake_transaction_payload::claim(claim) => { - let smart_contract_address = - AccountAddress::from_str(&value.smart_contract_address) - .map_err(from_account_error) - .into_tw() - .context("Invalid Smart Contract address")?; + let smart_contract_address = Address::from_str(&value.smart_contract_address) + .into_tw() + .context("Invalid Smart Contract address")?; Ok(LiquidStakingOperation::Claim(Claim { idx: claim.idx, smart_contract_address, @@ -132,7 +126,7 @@ impl From for LiquidStaking<'_> { fn from(value: LiquidStakingOperation) -> Self { match value { LiquidStakingOperation::Stake(stake) => LiquidStaking { - smart_contract_address: stake.smart_contract_address.to_hex_literal().into(), + smart_contract_address: stake.smart_contract_address.to_string().into(), liquid_stake_transaction_payload: OneOfliquid_stake_transaction_payload::stake( TortugaStake { amount: stake.amount, @@ -140,7 +134,7 @@ impl From for LiquidStaking<'_> { ), }, LiquidStakingOperation::Unstake(unstake) => LiquidStaking { - smart_contract_address: unstake.smart_contract_address.to_hex_literal().into(), + smart_contract_address: unstake.smart_contract_address.to_string().into(), liquid_stake_transaction_payload: OneOfliquid_stake_transaction_payload::unstake( TortugaUnstake { amount: unstake.amount, @@ -148,7 +142,7 @@ impl From for LiquidStaking<'_> { ), }, LiquidStakingOperation::Claim(claim) => LiquidStaking { - smart_contract_address: claim.smart_contract_address.to_hex_literal().into(), + smart_contract_address: claim.smart_contract_address.to_string().into(), liquid_stake_transaction_payload: OneOfliquid_stake_transaction_payload::claim( TortugaClaim { idx: claim.idx }, ), diff --git a/rust/chains/tw_aptos/src/nft.rs b/rust/chains/tw_aptos/src/nft.rs index 172308b4ee2..f51ad1d50a1 100644 --- a/rust/chains/tw_aptos/src/nft.rs +++ b/rust/chains/tw_aptos/src/nft.rs @@ -2,16 +2,15 @@ // // Copyright © 2017 Trust Wallet. -use crate::address::from_account_error; -use move_core_types::account_address::AccountAddress; +use crate::address::Address; use std::str::FromStr; use tw_coin_entry::error::prelude::*; use tw_proto::Aptos::Proto::mod_NftMessage::OneOfnft_transaction_payload; use tw_proto::Aptos::Proto::{CancelOfferNftMessage, ClaimNftMessage, NftMessage, OfferNftMessage}; pub struct Offer { - pub receiver: AccountAddress, - pub creator: AccountAddress, + pub receiver: Address, + pub creator: Address, pub collection: Vec, pub name: Vec, pub property_version: u64, @@ -19,8 +18,8 @@ pub struct Offer { } pub struct Claim { - pub sender: AccountAddress, - pub creator: AccountAddress, + pub sender: Address, + pub creator: Address, pub collection: Vec, pub name: Vec, pub property_version: u64, @@ -77,8 +76,8 @@ impl TryFrom> for Offer { fn try_from(value: OfferNftMessage) -> SigningResult { Ok(Offer { - receiver: AccountAddress::from_str(&value.receiver).map_err(from_account_error)?, - creator: AccountAddress::from_str(&value.creator).map_err(from_account_error)?, + receiver: Address::from_str(&value.receiver)?, + creator: Address::from_str(&value.creator)?, collection: value.collectionName.as_bytes().to_vec(), name: value.name.as_bytes().to_vec(), property_version: value.property_version, @@ -90,8 +89,8 @@ impl TryFrom> for Offer { impl From for OfferNftMessage<'_> { fn from(value: Offer) -> Self { OfferNftMessage { - receiver: value.receiver.to_hex_literal().into(), - creator: value.creator.to_hex_literal().into(), + receiver: value.receiver.to_string().into(), + creator: value.creator.to_string().into(), collectionName: String::from_utf8_lossy(value.collection.as_slice()) .to_string() .into(), @@ -107,12 +106,10 @@ impl TryFrom> for Offer { fn try_from(value: CancelOfferNftMessage) -> SigningResult { Ok(Offer { - receiver: AccountAddress::from_str(&value.receiver) - .map_err(from_account_error) + receiver: Address::from_str(&value.receiver) .into_tw() .context("Invalid receiver address")?, - creator: AccountAddress::from_str(&value.creator) - .map_err(from_account_error) + creator: Address::from_str(&value.creator) .into_tw() .context("Invalid creator address")?, collection: value.collectionName.as_bytes().to_vec(), @@ -126,8 +123,8 @@ impl TryFrom> for Offer { impl From for CancelOfferNftMessage<'_> { fn from(value: Offer) -> Self { CancelOfferNftMessage { - receiver: value.receiver.to_hex_literal().into(), - creator: value.creator.to_hex_literal().into(), + receiver: value.receiver.to_string().into(), + creator: value.creator.to_string().into(), collectionName: String::from_utf8_lossy(value.collection.as_slice()) .to_string() .into(), @@ -144,12 +141,10 @@ impl TryFrom> for Claim { fn try_from(value: ClaimNftMessage) -> SigningResult { Ok(Claim { - sender: AccountAddress::from_str(&value.sender) - .map_err(from_account_error) + sender: Address::from_str(&value.sender) .into_tw() .context("Invalid sender address")?, - creator: AccountAddress::from_str(&value.creator) - .map_err(from_account_error) + creator: Address::from_str(&value.creator) .into_tw() .context("Invalid creator address")?, collection: value.collectionName.as_bytes().to_vec(), @@ -162,8 +157,8 @@ impl TryFrom> for Claim { impl From for ClaimNftMessage<'_> { fn from(value: Claim) -> Self { ClaimNftMessage { - sender: value.sender.to_hex_literal().into(), - creator: value.creator.to_hex_literal().into(), + sender: value.sender.to_string().into(), + creator: value.creator.to_string().into(), collectionName: String::from_utf8_lossy(value.collection.as_slice()) .to_string() .into(), diff --git a/rust/chains/tw_aptos/src/signer.rs b/rust/chains/tw_aptos/src/signer.rs index 8937e821081..f3a5686a87f 100644 --- a/rust/chains/tw_aptos/src/signer.rs +++ b/rust/chains/tw_aptos/src/signer.rs @@ -28,7 +28,7 @@ impl Signer { .into_tw() .context("Invalid sender address")?; let signed_tx = builder - .sender(sender.inner()) + .sender(sender) .sequence_number(input.sequence_number as u64) .build()? .sign(key_pair)?; diff --git a/rust/chains/tw_aptos/src/transaction.rs b/rust/chains/tw_aptos/src/transaction.rs index f4ca4a2c151..a6131906fd2 100644 --- a/rust/chains/tw_aptos/src/transaction.rs +++ b/rust/chains/tw_aptos/src/transaction.rs @@ -2,9 +2,9 @@ // // Copyright © 2017 Trust Wallet. +use crate::address::Address; use crate::constants::APTOS_SALT; use crate::transaction_payload::TransactionPayload; -use move_core_types::account_address::AccountAddress; use serde::Serialize; use serde_json::{json, Value}; use std::borrow::Cow; @@ -71,7 +71,7 @@ impl TransactionAuthenticator { #[derive(Clone, Serialize)] pub struct RawTransaction { /// Sender's address. - sender: AccountAddress, + sender: Address, /// Sequence number of this transaction. This must match the sequence number /// stored in the sender's account at the time the transaction executes. @@ -103,7 +103,7 @@ impl RawTransaction { /// It can be either to publish a module, to execute a script, or to issue a writeset /// transaction. pub fn new( - sender: AccountAddress, + sender: Address, sequence_number: u64, payload: TransactionPayload, max_gas_amount: u64, @@ -174,7 +174,7 @@ impl RawTransaction { "gas_unit_price": self.gas_unit_price.to_string(), "max_gas_amount": self.max_gas_amount.to_string(), "payload": self.payload.to_json(), - "sender": self.sender.to_hex_literal(), + "sender": self.sender.to_string(), "sequence_number": self.sequence_number.to_string() }) } diff --git a/rust/chains/tw_aptos/src/transaction_builder.rs b/rust/chains/tw_aptos/src/transaction_builder.rs index 7fc0fb96eb5..e8327c85a64 100644 --- a/rust/chains/tw_aptos/src/transaction_builder.rs +++ b/rust/chains/tw_aptos/src/transaction_builder.rs @@ -2,7 +2,7 @@ // // Copyright © 2017 Trust Wallet. -use crate::address::from_account_error; +use crate::address::Address; use crate::aptos_move_packages::{ aptos_account_create_account, aptos_account_transfer, aptos_account_transfer_coins, coin_transfer, fungible_asset_transfer, token_transfers_cancel_offer_script, @@ -17,7 +17,6 @@ use crate::transaction::RawTransaction; use crate::transaction_payload::{ convert_proto_struct_tag_to_type_tag, EntryFunction, TransactionPayload, }; -use move_core_types::account_address::AccountAddress; use move_core_types::language_storage::TypeTag; use serde_json::Value; use std::str::FromStr; @@ -26,7 +25,7 @@ use tw_proto::Aptos::Proto::mod_SigningInput::OneOftransaction_payload; use tw_proto::Aptos::Proto::SigningInput; pub struct TransactionBuilder { - sender: Option, + sender: Option
, sequence_number: Option, payload: TransactionPayload, max_gas_amount: u64, @@ -36,7 +35,7 @@ pub struct TransactionBuilder { } impl TransactionBuilder { - pub fn sender(mut self, sender: AccountAddress) -> Self { + pub fn sender(mut self, sender: Address) -> Self { self.sender = Some(sender); self } @@ -93,8 +92,7 @@ impl TransactionFactory { match input.transaction_payload { OneOftransaction_payload::transfer(transfer) => factory .implicitly_create_user_account_and_transfer( - AccountAddress::from_str(&transfer.to) - .map_err(from_account_error) + Address::from_str(&transfer.to) .into_tw() .context("Invalid destination address")?, transfer.amount, @@ -105,8 +103,7 @@ impl TransactionFactory { .or_tw_err(SigningErrorType::Error_invalid_params) .context("'TokenTransferMessage::function' is not set")?; factory.coins_transfer( - AccountAddress::from_str(&token_transfer.to) - .map_err(from_account_error) + Address::from_str(&token_transfer.to) .into_tw() .context("Invalid destination address")?, token_transfer.amount, @@ -114,8 +111,7 @@ impl TransactionFactory { ) }, OneOftransaction_payload::create_account(create_account) => { - let address = AccountAddress::from_str(&create_account.auth_key) - .map_err(from_account_error) + let address = Address::from_str(&create_account.auth_key) .into_tw() .context("Invalid 'auth_key' address")?; factory.create_user_account(address) @@ -132,8 +128,7 @@ impl TransactionFactory { .or_tw_err(SigningErrorType::Error_invalid_params) .context("'TokenTransferCoinsMessage::function' is not set")?; factory.implicitly_create_user_and_coins_transfer( - AccountAddress::from_str(&token_transfer_coins.to) - .map_err(from_account_error) + Address::from_str(&token_transfer_coins.to) .into_tw() .context("Invalid destination address")?, token_transfer_coins.amount, @@ -142,12 +137,10 @@ impl TransactionFactory { }, OneOftransaction_payload::fungible_asset_transfer(fungible_asset_transfer) => factory .fungible_asset_transfer( - AccountAddress::from_str(&fungible_asset_transfer.metadata_address) - .map_err(from_account_error) + Address::from_str(&fungible_asset_transfer.metadata_address) .into_tw() .context("Invalid metadata address")?, - AccountAddress::from_str(&fungible_asset_transfer.to) - .map_err(from_account_error) + Address::from_str(&fungible_asset_transfer.to) .into_tw() .context("Invalid destination address")?, fungible_asset_transfer.amount, @@ -188,7 +181,7 @@ impl TransactionFactory { self.transaction_builder(payload) } - pub fn create_user_account(&self, to: AccountAddress) -> SigningResult { + pub fn create_user_account(&self, to: Address) -> SigningResult { Ok(self.payload(aptos_account_create_account(to)?)) } @@ -239,7 +232,7 @@ impl TransactionFactory { pub fn implicitly_create_user_account_and_transfer( &self, - to: AccountAddress, + to: Address, amount: u64, ) -> SigningResult { Ok(self.payload(aptos_account_transfer(to, amount)?)) @@ -247,7 +240,7 @@ impl TransactionFactory { pub fn coins_transfer( &self, - to: AccountAddress, + to: Address, amount: u64, coin_type: TypeTag, ) -> SigningResult { @@ -256,8 +249,8 @@ impl TransactionFactory { pub fn fungible_asset_transfer( &self, - metadata_address: AccountAddress, - to: AccountAddress, + metadata_address: Address, + to: Address, amount: u64, ) -> SigningResult { Ok(self.payload(fungible_asset_transfer(metadata_address, to, amount)?)) @@ -265,7 +258,7 @@ impl TransactionFactory { pub fn implicitly_create_user_and_coins_transfer( &self, - to: AccountAddress, + to: Address, amount: u64, coin_type: TypeTag, ) -> SigningResult { diff --git a/rust/chains/tw_aptos/src/transaction_payload.rs b/rust/chains/tw_aptos/src/transaction_payload.rs index 2352b465cd4..003ab955967 100644 --- a/rust/chains/tw_aptos/src/transaction_payload.rs +++ b/rust/chains/tw_aptos/src/transaction_payload.rs @@ -2,6 +2,7 @@ // // Copyright © 2017 Trust Wallet. +use crate::address::Address; use crate::aptos_move_types::MoveType; use crate::constants::{OBJECT_MODULE, OBJECT_STRUCT}; use crate::serde_helper::vec_bytes; @@ -227,7 +228,8 @@ fn parse_argument(layout: &MoveTypeLayout, val: Value) -> EncodingResult MoveValue::Address( val_str - .parse::() + .parse::
() + .map(|addr| addr.inner()) .map_err(|_| EncodingError::InvalidInput)?, ), MoveTypeLayout::Vector(item_layout) => parse_vector_argument(item_layout.as_ref(), val)?, diff --git a/rust/chains/tw_aptos/tests/signer.rs b/rust/chains/tw_aptos/tests/signer.rs index 93a7c0de474..7e0d684859d 100644 --- a/rust/chains/tw_aptos/tests/signer.rs +++ b/rust/chains/tw_aptos/tests/signer.rs @@ -2,9 +2,9 @@ // // Copyright © 2017 Trust Wallet. -use move_core_types::account_address::AccountAddress; use move_core_types::language_storage::TypeTag; use std::str::FromStr; +use tw_aptos::address::Address; use tw_aptos::liquid_staking; use tw_aptos::liquid_staking::{LiquidStakingOperation, Stake, Unstake}; use tw_aptos::nft::{Claim, NftOperation, Offer}; @@ -220,12 +220,12 @@ fn test_aptos_sign_transaction_transfer() { "gas_unit_price": "100", "max_gas_amount": "3296766", "payload": { - "arguments": ["0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","1000"], + "arguments": ["0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","1000"], "function": "0x1::aptos_account::transfer", "type": "entry_function_payload", "type_arguments": [] }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "99", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", @@ -268,7 +268,7 @@ fn test_aptos_sign_create_account() { "type": "entry_function_payload", "type_arguments": [] }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "0", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", @@ -314,12 +314,12 @@ fn test_aptos_sign_coin_transfer() { "gas_unit_price": "100", "max_gas_amount": "3296766", "payload": { - "arguments": ["0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","100000"], + "arguments": ["0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","100000"], "function": "0x1::coin::transfer", "type": "entry_function_payload", "type_arguments": ["0x43417434fd869edee76cca2a4d2301e528a1551b1d719b75c350c3c97d15b8b9::coins::BTC"] }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "24", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", @@ -365,7 +365,7 @@ fn test_aptos_sign_fungible_asset_transfer() { "type": "entry_function_payload", "type_arguments": ["0x1::fungible_asset::Metadata"] }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "74", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", @@ -430,11 +430,11 @@ fn test_aptos_nft_offer() { "", "", Some(OpsDetails::NftOps(NftOperation::Offer(Offer { - receiver: AccountAddress::from_str( + receiver: Address::from_str( "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", ) .unwrap(), - creator: AccountAddress::from_str( + creator: Address::from_str( "0x9125e4054d884fdc7296b66e12c0d63a7baa0d88c77e8e784987c0a967c670ac", ) .unwrap(), @@ -455,7 +455,7 @@ fn test_aptos_nft_offer() { "max_gas_amount": "3296766", "payload": { "arguments": [ - "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "0x9125e4054d884fdc7296b66e12c0d63a7baa0d88c77e8e784987c0a967c670ac", "Topaz Troopers", "Topaz Trooper #20068", "0", "1"], "function": "0x3::token_transfers::offer_script", @@ -476,8 +476,8 @@ fn test_aptos_nft_offer() { #[test] fn test_aptos_cancel_nft_offer() { let input = setup_proto_transaction( - "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", // Sender's address - "5d996aa76b3212142792d9130796cd2e11e3c445a93118c08414df4f66bc60ec", // Keypair + "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", // Sender's address + "5d996aa76b3212142792d9130796cd2e11e3c445a93118c08414df4f66bc60ec", // Keypair "nft_ops", 21, // Sequence number 2, @@ -487,11 +487,11 @@ fn test_aptos_cancel_nft_offer() { "", "", Some(OpsDetails::NftOps(NftOperation::Cancel(Offer { - receiver: AccountAddress::from_str( + receiver: Address::from_str( "0x783135e8b00430253a22ba041d860c373d7a1501ccf7ac2d1ad37a8ed2775aee", ) .unwrap(), - creator: AccountAddress::from_str( + creator: Address::from_str( "0x9125e4054d884fdc7296b66e12c0d63a7baa0d88c77e8e784987c0a967c670ac", ) .unwrap(), @@ -519,7 +519,7 @@ fn test_aptos_cancel_nft_offer() { "type": "entry_function_payload", "type_arguments": [] }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "21", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", @@ -533,8 +533,8 @@ fn test_aptos_cancel_nft_offer() { #[test] fn test_aptos_nft_claim() { let input = setup_proto_transaction( - "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", // Sender's address - "5d996aa76b3212142792d9130796cd2e11e3c445a93118c08414df4f66bc60ec", // Keypair + "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", // Sender's address + "5d996aa76b3212142792d9130796cd2e11e3c445a93118c08414df4f66bc60ec", // Keypair "nft_ops", 19, // Sequence number 2, @@ -544,11 +544,11 @@ fn test_aptos_nft_claim() { "", "", Some(OpsDetails::NftOps(NftOperation::Claim(Claim { - sender: AccountAddress::from_str( + sender: Address::from_str( "0x783135e8b00430253a22ba041d860c373d7a1501ccf7ac2d1ad37a8ed2775aee", ) .unwrap(), - creator: AccountAddress::from_str( + creator: Address::from_str( "0x9125e4054d884fdc7296b66e12c0d63a7baa0d88c77e8e784987c0a967c670ac", ) .unwrap(), @@ -575,7 +575,7 @@ fn test_aptos_nft_claim() { "type": "entry_function_payload", "type_arguments": [] }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "19", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", @@ -602,7 +602,7 @@ fn test_aptos_tortuga_stake() { Some(OpsDetails::LiquidStakingOps(LiquidStakingOperation::Stake( Stake { amount: 100000000, - smart_contract_address: AccountAddress::from_str( + smart_contract_address: Address::from_str( "0x8f396e4246b2ba87b51c0739ef5ea4f26515a98375308c31ac2ec1e42142a57f", ) .unwrap(), @@ -653,7 +653,7 @@ fn test_aptos_tortuga_unstake() { Some(OpsDetails::LiquidStakingOps( LiquidStakingOperation::Unstake(Unstake { amount: 99178100, - smart_contract_address: AccountAddress::from_str( + smart_contract_address: Address::from_str( "0x8f396e4246b2ba87b51c0739ef5ea4f26515a98375308c31ac2ec1e42142a57f", ) .unwrap(), @@ -704,7 +704,7 @@ fn test_aptos_tortuga_claim() { Some(OpsDetails::LiquidStakingOps(LiquidStakingOperation::Claim( liquid_staking::Claim { idx: 0, - smart_contract_address: AccountAddress::from_str( + smart_contract_address: Address::from_str( "0x8f396e4246b2ba87b51c0739ef5ea4f26515a98375308c31ac2ec1e42142a57f", ) .unwrap(), @@ -790,7 +790,7 @@ fn test_aptos_blind_sign() { ], "type": "entry_function_payload" }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "42", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", @@ -852,7 +852,7 @@ fn test_aptos_blind_sign_with_abi() { ], "type": "entry_function_payload" }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "69", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", diff --git a/rust/coverage.stats b/rust/coverage.stats index 6451592a981..7f44617b0b9 100644 --- a/rust/coverage.stats +++ b/rust/coverage.stats @@ -1 +1 @@ -94.1 \ No newline at end of file +94.2 \ No newline at end of file diff --git a/rust/tw_tests/tests/chains/aptos/aptos_address.rs b/rust/tw_tests/tests/chains/aptos/aptos_address.rs index 97a52410960..476717cdfd4 100644 --- a/rust/tw_tests/tests/chains/aptos/aptos_address.rs +++ b/rust/tw_tests/tests/chains/aptos/aptos_address.rs @@ -14,35 +14,64 @@ fn test_aptos_address_normalization() { "0xf3d7f364dd7705824a5ebda9c7aab6cb3fc7bb5b58718249f12defec240b36cc", "0xf3d7f364dd7705824a5ebda9c7aab6cb3fc7bb5b58718249f12defec240b36cc", ); + test_address_normalization( + CoinType::Aptos, + "0x03d7f364dd7705824a5ebda9c7aab6cb3fc7bb5b58718249f12defec240b36cc", + "0x03d7f364dd7705824a5ebda9c7aab6cb3fc7bb5b58718249f12defec240b36cc", + ); + test_address_normalization( + CoinType::Aptos, + "0x00d7f364dd7705824a5ebda9c7aab6cb3fc7bb5b58718249f12defec240b36cc", + "0x00d7f364dd7705824a5ebda9c7aab6cb3fc7bb5b58718249f12defec240b36cc", + ); + test_address_normalization(CoinType::Aptos, "0x1", "0x1"); + // `0x1` is a special address, so it should be normalized to `0x1` instead of 64 hex chars with leading zeros. + test_address_normalization( + CoinType::Aptos, + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x1", + ); + // `0xb` is not a special address, so it should be normalized to 64 hex chars with leading zeros. + test_address_normalization( + CoinType::Aptos, + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000b", + ); } #[test] fn test_aptos_address_is_valid() { test_address_valid(CoinType::Aptos, "0x1"); + test_address_valid(CoinType::Aptos, "0xa"); test_address_valid( CoinType::Aptos, "0xeeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", ); - test_address_valid( +} + +#[test] +fn test_aptos_address_invalid() { + // Special address is out of range. + test_address_invalid(CoinType::Aptos, "0xb"); + // Non-hex special address. + test_address_invalid(CoinType::Aptos, "0xs"); + // Special address must be 3 chars only. + test_address_invalid(CoinType::Aptos, "0x01"); + // Missing 0x prefix + test_address_invalid( CoinType::Aptos, "eeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", ); - test_address_valid( - CoinType::Aptos, - "19aadeca9388e009d136245b9a67423f3eee242b03142849eb4f81a4a409e59c", - ); - test_address_valid( + // Too short (expected exactly 64 hex chars) + test_address_invalid( CoinType::Aptos, "0x777821c78442e17d82c3d7a371f42de7189e4248e529fe6eee6bca40ddbb", ); - test_address_valid( + // Too short (expected exactly 64 hex chars) + test_address_invalid( CoinType::Aptos, "0xeeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175", ); -} - -#[test] -fn test_aptos_address_invalid() { // Empty test_address_invalid(CoinType::Aptos, ""); // Invalid Hex @@ -53,8 +82,14 @@ fn test_aptos_address_invalid() { // Too long test_address_invalid( CoinType::Aptos, - "eeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175bb", + "0xeeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175bb", ); + // Too long + test_address_invalid( + CoinType::Aptos, + "0xeeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175bbb", + ); + // Invalid characters. test_address_invalid( CoinType::Aptos, "0xSeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", @@ -68,4 +103,9 @@ fn test_aptos_address_get_data() { "0x1", "0000000000000000000000000000000000000000000000000000000000000001", ); + test_address_get_data( + CoinType::Aptos, + "0xeeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", + "eeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", + ); } diff --git a/rust/tw_tests/tests/chains/aptos/test_cases.rs b/rust/tw_tests/tests/chains/aptos/test_cases.rs index 41af3a01603..8e9df09eb46 100644 --- a/rust/tw_tests/tests/chains/aptos/test_cases.rs +++ b/rust/tw_tests/tests/chains/aptos/test_cases.rs @@ -45,12 +45,12 @@ pub(super) mod transfer_b4d62afd { "gas_unit_price": "100", "max_gas_amount": "3296766", "payload": { - "arguments": ["0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","1000"], + "arguments": ["0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","1000"], "function": "0x1::aptos_account::transfer", "type": "entry_function_payload", "type_arguments": [] }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "99", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", diff --git a/swift/Tests/CoinAddressDerivationTests.swift b/swift/Tests/CoinAddressDerivationTests.swift index 8c3de6b677c..1f5263fa042 100644 --- a/swift/Tests/CoinAddressDerivationTests.swift +++ b/swift/Tests/CoinAddressDerivationTests.swift @@ -318,7 +318,7 @@ class CoinAddressDerivationTests: XCTestCase { let expectedResult = "UQDgEMqToTacHic7SnvnPFmvceG5auFkCcAw0mSCvzvKUaT4"; assertCoinDerivation(coin, expectedResult, derivedAddress, address) case .aptos: - let expectedResult = "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30"; + let expectedResult = "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30"; assertCoinDerivation(coin, expectedResult, derivedAddress, address) case .nebl: let expectedResult = "NgDVaXAwNgBwb88xLiFKomfBmPkEh9F2d7"; diff --git a/tests/chains/Aptos/AddressTests.cpp b/tests/chains/Aptos/AddressTests.cpp index 6c7a952b87f..57f0e7e4fa7 100644 --- a/tests/chains/Aptos/AddressTests.cpp +++ b/tests/chains/Aptos/AddressTests.cpp @@ -22,19 +22,20 @@ TEST(AptosAddress, Valid) { ASSERT_TRUE(entry.validateAddress(TWCoinTypeAptos, "0x1", std::monostate{})); ASSERT_TRUE(entry.validateAddress(TWCoinTypeAptos, "0x0", std::monostate{})); ASSERT_TRUE(entry.validateAddress(TWCoinTypeAptos, "0xeeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", std::monostate{})); - ASSERT_TRUE(entry.validateAddress(TWCoinTypeAptos, "eeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", std::monostate{})); - ASSERT_TRUE(entry.validateAddress(TWCoinTypeAptos, "19aadeca9388e009d136245b9a67423f3eee242b03142849eb4f81a4a409e59c", std::monostate{})); - ASSERT_TRUE(entry.validateAddress(TWCoinTypeAptos, "0x777821c78442e17d82c3d7a371f42de7189e4248e529fe6eee6bca40ddbb", std::monostate{})); - ASSERT_TRUE(entry.validateAddress(TWCoinTypeAptos, "0xeeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175", std::monostate{})); + ASSERT_TRUE(entry.validateAddress(TWCoinTypeAptos, "0x19aadeca9388e009d136245b9a67423f3eee242b03142849eb4f81a4a409e59c", std::monostate{})); + ASSERT_TRUE(entry.validateAddress(TWCoinTypeAptos, "0x0000777821c78442e17d82c3d7a371f42de7189e4248e529fe6eee6bca40ddbb", std::monostate{})); } TEST(AptosAddress, Invalid) { Entry entry; ASSERT_FALSE(entry.validateAddress(TWCoinTypeAptos, "", std::monostate{})); + ASSERT_FALSE(entry.validateAddress(TWCoinTypeAptos, "0x01", std::monostate{})); ASSERT_FALSE(entry.validateAddress(TWCoinTypeAptos, "Seff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", std::monostate{})); ASSERT_FALSE(entry.validateAddress(TWCoinTypeAptos, "eeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175bb", std::monostate{})); ASSERT_FALSE(entry.validateAddress(TWCoinTypeAptos, "0xSeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", std::monostate{})); - + ASSERT_FALSE(entry.validateAddress(TWCoinTypeAptos, "eeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b", std::monostate{})); + ASSERT_FALSE(entry.validateAddress(TWCoinTypeAptos, "0x777821c78442e17d82c3d7a371f42de7189e4248e529fe6eee6bca40ddbb", std::monostate{})); + ASSERT_FALSE(entry.validateAddress(TWCoinTypeAptos, "0xeeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175", std::monostate{})); } TEST(AptosAddress, FromPrivateKey) { diff --git a/tests/chains/Aptos/CompilerTests.cpp b/tests/chains/Aptos/CompilerTests.cpp index 814e71c6f02..8290876a7b5 100644 --- a/tests/chains/Aptos/CompilerTests.cpp +++ b/tests/chains/Aptos/CompilerTests.cpp @@ -65,12 +65,12 @@ TEST(AptosCompiler, StandardTransaction) { "gas_unit_price": "100", "max_gas_amount": "3296766", "payload": { - "arguments": ["0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","1000"], + "arguments": ["0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","1000"], "function": "0x1::aptos_account::transfer", "type": "entry_function_payload", "type_arguments": [] }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "99", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", @@ -159,7 +159,7 @@ TEST(AptosCompiler, BlindTransactionJson) { ], "type": "entry_function_payload" }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "42", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", diff --git a/tests/chains/Aptos/TWAnySignerTests.cpp b/tests/chains/Aptos/TWAnySignerTests.cpp index b0ad67d6d8c..dcefa981a94 100644 --- a/tests/chains/Aptos/TWAnySignerTests.cpp +++ b/tests/chains/Aptos/TWAnySignerTests.cpp @@ -39,12 +39,12 @@ TEST(TWAnySignerAptos, TxSign) { "gas_unit_price": "100", "max_gas_amount": "3296766", "payload": { - "arguments": ["0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","1000"], + "arguments": ["0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30","1000"], "function": "0x1::aptos_account::transfer", "type": "entry_function_payload", "type_arguments": [] }, - "sender": "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", + "sender": "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30", "sequence_number": "99", "signature": { "public_key": "0xea526ba1710343d953461ff68641f1b7df5f23b9042ffa2d2a798d3adb3f3d6c", diff --git a/tests/chains/Aptos/TWAptosAddressTests.cpp b/tests/chains/Aptos/TWAptosAddressTests.cpp index 4dea755b651..6b8de7d4fbe 100644 --- a/tests/chains/Aptos/TWAptosAddressTests.cpp +++ b/tests/chains/Aptos/TWAptosAddressTests.cpp @@ -26,7 +26,7 @@ TEST(TWAptosAddress, HDWallet) { auto address = WRAP(TWAnyAddress, TWAnyAddressCreateWithPublicKey(publicKey.get(), TWCoinTypeAptos)); auto addressStr = WRAPS(TWAnyAddressDescription(address.get())); - assertStringsEqual(addressStr, "0x7968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30"); + assertStringsEqual(addressStr, "0x07968dab936c1bad187c60ce4082f307d030d780e91e694ae03aef16aba73f30"); } } // namespace TW::Aptos::tests