> For the complete documentation index, see [llms.txt](https://docs.midpointapi.com/midpoint-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.midpointapi.com/midpoint-documentation/get-started/sample-midpoints/listener-subscribe-an-internal-service-to-any-event.md).

# 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
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
