Skip to main content

Try it Live

Run ABI examples in the interactive playground

Overview

Abi.decode decodes function return data using a full ABI. It looks up the function by name and decodes the return values based on the function outputs.

Quick Start

import { Abi } from '@tevm/voltaire/Abi';
import { Hex } from '@tevm/voltaire/Hex';

const abi = Abi([
  {
    type: 'function',
    name: 'balanceOf',
    stateMutability: 'view',
    inputs: [{ type: 'address', name: 'account' }],
    outputs: [{ type: 'uint256', name: 'balance' }]
  }
] as const);

const returnData = Hex.toBytes(
  '0x00000000000000000000000000000000000000000000000000000000000f4240'
);

const [balance] = abi.decode('balanceOf', returnData);
// balance = 1000000n

Decode Without Abi Instance

If you already have the function item, decode directly:
import { Abi } from '@tevm/voltaire/Abi';

const balanceOf = {
  type: 'function',
  name: 'balanceOf',
  inputs: [{ type: 'address', name: 'account' }],
  outputs: [{ type: 'uint256', name: 'balance' }]
} as const;

const [balance] = Abi.Function.decodeResult(balanceOf, returnData);

Overloads and Ambiguity

Abi.decode matches by function name. With overloads, pick the exact function by signature:
const signature = 'foo(address,uint256)';
const fn = abi.find(
  (item) =>
    item.type === 'function' &&
    Abi.Function.getSignature(item) === signature
);

const result = Abi.Function.decodeResult(fn, returnData);

Error Handling

import { Abi, AbiItemNotFoundError, AbiDecodingError } from '@tevm/voltaire/Abi';

try {
  abi.decode('missingFunction', returnData);
} catch (error) {
  if (error instanceof AbiItemNotFoundError) {
    console.error('Function not found in ABI');
  }
  if (error instanceof AbiDecodingError) {
    console.error('Return data did not match output types');
  }
}

See Also