declare module 'ethereumjs-util' {
  import { Buffer } from 'buffer';
  import BN from 'bn.js';
  export import rlp = require('rlp');

  interface Signature {
    v: number;
    r: Buffer;
    s: Buffer;
  }

  export const MAX_INTEGER: BN;

  export const TWO_POW256: BN;

  export const SHA3_NULL_S: string;

  export const SHA3_NULL: Buffer;

  export const SHA3_RLP_ARRAY_S: string;

  export const SHA3_RLP_ARRAY: Buffer;

  export const SHA3_RLP_S: string;

  export const SHA3_RLP: Buffer;

  export function zeros(bytes: number): Buffer;

  export function setLength(msg: Buffer, length: number, right: boolean): Buffer;
  export function setLength(msg: number[], length: number, right: boolean): number[];

  export function setLengthLeft(msg: Buffer, length: number, right: boolean): Buffer;
  export function setLengthLeft(msg: number[], length: number, right: boolean): number[];

  export function setLengthRight(msg: Buffer, length: number): Buffer;
  export function setLengthRight(msg: number[], length: number): number[];

  export function unpad(a: Buffer): Buffer;
  export function unpad(a: number[]): number[];
  export function unpad(a: string): string;

  export function toBuffer(v: any): Buffer;

  export function bufferToInt(buf: Buffer | BN): number;

  export function bufferToHex(buf: Buffer | BN): string;

  export function fromSigned(num: Buffer | BN): BN;

  export function toUnsigned(num: BN): Buffer;

  export function sha3(a: Buffer | string | number | number[], bits?: number): Buffer;

  export function sha256(a: Buffer | string | number | number[]): Buffer;

  export function ripemd160(a: Buffer | string | number | number[], padded?: boolean): Buffer;

  export function rlphash(a: Buffer | string | number | number[]): Buffer;

  export function isValidPrivate(privateKey: Buffer): boolean;

  export function isValidPublic(publicKey: Buffer, sanitize?: boolean): boolean;

  export function pubToAddress(publicKey: Buffer, sanitize?: boolean): Buffer;
  export function publicToAddress(publicKey: Buffer, sanitize?: boolean): Buffer;

  export function privateToPublic(privateKey: Buffer): Buffer;

  export function importPublic(publicKey: Buffer): Buffer;

  export function ecsign(message: Buffer, privateKey: Buffer): Signature;

  export function hashPersonalMessage(message: Buffer | string): Buffer;

  export function ecrecover(msgHash: Buffer, v: number, r: Buffer, s: Buffer): Buffer;

  export function toRpcSig(v: number, r: Buffer, s: Buffer): string;

  export function fromRpcSig(sig: string): Signature;

  export function privateToAddress(privateKey: Buffer): Buffer;

  export function isValidAddress(address: string): boolean;

  export function toChecksumAddress(address: string): string;

  export function isValidChecksumAddress(address: string): boolean;

  export function generateAddress(
    from: Buffer | string,
    nonce: number | string | number[] | Buffer
  ): Buffer;

  export function isPrecompiled(address: Buffer | string): boolean;

  export function addHexPrefix(str: string): string;

  export function isValidSignature(
    v: number,
    r: Buffer | string,
    s: Buffer | string,
    homestead?: boolean
  ): boolean;

  export function padToEven(str: string): string;
  export function baToJSON(ba: Buffer): string;
  export function baToJSON(ba: any[]): string[];
}