trufflesuite/truffle

View on GitHub
packages/abi-utils/lib/normalize.ts

Summary

Maintainability
A
0 mins
Test Coverage
import type { Abi as SchemaAbi } from "@truffle/contract-schema/spec";
import type { Abi, Entry, StateMutability } from "./types";

export const normalize = (looseAbi: SchemaAbi | Abi): Abi =>
  (looseAbi as SchemaAbi).map(normalizeEntry);

type Item<A> = A extends (infer I)[] ? I : never;

export const normalizeEntry = (looseEntry: Item<SchemaAbi> | Entry): Entry => {
  if (looseEntry.type === "event" || looseEntry.type === "error") {
    // nothing gets normalized for events or errors right now
    return looseEntry as Entry;
  }

  const entry = {
    ...looseEntry,
    ...normalizeStateMutability(looseEntry as LooseStateMutabilityFields),
    type: looseEntry.type || "function"
  } as Entry;

  if (entry.type === "function") {
    entry.outputs = entry.outputs || [];
  }

  delete (entry as any).payable;
  delete (entry as any).constant;

  return entry;
};

interface LooseStateMutabilityFields {
  stateMutability?: StateMutability;
  payable?: boolean;
  constant?: boolean;
}

const normalizeStateMutability = ({
  stateMutability,
  payable,
  constant
}: LooseStateMutabilityFields): { stateMutability: StateMutability } => {
  if (stateMutability) {
    return { stateMutability };
  }

  return {
    stateMutability: payable ? "payable" : constant ? "view" : "nonpayable"
  };
};