Granite Upgrade Activates in06d:23h:31m:13s
Utils

Utilities

Overview

The Avalanche SDK provides utility functions for AVAX unit conversion, CB58 encoding/decoding, transaction serialization, and UTXO operations. All viem utilities are also re-exported for EVM operations.

Note: All utility functions are synchronous unless marked as async. Handle errors appropriately when working with blockchain data.

Importing Utilities

Import utilities from @avalanche-sdk/client/utils:

import {
  // AVAX conversions
  avaxToNanoAvax,
  nanoAvaxToAvax,
  avaxToWei,
  weiToAvax,
  weiToNanoAvax,
  nanoAvaxToWei,
  // CB58 encoding
  CB58ToHex,
  hexToCB58,
  // Transaction serialization
  getTxFromBytes,
  getUnsignedTxFromBytes,
  // UTXO operations
  getUtxoFromBytes,
  getUtxosForAddress,
  buildUtxoBytes,
} from "@avalanche-sdk/client/utils";

// Viem utilities are also available
import { hexToBytes, bytesToHex, isAddress } from "@avalanche-sdk/client/utils";

AVAX Unit Conversion

Avalanche uses different units for different chains:

  • AVAX: Human-readable unit (1 AVAX)
  • nanoAVAX (nAVAX): Smallest unit on P-Chain and X-Chain and C-Chain atomics (1 AVAX = 10^9 nAVAX)
  • wei: Used on C-Chain (1 AVAX = 10^18 wei)

avaxToNanoAvax

Converts AVAX to nanoAVAX for P-Chain/X-Chain or C-Chain Atomic operations.

Function Signature:

function avaxToNanoAvax(amount: number): bigint;

Parameters:

NameTypeRequiredDescription
amountnumberYesAmount in AVAX

Returns:

TypeDescription
bigintAmount in nanoAVAX

Example:

import { avaxToNanoAvax } from "@avalanche-sdk/client/utils";

const nanoAvax = avaxToNanoAvax(1.5);
console.log(nanoAvax); // 1500000000n

// Use in P-Chain transaction
const tx = await walletClient.pChain.prepareBaseTxn({
  outputs: [
    {
      addresses: ["P-avax1..."],
      amount: Number(nanoAvax),
    },
  ],
});

nanoAvaxToAvax

Converts nanoAVAX back to AVAX for display purposes.

Function Signature:

function nanoAvaxToAvax(amount: bigint): number;

Parameters:

NameTypeRequiredDescription
amountbigintYesAmount in nanoAVAX

Returns:

TypeDescription
numberAmount in AVAX

Example:

import { nanoAvaxToAvax } from "@avalanche-sdk/client/utils";

const balance = await walletClient.pChain.getBalance({
  addresses: ["P-avax1..."],
});

const avax = nanoAvaxToAvax(BigInt(balance.balance || 0));
console.log(`Balance: ${avax} AVAX`);

avaxToWei

Converts AVAX to wei for C-Chain operations.

Function Signature:

function avaxToWei(amount: number): bigint;

Parameters:

NameTypeRequiredDescription
amountnumberYesAmount in AVAX

Returns:

TypeDescription
bigintAmount in wei

Example:

import { avaxToWei } from "@avalanche-sdk/client/utils";

const wei = avaxToWei(1.5);
console.log(wei); // 1500000000000000000n

// Use in C-Chain transaction
const txHash = await walletClient.cChain.sendTransaction({
  to: "0x...",
  value: wei,
});

weiToAvax

Converts wei back to AVAX for display.

Function Signature:

function weiToAvax(amount: bigint): bigint;

Parameters:

NameTypeRequiredDescription
amountbigintYesAmount in wei

Returns:

TypeDescription
bigintAmount in AVAX (as bigint)

Example:

import { weiToAvax } from "@avalanche-sdk/client/utils";

const balance = await walletClient.cChain.getBalance({
  address: "0x...",
});

const avax = weiToAvax(balance);
console.log(`Balance: ${avax} AVAX`);

weiToNanoAvax

Converts wei to nanoAVAX for cross-chain operations.

Function Signature:

function weiToNanoAvax(amount: bigint): bigint;

Parameters:

NameTypeRequiredDescription
amountbigintYesAmount in wei

Returns:

TypeDescription
bigintAmount in nanoAVAX

Example:

import { weiToNanoAvax } from "@avalanche-sdk/client/utils";

const cChainBalance = await walletClient.cChain.getBalance({
  address: "0x...",
});

// Convert to nanoAVAX for P-Chain transfer
const nanoAvax = weiToNanoAvax(cChainBalance);

