import * as BigNumber from "bignumber.js";
import { Address, DefaultSchemePermissions, SchemePermissions } from "../commonTypes";
import { ArcTransactionResult, ContractWrapperBase, EventFetcherFactory } from "../contractWrapperBase";
import { ContractWrapperFactory } from "../contractWrapperFactory";
export declare class DaoCreatorWrapper extends ContractWrapperBase {
    name: string;
    friendlyName: string;
    factory: ContractWrapperFactory<DaoCreatorWrapper>;
    /**
     * Events
     */
    NewOrg: EventFetcherFactory<NewOrgEventResult>;
    InitialSchemesSet: EventFetcherFactory<InitialSchemesSetEventResult>;
    /**
     * Create a new DAO
     * @param {ForgeOrgConfig} options
     */
    forgeOrg(options?: ForgeOrgConfig): Promise<ArcTransactionResult>;
    /**
     * Register schemes with newly-created DAO.
     * Can only be invoked by the agent that created the DAO
     * via forgeOrg, and at that, can only be called one time.
     * @param {SetSchemesConfig} options
     */
    setSchemes(options?: SetSchemesConfig): Promise<ArcTransactionResult>;
    forgeOrgTransactionsCount(options: ForgeOrgConfig): number;
    setSchemesTransactionsCount(options: SchemesConfig): number;
}
/**
 * defined just to add good type checking
 */
export declare class DaoCreatorFactoryType extends ContractWrapperFactory<DaoCreatorWrapper> {
    /**
     *
     * @param controllerCreatorAddress The ControllerCreator that Arc will use when migrating
     * a new non-universal controller in `forgeOrg`.
     * Typically is `ControllerCreator` from Arc.
     */
    new(controllerCreatorAddress?: Address): Promise<DaoCreatorWrapper>;
}
export declare const DaoCreatorFactory: DaoCreatorFactoryType;
export interface NewOrgEventResult {
    _avatar: Address;
}
export interface InitialSchemesSetEventResult {
    _avatar: Address;
}
export interface FounderConfig {
    /**
     * Founders' address
     */
    address: string;
    /**
     * string | BigNumber token amount to be awarded to each founder.
     * Should be given in Wei.
     */
    tokens: string | BigNumber.BigNumber;
    /**
     * string | BigNumber reputation amount to be awarded to each founder.
     * Should be given in Wei.
     */
    reputation: string | BigNumber.BigNumber;
}
export interface NewDaoVotingMachineConfig {
    /**
     * Optional Reputation address.
     * Default is the new DAO's native reputation.
     */
    reputation?: string;
    /**
     * Optional VotingMachine name
     * Default is AbsoluteVote
     */
    votingMachineName?: string;
    /**
     * Optional VotingMachine address
     * Default is that of AbsoluteVote
     */
    votingMachineAddress?: string;
    /**
     * You can add your voting-machine-specific parameters here, like ownerVote, votePerc, etc
     */
    [x: string]: any;
}
/**
 * options for DaoCreator.forgeOrg
 */
export interface ForgeOrgConfig {
    /**
     * The name of the new DAO.
     */
    name: string;
    /**
     * Optional cap on the number of tokens, in the DAO's token.  Default is zero, which means no cap.
     */
    tokenCap?: BigNumber.BigNumber | string;
    /**
     * The name of the token to be associated with the DAO
     */
    tokenName: string;
    /**
     * The symbol of the token to be associated with the DAO
     */
    tokenSymbol: string;
    /**
     * Optional array describing founders.
     * Default is [].
     */
    founders?: Array<FounderConfig>;
    /**
     * true to use the UniversalController contract, false to instantiate and use a new Controller contract.
     * The default is true.
     */
    universalController?: boolean;
}
/**
 * Configuration of an Arc scheme that you want to automatically register with a new DAO.
 */
export interface SchemeConfig {
    /**
     * The name of the Arc scheme.  It must be an Arc scheme.
     */
    name: string;
    /**
     * Scheme address if you don't want to use the scheme supplied in this release of Arc.js.
     */
    address?: string;
    /**
     * Extra permissions on the scheme.  The minimum permissions for the scheme
     * will be enforced (or'd with anything you supply).
     * See ContractWrapperBase.getDefaultPermissions for what this string
     * should look like.
     */
    permissions?: SchemePermissions | DefaultSchemePermissions;
    /**
     * Optional votingMachine parameters if you have not supplied them in ForgeOrgConfig or want to override them.
     * Note it costs more gas to add them here.
     *
     * New schemes will be created with these parameters and the DAO's native reputation contract.
     *
     * !!! note
     *     This is only relevant to schemes that can create proposals upon which
     * there can be a vote.  Other schemes will ignore these parameters.
     *
     * Defaults are those of whatever voting machine is the default for DaoCreator.  The default
     * default VotingMachine is AbsoluteVote.
     */
    votingMachineParams?: NewDaoVotingMachineConfig;
    /**
     * Other scheme parameters, any params besides those already provided in votingMachineParams.
     * For example, ContributionReward requires orgNativeTokenFee.  SchemeRegistrar has voteRemoveParametersHash.
     *
     * Default is {}
     */
    additionalParams?: any;
}
export interface SchemesConfig {
    /**
     * Default votingMachine parameters if you have not configured a scheme that you want to register with the
     * new DAO with its own voting parameters.
     *
     * New schemes will be created these parameters.
     *
     * !!! note
     *     This is only relevant to schemes that can create proposals upon which
     * there can be a vote.  Other schemes will ignore these parameters.
     *
     * Defaults are described in [[NewDaoVotingMachineConfig]].
     */
    votingMachineParams?: NewDaoVotingMachineConfig;
    /**
     * Any Arc schemes you would like to automatically register with the new DAO.
     * Non-Arc schemes are not allowed here.  You may add them later in your application's workflow
     * using SchemeRegistrar.
     */
    schemes?: Array<SchemeConfig>;
}
export interface SetSchemesConfig extends SchemesConfig {
    /**
     * avatar address
     */
    avatar: Address;
}
