Skip to content
Algorand Developer Portal

Account Information

← Back to Algod Client

This example demonstrates how to retrieve comprehensive account information using the AlgodClient methods: accountInformation(), accountApplicationInformation(), and accountAssetInformation().

  • LocalNet running (via algokit localnet start)

From the repository root:

Terminal window
cd examples
npm run example algod_client/04-account-info.ts

View source on GitHub

04-account-info.ts
/**
* Example: Account Information
*
* This example demonstrates how to retrieve comprehensive account information using
* the AlgodClient methods: accountInformation(), accountApplicationInformation(), and
* accountAssetInformation().
*
* Prerequisites:
* - LocalNet running (via `algokit localnet start`)
*/
import {
createAlgodClient,
createAlgorandClient,
getFundedAccount,
printError,
printHeader,
printInfo,
printStep,
printSuccess,
shortenAddress,
} from '../shared/utils.js';
/**
* Format a bigint microAlgos value to both microAlgo and Algo representations
*/
function formatAmount(microAlgos: bigint): { microAlgo: string; algo: string } {
const microAlgoStr = microAlgos.toLocaleString('en-US');
const algoValue = Number(microAlgos) / 1_000_000;
const algoStr = algoValue.toLocaleString('en-US', {
minimumFractionDigits: 6,
maximumFractionDigits: 6,
});
return {
microAlgo: `${microAlgoStr} µALGO`,
algo: `${algoStr} ALGO`,
};
}
async function main() {
printHeader('Account Information Example');
// Create an Algod client connected to LocalNet
const algod = createAlgodClient();
// Create an AlgorandClient to get a funded account
const algorand = createAlgorandClient();
// =========================================================================
// Step 1: Get a Funded Account from LocalNet
// =========================================================================
printStep(1, 'Getting a funded account from LocalNet');
let accountAddress: string;
try {
const fundedAccount = await getFundedAccount(algorand);
accountAddress = fundedAccount.addr.toString();
printSuccess(`Got funded account: ${accountAddress}`);
} catch (error) {
printError(
`Failed to get funded account: ${error instanceof Error ? error.message : String(error)}`,
);
printInfo('Make sure LocalNet is running with `algokit localnet start`');
printInfo('If issues persist, try `algokit localnet reset`');
process.exit(1);
}
// =========================================================================
// Step 2: Get Full Account Information
// =========================================================================
printStep(2, 'Getting full account information with accountInformation()');
try {
const accountInfo = await algod.accountInformation(accountAddress);
printSuccess('Account information retrieved successfully!');
printInfo('');
// Display core account fields
printInfo('Core Account Information:');
printInfo(` Address: ${accountInfo.address.toString()}`);
printInfo(` Short: ${shortenAddress(accountInfo.address.toString())}`);
const balance = formatAmount(accountInfo.amount);
printInfo(` Balance: ${balance.algo} (${balance.microAlgo})`);
const minBalance = formatAmount(accountInfo.minBalance);
printInfo(` Min Balance: ${minBalance.algo} (${minBalance.microAlgo})`);
printInfo(` Status: ${accountInfo.status}`);
printInfo(` Round: ${accountInfo.round.toLocaleString('en-US')}`);
printInfo('');
// =========================================================================
// Step 3: Display Additional Account Fields
// =========================================================================
printStep(3, 'Displaying additional account fields');
const pendingRewards = formatAmount(accountInfo.pendingRewards);
const totalRewards = formatAmount(accountInfo.rewards);
const amountWithoutRewards = formatAmount(accountInfo.amountWithoutPendingRewards);
printInfo('Rewards Information:');
printInfo(` Pending Rewards: ${pendingRewards.algo}`);
printInfo(` Total Rewards: ${totalRewards.algo}`);
printInfo(` Amount Without Rewards: ${amountWithoutRewards.algo}`);
printInfo('');
// =========================================================================
// Step 4: Display Asset Holdings
// =========================================================================
printStep(4, 'Displaying assets held by the account (assetHolding)');
printInfo('Asset Holdings:');
printInfo(` Total Assets Opted In: ${accountInfo.totalAssetsOptedIn}`);
if (accountInfo.assets && accountInfo.assets.length > 0) {
printInfo(' Asset Holdings:');
for (const asset of accountInfo.assets) {
printInfo(` - Asset ID: ${asset.assetId}`);
printInfo(` Amount: ${asset.amount.toLocaleString('en-US')}`);
printInfo(` Frozen: ${asset.isFrozen}`);
}
} else {
printInfo(' No assets held by this account');
printInfo('On LocalNet, dispenser accounts typically do not hold any ASAs');
}
printInfo('');
// =========================================================================
// Step 5: Display Created Applications
// =========================================================================
printStep(5, 'Displaying applications created by the account (createdApps)');
printInfo('Created Applications:');
printInfo(` Total Created Apps: ${accountInfo.totalCreatedApps}`);
if (accountInfo.createdApps && accountInfo.createdApps.length > 0) {
printInfo(' Created Applications:');
for (const app of accountInfo.createdApps) {
printInfo(` - App ID: ${app.id}`);
if (app.params.creator) {
printInfo(` Creator: ${shortenAddress(app.params.creator.toString())}`);
}
}
} else {
printInfo(' No applications created by this account');
printInfo('This account has not deployed any smart contracts');
}
printInfo('');
// =========================================================================
// Step 6: Display Opted-In Applications
// =========================================================================
printStep(6, 'Displaying applications the account has opted into (appsLocalState)');
printInfo('Opted-In Applications (Local State):');
printInfo(` Total Apps Opted In: ${accountInfo.totalAppsOptedIn}`);
if (accountInfo.appsLocalState && accountInfo.appsLocalState.length > 0) {
printInfo(' Local State Entries:');
for (const localState of accountInfo.appsLocalState) {
printInfo(` - App ID: ${localState.id}`);
printInfo(
` Schema: ${localState.schema.numUints} uints, ${localState.schema.numByteSlices} byte slices`,
);
if (localState.keyValue && localState.keyValue.length > 0) {
printInfo(` Key-Value Pairs: ${localState.keyValue.length}`);
}
}
} else {
printInfo(' No applications opted into');
printInfo('This account has not opted into any applications');
}
printInfo('');
// =========================================================================
// Step 7: Display Created Assets
// =========================================================================
printStep(7, 'Displaying assets created by the account (createdAssets)');
printInfo('Created Assets:');
printInfo(` Total Created Assets: ${accountInfo.totalCreatedAssets}`);
if (accountInfo.createdAssets && accountInfo.createdAssets.length > 0) {
printInfo(' Created Assets:');
for (const asset of accountInfo.createdAssets) {
printInfo(` - Asset ID: ${asset.id}`);
if (asset.params.name) {
printInfo(` Name: ${asset.params.name}`);
}
if (asset.params.unitName) {
printInfo(` Unit: ${asset.params.unitName}`);
}
printInfo(` Total: ${asset.params.total.toLocaleString('en-US')}`);
printInfo(` Decimals: ${asset.params.decimals}`);
}
} else {
printInfo(' No assets created by this account');
}
printInfo('');
// =========================================================================
// Step 8: Demonstrate accountApplicationInformation() (if apps exist)
// =========================================================================
printStep(8, 'Demonstrating accountApplicationInformation(address, appId)');
if (accountInfo.appsLocalState && accountInfo.appsLocalState.length > 0) {
const appId = accountInfo.appsLocalState[0].id;
printInfo(`Querying specific application info for App ID: ${appId}`);
const appInfo = await algod.accountApplicationInformation(accountAddress, appId);
printSuccess('Application-specific information retrieved!');
printInfo(` Round: ${appInfo.round.toLocaleString('en-US')}`);
if (appInfo.appLocalState) {
printInfo(` Has Local State: Yes`);
printInfo(
` Schema: ${appInfo.appLocalState.schema.numUints} uints, ${appInfo.appLocalState.schema.numByteSlices} byte slices`,
);
}
if (appInfo.createdApp) {
printInfo(` Is Creator: Yes`);
}
} else if (accountInfo.createdApps && accountInfo.createdApps.length > 0) {
const appId = accountInfo.createdApps[0].id;
printInfo(`Querying specific application info for App ID: ${appId}`);
const appInfo = await algod.accountApplicationInformation(accountAddress, appId);
printSuccess('Application-specific information retrieved!');
printInfo(` Round: ${appInfo.round.toLocaleString('en-US')}`);
if (appInfo.createdApp) {
printInfo(` Is Creator: Yes`);
printInfo(
` Approval Program Size: ${appInfo.createdApp.approvalProgram?.length ?? 0} bytes`,
);
printInfo(
` Clear Program Size: ${appInfo.createdApp.clearStateProgram?.length ?? 0} bytes`,
);
}
} else {
printInfo('No applications to query.');
printInfo(
'accountApplicationInformation() requires an app ID that the account has interacted with.',
);
printInfo('It returns both local state (if opted in) and global state (if creator).');
}
printInfo('');
// =========================================================================
// Step 9: Demonstrate accountAssetInformation() (if assets exist)
// =========================================================================
printStep(9, 'Demonstrating accountAssetInformation(address, assetId)');
if (accountInfo.assets && accountInfo.assets.length > 0) {
const assetId = accountInfo.assets[0].assetId;
printInfo(`Querying specific asset info for Asset ID: ${assetId}`);
const assetInfo = await algod.accountAssetInformation(accountAddress, assetId);
printSuccess('Asset-specific information retrieved!');
printInfo(` Round: ${assetInfo.round.toLocaleString('en-US')}`);
if (assetInfo.assetHolding) {
printInfo(` Holding Amount: ${assetInfo.assetHolding.amount.toLocaleString('en-US')}`);
printInfo(` Is Frozen: ${assetInfo.assetHolding.isFrozen}`);
}
if (assetInfo.createdAsset) {
printInfo(` Is Creator: Yes`);
printInfo(` Total Supply: ${assetInfo.createdAsset.total.toLocaleString('en-US')}`);
}
} else if (accountInfo.createdAssets && accountInfo.createdAssets.length > 0) {
const assetId = accountInfo.createdAssets[0].id;
printInfo(`Querying specific asset info for Asset ID: ${assetId}`);
const assetInfo = await algod.accountAssetInformation(accountAddress, assetId);
printSuccess('Asset-specific information retrieved!');
printInfo(` Round: ${assetInfo.round.toLocaleString('en-US')}`);
if (assetInfo.assetHolding) {
printInfo(` Holding Amount: ${assetInfo.assetHolding.amount.toLocaleString('en-US')}`);
}
if (assetInfo.createdAsset) {
printInfo(` Is Creator: Yes`);
printInfo(` Total Supply: ${assetInfo.createdAsset.total.toLocaleString('en-US')}`);
printInfo(` Decimals: ${assetInfo.createdAsset.decimals}`);
}
} else {
printInfo('No assets to query.');
printInfo(
'accountAssetInformation() requires an asset ID that the account has interacted with.',
);
printInfo('It returns both the holding info and asset params (if creator).');
}
} catch (error) {
printError(
`Failed to get account information: ${error instanceof Error ? error.message : String(error)}`,
);
process.exit(1);
}
// =========================================================================
// Summary
// =========================================================================
printHeader('Summary');
printInfo('This example demonstrated:');
printInfo(' 1. accountInformation(address) - Get full account details');
printInfo(' 2. Key fields: address, amount, minBalance, status, round');
printInfo(' 3. Asset holdings (assets array)');
printInfo(' 4. Created applications (createdApps array)');
printInfo(' 5. Opted-in applications (appsLocalState array)');
printInfo(' 6. Created assets (createdAssets array)');
printInfo(' 7. accountApplicationInformation(address, appId) - Get specific app info');
printInfo(' 8. accountAssetInformation(address, assetId) - Get specific asset info');
printInfo('');
printInfo('Key Account fields:');
printInfo(' - address: The account public key');
printInfo(' - amount: Total MicroAlgos in the account');
printInfo(' - minBalance: Minimum balance required based on usage');
printInfo(' - status: "Offline", "Online", or "NotParticipating"');
printInfo(' - round: The round this information is valid for');
printInfo(' - assets: Array of AssetHolding (assetId, amount, isFrozen)');
printInfo(' - appsLocalState: Array of ApplicationLocalState (opted-in apps)');
printInfo(' - createdApps: Array of Application (apps created by this account)');
printInfo(' - createdAssets: Array of Asset (ASAs created by this account)');
printInfo('');
printInfo('Use cases:');
printInfo(' - Check account balance before transactions');
printInfo(' - Verify minimum balance requirements');
printInfo(' - Enumerate assets held or created by an account');
printInfo(' - Check application opt-in status');
printInfo(' - Query specific asset or app details for an account');
}
main().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});