import { Address, GetDaoProposalsConfig, Hash, SchemePermissions } from "../commonTypes";
import * as BigNumber from "bignumber.js";
import { ArcTransactionDataResult, ArcTransactionProposalResult, ArcTransactionResult, ContractWrapperBase, EventFetcherFactory, StandardSchemeParams } from "../contractWrapperBase";
import { ContractWrapperFactory } from "../contractWrapperFactory";
import { ProposalDeletedEventResult, ProposalExecutedEventResult, RedeemEventResult } from "./commonEventInterfaces";
export declare class ContributionRewardWrapper extends ContractWrapperBase {
    name: string;
    friendlyName: string;
    factory: ContractWrapperFactory<ContributionRewardWrapper>;
    /**
     * Events
     */
    NewContributionProposal: EventFetcherFactory<NewContributionProposalEventResult>;
    ProposalExecuted: EventFetcherFactory<ProposalExecutedEventResult>;
    ProposalDeleted: EventFetcherFactory<ProposalDeletedEventResult>;
    RedeemReputation: EventFetcherFactory<RedeemEventResult>;
    RedeemEther: EventFetcherFactory<RedeemEventResult>;
    RedeemNativeToken: EventFetcherFactory<RedeemEventResult>;
    RedeemExternalToken: EventFetcherFactory<RedeemEventResult>;
    /**
     * Submit a proposal for a reward for a contribution
     * @param {ProposeContributionRewardParams} options
     */
    proposeContributionReward(options?: ProposeContributionRewardParams): Promise<ArcTransactionProposalResult>;
    /**
     * Redeem the specified rewards for the beneficiary of the proposal
     * @param {ContributionRewardRedeemParams} opts
     */
    redeemContributionReward(options?: ContributionRewardRedeemParams): Promise<ArcTransactionResult>;
    /**
     * Redeem external token reward for the beneficiary of the proposal
     * @param {ContributionRewardSpecifiedRedemptionParams} options
     */
    redeemExternalToken(options?: ContributionRewardSpecifiedRedemptionParams): Promise<ArcTransactionResult>;
    /**
     * Redeem reputation reward for the beneficiary of the proposal
     * @param {ContributionRewardSpecifiedRedemptionParams} options
     */
    redeemReputation(options?: ContributionRewardSpecifiedRedemptionParams): Promise<ArcTransactionResult>;
    /**
     * Redeem native token reward for the beneficiary of the proposal
     * @param {ContributionRewardSpecifiedRedemptionParams} options
     */
    redeemNativeToken(options?: ContributionRewardSpecifiedRedemptionParams): Promise<ArcTransactionResult>;
    /**
     * Redeem ether reward for the beneficiary of the proposal
     * @param {ContributionRewardSpecifiedRedemptionParams} options
     */
    redeemEther(options?: ContributionRewardSpecifiedRedemptionParams): Promise<ArcTransactionResult>;
    /**
     * Return all ContributionReward proposals ever created under the given avatar.
     * Filter by the optional proposalId.
     */
    getDaoProposals(options?: GetDaoProposalsConfig): Promise<Array<ContributionProposal>>;
    /**
     * Return a list of `ProposalRewards` for executed (passed by vote) proposals
     * that have rewards waiting to be redeemed by the given beneficiary.
     * `ProposalRewards` includes both the total amount redeemable and the amount
     * yet-to-be redeemed.
     * @param {GetBeneficiaryRewardsParams} options
     */
    getBeneficiaryRewards(options?: GetBeneficiaryRewardsParams): Promise<Array<ProposalRewards>>;
    setParameters(params: ContributionRewardParams): Promise<ArcTransactionDataResult<Hash>>;
    getDefaultPermissions(): SchemePermissions;
    getSchemePermissions(avatarAddress: Address): Promise<SchemePermissions>;
    getSchemeParameters(avatarAddress: Address): Promise<ContributionRewardParamsReturn>;
    getParameters(paramsHash: Hash): Promise<ContributionRewardParamsReturn>;
    private computeRemainingReward(proposalRewards, proposal, rewardName, avatarAddress, rewardType);
    private orgProposalToContributionProposal(orgProposal, proposalId);
}
export declare enum RewardType {
    Reputation = 0,
    NativeToken = 1,
    Eth = 2,
    ExternalToken = 3,
}
export declare const ContributionRewardFactory: ContractWrapperFactory<ContributionRewardWrapper>;
export interface NewContributionProposalEventResult {
    /**
     * indexed
     */
    _avatar: Address;
    _beneficiary: Address;
    _contributionDescription: Hash;
    _externalToken: Address;
    /**
     * indexed
     */
    _intVoteInterface: Address;
    /**
     * indexed
     */
    _proposalId: Hash;
    _reputationChange: BigNumber.BigNumber;
    _rewards: Array<BigNumber.BigNumber>;
}
export interface ContributionProposal {
    proposalId: Hash;
    beneficiaryAddress: Address;
    contributionDescriptionHash: Hash;
    ethReward: BigNumber.BigNumber;
    executionTime: number;
    externalToken: Address;
    externalTokenReward: BigNumber.BigNumber;
    nativeTokenReward: BigNumber.BigNumber;
    numberOfPeriods: number;
    periodLength: number;
    reputationChange: BigNumber.BigNumber;
}
export interface ProposalRewards {
    /**
     * The total ETH reward
     */
    ethReward: BigNumber.BigNumber;
    /**
     * The total unredeemed amount of ETH
     */
    ethRewardUnredeemed: BigNumber.BigNumber;
    /**
     * The currently-redeemable external token reward
     */
    ethRewardRedeemable: BigNumber.BigNumber;
    /**
     * The total external token reward
     */
    externalTokenReward: BigNumber.BigNumber;
    /**
     * The total unredeemed number of external tokens
     */
    externalTokenRewardUnredeemed: BigNumber.BigNumber;
    /**
     * The currently-redeemable external token reward
     */
    externalTokenRewardRedeemable: BigNumber.BigNumber;
    /**
     * The total native token reward
     */
    nativeTokenReward: BigNumber.BigNumber;
    /**
     * The total unredeemed number of native tokens
     */
    nativeTokenRewardUnredeemed: BigNumber.BigNumber;
    /**
     * The currently-redeemable native token reward
     */
    nativeTokenRewardRedeemable: BigNumber.BigNumber;
    /**
     * The proposal Id
     */
    proposalId: Hash;
    /**
     * The total reputation reward
     */
    reputationChange: BigNumber.BigNumber;
    /**
     * The total unredeemed amount of reputation
     */
    reputationChangeUnredeemed: BigNumber.BigNumber;
    /**
     * The currently-redeemable reputation reward
     */
    reputationChangeRedeemable: BigNumber.BigNumber;
}
export interface ContributionRewardParams extends StandardSchemeParams {
    orgNativeTokenFee: BigNumber.BigNumber | string;
}
export interface ContributionRewardParamsReturn extends StandardSchemeParams {
    orgNativeTokenFee: BigNumber.BigNumber;
}
export interface ContributionRewardSpecifiedRedemptionParams {
    /**
     * The avatar under which the proposal was made
     */
    avatar: Address;
    /**
     * The reward proposal
     */
    proposalId: string;
}
export interface GetBeneficiaryRewardsParams {
    /**
     * The avatar under which the proposals were created
     */
    avatar: Address;
    /**
     * The agent who is to receive the rewards
     */
    beneficiaryAddress: string;
    /**
     * Optionally filter on the given proposalId
     */
    proposalId?: string;
}
export interface ProposeContributionRewardParams {
    /**
     * avatar address
     */
    avatar: Address;
    /**
     * description of the constraint
     */
    description: string;
    /**
     * Amount of reputation change requested, per period.
     * Can be negative.  In Wei. Default is 0;
     */
    reputationChange?: BigNumber.BigNumber | string;
    /**
     * Reward in tokens per period, in the DAO's native token.
     * Must be >= 0.
     * In Wei. Default is 0;
     */
    nativeTokenReward?: BigNumber.BigNumber | string;
    /**
     * Reward per period, in ethers.
     * Must be >= 0.
     * In Wei. Default is 0;
     */
    ethReward?: BigNumber.BigNumber | string;
    /**
     * Reward per period in the given external token.
     * Must be >= 0.
     * In Wei. Default is 0;
     */
    externalTokenReward?: BigNumber.BigNumber | string;
    /**
     * The number of blocks in a period.
     * Must be > 0.
     */
    periodLength: number;
    /**
     * Maximum number of periods that can be paid out.
     * Must be > 0.
     */
    numberOfPeriods: number;
    /**
     * The address of the external token (for externalTokenReward)
     * Only required when externalTokenReward is non-zero.
     */
    externalToken?: string;
    /**
     *  beneficiary address
     */
    beneficiaryAddress: string;
}
export interface ContributionRewardRedeemParams {
    /**
     * The reward proposal
     */
    proposalId: string;
    /**
     * The avatar under which the proposal was made
     */
    avatar: Address;
    /**
     * true to credit/debit reputation
     * Default is false
     */
    reputation?: boolean;
    /**
     * true to reward native tokens
     * Default is false
     */
    nativeTokens?: boolean;
    /**
     * true to reward ethers
     * Default is false
     */
    ethers?: boolean;
    /**
     * true to reward external tokens
     * Default is false
     */
    externalTokens?: boolean;
}
