interface IERC777Recipient {
    /**
     * @dev Called by an `IERC777` token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * `IERC777.balanceOf`, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}
/**
 * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
 *
 * Accounts can be notified of `IERC777` tokens being sent to them 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 tokensReceived(
    address operator,
    address from,
    address to,
    uint amount,
    bytes calldata userData,
    bytes calldata operatorData
) external;

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