interface IStakingRewards {
	/// @dev Used instead of having a public variable to respect the ERC20 standard
	/// @return Total supply
	function totalSupply() external view returns (uint256);

	/// @param account Account to query the balance of
	/// @return Number of token staked by an account
	function balanceOf(address account) external view returns (uint256);

	/// @return Current timestamp if a reward is being distributed and the end of the staking
	/// period if staking is done
	function lastTimeRewardApplicable() external view returns (uint256);

	/// @notice Returns how much unclaimed rewards an account has
	/// @param account Address for which the request is made
	/// @return How much a given account earned rewards
	function earned(address account) external view returns (uint256);

	/// @notice Lets someone stake a given amount of `stakingTokens`
	/// @param amount Amount of ERC20 staking token that the `msg.sender` wants to stake
	function stake(uint256 amount) external;

	/// @notice Allows to stake on behalf of another address
	/// @param amount Amount to stake
	/// @param onBehalf Address to stake onBehalf of
	function stakeOnBehalf(uint256 amount, address onBehalf) external;

	/// @notice Lets a user withdraw a given amount of collateral from the staking contract
	/// @param amount Amount of the ERC20 staking token that the `msg.sender` wants to withdraw
	function withdraw(uint256 amount) external;

	/// @notice Triggers a payment of the reward earned to the msg.sender
	function getReward() external;

	/// @notice Lets the caller withdraw its staking and claim rewards
	function exit() external;
}
/// @notice Interface for the staking contract of the Angle protocol
function stakeOnBehalf(uint256 amount, address onBehalf) external;

/// @notice Allows to stake on behalf of another address
/// @param amount Amount to stake
/// @param onBehalf Address to stake onBehalf of