Address Basics
Description
Section titled “Description”This example demonstrates basic address operations using the Address class:
- Parsing addresses from base32 strings with Address.fromString()
- Creating the zero address with Address.zeroAddress()
- Encoding addresses back to base32 strings with Address.toString()
- Comparing addresses for equality with Address.equals()
- Computing the 4-byte checksum with Address.checksum()
- Validating addresses with isValidAddress()
- Accessing the 32-byte public key property
- Using address constants: ALGORAND_ADDRESS_LENGTH, ALGORAND_ZERO_ADDRESS_STRING
Prerequisites
Section titled “Prerequisites”- No LocalNet required
Run This Example
Section titled “Run This Example”From the repository root:
cd examplesnpm run example common/01-address-basics.ts/** * Example: Address Basics * * This example demonstrates basic address operations using the Address class: * - Parsing addresses from base32 strings with Address.fromString() * - Creating the zero address with Address.zeroAddress() * - Encoding addresses back to base32 strings with Address.toString() * - Comparing addresses for equality with Address.equals() * - Computing the 4-byte checksum with Address.checksum() * - Validating addresses with isValidAddress() * - Accessing the 32-byte public key property * - Using address constants: ALGORAND_ADDRESS_LENGTH, ALGORAND_ZERO_ADDRESS_STRING * * Prerequisites: * - No LocalNet required */
import { Address, ALGORAND_ADDRESS_LENGTH, ALGORAND_ZERO_ADDRESS_STRING, isValidAddress,} from '@algorandfoundation/algokit-utils/common'import { formatBytes, formatHex, printHeader, printInfo, printStep, printSuccess } from '../shared/utils.js'
function main() { printHeader('Address Basics Example')
// Step 1: Address constants printStep(1, 'Address Constants')
printInfo(`ALGORAND_ADDRESS_LENGTH: ${ALGORAND_ADDRESS_LENGTH} characters`) printInfo(`ALGORAND_ZERO_ADDRESS_STRING: ${ALGORAND_ZERO_ADDRESS_STRING}`)
// Step 2: Parse an address from base32 string using Address.fromString() printStep(2, 'Parse Address from Base32 String')
// Valid address created from bytes [0, 1, 2, ... 31] const sampleAddressString = 'AAAQEAYEAUDAOCAJBIFQYDIOB4IBCEQTCQKRMFYYDENBWHA5DYP7MUPJQE' printInfo(`Input address string: ${sampleAddressString}`) printInfo(`String length: ${sampleAddressString.length} characters`)
const parsedAddress = Address.fromString(sampleAddressString) printInfo(`Successfully parsed address using Address.fromString()`)
// Step 3: Access the public key property (32-byte Uint8Array) printStep(3, 'Public Key Property')
printInfo(`Public key length: ${parsedAddress.publicKey.length} bytes`) printInfo(`Public key: ${formatBytes(parsedAddress.publicKey, 8)}`) printInfo(`Public key (hex): ${formatHex(parsedAddress.publicKey)}`)
// Step 4: Encode back to base32 string using Address.toString() printStep(4, 'Encode Address to Base32 String')
const encodedString = parsedAddress.toString() printInfo(`Encoded address: ${encodedString}`) printInfo(`Round-trip matches: ${encodedString === sampleAddressString}`)
// Step 5: Create the zero address using Address.zeroAddress() printStep(5, 'Create Zero Address')
const zeroAddress = Address.zeroAddress() printInfo(`Zero address string: ${zeroAddress.toString()}`) printInfo(`Matches constant: ${zeroAddress.toString() === ALGORAND_ZERO_ADDRESS_STRING}`) printInfo(`Public key: ${formatBytes(zeroAddress.publicKey, 8)}`)
// Verify all bytes are zero const allZeros = zeroAddress.publicKey.every((byte: number) => byte === 0) printInfo(`All public key bytes are zero: ${allZeros}`)
// Step 6: Compare addresses using Address.equals() printStep(6, 'Address Equality')
// Compare two addresses created from the same string const address1 = Address.fromString(sampleAddressString) const address2 = Address.fromString(sampleAddressString) printInfo(`address1.equals(address2): ${address1.equals(address2)}`)
// Compare with zero address printInfo(`parsedAddress.equals(zeroAddress): ${parsedAddress.equals(zeroAddress)}`)
// Two different zero addresses should be equal const zeroAddress2 = Address.zeroAddress() printInfo(`zeroAddress.equals(zeroAddress2): ${zeroAddress.equals(zeroAddress2)}`)
// Step 7: Compute checksum using Address.checksum() printStep(7, 'Compute Checksum')
const checksum = parsedAddress.checksum() printInfo(`Checksum length: ${checksum.length} bytes`) printInfo(`Checksum: ${formatBytes(checksum, 4)}`) printInfo(`Checksum (hex): ${formatHex(checksum)}`)
// Zero address checksum const zeroChecksum = zeroAddress.checksum() printInfo(`Zero address checksum: ${formatHex(zeroChecksum)}`)
// Step 8: Validate addresses using isValidAddress() printStep(8, 'Address Validation')
printInfo('Testing isValidAddress() with various inputs:')
// Valid address printInfo(` Valid address: isValidAddress('${sampleAddressString.substring(0, 20)}...') = ${isValidAddress(sampleAddressString)}`)
// Zero address printInfo(` Zero address: isValidAddress(ALGORAND_ZERO_ADDRESS_STRING) = ${isValidAddress(ALGORAND_ZERO_ADDRESS_STRING)}`)
// Invalid - wrong length const wrongLength = 'ABC123' printInfo(` Wrong length: isValidAddress('${wrongLength}') = ${isValidAddress(wrongLength)}`)
// Invalid - bad characters const badChars = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFK0' printInfo(` Bad characters (has '0'): isValidAddress('...Y5HFK0') = ${isValidAddress(badChars)}`)
// Invalid - bad checksum (modified last character) const badChecksum = 'AAAQEAYEAUDAOCAJBIFQYDIOB4IBCEQTCQKRMFYYDENBWHA5DYP7MUPJQA' printInfo(` Bad checksum: isValidAddress('...PJQA') = ${isValidAddress(badChecksum)}`)
// Step 9: Create address from raw public key bytes printStep(9, 'Create Address from Public Key Bytes')
// Create a 32-byte public key const rawPublicKey = new Uint8Array(32) for (let i = 0; i < 32; i++) { rawPublicKey[i] = i }
printInfo(`Raw public key: ${formatBytes(rawPublicKey, 8)}`)
const addressFromBytes = new Address(rawPublicKey) printInfo(`Address from bytes: ${addressFromBytes.toString()}`) printInfo(`Public key matches: ${addressFromBytes.publicKey.every((b: number, i: number) => b === rawPublicKey[i])}`)
// Verify it's valid printInfo(`isValidAddress(addressFromBytes.toString()): ${isValidAddress(addressFromBytes.toString())}`)
// Step 10: Summary printStep(10, 'Summary')
printInfo('Address class methods:') printInfo(' - Address.fromString(str) - Parse base32 address string') printInfo(' - Address.zeroAddress() - Create the zero address') printInfo(' - new Address(publicKey) - Create from 32-byte public key') printInfo(' - address.toString() - Encode to base32 string (58 chars)') printInfo(' - address.equals(other) - Compare two addresses') printInfo(' - address.checksum() - Get 4-byte checksum') printInfo(' - address.publicKey - Get 32-byte public key (Uint8Array)')
printInfo('\nUtility functions:') printInfo(' - isValidAddress(str) - Check if string is valid address')
printInfo('\nConstants:') printInfo(` - ALGORAND_ADDRESS_LENGTH = ${ALGORAND_ADDRESS_LENGTH}`) printInfo(` - ALGORAND_ZERO_ADDRESS_STRING = ${ALGORAND_ZERO_ADDRESS_STRING.substring(0, 20)}...`)
printSuccess('Address Basics example completed successfully!')}
main()