declare module 'solc' {
    export interface ContractCompilationResult {
        srcmap: string;
        srcmapRuntime: string;
        bytecode: string;
        runtimeBytecode: string;
        interface: string;
    }
    export interface CompilationResult {
        errors: string[];
        contracts: {
            [contractIdentifier: string]: ContractCompilationResult;
        };
        sources: {
            [sourceName: string]: {
                AST: any;
            };
        };
        sourceList: string[];
    }
    export interface ImportContents {
        contents: string;
    }
    export interface InputSources {
        sources: {
            [fileName: string]: string;
        };
    }
    export interface BaseSource {
        keccak256?: string;
    }
    export interface InMemorySource extends BaseSource {
        content: string;
    }
    export interface UrlSource extends BaseSource {
        urls: string[];
    }
    export type Source = UrlSource | InMemorySource;
    export type OutputField =
        | '*'
        | 'ast'
        | 'legacyAST'
        | 'abi'
        | 'devdoc'
        | 'userdoc'
        | 'metadata'
        | 'ir'
        | 'evm.assembly'
        | 'evm.legacyAssembly'
        | 'evm.bytecode.object'
        | 'evm.bytecode.opcodes'
        | 'evm.bytecode.sourceMap'
        | 'evm.bytecode.linkReferences'
        | 'evm.deployedBytecode.object'
        | 'evm.deployedBytecode.opcodes'
        | 'evm.deployedBytecode.sourceMap'
        | 'evm.deployedBytecode.linkReferences'
        | 'evm.methodIdentifiers'
        | 'evm.gasEstimates'
        | 'ewasm.wast'
        | 'ewasm.wasm';
    export interface StandardInput {
        language: 'Solidity' | 'serpent' | 'lll' | 'assembly';
        sources: {
            [fileName: string]: Source;
        };
        settings: {
            remappings?: string[];
            optimizer?: {
                enabled: boolean;
                runs?: number;
            };
            evmVersion?: 'homestead' | 'tangerineWhistle' | 'spuriousDragon' | 'byzantium' | 'constantinople';
            metadata?: {
                useLiteralContent: true;
            };
            libraries?: {
                [fileName: string]: {
                    [libName: string]: string;
                };
            };
            outputSelection: {
                [fileName: string]: {
                    [contractName: string]: OutputField[];
                };
            };
        };
    }
    export type ErrorType =
        | 'JSONError'
        | 'IOError'
        | 'ParserError'
        | 'DocstringParsingError'
        | 'SyntaxError'
        | 'DeclarationError'
        | 'TypeError'
        | 'UnimplementedFeatureError'
        | 'InternalCompilerError'
        | 'Exception'
        | 'CompilerError'
        | 'FatalError'
        | 'Warning';
    export type ErrorSeverity = 'error' | 'warning';
    export interface Error {
        sourceLocation?: {
            file: string;
            start: number;
            end: number;
        };
        type: ErrorType;
        component: 'general' | 'ewasm';
        severity: ErrorSeverity;
        message: string;
        formattedMessage?: string;
    }
    import { ContractAbi } from '@0xproject/types';
    export interface StandardOutput {
        errors: Error[];
        sources: {
            [fileName: string]: {
                id: number;
                ast?: object;
                legacyAST?: object;
            };
        };
        contracts: {
            [fileName: string]: {
                [contractName: string]: {
                    abi: ContractAbi;
                    evm: {
                        bytecode: {
                            object: string;
                            sourceMap: string;
                        };
                        deployedBytecode: {
                            object: string;
                            sourceMap: string;
                        };
                    };
                };
            };
        };
    }
    export interface SolcInstance {
        compile(
            sources: InputSources,
            optimizerEnabled: number,
            findImports: (importPath: string) => ImportContents,
        ): CompilationResult;
        compileStandardWrapper(input: string, findImports: (importPath: string) => ImportContents): string;
    }
    export function loadRemoteVersion(versionName: string, cb: (err: Error | null, res?: SolcInstance) => void): void;
    export function setupMethods(solcBin: any): SolcInstance;
}
