/* Generated by ts-generator ver. 0.0.8 */
/* tslint:disable */

import { Contract, ContractTransaction, EventFilter, Signer } from "ethers";
import { Listener, Provider } from "ethers/providers";
import { Arrayish, BigNumber, BigNumberish, Interface } from "ethers/utils";
import {
  TransactionOverrides,
  TypedEventDescription,
  TypedFunctionDescription
} from ".";

interface ATokenInterface extends Interface {
  functions: {
    ATOKEN_REVISION: TypedFunctionDescription<{ encode([]: []): string }>;

    UINT_MAX_VALUE: TypedFunctionDescription<{ encode([]: []): string }>;

    allowInterestRedirectionTo: TypedFunctionDescription<{
      encode([_to]: [string]): string;
    }>;

    allowance: TypedFunctionDescription<{
      encode([owner, spender]: [string, string]): string;
    }>;

    approve: TypedFunctionDescription<{
      encode([spender, amount]: [string, BigNumberish]): string;
    }>;

    balanceOf: TypedFunctionDescription<{ encode([_user]: [string]): string }>;

    burnOnLiquidation: TypedFunctionDescription<{
      encode([_account, _value]: [string, BigNumberish]): string;
    }>;

    decimals: TypedFunctionDescription<{ encode([]: []): string }>;

    decreaseAllowance: TypedFunctionDescription<{
      encode([spender, subtractedValue]: [string, BigNumberish]): string;
    }>;

    getInterestRedirectionAddress: TypedFunctionDescription<{
      encode([_user]: [string]): string;
    }>;

    getRedirectedBalance: TypedFunctionDescription<{
      encode([_user]: [string]): string;
    }>;

    getUserIndex: TypedFunctionDescription<{
      encode([_user]: [string]): string;
    }>;

    increaseAllowance: TypedFunctionDescription<{
      encode([spender, addedValue]: [string, BigNumberish]): string;
    }>;

    initialize: TypedFunctionDescription<{
      encode([_underlyingAssetDecimals, _tokenName, _tokenSymbol]: [
        BigNumberish,
        string,
        string
      ]): string;
    }>;

    isTransferAllowed: TypedFunctionDescription<{
      encode([_user, _amount]: [string, BigNumberish]): string;
    }>;

    mintOnDeposit: TypedFunctionDescription<{
      encode([_account, _amount]: [string, BigNumberish]): string;
    }>;

    name: TypedFunctionDescription<{ encode([]: []): string }>;

    principalBalanceOf: TypedFunctionDescription<{
      encode([_user]: [string]): string;
    }>;

    redeem: TypedFunctionDescription<{
      encode([_amount]: [BigNumberish]): string;
    }>;

    redirectInterestStream: TypedFunctionDescription<{
      encode([_to]: [string]): string;
    }>;

    redirectInterestStreamOf: TypedFunctionDescription<{
      encode([_from, _to]: [string, string]): string;
    }>;

    symbol: TypedFunctionDescription<{ encode([]: []): string }>;

    totalSupply: TypedFunctionDescription<{ encode([]: []): string }>;

    transfer: TypedFunctionDescription<{
      encode([recipient, amount]: [string, BigNumberish]): string;
    }>;

    transferFrom: TypedFunctionDescription<{
      encode([sender, recipient, amount]: [
        string,
        string,
        BigNumberish
      ]): string;
    }>;

    transferOnLiquidation: TypedFunctionDescription<{
      encode([_from, _to, _value]: [string, string, BigNumberish]): string;
    }>;

    transferUnderlyingTo: TypedFunctionDescription<{
      encode([_target, _amount]: [string, BigNumberish]): string;
    }>;

    underlyingAssetAddress: TypedFunctionDescription<{
      encode([]: []): string;
    }>;
  };

