import { toFunctionSelector, type AbiFunction, type Hex } from "viem"; /** Find an AbiFunction by name, optionally disambiguating overloads with a predicate. */ export function abiFn( abi: readonly unknown[], name: string, pick?: (fn: AbiFunction) => boolean, ): AbiFunction { const fns = (abi as AbiFunction[]).filter((i) => i.type === "function" && i.name === name); if (fns.length === 0) throw new Error(`ABI has no function "${name}"`); const fn = pick ? fns.find(pick) : fns[0]; if (!fn) throw new Error(`No overload of "${name}" matched the predicate`); return fn; } /** 4-byte selector for a function in an ABI (handles overloads via predicate). */ export function selector( abi: readonly unknown[], name: string, pick?: (fn: AbiFunction) => boolean, ): Hex { return toFunctionSelector(abiFn(abi, name, pick)); }