Move to TypeScript type mapping in @aptos-labs/ts-sdk: u64/u128/u256 as bigint, address as string, TypeTag, functionArguments and typeArguments. Triggers on: 'typeArguments', 'functionArguments', 'Move to TypeScript', 'type mapping', 'TypeTag', 'bigint u128'.
74
93%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Guide type mapping between Move and TypeScript when using @aptos-labs/ts-sdk: numeric types (especially u128/u256), address, TypeTag, and functionArguments / typeArguments.
bigint for u128 and u256 – in both view results and functionArguments; JavaScript number loses precision above 2^53.string for address in payloads – e.g. "0x1" or accountAddress.toString(); SDK accepts AccountAddressInput (string or AccountAddress).typeArguments for generic Move functions – e.g. coin type ["0x1::aptos_coin::AptosCoin"] for coin::balance or coin::transfer.BigInt(result[0] as string) for u128.number for u128/u256 – precision loss; use bigint.bigint if value can exceed Number.MAX_SAFE_INTEGER.balance<CoinType>).| Move type | TypeScript type | Example |
|---|---|---|
| u8, u16, u32 | number | 255, 65535 |
| u64 | number | bigint | Prefer bigint for large values |
| u128, u256 | bigint | BigInt("340282366920938463463374607431768211455") |
| i8..i64 (Move 2.3+) | number | bigint | Use bigint for i64 when large |
| i128, i256 | bigint | BigInt("-...") |
| bool | boolean | true |
| address | string | "0x1" |
| signer | — | Not passed from TS; signer is the transaction sender |
| vector<u8> | Uint8Array | string (hex) | new Uint8Array([1,2,3]) or hex |
| vector<T> | T[] | [1, 2, 3] |
| String | string | "hello" |
| Object<T> | string (object address) | objectAddress.toString() |
| Option<T> | T | null | Value or null |
Order and types must match the Move entry/view function parameters:
// Move: public fun transfer<CoinType>(to: address, amount: u64)
await aptos.transaction.build.simple({
sender: account.accountAddress,
data: {
function: "0x1::coin::transfer",
typeArguments: ["0x1::aptos_coin::AptosCoin"],
functionArguments: [
"0xrecipient...", // address as string
1000n, // u64 as bigint (or number if small)
],
},
});For generic Move functions, pass full type strings (address::module::StructName):
// Move: balance<CoinType>(addr): u64
typeArguments: ["0x1::aptos_coin::AptosCoin"];
// Move: transfer<CoinType>(to, amount)
typeArguments: ["0x1::aptos_coin::AptosCoin"];const result = await aptos.view({
payload: {
function: "0x1::coin::balance",
typeArguments: ["0x1::aptos_coin::AptosCoin"],
functionArguments: [accountAddress],
},
});
// result is an array; u128 often returned as string in JSON
const balance = BigInt(result[0] as string);When building payloads programmatically or parsing type strings:
import { TypeTag } from "@aptos-labs/ts-sdk";
// Parser for type tag strings
import { parseTypeTag } from "@aptos-labs/ts-sdk";
const tag = parseTypeTag("0x1::aptos_coin::AptosCoin");Use typeArguments as string array in simple cases; use TypeTag when the SDK API expects it.
Pass object address as string (LONG or SHORT per AIP-40):
functionArguments: [
nftObjectAddress.toString(), // or "0x..."
price,
];| Mistake | Correct approach |
|---|---|
| Passing number for u128 amount | Use 1000000n or BigInt("...") |
| Omitting typeArguments for coin::balance | Add typeArguments: ["0x1::aptos_coin::AptosCoin"] |
| Using result[0] as number for u128 | Use BigInt(result[0] as string) |
| Wrong order of functionArguments | Match Move parameter order exactly |
src/transactions/typeTag/, src/transactions/instances/transactionArgument.ts, view and build APIs919362b
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.