  events: {
    Approval: TypedEventDescription<{
      encodeTopics([owner, spender, value]: [
        string | null,
        string | null,
        null
      ]): string[];
    }>;

    BalanceTransfer: TypedEventDescription<{
      encodeTopics([
        _from,
        _to,
        _value,
        _fromBalanceIncrease,
        _toBalanceIncrease,
        _fromIndex,
        _toIndex
      ]: [
        string | null,
        string | null,
        null,
        null,
        null,
        null,
        null
      ]): string[];
    }>;

    BurnOnLiquidation: TypedEventDescription<{
      encodeTopics([_from, _value, _fromBalanceIncrease, _fromIndex]: [
        string | null,
        null,
        null,
        null
      ]): string[];
    }>;

    InterestRedirectionAllowanceChanged: TypedEventDescription<{
      encodeTopics([_from, _to]: [string | null, string | null]): string[];
    }>;

    InterestStreamRedirected: TypedEventDescription<{
      encodeTopics([
        _from,
        _to,
        _redirectedBalance,
        _fromBalanceIncrease,
        _fromIndex
      ]: [string | null, string | null, null, null, null]): string[];
    }>;

    MintOnDeposit: TypedEventDescription<{
      encodeTopics([_from, _value, _fromBalanceIncrease, _fromIndex]: [
        string | null,
        null,
        null,
        null
      ]): string[];
    }>;

    Redeem: TypedEventDescription<{
      encodeTopics([_from, _value, _fromBalanceIncrease, _fromIndex]: [
        string | null,
        null,
        null,
        null
      ]): string[];
    }>;

    RedirectedBalanceUpdated: TypedEventDescription<{
      encodeTopics([
        _targetAddress,
        _targetBalanceIncrease,
        _targetIndex,
        _redirectedBalanceAdded,
        _redirectedBalanceRemoved
      ]: [string | null, null, null, null, null]): string[];
    }>;

    Transfer: TypedEventDescription<{
      encodeTopics([from, to, value]: [
        string | null,
        string | null,
        null
      ]): string[];
    }>;
  };
}

export class AToken extends Contract {
  connect(signerOrProvider: Signer | Provider | string): AToken;
  attach(addressOrName: string): AToken;
  deployed(): Promise<AToken>;

  on(event: EventFilter | string, listener: Listener): AToken;
  once(event: EventFilter | string, listener: Listener): AToken;
  addListener(eventName: EventFilter | string, listener: Listener): AToken;
  removeAllListeners(eventName: EventFilter | string): AToken;
  removeListener(eventName: any, listener: Listener): AToken;

  interface: ATokenInterface;

