ABI Primitive Types
Description
Section titled “Description”This example demonstrates how to encode and decode primitive ABI types:
- ABIUintType: Unsigned integers of various bit sizes (8, 16, 32, 64, 128, 256, 512)
- ABIBoolType: Boolean values encoded as a single byte
- ABIByteType: Single byte values Shows encode() and decode() methods, hex format display, and round-trip verification.
Prerequisites
Section titled “Prerequisites”- No LocalNet required
Run This Example
Section titled “Run This Example”From the repository root:
cd examplesnpm run example abi/02-primitive-types.ts/** * Example: ABI Primitive Types * * This example demonstrates how to encode and decode primitive ABI types: * - ABIUintType: Unsigned integers of various bit sizes (8, 16, 32, 64, 128, 256, 512) * - ABIBoolType: Boolean values encoded as a single byte * - ABIByteType: Single byte values * * Shows encode() and decode() methods, hex format display, and round-trip verification. * * Prerequisites: * - No LocalNet required */
import { ABIBoolType, ABIByteType, ABIUintType } from '@algorandfoundation/algokit-utils/abi'import { formatHex, printHeader, printInfo, printStep, printSuccess } from '../shared/utils.js'
function main() { printHeader('ABI Primitive Types Example')
// Step 1: ABIUintType with various bit sizes printStep(1, 'ABIUintType - Various Bit Sizes')
const uintSizes = [8, 16, 32, 64, 128, 256, 512]
for (const bitSize of uintSizes) { const uintType = new ABIUintType(bitSize) printInfo(`\n${uintType.toString()}:`) printInfo(` bitSize: ${uintType.bitSize}`) printInfo(` byteLen: ${uintType.byteLen()}`) printInfo(` isDynamic: ${uintType.isDynamic()}`) }
// Step 2: Encoding and decoding small uint values printStep(2, 'Encoding/Decoding Small Uint Values')
const uint8Type = new ABIUintType(8) const uint8Value = 42 const uint8Encoded = uint8Type.encode(uint8Value) const uint8Decoded = uint8Type.decode(uint8Encoded)
printInfo(`uint8 value: ${uint8Value}`) printInfo(` encoded: ${formatHex(uint8Encoded)}`) printInfo(` decoded: ${uint8Decoded}`) printInfo(` round-trip verified: ${Number(uint8Decoded) === uint8Value}`)
const uint16Type = new ABIUintType(16) const uint16Value = 1000 const uint16Encoded = uint16Type.encode(uint16Value) const uint16Decoded = uint16Type.decode(uint16Encoded)
printInfo(`uint16 value: ${uint16Value}`) printInfo(` encoded: ${formatHex(uint16Encoded)}`) printInfo(` decoded: ${uint16Decoded}`) printInfo(` round-trip verified: ${Number(uint16Decoded) === uint16Value}`)
const uint32Type = new ABIUintType(32) const uint32Value = 1_000_000 const uint32Encoded = uint32Type.encode(uint32Value) const uint32Decoded = uint32Type.decode(uint32Encoded)
printInfo(`uint32 value: ${uint32Value}`) printInfo(` encoded: ${formatHex(uint32Encoded)}`) printInfo(` decoded: ${uint32Decoded}`) printInfo(` round-trip verified: ${Number(uint32Decoded) === uint32Value}`)
const uint64Type = new ABIUintType(64) const uint64Value = 9_007_199_254_740_991n // Max safe integer as BigInt const uint64Encoded = uint64Type.encode(uint64Value) const uint64Decoded = uint64Type.decode(uint64Encoded)
printInfo(`uint64 value: ${uint64Value}`) printInfo(` encoded: ${formatHex(uint64Encoded)}`) printInfo(` decoded: ${uint64Decoded}`) printInfo(` round-trip verified: ${uint64Decoded === uint64Value}`)
// Step 3: Encoding BigInt values for large uint types printStep(3, 'Encoding BigInt Values for Large Uint Types')
const uint128Type = new ABIUintType(128) const uint128Value = 340282366920938463463374607431768211455n // 2^128 - 1 (max uint128) const uint128Encoded = uint128Type.encode(uint128Value) const uint128Decoded = uint128Type.decode(uint128Encoded)
printInfo(`uint128 max value: ${uint128Value}`) printInfo(` encoded: ${formatHex(uint128Encoded)}`) printInfo(` decoded: ${uint128Decoded}`) printInfo(` round-trip verified: ${uint128Decoded === uint128Value}`)
const uint256Type = new ABIUintType(256) // Example: a large 256-bit value const uint256Value = 115792089237316195423570985008687907853269984665640564039457584007913129639935n // 2^256 - 1 (max uint256) const uint256Encoded = uint256Type.encode(uint256Value) const uint256Decoded = uint256Type.decode(uint256Encoded)
printInfo(`uint256 max value: ${uint256Value}`) printInfo(` encoded: ${formatHex(uint256Encoded)}`) printInfo(` decoded: ${uint256Decoded}`) printInfo(` round-trip verified: ${uint256Decoded === uint256Value}`)
const uint512Type = new ABIUintType(512) // Example: a moderately large 512-bit value const uint512Value = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084095n // 2^512 - 1 (max uint512) const uint512Encoded = uint512Type.encode(uint512Value) const uint512Decoded = uint512Type.decode(uint512Encoded)
printInfo(`uint512 max value: ${uint512Value}`) printInfo(` encoded: ${formatHex(uint512Encoded)}`) printInfo(` decoded: ${uint512Decoded}`) printInfo(` round-trip verified: ${uint512Decoded === uint512Value}`)
// Step 4: ABIBoolType encoding true/false printStep(4, 'ABIBoolType - Encoding Boolean Values')
const boolType = new ABIBoolType()
printInfo(`bool type: ${boolType.toString()}`) printInfo(` byteLen: ${boolType.byteLen()}`) printInfo(` isDynamic: ${boolType.isDynamic()}`)
// Encode true const trueEncoded = boolType.encode(true) const trueDecoded = boolType.decode(trueEncoded)
printInfo(`\nbool value: true`) printInfo(` encoded: ${formatHex(trueEncoded)}`) printInfo(` decoded: ${trueDecoded}`) printInfo(` round-trip verified: ${trueDecoded === true}`)
// Encode false const falseEncoded = boolType.encode(false) const falseDecoded = boolType.decode(falseEncoded)
printInfo(`\nbool value: false`) printInfo(` encoded: ${formatHex(falseEncoded)}`) printInfo(` decoded: ${falseDecoded}`) printInfo(` round-trip verified: ${falseDecoded === false}`)
// Step 5: ABIByteType encoding single byte values printStep(5, 'ABIByteType - Encoding Single Byte Values')
const byteType = new ABIByteType()
printInfo(`byte type: ${byteType.toString()}`) printInfo(` byteLen: ${byteType.byteLen()}`) printInfo(` isDynamic: ${byteType.isDynamic()}`)
// Encode minimum byte value (0) const byte0Value = 0 const byte0Encoded = byteType.encode(byte0Value) const byte0Decoded = byteType.decode(byte0Encoded)
printInfo(`\nbyte value: ${byte0Value} (0x00)`) printInfo(` encoded: ${formatHex(byte0Encoded)}`) printInfo(` decoded: ${byte0Decoded}`) printInfo(` round-trip verified: ${byte0Decoded === byte0Value}`)
// Encode a middle byte value (127) const byte127Value = 127 const byte127Encoded = byteType.encode(byte127Value) const byte127Decoded = byteType.decode(byte127Encoded)
printInfo(`\nbyte value: ${byte127Value} (0x7F)`) printInfo(` encoded: ${formatHex(byte127Encoded)}`) printInfo(` decoded: ${byte127Decoded}`) printInfo(` round-trip verified: ${byte127Decoded === byte127Value}`)
// Encode maximum byte value (255) const byte255Value = 255 const byte255Encoded = byteType.encode(byte255Value) const byte255Decoded = byteType.decode(byte255Encoded)
printInfo(`\nbyte value: ${byte255Value} (0xFF)`) printInfo(` encoded: ${formatHex(byte255Encoded)}`) printInfo(` decoded: ${byte255Decoded}`) printInfo(` round-trip verified: ${byte255Decoded === byte255Value}`)
// Step 6: Summary of encoded byte lengths printStep(6, 'Summary - Encoded Byte Lengths')
printInfo('Primitive type byte lengths:') printInfo(` uint8: ${new ABIUintType(8).byteLen()} byte`) printInfo(` uint16: ${new ABIUintType(16).byteLen()} bytes`) printInfo(` uint32: ${new ABIUintType(32).byteLen()} bytes`) printInfo(` uint64: ${new ABIUintType(64).byteLen()} bytes`) printInfo(` uint128: ${new ABIUintType(128).byteLen()} bytes`) printInfo(` uint256: ${new ABIUintType(256).byteLen()} bytes`) printInfo(` uint512: ${new ABIUintType(512).byteLen()} bytes`) printInfo(` bool: ${new ABIBoolType().byteLen()} byte`) printInfo(` byte: ${new ABIByteType().byteLen()} byte`)
printSuccess('ABI Primitive Types example completed successfully!')}
main()