# Listener: Subscribe an internal service to any event

## **Overview**

A Listener is a midpoint that listen for an event from a contract and makes an HTTP request based on the values from the event values.&#x20;

As an example of a Listener, we will define a midpoint that sends Slack notification when a user borrows a token on Aave V2.

**EVMEventEmittedSource:**&#x20;

1. Listen for the `deposit` event to be emitted
2. Extract the sender, recipient address and amount to be send to the MakeHttpRequestTask

**MakeHttpRequestTask:**&#x20;

1. Notify the user via Slack using a Slack webhook

## Midpoint

`$ npm install -g midpoint-cli`

`$ midpoint init blank my-listener`

#### **1 . EVMEventEmittedSource**

`$ midpoint add-source evmEventEmittedSource listener-source`

We define the [EVM Event Emitted](/midpoint-documentation/sources/evm-event-emitted.md) source so that Midpoint can listen for the borrow event.&#x20;

```json
{
    "evmEventEmittedSource": {
      "chainId": "1",
      "contractAddress": "0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9",
      "eventName": "Borrow",
      "arguments": [
        {
          "name": "reserve",
          "datatype": "address",
          "indexed": true
        },
        {
          "name": "user",
          "datatype": "address",
          "indexed": true
        },
        {
          "name": "onBehalfOf",
          "datatype": "address",
          "indexed": false
        },
        {
          "name": "amount",
          "datatype": "uint256",
          "indexed": false
        },
        {
          "name": "borrowRateMode",
          "datatype": "uint256",
          "indexed": false
        },
        {
          "name": "borrowRate",
          "datatype": "uint256",
          "indexed": false
        },
        {
          "name": "referral",
          "datatype": "uint16",
          "indexed": true
        }
      ]
    }
}
```

**2.  CallEvmFunction Task**

`$ midpoint add-task callEvmFunction get-erc20-name`

We define the [Call EVM Function](/midpoint-documentation/tasks/call-evm-function.md) task to retrieve the ERC20 name of the token that was borrowed.

```json
{
  "callEvmFunction": {
      "chainId": "1",
      "contractAddress": "{{reserve}}",
      "functionName": "name",
      "arguments": [],
      "returnValues": [
        {
          "name": "erc20-name",
          "datatype": "string"
        }
      ]
    }
}
```

**3.  MakeHttpRequest Task**

`$ midpoint add-task makeHttpRequest send-to-slack`

We define the [Make HTTP Request](/midpoint-documentation/tasks/make-http-request.md) task to notify users via Slack message using the Slack Webhook. &#x20;

To add WEB\_HOOK\_URL as a [secret](/midpoint-documentation/core-concepts/midpoints/source-and-task-definitions/secrets.md):&#x20;

`$ midpoint add-secret <slack webhook url> WEB_HOOK_URL`

```json
{
    "makeHttpRequest": {
        "urlRaw": "https://hooks.slack.com/services/[[WEB_HOOK_URL]]",
        "method": "POST",
        "urlType": "raw",
        "bodyType": "json",
        "body": "{\"text\": \"The deposit function was called by {{user}} for {{amount}} on the Apecoin contract\"}"
    }
}

```

#### **4.  Define Path**

We define our path file.&#x20;

```
listener-source => get-erc20-name
get-erc20-name => send-to-slack
```

#### **5.  Publish Midpoint**

`$ midpoint publish`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.midpointapi.com/midpoint-documentation/get-started/sample-midpoints/listener-subscribe-an-internal-service-to-any-event.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
