# 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](https://docs.midpointapi.com/midpoint-documentation/sources/evm-event-emitted "mention") 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](https://docs.midpointapi.com/midpoint-documentation/tasks/call-evm-function "mention") 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](https://docs.midpointapi.com/midpoint-documentation/tasks/make-http-request "mention") task to notify users via Slack message using the Slack Webhook. &#x20;

To add WEB\_HOOK\_URL as a [secret](https://docs.midpointapi.com/midpoint-documentation/core-concepts/midpoints/source-and-task-definitions/secrets):&#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`
