// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /** * @title ICollector * @notice Defines the interface of the Collector contract * @author Aave **/ interface ICollector { struct Stream { uint256 deposit; uint256 ratePerSecond; uint256 remainingBalance; uint256 startTime; uint256 stopTime; address recipient; address sender; address tokenAddress; bool isEntity; } /** @notice Emitted when the funds admin changes * @param fundsAdmin The new funds admin. **/ event NewFundsAdmin(address indexed fundsAdmin); /** @notice Emitted when the new stream is created * @param streamId The identifier of the stream. * @param sender The address of the collector. * @param recipient The address towards which the money is streamed. * @param deposit The amount of money to be streamed. * @param tokenAddress The ERC20 token to use as streaming currency. * @param startTime The unix timestamp for when the stream starts. * @param stopTime The unix timestamp for when the stream stops. **/ event CreateStream( uint256 indexed streamId, address indexed sender, address indexed recipient, uint256 deposit, address tokenAddress, uint256 startTime, uint256 stopTime ); /** * @notice Emmitted when withdraw happens from the contract to the recipient's account. * @param streamId The id of the stream to withdraw tokens from. * @param recipient The address towards which the money is streamed. * @param amount The amount of tokens to withdraw. */ event WithdrawFromStream(uint256 indexed streamId, address indexed recipient, uint256 amount); /** * @notice Emmitted when the stream is canceled. * @param streamId The id of the stream to withdraw tokens from. * @param sender The address of the collector. * @param recipient The address towards which the money is streamed. * @param senderBalance The sender's balance at the moment of cancelling. * @param recipientBalance The recipient's balance at the moment of cancelling. */ event CancelStream( uint256 indexed streamId, address indexed sender, address indexed recipient, uint256 senderBalance, uint256 recipientBalance ); /** @notice Returns the mock ETH reference address * @return address The address **/ function ETH_MOCK_ADDRESS() external pure returns (address); /** @notice Initializes the contracts * @param fundsAdmin Funds admin address * @param nextStreamId StreamId to set, applied if greater than 0 **/ function initialize(address fundsAdmin, uint256 nextStreamId) external; /** * @notice Return the funds admin, only entity to be able to interact with this contract (controller of reserve) * @return address The address of the funds admin **/ function getFundsAdmin() external view returns (address); /** * @notice Returns the available funds for the given stream id and address. * @param streamId The id of the stream for which to query the balance. * @param who The address for which to query the balance. * @notice Returns the total funds allocated to `who` as uint256. */ function balanceOf(uint256 streamId, address who) external view returns (uint256 balance); /** * @dev Function for the funds admin to give ERC20 allowance to other parties * @param token The address of the token to give allowance from * @param recipient Allowance's recipient * @param amount Allowance to approve **/ function approve( //IERC20 token, address token, address recipient, uint256 amount ) external; /** * @notice Function for the funds admin to transfer ERC20 tokens to other parties * @param token The address of the token to transfer * @param recipient Transfer's recipient * @param amount Amount to transfer **/ function transfer( //IERC20 token, address token, address recipient, uint256 amount ) external; /** * @dev Transfer the ownership of the funds administrator role. This function should only be callable by the current funds administrator. * @param admin The address of the new funds administrator */ function setFundsAdmin(address admin) external; /** * @notice Creates a new stream funded by this contracts itself and paid towards `recipient`. * @param recipient The address towards which the money is streamed. * @param deposit The amount of money to be streamed. * @param tokenAddress The ERC20 token to use as streaming currency. * @param startTime The unix timestamp for when the stream starts. * @param stopTime The unix timestamp for when the stream stops. * @return streamId the uint256 id of the newly created stream. */ function createStream( address recipient, uint256 deposit, address tokenAddress, uint256 startTime, uint256 stopTime ) external returns (uint256 streamId); /** * @notice Returns the stream with all its properties. * @dev Throws if the id does not point to a valid stream. * @param streamId The id of the stream to query. * @notice Returns the stream object. */ function getStream( uint256 streamId ) external view returns ( address sender, address recipient, uint256 deposit, address tokenAddress, uint256 startTime, uint256 stopTime, uint256 remainingBalance, uint256 ratePerSecond ); /** * @notice Withdraws from the contract to the recipient's account. * @param streamId The id of the stream to withdraw tokens from. * @param amount The amount of tokens to withdraw. * @return bool Returns true if successful. */ function withdrawFromStream(uint256 streamId, uint256 amount) external returns (bool); /** * @notice Cancels the stream and transfers the tokens back on a pro rata basis. * @param streamId The id of the stream to cancel. * @return bool Returns true if successful. */ function cancelStream(uint256 streamId) external returns (bool); /** * @notice Returns the next available stream id * @return nextStreamId Returns the stream id. */ function getNextStreamId() external view returns (uint256); }