UNPKG

@crtxio/abi

Version:

A tiny Solidity ABI encoder and decoder

50 lines (40 loc) 1.29 kB
import { pack, unpack } from '../packer'; import { DecodeArgs, Parser } from '../types'; import { concat, toBuffer, toNumber } from '../utils'; // TODO: Add support for fixed length arrays const ARRAY_REGEX = /^(.*)\[]$/; /** * Get the type of the array. * * @param type The type to get the array type for. * @return The array type. */ export const getArrayType = (type: string): string => { const match = type.match(ARRAY_REGEX); if (match) { return match[1]; } throw new Error('Type is not an array type'); }; export const array: Parser<unknown[]> = { isDynamic: true, /** * Check if a type is an array type. * * @param type The type to check. * @return Whether the type is a array type. */ isType(type: string): boolean { return ARRAY_REGEX.test(type); }, encode({ type, buffer, value }): Uint8Array { const arrayType = getArrayType(type); const arrayLength = toBuffer(value.length); return pack(new Array(value.length).fill(arrayType), value, concat([buffer, arrayLength])); }, decode({ type, value }: DecodeArgs): unknown[] { const arrayType = getArrayType(type); const arrayLength = Number(toNumber(value.subarray(0, 32))); return unpack(new Array(arrayLength).fill(arrayType), value.subarray(32)); } };