How to create and use AccountAddress in @aptos-labs/ts-sdk. Covers address format (AIP-40), from/fromString/fromStrict, special addresses, LONG vs SHORT form, and derived addresses (object, resource, token, user-derived). Triggers on: 'AccountAddress', 'AccountAddress.from', 'AIP-40', 'derived address', 'createObjectAddress', 'createResourceAddress', 'createTokenAddress'.
70
88%
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 correct creation, parsing, and formatting of account addresses in @aptos-labs/ts-sdk. Addresses are 32-byte values; string format follows AIP-40.
AccountAddress.from() for flexible input – accepts string (with or without 0x), Uint8Array, or existing AccountAddress.AccountAddress or string in API – SDK accepts AccountAddressInput (string or AccountAddress) in most APIs.AccountAddress.fromStringStrict() / AccountAddress.fromStrict() when you need AIP-40 strict: LONG (0x + 64 hex chars) or SHORT only for special (0x0–0xf).addr.equals(other) or normalize with AccountAddress.from().Hex class for account addresses – use AccountAddress only (per SDK docs).0x. LONG = 0x + 64 hex chars; SHORT = shortest form (e.g. 0x1, 0xf).0x0–0xf (last byte < 16, rest zero). These may be written in SHORT form (0x1, 0xa).import { AccountAddress } from "@aptos-labs/ts-sdk";
// Relaxed: accepts with or without 0x, SHORT or LONG
const addr1 = AccountAddress.from("0x1");
const addr2 = AccountAddress.from(
"0xaa86fe99004361f747f91342ca13c426ca0cccb0c1217677180c9493bad6ef0c",
);
const addr3 = AccountAddress.from("1"); // no 0x ok// Strict: LONG (0x + 64 chars) or SHORT only for special (0x0–0xf)
const addrStrict = AccountAddress.fromStringStrict(
"0x0000000000000000000000000000000000000000000000000000000000000001",
);
// Or use fromStrict for any AccountAddressInput
const a = AccountAddress.fromStrict("0x1"); // ok: special address in SHORT formconst bytes = new Uint8Array(32);
bytes[31] = 1;
const addr = new AccountAddress(bytes);
// or
const addrFrom = AccountAddress.from(bytes);AccountAddress.ZERO; // 0x0
AccountAddress.ONE; // 0x1
AccountAddress.TWO; // 0x2
AccountAddress.THREE; // 0x3
AccountAddress.FOUR; // 0x4
AccountAddress.A; // 0xa| Method | Use case |
|---|---|
addr.toString() | AIP-40 default: SHORT for special, LONG for others |
addr.toStringLong() | Always 0x + 64 hex chars |
addr.toStringShort() | Shortest form (no leading zeros) |
addr.toStringLongWithoutPrefix() | 64 hex chars, no 0x |
const addr = AccountAddress.from("0x1");
addr.toString(); // "0x1"
addr.toStringLong(); // "0x0000...0001" (64 chars after 0x)const result = AccountAddress.isValid({
input: "0x1",
strict: false,
});
if (result.valid) {
// use address
} else {
console.log(result.invalidReason, result.invalidReasonMessage);
}Import from @aptos-labs/ts-sdk (via core):
import {
AccountAddress,
createObjectAddress,
createResourceAddress,
createTokenAddress,
createUserDerivedObjectAddress,
} from "@aptos-labs/ts-sdk";const creator = AccountAddress.from(
"0x120e79e45d21ef439963580c77a023e2729db799e96e61f878fac98fde5b9cc9",
);
const seed = "migration::migration_contract"; // or Uint8Array
const objectAddr = createObjectAddress(creator, seed);
// objectAddr.toString() => deterministic 0x... addressconst creator = AccountAddress.from(
"0x41e724e1d4fce6472ffcb5c9886770893eb49489e3f531d0aa97bf951e66d70c",
);
const seed = "create_resource::create_resource";
const resourceAddr = createResourceAddress(creator, seed);const creator = AccountAddress.from(
"0x9d518b9b84f327eafc5f6632200ea224a818a935ffd6be5d78ada250bbc44a6",
);
const collectionName = "SuperV Villains";
const tokenName = "Nami #5962";
const tokenAddr = createTokenAddress(creator, collectionName, tokenName);
// Internally: seed = `${collectionName}::${tokenName}` -> createObjectAddress(creator, seed)const sourceAddress = AccountAddress.from(
"0x653a60dab27fe8f3859414973d218e1b7551c778a8650a7055a85c0f8041b2a4",
);
const deriveFromAddress = AccountAddress.from("0xa");
const userDerivedAddr = createUserDerivedObjectAddress(sourceAddress, deriveFromAddress);const a = AccountAddress.from("0x1");
const b = AccountAddress.from("0x0000000000000000000000000000000000000000000000000000000000000001");
a.equals(b); // true
// BCS: use serializer or SDK entry/script helpers in transaction building| Mistake | Correct approach |
|---|---|
Using Hex for account address | Use AccountAddress only |
Comparing with === on strings | Use addr1.equals(addr2) or compare after AccountAddress.from() |
| Using SHORT for non-special in strict | Use LONG (0x + 64 hex chars) or AccountAddress.from() (relaxed) |
| Hand-rolling object address hash | Use createObjectAddress / createTokenAddress / createResourceAddress / createUserDerivedObjectAddress |
src/core/accountAddress.ts, src/core/account/utils/address.ts919362b
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.