/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */

import BN from "bn.js";
import { ContractOptions } from "web3-eth-contract";
import { EventLog } from "web3-core";
import { EventEmitter } from "events";
import {
  Callback,
  PayableTransactionObject,
  NonPayableTransactionObject,
  BlockType,
  ContractEventLog,
  BaseContract,
} from "./types";

interface EventOptions {
  filter?: object;
  fromBlock?: BlockType;
  topics?: string[];
}

export type ProposalCreated = ContractEventLog<{
  _id: string;
  _proposal: [
    string,
    [string, string, string, string, string, string, string, string],
    [string, string, string],
    boolean
  ];
  0: string;
  1: [
    string,
    [string, string, string, string, string, string, string, string],
    [string, string, string],
    boolean
  ];
}>;
export type ProposalExecuted = ContractEventLog<{
  _proposalId: string;
  0: string;
}>;
export type QuorumReached = ContractEventLog<{
  id: string;
  0: string;
}>;
export type UserVoted = ContractEventLog<{
  _proposalId: string;
  _votingOption: string;
  _amount: string;
  0: string;
  1: string;
  2: string;
}>;
export type VetoOccurred = ContractEventLog<{
  id: string;
  sender: string;
  0: string;
  1: string;
}>;

export interface EPDRMembershipVoting extends BaseContract {
  constructor(
    jsonInterface: any[],
    address?: string,
    options?: ContractOptions
  ): EPDRMembershipVoting;
  clone(): EPDRMembershipVoting;
  methods: {
    createAddExpertProposal(
      _remark: string,
      _newExpert: string
    ): NonPayableTransactionObject<string>;

    createChangeExpertProposal(
      _remark: string,
      _newExpert: string,
      _expertToBeChanged: string
    ): NonPayableTransactionObject<string>;

    createRemoveExpertProposal(
      _remark: string,
      _toRemoveExpert: string
    ): NonPayableTransactionObject<string>;

    execute(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<void>;

    expertKey(): NonPayableTransactionObject<string>;

    getProposal(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<
      [
        string,
        [string, string, string, string, string, string, string, string],
        [string, string, string],
        boolean
      ]
    >;

    getProposalStats(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<[string, string, string, string, string]>;

    getStatus(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<string>;

    getVetosNumber(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<string>;

    getVetosPercentage(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<string>;

    getVotesAgainst(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<string>;

    getVotesFor(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<string>;

    getVotingWeightInfo(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<
      [boolean, boolean, [string, string, string, string]]
    >;

    hasRootVetoed(
      arg0: number | string | BN,
      arg1: string
    ): NonPayableTransactionObject<boolean>;

    hasUserVoted(
      arg0: number | string | BN,
      arg1: string
    ): NonPayableTransactionObject<boolean>;

    majorityKey(): NonPayableTransactionObject<string>;

    proposalCount(): NonPayableTransactionObject<string>;

    proposals(
      arg0: number | string | BN
    ): NonPayableTransactionObject<{
      base: [
        string,
        [string, string, string, string, string, string, string, string],
        [string, string, string],
        boolean
      ];
      proposalDetails: [string, string];
      0: [
        string,
        [string, string, string, string, string, string, string, string],
        [string, string, string],
        boolean
      ];
      1: [string, string];
    }>;

    veto(_proposalId: number | string | BN): NonPayableTransactionObject<void>;

    vetoPeriodKey(): NonPayableTransactionObject<string>;

    voteAgainst(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<void>;

    voteFor(
      _proposalId: number | string | BN
    ): NonPayableTransactionObject<void>;

    votingPeriodKey(): NonPayableTransactionObject<string>;

    votingQuorumKey(): NonPayableTransactionObject<string>;

    initialize(_registry: string): NonPayableTransactionObject<void>;
  };
  events: {
    ProposalCreated(cb?: Callback<ProposalCreated>): EventEmitter;
    ProposalCreated(
      options?: EventOptions,
      cb?: Callback<ProposalCreated>
    ): EventEmitter;

    ProposalExecuted(cb?: Callback<ProposalExecuted>): EventEmitter;
    ProposalExecuted(
      options?: EventOptions,
      cb?: Callback<ProposalExecuted>
    ): EventEmitter;

    QuorumReached(cb?: Callback<QuorumReached>): EventEmitter;
    QuorumReached(
      options?: EventOptions,
      cb?: Callback<QuorumReached>
    ): EventEmitter;

    UserVoted(cb?: Callback<UserVoted>): EventEmitter;
    UserVoted(options?: EventOptions, cb?: Callback<UserVoted>): EventEmitter;

    VetoOccurred(cb?: Callback<VetoOccurred>): EventEmitter;
    VetoOccurred(
      options?: EventOptions,
      cb?: Callback<VetoOccurred>
    ): EventEmitter;

    allEvents(options?: EventOptions, cb?: Callback<EventLog>): EventEmitter;
  };

  once(event: "ProposalCreated", cb: Callback<ProposalCreated>): void;
  once(
    event: "ProposalCreated",
    options: EventOptions,
    cb: Callback<ProposalCreated>
  ): void;

  once(event: "ProposalExecuted", cb: Callback<ProposalExecuted>): void;
  once(
    event: "ProposalExecuted",
    options: EventOptions,
    cb: Callback<ProposalExecuted>
  ): void;

  once(event: "QuorumReached", cb: Callback<QuorumReached>): void;
  once(
    event: "QuorumReached",
    options: EventOptions,
    cb: Callback<QuorumReached>
  ): void;

  once(event: "UserVoted", cb: Callback<UserVoted>): void;
  once(
    event: "UserVoted",
    options: EventOptions,
    cb: Callback<UserVoted>
  ): void;

  once(event: "VetoOccurred", cb: Callback<VetoOccurred>): void;
  once(
    event: "VetoOccurred",
    options: EventOptions,
    cb: Callback<VetoOccurred>
  ): void;
}
