Skip to content

Commit 949782e

Browse files
committed
fix(address): replace get_application_address with Address::from_app_id
- Remove duplicate get_application_address function from utils.rs - Replace all usages with Address::from_app_id method from PR #225 - Update imports and function calls across codebase - Add test for Address::from_app_id method - Maintain backward compatibility for functionality Addresses PR comment by neilcampbell about using Address trait approach
1 parent 8e8b4ac commit 949782e

File tree

5 files changed

+33
-26
lines changed

5 files changed

+33
-26
lines changed

crates/algokit_transact/src/address.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::utils::pub_key_to_checksum;
1010
use crate::{
1111
ALGORAND_ADDRESS_LENGTH, ALGORAND_CHECKSUM_BYTE_LENGTH, ALGORAND_PUBLIC_KEY_BYTE_LENGTH,
1212
};
13+
use sha2::{Digest, Sha512_256};
1314
use serde::{Deserialize, Serialize};
1415
use serde_with::{Bytes, serde_as};
1516
use std::fmt::{Display, Formatter, Result as FmtResult};
@@ -31,6 +32,22 @@ impl Address {
3132
&self.0
3233
}
3334

35+
/// Creates an Address from an application ID.
36+
///
37+
/// This computes the application address by hashing the application ID
38+
/// with the "appID" prefix, as per Algorand's application address derivation.
39+
pub fn from_app_id(app_id: &u64) -> Address {
40+
let mut hasher = Sha512_256::new();
41+
hasher.update(b"appID");
42+
hasher.update(app_id.to_be_bytes());
43+
44+
let hash = hasher.finalize();
45+
let mut addr_bytes = [0u8; ALGORAND_PUBLIC_KEY_BYTE_LENGTH];
46+
addr_bytes.copy_from_slice(&hash[..ALGORAND_PUBLIC_KEY_BYTE_LENGTH]);
47+
48+
Address(addr_bytes)
49+
}
50+
3451
/// Returns the base32-encoded string representation of the address, including the checksum.
3552
pub fn as_str(&self) -> String {
3653
let mut buffer = [0u8; ALGORAND_PUBLIC_KEY_BYTE_LENGTH + ALGORAND_CHECKSUM_BYTE_LENGTH];
@@ -103,3 +120,16 @@ impl Display for Address {
103120
write!(f, "{}", self.as_str())
104121
}
105122
}
123+
124+
#[cfg(test)]
125+
mod tests {
126+
use super::*;
127+
128+
#[test]
129+
fn test_from_app_id() {
130+
let app_id = 123u64;
131+
let address = Address::from_app_id(&app_id);
132+
let address_str = address.to_string();
133+
assert_eq!(address_str, "WRBMNT66ECE2AOYKM76YVWIJMBW6Z3XCQZOKG5BL7NISAQC2LBGEKTZLRM");
134+
}
135+
}

crates/algokit_transact/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ pub use transactions::{
2222
OnApplicationComplete, PaymentTransactionBuilder, PaymentTransactionFields, SignedTransaction,
2323
StateSchema, Transaction, TransactionHeader, TransactionHeaderBuilder,
2424
};
25-
pub use utils::get_application_address;
2625

2726
#[cfg(test)]
2827
mod tests;

crates/algokit_transact/src/utils.rs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -132,27 +132,6 @@ impl AlgorandMsgpack for GroupedTransactions {
132132
const PREFIX: &'static [u8] = b"TG";
133133
}
134134

135-
pub fn get_application_address(app_id: u64) -> Address {
136-
let mut hasher = Sha512_256::new();
137-
hasher.update(b"appID");
138-
hasher.update(app_id.to_be_bytes());
139-
140-
let hash = hasher.finalize();
141-
let mut addr_bytes = [0u8; ALGORAND_PUBLIC_KEY_BYTE_LENGTH];
142-
addr_bytes.copy_from_slice(&hash[..ALGORAND_PUBLIC_KEY_BYTE_LENGTH]);
143-
144-
Address(addr_bytes)
145-
}
146-
147135
#[cfg(test)]
148136
mod tests {
149-
use super::*;
150-
151-
#[test]
152-
fn test_get_application_address() {
153-
let app_id = 123u64;
154-
let address = get_application_address(app_id);
155-
let address_str = address.to_string();
156-
assert!(address_str == "WRBMNT66ECE2AOYKM76YVWIJMBW6Z3XCQZOKG5BL7NISAQC2LBGEKTZLRM");
157-
}
158137
}

crates/algokit_utils/src/transactions/sender_results.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use super::transaction_ext::TransactionExt;
33
use algod_client::models::PendingTransactionResponse;
44
use algokit_transact::{
55
Address, ApplicationCallTransactionFields, AssetConfigTransactionFields, Transaction,
6-
get_application_address,
76
};
87

98
/// The unified, comprehensive result of sending a single transaction or transaction group.
@@ -279,7 +278,7 @@ impl SendAppCreateResult {
279278
})?;
280279

281280
// Calculate app address
282-
let app_address = get_application_address(app_id);
281+
let app_address = Address::from_app_id(&app_id);
283282

284283
Ok(SendAppCreateResult {
285284
base,

crates/algokit_utils/tests/transactions/composer/inner_fee_coverage.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::common::init_test_logging;
22
use algokit_abi::abi_type::BitSize;
33
use algokit_abi::{ABIMethod, ABIType, ABIValue};
44
use algokit_test_artifacts::{inner_fee_contract, nested_contract};
5-
use algokit_transact::{Address, OnApplicationComplete, TransactionId, get_application_address};
5+
use algokit_transact::{Address, OnApplicationComplete, TransactionId};
66
use algokit_utils::transactions::composer::SendParams;
77
use algokit_utils::{AppCallParams, AppCreateParams, PaymentParams, testing::*};
88
use algokit_utils::{CommonParams, Composer};
@@ -1913,7 +1913,7 @@ async fn fund_app_accounts(
19131913
let mut dispenser = LocalNetDispenser::new(context.algod.clone());
19141914

19151915
for app_id in app_ids {
1916-
let app_address = get_application_address(*app_id);
1916+
let app_address = Address::from_app_id(app_id);
19171917
dispenser
19181918
.fund_account(&app_address.to_string(), amount)
19191919
.await?;

0 commit comments

Comments
 (0)