From aptos-agent-skills
Guides creating, parsing, and formatting AccountAddress in @aptos-labs/ts-sdk per AIP-40: from/fromString/fromStrict methods, special addresses, LONG/SHORT forms, derived object/resource/token addresses.
npx claudepluginhub aptos-labs/aptos-agent-skills --plugin aptos-agent-skillsThis skill uses the workspace's default tool permissions.
Guide correct creation, parsing, and formatting of **account addresses** in `@aptos-labs/ts-sdk`. Addresses are 32-byte
Guides creating and using Account signers in @aptos-labs/ts-sdk via generate(), fromPrivateKey(), fromDerivationPath(); covers Ed25519, SingleKey, MultiKey, Keyless types and serialization for Aptos transactions.
Interact with Aptos blockchain: check balances, transfer APT, swap tokens, stake, execute Move view functions. Includes game-theoretic Nash equilibrium analysis; requires explicit approval for transactions.
Provides expertise in ERC-4337 account abstraction: smart contract wallets, paymasters, bundlers, user operations, social recovery, session keys, gas sponsorship, wallet SDKs.
Share bugs, ideas, or general feedback.
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 form
const 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... address
const 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.ts