contract StakingRewards {

	uint256 public immutable PID; // ip of pair XFT/ETH in Onsen

	IERC20 public rewardsTokenXFT;
	IERC20 public rewardsTokenSUSHI;
	IERC20 public stakingToken;
	IMasterChef public masterChef;

	PoolInfo public poolInfo;

	uint256 public periodFinish;
	uint256 public rewardRate;
	uint256 public rewardsDuration;
	uint256 public lastUpdateTime;
	uint256 public rewardPerTokenStored;

	mapping(address => UserInfo) public userInfo;
	mapping(address => uint256) public userRewardPerTokenPaid;
	mapping(address => uint256) public rewardsXFT;
	mapping(address => uint256) public rewardsSUSHI;

	uint256 private _totalStaked;

	function totalStaked() external view override returns (uint256);

    // staked balance for specific user
	function balanceOf(address _account)
		external
		view
		override
		returns (uint256);

    // reward notified for duration
	function getRewardForDuration() external view override returns (uint256);

    // withdraw all staked tokens and get reward
	function exit() external override; 

	function stake(uint256 _amount)
		external
		override
		nonReentrant
		whenNotPaused
		updateReward(msg.sender);

	function withdraw(uint256 _amount)
		public
		override
		nonReentrant
		updateReward(msg.sender);

    // get reward in both tokens
	function getReward() public override nonReentrant updateReward(msg.sender); // 

	function lastTimeRewardApplicable() public view override returns (uint256);

    // reward per token in XFT
	function rewardPerToken() public view override returns (uint256);

    // reward XFT for specific user
	function earnedXFT(address _account)
		public
		view
		override
		returns (uint256);

    // reward SUSHI for specific user
	function earnedSushi(address _account)
		public
		view
		override
		returns (uint256);

    // onlyOwner
	
	// Ensure the provided reward amount is not more than the balance in the contract.
    // This keeps the reward rate in the right range, preventing overflows due to
    // very high values of rewardRate in the earned and rewardsPerToken functions;
    // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.
	function notifyRewardAmount(uint256 _reward)
		external
		onlyOwner
		updateReward(address(0));

    // 
	function updatePeriodFinish(uint256 _timestamp)
		external
		onlyOwner
		updateReward(address(0));


    // Pausable
    // status
    function paused() public view virtual returns (bool);

	function pause() public onlyOwner;

	function unpause() public onlyOwner;


    // Ownble
    function owner() public view virtual returns (address);

    // transfere ownership to zero address 
    function renounceOwnership() public virtual onlyOwner;

    function transferOwnership(address newOwner) public virtual onlyOwner;
}