nanoAvaxToWei

Converts nanoAVAX to wei for cross-chain operations.

Function Signature:

function nanoAvaxToWei(amount: bigint): bigint;

Parameters:

NameTypeRequiredDescription
amountbigintYesAmount in nanoAVAX

Returns:

TypeDescription
bigintAmount in wei

Example:

import { nanoAvaxToWei } from "@avalanche-sdk/client/utils";

const pChainBalance = await walletClient.pChain.getBalance({
  addresses: ["P-avax1..."],
});

// Convert to wei for C-Chain transfer
const wei = nanoAvaxToWei(BigInt(pChainBalance.balance || 0));

CB58 Encoding/Decoding

CB58 is Avalanche's base58 encoding format used for transaction IDs, asset IDs, and addresses.

CB58ToHex

Converts CB58-encoded strings to hexadecimal format.

Function Signature:

function CB58ToHex(cb58: string): Hex;

Parameters:

NameTypeRequiredDescription
cb58stringYesCB58 encoded string

Returns:

TypeDescription
HexHexadecimal string with 0x prefix

Example:

import { CB58ToHex } from "@avalanche-sdk/client/utils";

const txId = "mYxFK3CWs6iMFFaRx4wmVLDUtnktzm2o9Mhg9AG6JSzRijy5V";
const hex = CB58ToHex(txId);
console.log(hex); // 0x...

// Use with hex-based APIs
const tx = await client.pChain.getAtomicTx({ txID: hex });

hexToCB58

Converts hexadecimal strings to CB58 format.

Function Signature:

function hexToCB58(hex: Hex): string;

Parameters:

NameTypeRequiredDescription
hexHexYesHexadecimal string with 0x prefix

Returns:

TypeDescription
stringCB58 encoded string

Example:

import { hexToCB58 } from "@avalanche-sdk/client/utils";

const hex = "0x1234567890abcdef";
const cb58 = hexToCB58(hex);
console.log(cb58); // CB58 encoded string

Transaction Serialization

getTxFromBytes

Parses signed transaction bytes to extract the transaction and credentials.

Function Signature:

function getTxFromBytes(
  txBytes: string,
  chainAlias: "P" | "X" | "C"
): [Common.Transaction, Credential[]];

Parameters:

NameTypeRequiredDescription
txBytesstringYesTransaction bytes as hex string
chainAlias"P" | "X" | "C"YesChain alias

Returns:

TypeDescription
[Common.Transaction, Credential[]]Tuple containing transaction and credentials array

Example:

import { getTxFromBytes } from "@avalanche-sdk/client/utils";

const txHex = "0x1234567890abcdef...";
const [tx, credentials] = getTxFromBytes(txHex, "P");

console.log("Transaction ID:", tx.getId().toString());
console.log("Signatures:", credentials.length);

getUnsignedTxFromBytes

Parses unsigned transaction bytes to get an unsigned transaction object.

Function Signature:

function getUnsignedTxFromBytes(
  txBytes: string,
  chainAlias: "P" | "X" | "C"
): UnsignedTx;

Parameters:

NameTypeRequiredDescription
txBytesstringYesTransaction bytes as hex string
chainAlias"P" | "X" | "C"YesChain alias

Returns:

TypeDescription
UnsignedTxParsed unsigned transaction object

Example:

import { getUnsignedTxFromBytes } from "@avalanche-sdk/client/utils";

const txHex = "0x1234567890abcdef...";
const unsignedTx = getUnsignedTxFromBytes(txHex, "P");

console.log("Transaction ID:", unsignedTx.txID);
console.log("Transaction bytes:", unsignedTx.toBytes());

UTXO Operations

getUtxoFromBytes

Parses UTXO bytes to get a UTXO object.

Function Signature:

function getUtxoFromBytes(
  utxoBytesOrHex: string | Uint8Array,
  chainAlias: "P" | "X" | "C"
): Utxo;

Parameters:

NameTypeRequiredDescription
utxoBytesOrHexstring | Uint8ArrayYesUTXO bytes as hex string or Uint8Array
chainAlias"P" | "X" | "C"YesChain alias

Returns:

TypeDescription
UtxoParsed UTXO object

Example:

import { getUtxoFromBytes } from "@avalanche-sdk/client/utils";

const utxoHex = "0x1234567890abcdef...";
const utxo = getUtxoFromBytes(utxoHex, "P");

console.log("UTXO ID:", utxo.utxoID);
console.log("Asset ID:", utxo.assetID);
console.log("Output:", utxo.output);

