import { Address } from './commonTypes';
import { IContractWrapper, IContractWrapperFactory, IUniversalSchemeWrapper } from './iContractWrapperBase';
import { AbsoluteVoteWrapper } from './wrappers/absoluteVote';
import { Auction4ReputationWrapper } from './wrappers/auction4Reputation';
import { ContributionRewardWrapper } from './wrappers/contributionReward';
import { DaoCreatorWrapper } from './wrappers/daoCreator';
import { DaoTokenWrapper } from './wrappers/daoToken';
import { Erc20Wrapper } from './wrappers/erc20';
import { ExternalLocking4ReputationWrapper } from './wrappers/externalLocking4Reputation';
import { FixedReputationAllocationWrapper } from './wrappers/fixedReputationAllocation';
import { GenericSchemeWrapper } from './wrappers/genericScheme';
import { GenesisProtocolWrapper } from './wrappers/genesisProtocol';
import { GlobalConstraintRegistrarWrapper } from './wrappers/globalConstraintRegistrar';
import { IntVoteInterfaceWrapper } from './wrappers/intVoteInterface';
import { LockingEth4ReputationWrapper } from './wrappers/lockingEth4Reputation';
import { LockingToken4ReputationWrapper } from './wrappers/lockingToken4Reputation';
import { RedeemerWrapper } from './wrappers/redeemer';
import { ReputationWrapper } from './wrappers/reputation';
import { SchemeRegistrarWrapper } from './wrappers/schemeRegistrar';
import { TokenCapGCWrapper } from './wrappers/tokenCapGC';
import { UpgradeSchemeWrapper } from './wrappers/upgradeScheme';
import { VestingSchemeWrapper } from './wrappers/vestingScheme';
import { VoteInOrganizationSchemeWrapper } from './wrappers/voteInOrganizationScheme';
/**
 * An object with property names being a contract key and property value as the
 * corresponding wrapper factory (IContractWrapperFactory<TWrapper).
 */
export interface ArcWrapperFactories {
    AbsoluteVote: IContractWrapperFactory<AbsoluteVoteWrapper>;
    ContributionReward: IContractWrapperFactory<ContributionRewardWrapper>;
    DaoCreator: IContractWrapperFactory<DaoCreatorWrapper>;
    DaoToken: IContractWrapperFactory<DaoTokenWrapper>;
    GenesisProtocol: IContractWrapperFactory<GenesisProtocolWrapper>;
    GenericScheme: IContractWrapperFactory<GenericSchemeWrapper>;
    GlobalConstraintRegistrar: IContractWrapperFactory<GlobalConstraintRegistrarWrapper>;
    IntVoteInterface: IContractWrapperFactory<IntVoteInterfaceWrapper>;
    LockingEth4Reputation: IContractWrapperFactory<LockingEth4ReputationWrapper>;
    LockingToken4Reputation: IContractWrapperFactory<LockingToken4ReputationWrapper>;
    Auction4Reputation: IContractWrapperFactory<Auction4ReputationWrapper>;
    FixedReputationAllocation: IContractWrapperFactory<FixedReputationAllocationWrapper>;
    ExternalLocking4Reputation: IContractWrapperFactory<ExternalLocking4ReputationWrapper>;
    Redeemer: IContractWrapperFactory<RedeemerWrapper>;
    Reputation: IContractWrapperFactory<ReputationWrapper>;
    SchemeRegistrar: IContractWrapperFactory<SchemeRegistrarWrapper>;
    Erc20: IContractWrapperFactory<Erc20Wrapper>;
    TokenCapGC: IContractWrapperFactory<TokenCapGCWrapper>;
    UpgradeScheme: IContractWrapperFactory<UpgradeSchemeWrapper>;
    VestingScheme: IContractWrapperFactory<VestingSchemeWrapper>;
    VoteInOrganizationScheme: IContractWrapperFactory<VoteInOrganizationSchemeWrapper>;
}
/**
 * An object with property names being an Arc contract name and then property value being the
 * corresponding wrapper.  Only deployed wrappers are included here.  Other wrappers
 * may be obtained via their factory.  See also ArcSchemeWrappers.
 */
