How to read on-chain data in @aptos-labs/ts-sdk: view(), getBalance(), getAccountInfo(), getAccountResources(), getAccountModules(), getResource(). Triggers on: 'aptos.view', 'getBalance', 'getAccountInfo', 'getAccountResources', 'SDK query', 'view function TypeScript'.
68
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Guide read-only access to chain data in @aptos-labs/ts-sdk: view functions, balance, account info, resources, and modules.
aptos.getBalance({ accountAddress }) for APT balance – not deprecated getAccountCoinAmount / getAccountAPTAmount.aptos.view() for Move view functions – pass function, functionArguments, and optional typeArguments.bigint for u128/u256 view return values – cast result[0] to BigInt(...) when the Move function returns u128/u256.AccountAddressInput (string or AccountAddress).getAccountCoinAmount or getAccountAPTAmount – use getBalance().number for u128/u256 – precision loss; use bigint.const balance = await aptos.getBalance({
accountAddress: account.accountAddress,
});
// balance is bigint in octas (1 APT = 100_000_000 octas)
const apt = balance / 100_000_000n;
const remainder = balance % 100_000_000n;
console.log(`${apt}.${remainder.toString().padStart(8, "0")} APT`);const accountInfo = await aptos.getAccountInfo({
accountAddress: "0x1",
});
// accountInfo: { sequence_number, authentication_key, ... }// No type arguments
const result = await aptos.view({
payload: {
function: `${MODULE_ADDRESS}::counter::get_count`,
functionArguments: [accountAddress],
},
});
const count = Number(result[0]);
// With type arguments (e.g. coin type)
const balanceResult = await aptos.view({
payload: {
function: "0x1::coin::balance",
typeArguments: ["0x1::aptos_coin::AptosCoin"],
functionArguments: [accountAddress],
},
});
const coinBalance = BigInt(balanceResult[0] as string);
// Multiple return values
// Move: public fun get_listing(addr): (address, u64, bool)
const [seller, price, isActive] = await aptos.view({
payload: {
function: `${MODULE_ADDRESS}::marketplace::get_listing`,
functionArguments: [listingAddress],
},
});
const listing = {
seller: seller as string,
price: BigInt(price as string),
isActive: isActive as boolean,
};const resources = await aptos.getAccountResources({
accountAddress: account.accountAddress,
});
// resources: Array<MoveResource>
const counterResource = resources.find((r) => r.type === `${MODULE_ADDRESS}::counter::Counter`);const resource = await aptos.getAccountResource({
accountAddress: account.accountAddress,
resourceType: `${MODULE_ADDRESS}::counter::Counter`,
});
// resource.data has the struct fields
const value = (resource?.data as { value: number })?.value;const modules = await aptos.getAccountModules({
accountAddress: modulePublisherAddress,
});
// modules: MoveModuleBytecode[] (ABI, bytecode)const module = await aptos.getModule({
accountAddress: modulePublisherAddress,
moduleName: "counter",
});Use cursor-based options when available:
const { resources, cursor } = await aptos.getAccountResourcesPage({
accountAddress: account.accountAddress,
options: { limit: 10, cursor: nextCursor },
});| Move return type | TypeScript | Example |
|---|---|---|
| u8..u64 | number or bigint | Number(result[0]) or BigInt(result[0]) |
| u128, u256 | bigint | BigInt(result[0] as string) |
| address | string | result[0] as string |
| bool | boolean | result[0] as boolean |
| vector | array | result[0] as T[] |
| Mistake | Correct approach |
|---|---|
| Using getAccountCoinAmount | Use aptos.getBalance({ accountAddress }) |
| Using number for u128 | Use BigInt(result[0] as string) |
| Forgetting typeArguments for generic view | Add typeArguments: [coinType] when Move function is generic |
src/internal/view.ts, src/api/account.ts, balance/getBalance in internal919362b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.