  functions: {
    ATOKEN_REVISION(): Promise<BigNumber>;

    UINT_MAX_VALUE(): Promise<BigNumber>;

    allowInterestRedirectionTo(
      _to: string,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    allowance(owner: string, spender: string): Promise<BigNumber>;

    approve(
      spender: string,
      amount: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    balanceOf(_user: string): Promise<BigNumber>;

    burnOnLiquidation(
      _account: string,
      _value: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    decimals(): Promise<number>;

    decreaseAllowance(
      spender: string,
      subtractedValue: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    getInterestRedirectionAddress(_user: string): Promise<string>;

    getRedirectedBalance(_user: string): Promise<BigNumber>;

    getUserIndex(_user: string): Promise<BigNumber>;

    increaseAllowance(
      spender: string,
      addedValue: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    initialize(
      _underlyingAssetDecimals: BigNumberish,
      _tokenName: string,
      _tokenSymbol: string,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    isTransferAllowed(_user: string, _amount: BigNumberish): Promise<boolean>;

    mintOnDeposit(
      _account: string,
      _amount: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    name(): Promise<string>;

    principalBalanceOf(_user: string): Promise<BigNumber>;

    redeem(
      _amount: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    redirectInterestStream(
      _to: string,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    redirectInterestStreamOf(
      _from: string,
      _to: string,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    symbol(): Promise<string>;

    totalSupply(): Promise<BigNumber>;

    transfer(
      recipient: string,
      amount: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    transferFrom(
      sender: string,
      recipient: string,
      amount: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    transferOnLiquidation(
      _from: string,
      _to: string,
      _value: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    transferUnderlyingTo(
      _target: string,
      _amount: BigNumberish,
      overrides?: TransactionOverrides
    ): Promise<ContractTransaction>;

    underlyingAssetAddress(): Promise<string>;
  };

  ATOKEN_REVISION(): Promise<BigNumber>;

  UINT_MAX_VALUE(): Promise<BigNumber>;

  allowInterestRedirectionTo(
    _to: string,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  allowance(owner: string, spender: string): Promise<BigNumber>;

  approve(
    spender: string,
    amount: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  balanceOf(_user: string): Promise<BigNumber>;

  burnOnLiquidation(
    _account: string,
    _value: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  decimals(): Promise<number>;

  decreaseAllowance(
    spender: string,
    subtractedValue: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  getInterestRedirectionAddress(_user: string): Promise<string>;

  getRedirectedBalance(_user: string): Promise<BigNumber>;

  getUserIndex(_user: string): Promise<BigNumber>;

  increaseAllowance(
    spender: string,
    addedValue: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  initialize(
    _underlyingAssetDecimals: BigNumberish,
    _tokenName: string,
    _tokenSymbol: string,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  isTransferAllowed(_user: string, _amount: BigNumberish): Promise<boolean>;

  mintOnDeposit(
    _account: string,
    _amount: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  name(): Promise<string>;

  principalBalanceOf(_user: string): Promise<BigNumber>;

  redeem(
    _amount: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  redirectInterestStream(
    _to: string,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  redirectInterestStreamOf(
    _from: string,
    _to: string,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  symbol(): Promise<string>;

  totalSupply(): Promise<BigNumber>;

  transfer(
    recipient: string,
    amount: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  transferFrom(
    sender: string,
    recipient: string,
    amount: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  transferOnLiquidation(
    _from: string,
    _to: string,
    _value: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  transferUnderlyingTo(
    _target: string,
    _amount: BigNumberish,
    overrides?: TransactionOverrides
  ): Promise<ContractTransaction>;

  underlyingAssetAddress(): Promise<string>;

  filters: {
    Approval(
      owner: string | null,
      spender: string | null,
      value: null
    ): EventFilter;

    BalanceTransfer(
      _from: string | null,
      _to: string | null,
      _value: null,
      _fromBalanceIncrease: null,
      _toBalanceIncrease: null,
      _fromIndex: null,
      _toIndex: null
    ): EventFilter;

    BurnOnLiquidation(
      _from: string | null,
      _value: null,
      _fromBalanceIncrease: null,
      _fromIndex: null
    ): EventFilter;

    InterestRedirectionAllowanceChanged(
      _from: string | null,
      _to: string | null
    ): EventFilter;

    InterestStreamRedirected(
      _from: string | null,
      _to: string | null,
      _redirectedBalance: null,
      _fromBalanceIncrease: null,
      _fromIndex: null
    ): EventFilter;

    MintOnDeposit(
      _from: string | null,
      _value: null,
      _fromBalanceIncrease: null,
      _fromIndex: null
    ): EventFilter;

    Redeem(
      _from: string | null,
      _value: null,
      _fromBalanceIncrease: null,
      _fromIndex: null
    ): EventFilter;

    RedirectedBalanceUpdated(
      _targetAddress: string | null,
      _targetBalanceIncrease: null,
      _targetIndex: null,
      _redirectedBalanceAdded: null,
      _redirectedBalanceRemoved: null
    ): EventFilter;

    Transfer(from: string | null, to: string | null, value: null): EventFilter;
  };

  estimate: {
    ATOKEN_REVISION(): Promise<BigNumber>;

    UINT_MAX_VALUE(): Promise<BigNumber>;

    allowInterestRedirectionTo(_to: string): Promise<BigNumber>;

    allowance(owner: string, spender: string): Promise<BigNumber>;

    approve(spender: string, amount: BigNumberish): Promise<BigNumber>;

    balanceOf(_user: string): Promise<BigNumber>;

    burnOnLiquidation(
      _account: string,
      _value: BigNumberish
    ): Promise<BigNumber>;

    decimals(): Promise<BigNumber>;

    decreaseAllowance(
      spender: string,
      subtractedValue: BigNumberish
    ): Promise<BigNumber>;

    getInterestRedirectionAddress(_user: string): Promise<BigNumber>;

    getRedirectedBalance(_user: string): Promise<BigNumber>;

    getUserIndex(_user: string): Promise<BigNumber>;

    increaseAllowance(
      spender: string,
      addedValue: BigNumberish
    ): Promise<BigNumber>;

    initialize(
      _underlyingAssetDecimals: BigNumberish,
      _tokenName: string,
      _tokenSymbol: string
    ): Promise<BigNumber>;

    isTransferAllowed(_user: string, _amount: BigNumberish): Promise<BigNumber>;

    mintOnDeposit(_account: string, _amount: BigNumberish): Promise<BigNumber>;

    name(): Promise<BigNumber>;

    principalBalanceOf(_user: string): Promise<BigNumber>;

    redeem(_amount: BigNumberish): Promise<BigNumber>;

    redirectInterestStream(_to: string): Promise<BigNumber>;

    redirectInterestStreamOf(_from: string, _to: string): Promise<BigNumber>;

    symbol(): Promise<BigNumber>;

    totalSupply(): Promise<BigNumber>;

    transfer(recipient: string, amount: BigNumberish): Promise<BigNumber>;

    transferFrom(
      sender: string,
      recipient: string,
      amount: BigNumberish
    ): Promise<BigNumber>;

    transferOnLiquidation(
      _from: string,
      _to: string,
      _value: BigNumberish
    ): Promise<BigNumber>;

    transferUnderlyingTo(
      _target: string,
      _amount: BigNumberish
    ): Promise<BigNumber>;

    underlyingAssetAddress(): Promise<BigNumber>;
  };
}