export interface ArcWrappers {
    AbsoluteVote: AbsoluteVoteWrapper;
    ContributionReward: ContributionRewardWrapper;
    DaoCreator: DaoCreatorWrapper;
    GenesisProtocol: GenesisProtocolWrapper;
    GenericScheme: GenericSchemeWrapper;
    GlobalConstraintRegistrar: GlobalConstraintRegistrarWrapper;
    Redeemer: RedeemerWrapper;
    SchemeRegistrar: SchemeRegistrarWrapper;
    TokenCapGC: TokenCapGCWrapper;
    UpgradeScheme: UpgradeSchemeWrapper;
    VestingScheme: VestingSchemeWrapper;
    VoteInOrganizationScheme: VoteInOrganizationSchemeWrapper;
}
/**
 * An object with property names being an Arc contract name and the property value being the
 * corresponding contract non-universal contract wrapper factory.
 */
export interface ArcNonUniversalSchemeWrapperFactories {
    LockingEth4Reputation: IContractWrapperFactory<LockingEth4ReputationWrapper>;
    LockingToken4Reputation: IContractWrapperFactory<LockingToken4ReputationWrapper>;
    Auction4Reputation: IContractWrapperFactory<Auction4ReputationWrapper>;
    FixedReputationAllocation: IContractWrapperFactory<FixedReputationAllocationWrapper>;
    ExternalLocking4Reputation: IContractWrapperFactory<ExternalLocking4ReputationWrapper>;
}
/**
 * An object with property names being an Arc contract name and the property value being the
 * corresponding universal contract wrapper factory.
 */
export interface ArcUniversalSchemeWrapperFactories {
    ContributionReward: IContractWrapperFactory<ContributionRewardWrapper>;
    GlobalConstraintRegistrar: IContractWrapperFactory<GlobalConstraintRegistrarWrapper>;
    SchemeRegistrar: IContractWrapperFactory<SchemeRegistrarWrapper>;
    GenericScheme: IContractWrapperFactory<GenericSchemeWrapper>;
    UpgradeScheme: IContractWrapperFactory<UpgradeSchemeWrapper>;
    VestingScheme: IContractWrapperFactory<VestingSchemeWrapper>;
    VoteInOrganizationScheme: IContractWrapperFactory<VoteInOrganizationSchemeWrapper>;
}
/**
 * An object with property names being an Arc contract name and the property value being the
 * corresponding contract wrapper factory.  Includes both universal and non-universal factories.
 */
export interface ArcSchemeWrapperFactories extends ArcNonUniversalSchemeWrapperFactories, ArcUniversalSchemeWrapperFactories {
}
/**
 * Arc.js wrapper factories grouped by type.
 */
export interface ArcWrappersByType {
    /**
     * All wrapped contracts
     */
    allWrappers: Array<IContractWrapper>;
    /**
     * All wrapped non-universal schemes
     */
    nonUniversalSchemes: Array<IContractWrapper>;
    /**
     * All wrapped universal schemes
     */
    universalSchemes: Array<IUniversalSchemeWrapper>;
    /**
     * All wrapped voting machines
     */
    votingMachines: Array<IContractWrapper>;
    /**
     * All wrapped global constraints
     */
    globalConstraints: Array<IContractWrapper>;
    /**
     * Other types of wrappers
     */
    other: Array<IContractWrapper>;
}
/**
 * Service that provides access to Arc.js contract wrapper classes and class factories.
 */
