interface IBigBang{
    
      /** @dev adding a new stiaking pool
     * @param _stakingToken: token to be used for staking
     * @param _rewardsToken token to be used for rewards
     * @param _tier1Fee Fee tier 1
     * @param _tier2Fee Fee tier 2
     * @param _tier3Fee Fee tier 3
     * @param _tier4Fee Fee tier 4
     * @param _tier5Fee Fee tier 5
     * @param _uom: 
         // 0: month
         // 1: week
         // 2: day
         // 3: hour
         // 4: minute
     * @param _multiplier: multiplier
     */
    
    function addPool  (
        address _stakingToken,
        address _rewardsToken,
        uint256 _tier1Fee,
        uint256 _tier2Fee,
        uint256 _tier3Fee,
        uint256 _tier4Fee,
        uint256 _tier5Fee,
        uint256 _uom,
        uint256 _multiplier
        ) external;
        
     /**
     * @dev check how many pools have been created.
     * Can only be called by the current owner.
     */
     function poolLength() external view returns (uint256);
    
    /* @dev check total rewards in the pool
     * @param _pid of the pool
     */

    function totalRewardsInThePool(uint256 _pid, address _poolAddress) external view returns (uint256);

    
    /* @dev add rewards to the pool
     * @param _pid of the pool
     */
    function addRewardsToThePool(uint256 _pid, address _poolAddress, uint256 _amount) external;

    /** @dev stake funds into the contract
     *@param _pid id of the pool
     *@param _address address of the user
     *@param _dValue value of tokens that the msg.sender wants to deposit
     *@param _tier days msg.sender wants to deposit the token for
     
     */
    function stake(uint256 _pid, address _address, address _poolAddress, uint256 _dValue, uint256 _tier) external;
    
    /** @dev withdrawal funds out of pool
     * @param _pid id of the pool
     * @param _address address of the user
     * @param wdValue amount to withdraw
     */
    function unstake(uint256 _pid, address _address, uint256 wdValue) external;
    
     /** @dev claim rewards out of pool
     * @param _address of the user
     * @param _pid of the pool
     */
    
    function claimRewards(uint256 _pid, address _address) external;
    
    /** @dev retreive current state of users funds
     * @param _address of the user
     * @param _pid of the pool
     * @return array of values describing the current state of user
     * index 0: total staked amount 
     * index 1: remaining days for getting rewards
     * index 2: pending Rewards
     * index 3: tierFee (apy)
     */
   function getState(uint256 _pid, address _address) external view returns (uint256[] memory);
    
}
function unstake(uint256 _pid, address _address, uint256 wdValue) external;

/** @dev withdrawal funds out of pool
 * @param _pid id of the pool
 * @param _address address of the user
 * @param wdValue amount to withdraw
 */