Skip to content

Address Basics

← Back to Common Utilities

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
  • No LocalNet required

From the repository root:

Terminal window
cd examples
npm run example common/01-address-basics.ts

View source on GitHub

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()