export declare class WrapperService {
    /**
     * Wrappers by name, hydrated with contracts as deployed by the running version of Arc.js.
     */
    static wrappers: ArcWrappers;
    /**
     * Contract wrapper factories grouped by type
     */
    static wrappersByType: ArcWrappersByType;
    /**
     * Wrapper factories by name.  Use these when you want to do `.at()` or `.new()`.  You can also
     * use for `deployed()`, but the wrappers for deployed contracts are directly available from the
     * `wrappers` and `wrappersByType` properties.
     */
    static factories: ArcWrapperFactories;
    /**
     * Universal scheme contract wrapper factories by name.
     */
    static universalSchemeFactories: ArcUniversalSchemeWrapperFactories;
    /**
     * Non-universal scheme contract wrapper factories by name.
     */
    static nonUniversalSchemeFactories: ArcNonUniversalSchemeWrapperFactories;
    /**
     * All scheme contract wrapper factories by name.
     */
    static schemeFactories: ArcSchemeWrapperFactories;
    /**
     * Map of contract wrappers keyed by address.  For example:
     *
     * `const wrapper = WrapperService.wrappersByAddress.get(anAddress);`
     *
     * Currently only returns the wrappers for contracts that were deployed by the running
     * version of Arc.js.
     */
    static wrappersByAddress: Map<Address, IContractWrapper>;
    /**
     * initialize() must be called before any of the static properties will have values.
     * It is called by ArcInitialize(), which in tur must be invoked by any application using Arc.js.
     *
     * @param options
     */
    static initialize(options?: WrapperServiceInitializeOptions): Promise<void>;
    /**
     * Returns the promise of an Arc.js contract wrapper or undefined if not found.
     *
     * Most useful when you have both contract name and maybe the address and wish to most
     * efficiently return the associated wrapper, or undefined when not found.
     *
     * @param contractName - name of an Arc contract, like "SchemeRegistrar"
     * @param address - optional
     */
    static getContractWrapper(contractName: string, address?: string): Promise<IContractWrapper | undefined>;
    /**
     * Confirm the given contract wrapper wraps the same contract as it purports to,
     * and is the one deployed in the running version of Arc.js.
     *
     * This will reject wrappers of different versions of contracts with the same name in Arc.
     * @param contractNameWant
     * @param contractWrapperFound
     */
    static confirmContractType(contractWrapperFound: any): Promise<boolean>;
    private static allWrappersFilter;
    private static noWrappersFilter;
}
export interface WrapperFilter {
    AbsoluteVote?: boolean;
    ContributionReward?: boolean;
    DaoCreator?: boolean;
    GenericScheme?: boolean;
    GenesisProtocol?: boolean;
    GlobalConstraintRegistrar?: boolean;
    Redeemer?: boolean;
    SchemeRegistrar?: boolean;
    TokenCapGC?: boolean;
    UpgradeScheme?: boolean;
    VestingScheme?: boolean;
    VoteInOrganizationScheme?: boolean;
}
export interface WrapperServiceInitializeOptions {
    /**
     * Optional filter to only initialize the contracts whose name is set to `true`.
     * Any contracts that are omitted or set to `false` here will appear as `null` in
     * `WrapperService.wrappers` and `WrapperService.wrappersByType`,
     * and will not be available in `WrapperService.wrappersByAddress`.
     * But their factories will still be available in `WrapperService.factories`.
     * See [Optimized Contract Loading](/Wrappers.md#optimizedcontractloading) for more information.
     */
    filter?: WrapperFilter;
}
/**
 * for quicker access to the contract wrappers
 */
export declare const ContractWrappers: ArcWrappers;
/**
 * for quicker access to the contract wrapper factories
 */
export declare const ContractWrapperFactories: ArcWrapperFactories;
/**
 * for quicker access to the contract wrapper types
 */
export declare const ContractWrappersByType: ArcWrappersByType;
/**
 * for quicker access to the contract wrappers by address
 */
export declare const ContractWrappersByAddress: Map<Address, IContractWrapper>;
export declare const UniversalSchemeFactories: ArcUniversalSchemeWrapperFactories;
export declare const NonUniversalSchemeFactories: ArcNonUniversalSchemeWrapperFactories;
export declare const SchemeFactories: ArcSchemeWrapperFactories;
