import { Address, Hash, SchemePermissions } from "../commonTypes";
import { ContractWrapperFactory } from "../contractWrapperFactory";
import { ArcTransactionDataResult, ArcTransactionProposalResult, IContractWrapperFactory, StandardSchemeParams } from "../iContractWrapperBase";
import { ProposalGeneratorBase } from "../proposalGeneratorBase";
import { TxGeneratingFunctionOptions } from "../transactionService";
import { EntityFetcherFactory, EventFetcherFactory } from "../web3EventService";
import { ProposalDeletedEventResult, SchemeProposalExecuted, SchemeProposalExecutedEventResult } from "./commonEventInterfaces";
export declare class SchemeRegistrarWrapper extends ProposalGeneratorBase {
    name: string;
    friendlyName: string;
    factory: IContractWrapperFactory<SchemeRegistrarWrapper>;
    /**
     * Events
     */
    NewSchemeProposal: EventFetcherFactory<NewSchemeProposalEventResult>;
    RemoveSchemeProposal: EventFetcherFactory<RemoveSchemeProposalEventResult>;
    ProposalExecuted: EventFetcherFactory<SchemeProposalExecutedEventResult>;
    ProposalDeleted: EventFetcherFactory<ProposalDeletedEventResult>;
    /**
     * Submit a proposal to add or modify a given scheme.
     * @param options
     */
    proposeToAddModifyScheme(options?: ProposeToAddModifySchemeParams): Promise<ArcTransactionProposalResult>;
    /**
     * Submit a proposal to remove a given scheme.
     * @param options
     */
    proposeToRemoveScheme(options?: ProposeToRemoveSchemeParams): Promise<ArcTransactionProposalResult>;
    getParametersHash(params: SchemeRegistrarParams): Promise<Hash>;
    setParameters(params: SchemeRegistrarParams & TxGeneratingFunctionOptions): Promise<ArcTransactionDataResult<Hash>>;
    getDefaultPermissions(): SchemePermissions;
    getSchemePermissions(avatarAddress: Address): Promise<SchemePermissions>;
    getSchemeParameters(avatarAddress: Address): Promise<SchemeRegistrarParams>;
    getParameters(paramsHash: Hash): Promise<SchemeRegistrarParams>;
    /**
     * EntityFetcherFactory for votable SchemeRegistrarProposal.
     * @param avatarAddress
     */
    getVotableAddSchemeProposals(avatarAddress: Address): Promise<EntityFetcherFactory<VotableSchemeRegistrarProposal, NewSchemeProposalEventResult>>;
    /**
     * EntityFetcherFactory for votable SchemeRegistrarProposal.
     * @param avatarAddress
     */
    getVotableRemoveSchemeProposals(avatarAddress: Address): Promise<EntityFetcherFactory<VotableSchemeRegistrarProposal, RemoveSchemeProposalEventResult>>;
    /**
     * EntityFetcherFactory for executed proposals.
     * @param avatarAddress
     */
    getExecutedProposals(avatarAddress: Address): EntityFetcherFactory<SchemeProposalExecuted, SchemeProposalExecutedEventResult>;
    getVotableProposal(avatarAddress: Address, proposalId: Hash): Promise<VotableSchemeRegistrarProposal>;
    protected hydrated(): void;
    private convertProposalPropsArrayToObject;
}
export declare const SchemeRegistrarFactory: ContractWrapperFactory<SchemeRegistrarWrapper>;
export interface NewSchemeProposalEventResult {
    /**
     * indexed
     */
    _avatar: Address;
    /**
     * indexed
     */
    _intVoteInterface: Address;
    _permissions: string;
    _parametersHash: Hash;
    /**
     * indexed
     */
    _proposalId: Hash;
    _scheme: Address;
}
export interface RemoveSchemeProposalEventResult {
    /**
     * indexed
     */
    _avatar: Address;
    /**
     * indexed
     */
    _intVoteInterface: Address;
    /**
     * indexed
     */
    _proposalId: Hash;
    _scheme: Address;
}
export interface ProposeToAddModifySchemeParams {
    /**
     * avatar address
     */
    avatar: Address;
    /**
     * Optional scheme address.  Supply this if you are submitting a non-Arc scheme
     * or wish to use a different Arc scheme than the default.  In the latter case, you must
     * also supply the schemeName.
     */
    schemeAddress?: Address;
    /**
     * Scheme name, like "SchemeRegistrar" or "ContributionReward".
     * Not required if you are registering a non-arc scheme.
     */
    schemeName?: string | null;
    /**
     * Fash of scheme parameters. These must be already registered with the new scheme.
     */
    schemeParametersHash: string;
    /**
     * Optionally supply values from SchemePermissions or DefaultSchemePermissions.
     *
     * This value is manditory for non-Arc schemes.
     *
     * For Arc schemes the default is taken from DefaultSchemePermissions
     * for the scheme given by schemeName.
     */
    permissions?: SchemePermissions | null;
}
export interface ProposeToRemoveSchemeParams {
    /**
     * avatar address
     */
    avatar: Address;
    /**
     *  the address of the global constraint to remove
     */
    schemeAddress: string;
}
export interface SchemeRegistrarParams extends StandardSchemeParams {
    /**
     * Optional hash of voting machine parameters to use when voting on a
     * proposal to unregister a scheme that is being registered.
     *
     * Default is the value of voteParametersHash.
     */
    voteRemoveParametersHash?: Hash;
}
export declare enum SchemeRegistrarProposalType {
    Add = 1,
    Remove = 2
}
export interface VotableSchemeRegistrarProposal {
    schemeAddress: Address;
    parametersHash: Hash;
    proposalType: SchemeRegistrarProposalType;
    permissions: SchemePermissions;
    proposalId: Hash;
}
