interface IERC777Sender {
    /**
     * @dev Called by an `IERC777` token contract whenever a registered holder's
     * (`from`) tokens are about to be moved or destroyed. The type of operation
     * is conveyed by `to` being the zero address or not.
     *
     * This call occurs _before_ the token contract's state is updated, so
     * `IERC777.balanceOf`, etc., can be used to query the pre-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}
/**
 * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
 *
 * `IERC777` Token holders can be notified of operations performed on their
 * tokens by having a contract implement this interface (contract holders can be
 *  their own implementer) and registering it on the
 * [ERC1820 global registry](https://eips.ethereum.org/EIPS/eip-1820).
 *
 * See `IERC1820Registry` and `ERC1820Implementer`.
 */
function tokensToSend(
    address operator,
    address from,
    address to,
    uint amount,
    bytes calldata userData,
    bytes calldata operatorData
) external;

/**
 * @dev Called by an `IERC777` token contract whenever a registered holder's
 * (`from`) tokens are about to be moved or destroyed. The type of operation
 * is conveyed by `to` being the zero address or not.
 *
 * This call occurs _before_ the token contract's state is updated, so
 * `IERC777.balanceOf`, etc., can be used to query the pre-operation state.
 *
 * This function may revert to prevent the operation from being executed.
 */