interface IERC20 
{
	// Amount of tokens in existence
    function totalSupply() external view returns (uint256);

	// Amount of tokens owned by account
    function balanceOf(address account) external view returns (uint256);

	// Move amount tokens from caller to recipient, returns boolean and emits Transfer event
    function transfer(address recipient, uint256 amount) external returns (bool);

	// Returns remaining number of tokens that spender is allowed to spend on behalf of owner via transferFrom function
    function allowance(address owner, address spender) external view returns (uint256);

	// Sets amount as allowance of spender over caller's tokens, returns boolean and emits Approval event
    function approve(address spender, uint256 amount) external returns (bool);

	// Moves amount tokens from sender to recipient using allowance mechanism, amount is then deducted from caller's allowance
	// Returns boolean and emits Transfer event
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

	// Emitted when value of tokens are moved from one account to another
    event Transfer(address indexed from, address indexed to, uint256 value);

	// Emitted when allowance of spender for an owner is set by a call to approve
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
function totalSupply() external view returns (uint256);

// Amount of tokens in existence