getUtxosForAddress

Fetches all UTXOs for a given address on a specific chain. This function handles pagination automatically.

Function Signature:

function getUtxosForAddress(
  client: AvalancheWalletCoreClient,
  params: {
    address: string;
    chainAlias: "P" | "X" | "C";
    sourceChain?: string;
  }
): Promise<Utxo[]>;

Parameters:

NameTypeRequiredDescription
clientAvalancheWalletCoreClientYesThe wallet client instance
paramsobjectYesParameters object

params object:

NameTypeRequiredDescription
addressstringYesAddress to query
chainAlias"P" | "X" | "C"YesChain alias
sourceChainstringNoSource chain ID for import transactions

Returns:

TypeDescription
Promise<Utxo[]>Array of UTXO objects

Example:

import { getUtxosForAddress } from "@avalanche-sdk/client/utils";
import { createAvalancheWalletClient } from "@avalanche-sdk/client";
import { avalanche } from "@avalanche-sdk/client/chains";

const walletClient = createAvalancheWalletClient({
  account: myAccount,
  chain: avalanche,
  transport: { type: "http" },
});

const utxos = await getUtxosForAddress(walletClient, {
  address: "P-avax1...",
  chainAlias: "P",
});

console.log(`Found ${utxos.length} UTXOs`);

buildUtxoBytes

Builds UTXO bytes from parameters. Useful for reconstructing UTXOs or creating test data.

Function Signature:

function buildUtxoBytes(
  txHash: string,
  outputIndex: number,
  assetId: string,
  amount: string,
  addresses: string[],
  locktime: string,
  threshold: number
): `0x${string}`;

Parameters:

NameTypeRequiredDescription
txHashstringYesTransaction hash in CB58 format
outputIndexnumberYesOutput index in the transaction
assetIdstringYesAsset ID in CB58 format
amountstringYesAmount as string
addressesstring[]YesArray of addresses that can spend this UTXO
locktimestringYesUNIX timestamp locktime in seconds
thresholdnumberYesSignature threshold

Returns:

TypeDescription
`0x${string}`UTXO bytes as hex string

Example:

import { buildUtxoBytes } from "@avalanche-sdk/client/utils";

const utxoBytes = buildUtxoBytes(
  "mYxFK3CWs6iMFFaRx4wmVLDUtnktzm2o9Mhg9AG6JSzRijy5V",
  0,
  "U8iRqJoiJm8xZHAacmvYyZVwqQx6uDNtQeP3CQ6fcgQk3JqnK",
  "111947",
  ["P-fuji1nv6w7m6egkwhkcvz96ze3qmzyk5gt6csqz7ejq"],
  "0",
  1
);

console.log("UTXO bytes:", utxoBytes);

Viem Utilities

The SDK re-exports all utilities from viem for EVM operations. See the viem utilities documentation for complete reference.

Common Categories:

  • Encoding/Decoding: bytesToHex, hexToBytes, stringToHex
  • ABI Operations: encodeAbiParameters, decodeAbiParameters, parseAbiItem
  • Address Operations: getAddress, isAddress, checksumAddress
  • Number Operations: bytesToBigInt, hexToNumber, numberToHex
  • Hash Operations: keccak256, sha256, ripemd160
  • Signature Operations: recoverAddress, verifyMessage

Common Patterns

Converting Between Units

import {
  avaxToNanoAvax,
  nanoAvaxToAvax,
  avaxToWei,
  weiToAvax,
} from "@avalanche-sdk/client/utils";

// P-Chain: AVAX → nanoAVAX
const nanoAvax = avaxToNanoAvax(1.5);

// C-Chain: AVAX → wei
const wei = avaxToWei(1.5);

// Display: nanoAVAX → AVAX
const avax = nanoAvaxToAvax(nanoAvax);

Working with Transaction IDs

import { CB58ToHex, hexToCB58 } from "@avalanche-sdk/client/utils";

// Convert CB58 to hex for API calls
const txId = "mYxFK3CWs6iMFFaRx4wmVLDUtnktzm2o9Mhg9AG6JSzRijy5V";
const hex = CB58ToHex(txId);

// Convert hex back to CB58 for display
const cb58 = hexToCB58(hex);

Parsing Transactions

import { getTxFromBytes } from "@avalanche-sdk/client/utils";

const txHex = "0x...";
const [tx, credentials] = getTxFromBytes(txHex, "P");

// Access transaction details
const txId = tx.getId().toString();
const numSignatures = credentials.length;

Next Steps

Is this guide helpful?