import { Address, Hash, SchemePermissions } from "../commonTypes";
import { ArcTransactionDataResult, ArcTransactionProposalResult, IContractWrapperFactory, StandardSchemeParams } from "../iContractWrapperBase";
import { ContractWrapperFactory } from "../contractWrapperFactory";
import { ProposalGeneratorBase } from "../proposalGeneratorBase";
import { TxGeneratingFunctionOptions } from "../transactionService";
import { EntityFetcherFactory, EventFetcherFactory } from "../web3EventService";
import { ProposalDeletedEventResult, SchemeProposalExecuted, SchemeProposalExecutedEventResult } from "./commonEventInterfaces";
export declare class UpgradeSchemeWrapper extends ProposalGeneratorBase {
    name: string;
    friendlyName: string;
    factory: IContractWrapperFactory<UpgradeSchemeWrapper>;
    /**
     * Events
     */
    NewUpgradeProposal: EventFetcherFactory<NewUpgradeProposalEventResult>;
    ChangeUpgradeSchemeProposal: EventFetcherFactory<ChangeUpgradeSchemeProposalEventResult>;
    ProposalExecuted: EventFetcherFactory<SchemeProposalExecutedEventResult>;
    ProposalDeleted: EventFetcherFactory<ProposalDeletedEventResult>;
    /**
     * Submit a proposal to change the DAO's controller.
     * @param options
     */
    proposeController(options?: ProposeControllerParams): Promise<ArcTransactionProposalResult>;
    /**
     * Submit a proposal to change or modify the DAO's upgrading scheme.
     * @param options
     */
    proposeUpgradingScheme(options?: ProposeUpgradingSchemeParams): Promise<ArcTransactionProposalResult>;
    getParametersHash(params: StandardSchemeParams): Promise<Hash>;
    setParameters(params: StandardSchemeParams & TxGeneratingFunctionOptions): Promise<ArcTransactionDataResult<Hash>>;
    getDefaultPermissions(): SchemePermissions;
    getSchemePermissions(avatarAddress: Address): Promise<SchemePermissions>;
    getSchemeParameters(avatarAddress: Address): Promise<StandardSchemeParams>;
    getParameters(paramsHash: Hash): Promise<StandardSchemeParams>;
    /**
     * EntityFetcherFactory for votable UpgradeSchemeProposal.
     * @param avatarAddress
     */
    getVotableUpgradeUpgradeSchemeProposals(avatarAddress: Address): Promise<EntityFetcherFactory<VotableUpgradeSchemeProposal, ChangeUpgradeSchemeProposalEventResult>>;
    /**
     * EntityFetcherFactory for votable UpgradeSchemeProposal.
     * @param avatarAddress
     */
    getVotableUpgradeControllerProposals(avatarAddress: Address): Promise<EntityFetcherFactory<VotableUpgradeSchemeProposal, NewUpgradeProposalEventResult>>;
    /**
     * EntityFetcherFactory for executed proposals.
     * @param avatarAddress
     */
    getExecutedProposals(avatarAddress: Address): EntityFetcherFactory<SchemeProposalExecuted, SchemeProposalExecutedEventResult>;
    getVotableProposal(avatarAddress: Address, proposalId: Hash): Promise<VotableUpgradeSchemeProposal>;
    protected hydrated(): void;
    private convertProposalPropsArrayToObject;
}
export declare const UpgradeSchemeFactory: ContractWrapperFactory<UpgradeSchemeWrapper>;
export interface NewUpgradeProposalEventResult {
    /**
     * indexed
     */
    _avatar: Address;
    /**
     * indexed
     */
    _intVoteInterface: Address;
    _newController: Address;
    /**
     * indexed
     */
    _proposalId: Hash;
}
export interface ChangeUpgradeSchemeProposalEventResult {
    /**
     * indexed
     */
    _avatar: Address;
    /**
     * indexed
     */
    _intVoteInterface: Address;
    _params: Hash;
    /**
     * indexed
     */
    _proposalId: Hash;
    _newUpgradeScheme: Address;
}
export interface ProposeUpgradingSchemeParams {
    /**
     * avatar address
     */
    avatar: Address;
    /**
     *  upgrading scheme address
     */
    scheme: string;
    /**
     * hash of the parameters of the upgrading scheme. These must be already registered with the new scheme.
     */
    schemeParametersHash: string;
}
export interface ProposeControllerParams {
    /**
     * avatar address
     */
    avatar: Address;
    /**
     *  controller address
     */
    controller: string;
}
export declare enum UpgradeSchemeProposalType {
    Controller = 1,
    UpgradeScheme = 2
}
export interface VotableUpgradeSchemeProposal {
    /**
     * Either a controller or an upgrade scheme.
     */
    upgradeContractAddress: Address;
    paramsUpgradingScheme: Hash;
    proposalType: UpgradeSchemeProposalType;
    proposalId: Hash;
}
