interface IPayingToken {

    /**
     * @dev Returns the total amount of funds a given address is able to withdraw currently.
     * @param owner Address of FundsDistributionToken holder
     * @return A uint256 representing the available funds for a given account
     */
    function withdrawableFundsOf(address owner) external view returns (uint256);

    /**
     * @dev Withdraws all available funds for a FundsDistributionToken holder.
     */
    function withdrawFunds() external;

    /**
     * @dev This event emits when new funds are distributed
     * @param by the address of the sender who distributed funds
     * @param fundsDistributed the amount of funds received for distribution
     */
    event FundsDistributed(address indexed by, uint256 fundsDistributed);

    /**
     * @dev This event emits when distributed funds are withdrawn by a token holder.
     * @param by the address of the receiver of funds
     * @param fundsWithdrawn the amount of funds that were withdrawn
     */
    event FundsWithdrawn(address indexed by, uint256 fundsWithdrawn);
}
function withdrawFunds() external;

/**
 * @dev Withdraws all available funds for a FundsDistributionToken holder.
 */