Address API
The Address API provides comprehensive functionality for working with Cardano addresses. It supports address creation, validation, conversion, and extraction of address components. The API handles both Shelley addresses (current) and Byron addresses (legacy) with full support for different address types and networks.
Key Features
Section titled “Key Features”- Address Creation: Create addresses from various inputs (strings, bytes, credentials)
- Address Validation: Validate address format and network compatibility
- Address Conversion: Convert between different address formats and representations
- Credential Extraction: Extract payment and delegation credentials from addresses
- Type Support: Support for all Cardano address types (base, enterprise, pointer, reward)
Core Classes
Section titled “Core Classes”Address Class
Section titled “Address Class”The main class for Shelley address operations, supporting Bech32 encoded addresses and credential extraction.
Constructors:
Address(String address)— Create from Bech32 stringAddress(byte[] addressBytes)— Create from byte arrayAddress(String prefix, byte[] bytes)— Create with custom prefix
Credential & Hash Methods:
getPaymentCredential()— Extract payment credential asOptional<Credential>getDelegationCredential()— Extract delegation credential asOptional<Credential>getPaymentCredentialHash()— Get raw payment key/script hash asOptional<byte[]>getDelegationCredentialHash()— Get raw delegation key/script hash asOptional<byte[]>getBech32VerificationKeyHash()— Get Bech32-encoded (addr_vkh) payment credential hash
Type Checking Methods:
isPubKeyHashInPaymentPart()— Check if payment credential is a public key hashisScriptHashInPaymentPart()— Check if payment credential is a script hashisStakeKeyHashInDelegationPart()— Check if delegation credential is a stake key hashisScriptHashInDelegationPart()— Check if delegation credential is a script hash
Other Methods:
toBech32()/getAddress()— Convert to Bech32 formatgetAddressType()— Get the address type (Base,Enterprise,Ptr,Reward)getNetwork()— Get the network (mainnet/testnet)getPrefix()— Get the address prefixgetBytes()— Get raw address bytes
AddressProvider Class
Section titled “AddressProvider Class”Utility class for generating addresses from keys, scripts, and credentials.
Address Generation:
getBaseAddress(HdPublicKey, HdPublicKey, Network)— Base address from key pairgetBaseAddress(Credential, Credential, Network)— Base address from any credential pair (key or script)getBaseAddress(Script, HdPublicKey, Network)— Base address with script paymentgetBaseAddress(HdPublicKey, Script, Network)— Base address with script delegationgetBaseAddress(Script, Script, Network)— Base address with both scriptsgetEntAddress(HdPublicKey, Network)— Enterprise address from keygetEntAddress(Script, Network)— Enterprise address from scriptgetEntAddress(Credential, Network)— Enterprise address from credentialgetRewardAddress(HdPublicKey, Network)— Reward address from delegation keygetRewardAddress(Script, Network)— Reward address from delegation scriptgetRewardAddress(Credential, Network)— Reward address from stake credentialgetPointerAddress(HdPublicKey, Pointer, Network)— Pointer address from keygetPointerAddress(Script, Pointer, Network)— Pointer address from scriptgetPointerAddress(Credential, Pointer, Network)— Pointer address from credential
Stake Address Derivation:
getStakeAddress(Address)— Derive stake/reward address from a base addressgetStakeAddressFromAccountPublicKey(String, Network)— Stake address from Bech32 account public key (acct_xvkorxpub)getStakeAddressFromAccountPublicKey(byte[], Network)— Stake address from account public key bytes
Verification & Inspection:
verifyAddress(Address, byte[])— Verify address matches a public keyisPubKeyHashInPaymentPart(Address)/isScriptHashInPaymentPart(Address)— Check payment credential typeisStakeKeyHashInDelegationPart(Address)/isScriptHashInDelegationPart(Address)— Check delegation credential typegetPaymentCredential(Address)/getDelegationCredential(Address)— Extract credentialsgetPaymentCredentialHash(Address)/getDelegationCredentialHash(Address)— Extract raw hashes
AddressUtil Class
Section titled “AddressUtil Class”Utility class for address validation and byte-level conversion.
Key Methods:
AddressUtil.isValidAddress(String address)— Validate Shelley or Byron address formatAddressUtil.addressToBytes(String address)— Convert Shelley or Byron address string to bytesAddressUtil.bytesToAddress(byte[])— Convert bytes to Shelley (Bech32) or Byron (Base58) address stringAddressUtil.bytesToBase58Address(byte[])— Convert Byron address bytes to Base58 string
Usage Examples
Section titled “Usage Examples”Creating Addresses
Section titled “Creating Addresses”Create addresses from different input formats:
// Create address from Bech32 stringString bech32 = "addr_test1qpx4kmt...plwg6";Address address = new Address(bech32);
// Create address from byte arraybyte[] addressBytes = address.getBytes();Address addressFromBytes = new Address(addressBytes);
// Create address with custom prefixAddress customAddress = new Address("addr_test", addressBytes);Address Generation from Accounts
Section titled “Address Generation from Accounts”Generate addresses from account credentials:
// Generate addresses from accountAccount account = new Account(Networks.testnet());
// Get base address (payment + staking)String baseAddress = account.baseAddress();System.out.println("Base Address: " + baseAddress);
// Get enterprise address (payment only)String enterpriseAddress = account.enterpriseAddress();System.out.println("Enterprise Address: " + enterpriseAddress);
// Get stake address (for delegation)String stakeAddress = account.stakeAddress();System.out.println("Stake Address: " + stakeAddress);Address Generation from Credentials
Section titled “Address Generation from Credentials”Build addresses directly from Credential objects, useful when working with key hashes or script hashes:
// From key hashesbyte[] paymentKeyHash = ...; // 28-byte Blake2b-224 hashbyte[] stakeKeyHash = ...;
Credential paymentCred = Credential.fromKey(paymentKeyHash);Credential stakeCred = Credential.fromKey(stakeKeyHash);
// Base address from credentialsAddress baseAddr = AddressProvider.getBaseAddress(paymentCred, stakeCred, Networks.testnet());
// Enterprise address (payment only, no staking)Address entAddr = AddressProvider.getEntAddress(paymentCred, Networks.testnet());
// Reward address (for staking/delegation)Address rewardAddr = AddressProvider.getRewardAddress(stakeCred, Networks.testnet());You can mix key and script credentials:
// Script-locked payment with key-based stakingCredential scriptPayment = Credential.fromScript(scriptHash);Credential keyStake = Credential.fromKey(stakeKeyHash);
Address scriptBaseAddr = AddressProvider.getBaseAddress(scriptPayment, keyStake, Networks.mainnet());Stake Address Derivation
Section titled “Stake Address Derivation”Derive the stake (reward) address from an existing base address:
// From a base addressAddress baseAddress = new Address("addr_test1qpx4kmt...plwg6");Address stakeAddress = AddressProvider.getStakeAddress(baseAddress);System.out.println("Stake Address: " + stakeAddress.toBech32());
// From a CIP-1852 extended account public key (Bech32 encoded)String accountPubKey = "acct_xvk1abc...xyz";Address stakeAddr = AddressProvider.getStakeAddressFromAccountPublicKey(accountPubKey, Networks.mainnet());Address Verification
Section titled “Address Verification”Verify that an address was derived from a given public key:
Address address = new Address("addr_test1qpx4kmt...plwg6");byte[] publicKeyBytes = ...; // Ed25519 public key bytes
boolean isMatch = AddressProvider.verifyAddress(address, publicKeyBytes);if (isMatch) { System.out.println("Address matches the public key");}Address Validation
Section titled “Address Validation”Validate address format and network compatibility:
// Basic address validation (supports both Shelley and Byron)String addressToValidate = "addr_test1qpx4kmt...plwg6";
boolean isValid = AddressUtil.isValidAddress(addressToValidate);if (isValid) { System.out.println("Address is valid");}
// Network-specific validationAddress addr = new Address(addressToValidate);boolean isTestnet = addr.getNetwork().equals(Networks.testnet());
// Validate address typeboolean isBase = addr.getAddressType() == AddressType.Base;Address Conversion
Section titled “Address Conversion”Convert addresses between different formats:
// Convert address to bytesString addressString = "addr_test1qpx4kmt...plwg6";byte[] addressBytes = AddressUtil.addressToBytes(addressString);
// Convert bytes back to address string (auto-detects Shelley vs Byron)String addressStr = AddressUtil.bytesToAddress(addressBytes);
// Convert Byron address bytes to Base58byte[] byronBytes = ...;String byronAddress = AddressUtil.bytesToBase58Address(byronBytes);
// Bech32 round-trip via Address classAddress address = new Address(addressBytes);String bech32 = address.toBech32();Credential Extraction
Section titled “Credential Extraction”Extract payment and delegation credentials from addresses:
Address address = new Address("addr_test1qpx4kmt...plwg6");
// Extract payment credentialOptional<Credential> paymentCredential = address.getPaymentCredential();if (paymentCredential.isPresent()) { Credential payment = paymentCredential.get(); System.out.println("Payment Credential Type: " + payment.getType()); System.out.println("Payment Credential Hash: " + HexUtil.encodeHexString(payment.getBytes()));}
// Extract delegation credentialOptional<Credential> delegationCredential = address.getDelegationCredential();if (delegationCredential.isPresent()) { Credential delegation = delegationCredential.get(); System.out.println("Delegation Credential Type: " + delegation.getType()); System.out.println("Delegation Credential Hash: " + HexUtil.encodeHexString(delegation.getBytes()));}
// Get raw hashes directlyOptional<byte[]> paymentHash = address.getPaymentCredentialHash();Optional<byte[]> delegationHash = address.getDelegationCredentialHash();
// Get Bech32-encoded payment verification key hash (addr_vkh1...)Optional<String> vkh = address.getBech32VerificationKeyHash();Credential Type Checking
Section titled “Credential Type Checking”Determine whether address credentials are key-based or script-based:
Address address = new Address("addr_test1qpx4kmt...plwg6");
// Check payment credential typeif (address.isPubKeyHashInPaymentPart()) { System.out.println("Payment is key-based");} else if (address.isScriptHashInPaymentPart()) { System.out.println("Payment is script-based");}
// Check delegation credential typeif (address.isStakeKeyHashInDelegationPart()) { System.out.println("Delegation is key-based");} else if (address.isScriptHashInDelegationPart()) { System.out.println("Delegation is script-based");}Address Information
Section titled “Address Information”Get detailed information about addresses:
Address address = new Address("addr_test1qpx4kmt...plwg6");
// Get address typeAddressType addressType = address.getAddressType();System.out.println("Address Type: " + addressType);
// Get networkNetwork network = address.getNetwork();System.out.println("Network: " + network);
// Get prefixString prefix = address.getPrefix();System.out.println("Prefix: " + prefix);
// Get raw bytesbyte[] bytes = address.getBytes();System.out.println("Address Length: " + bytes.length + " bytes");Advanced Usage
Section titled “Advanced Usage”Script Addresses
Section titled “Script Addresses”Work with script-based addresses:
// Generate key pair for scriptKeys keyPair = KeyGenUtil.generateKey();VerificationKey verificationKey = keyPair.getVkey();
// Create script pubkeyScriptPubkey scriptPubkey = ScriptPubkey.create(verificationKey);
// Generate script addressAddress scriptAddress = AddressProvider.getEntAddress(scriptPubkey, Networks.testnet());System.out.println("Script Address: " + scriptAddress.getAddress());
// Verify it's a script addressif (scriptAddress.isScriptHashInPaymentPart()) { System.out.println("Successfully created script address");}Multi-Signature Addresses
Section titled “Multi-Signature Addresses”Create addresses for multi-signature scenarios:
// Generate multiple key pairsKeys key1 = KeyGenUtil.generateKey();Keys key2 = KeyGenUtil.generateKey();Keys key3 = KeyGenUtil.generateKey();
// Create script pubkeysScriptPubkey scriptPubkey1 = ScriptPubkey.create(key1.getVkey());ScriptPubkey scriptPubkey2 = ScriptPubkey.create(key2.getVkey());ScriptPubkey scriptPubkey3 = ScriptPubkey.create(key3.getVkey());
// Create multi-sig script (2 of 3)ScriptAtLeast multiSigScript = new ScriptAtLeast(2) .addScript(scriptPubkey1) .addScript(scriptPubkey2) .addScript(scriptPubkey3);
// Generate multi-sig addressAddress multiSigAddress = AddressProvider.getEntAddress(multiSigScript, Networks.testnet());System.out.println("Multi-Sig Address: " + multiSigAddress.getAddress());Best Practices
Section titled “Best Practices”Address Validation
Section titled “Address Validation”// Always validate addresses before useif (!AddressUtil.isValidAddress(addressString)) { System.err.println("Invalid address format"); return;}
Address address = new Address(addressString);// Proceed with validated addressAddress Types Reference
Section titled “Address Types Reference”| Address Type | Prefix | Use Case | Components |
|---|---|---|---|
| Base | addr / addr_test | Payment + Staking | Payment credential + Delegation credential |
| Enterprise | addr / addr_test | Payment only | Payment credential only |
| Pointer | addr / addr_test | Payment + Pointer to stake | Payment credential + Stake pointer |
| Reward | stake / stake_test | Staking rewards | Delegation credential only |
| Byron | Ae2 / 37 | Legacy addresses | Legacy format (deprecated) |