Перейти к основному содержанию
В этом туториале мы покажем вам, как настроить Tenderly Web3 Action для мониторинга запросов на выход валидаторов Lido и отправки уведомлений через Telegram. Этот проект демонстрирует, как использовать Web3 Actions для взаимодействия со смарт-контрактами и внешними API для создания собственной системы уведомлений. Используйте этот шаблон Github-проекта, чтобы настроить собственный мониторинг запросов на выход валидаторов Lido:

Шаблон Web3 Action для мониторинга валидаторов

Обзор проекта

Цель этого проекта — настроить систему, которая отслеживает запросы на выход валидаторов Lido и отправляет уведомления при выполнении определённых условий. Вот краткое описание процесса проекта:
  1. Подпишитесь на релевантные on-chain события: Web3 Action отслеживает события ValidatorExitRequest от контракта Lido в Ethereum mainnet.
  2. Декодируйте событие через Tenderly API: когда событие обнаружено, извлекает детали транзакции через Tenderly API.
  3. Фильтруйте только интересующие события: событие ValidatorExitRequest дополнительно оценивается путём проверки того, что stakingModuleId равен 1, а nodeOperatorId равен 14.
  4. Реагируйте: если произошёл интересующий ValidatorExitRequest, Web3 Action отправляет уведомление в указанный канал Telegram с деталями запроса на выход валидатора.

Предварительные требования

Прежде чем начать, убедитесь, что у вас есть следующее:
  • Установленный Tenderly CLI
  • Node.js (в настоящее время поддерживается v20)
  • npm
  • Токен Telegram-бота и ID канала
  • Аккаунт и проект Tenderly

Настройка

Пройдём шаги настройки вашей системы уведомлений о выходе валидаторов Lido:
1
Клонирование репозитория
2
Сначала клонируйте репозиторий проекта и перейдите в каталог проекта:
3
git clone https://github.com/Tenderly/tenderly-lido-validator-monitoring-solution
cd tenderly-lido-validator-monitoring-solution
4
Установка зависимостей
5
Установите необходимые npm-пакеты:
6
npm install
7
Настройка проекта Tenderly
8
Настройте свой проект Tenderly, выполнив следующие шаги:
9
  • Войдите в свой аккаунт Tenderly
  • Создайте новый проект или используйте существующий
  • Запишите ваши Account Name и Project Slug
  • 10
    Настройка tenderly.yaml
    11
    Обновите файл tenderly.yaml информацией о вашем проекте Tenderly:
    12
    account_id: "<YOUR_ACCOUNT_ID>"
    actions:
      <YOUR_ACCOUNT_ID>/<YOUR_PROJECT_SLUG>:
        runtime: v2
        sources: actions
        specs:
          action_name:
            description: Get a notification when condition matches on Lido tx
            function: lidoEvents:subscribeToLidoValidatorExitRequestFn
            execution_type: parallel
            trigger:
              type: transaction
              transaction:
                status:
                  - mined
                filters:
                  - network: 1
                    eventEmitted:
                      contract:
                        address: 0x0de4ea0184c2ad0baca7183356aea5b8d5bf5c6e
                      name: ValidatorExitRequest
    project_slug: "<YOUR_PROJECT_SLUG>"
    
    13
    Обязательно замените <YOUR_ACCOUNT_ID> и <YOUR_PROJECT_SLUG> вашими фактическими Account Name и Project Slug Tenderly.
    14
    Добавление адреса контракта в проект
    15
    Чтобы иметь возможность разворачивать action и мониторить нужный контракт, вам нужно добавить этот контракт в проект.
    16
    В данном случае мы хотим добавить 0x0de4ea0184c2ad0baca7183356aea5b8d5bf5c6e.
    17
    Настройка Secrets
    18
    Добавьте следующие секреты в ваши Web3 Actions:
    19
  • BEARER: ваш bearer-токен Tenderly API
  • BOT-TOKEN: токен вашего Telegram-бота
  • CHANNEL-ID: ID вашего Telegram-канала
  • 20
    Чтобы добавить секреты, перейдите в Web3 Actions внутри вашего проекта и перейдите в раздел Secrets.
    21
    Развёртывание
    22
    Чтобы развернуть ваш Web3 Action, используйте Tenderly CLI:
    23
    tenderly actions deploy
    
    24
    Эта команда развернёт action, определённый в вашем файле tenderly.yaml.

    Как это работает

    Давайте разберём основные компоненты файла lidoEvents.ts:
    showLineNumbers
    
    const subscribeToLidoValidatorExitRequestFn = async (
      context: Context,
      transactionEvent: TransactionEvent,
    ) => {
      // Event handling logic here
    };
    
    // Helper functions for API calls and notifications
    
    Функция subscribeToLidoValidatorExitRequestFn — это основная точка входа нашего Web3 Action. Она обрабатывает следующие задачи:
    1. Извлекает детали транзакции через Tenderly API
    2. Проверяет, что stakingModuleId равен 1, а nodeOperatorId равен 14
    3. Если условие выполнено, отправляет уведомление в указанный канал Telegram

    Tenderly API для трейса транзакции

    Ключевая часть этого Web3 Action — получение трейса транзакции через Tenderly API. Вот используемый endpoint API:
    const url = `https://api.tenderly.co/api/v1/public-contract/${network}/trace/${txHash}`;
    
    Этот endpoint API возвращает подробный трейс транзакции, включающий все логи и события, сгенерированные во время выполнения транзакции. Вот что представляет каждая часть URL:
    • https://api.tenderly.co/api/v1/public-contract/: базовый URL для публичного API контрактов Tenderly
    • ${network}: идентификатор сети (например, 1 для Ethereum Mainnet)
    • ${txHash}: хеш транзакции, которая нас интересует
    Ответ этого API содержит массу информации о транзакции, включая:
    • Все сгенерированные события и их параметры
    • Внутренние вызовы, сделанные во время транзакции
    • Произошедшие изменения состояния
    В нашем Web3 Action мы используем этот трейс, чтобы найти событие ValidatorExitRequest и извлечь релевантную информацию:
    showLineNumbers
    const validatorExitRequestLog = result.logs.find(
      (log: any) => log.name === "ValidatorExitRequest"
    );
    
    if (validatorExitRequestLog) {
      const stakingModuleId = validatorExitRequestLog.inputs.find(
        (input: any) => input.soltype.name === "stakingModuleId"
      )?.value;
      const nodeOperatorId = validatorExitRequestLog.inputs.find(
        (input: any) => input.soltype.name === "nodeOperatorId"
      )?.value;
      // ... other parameters
    }
    
    Это позволяет нам точно идентифицировать интересующие нас запросы на выход валидаторов и извлекать необходимую информацию для отправки уведомления.
    Использование Tenderly API для трейсов транзакций предоставляет мощный способ получить подробную информацию об on-chain событиях без необходимости прямого взаимодействия с блокчейном или запуска собственной ноды.

    Кастомизация

    Для выходов валидаторов Lido интересующие события распознаются по параметрам stakingModuleId со значением 1 и nodeOperatorId со значением 14. Чтобы изменить эти условия фильтрации или добавить больше событий для мониторинга:
    1. Отредактируйте файл lidoEvents.ts
    2. Обновите проверку условия в операторе if в соответствии с вашими требованиями
    3. Измените формат сообщения или добавьте дополнительную информацию по необходимости
    Например, чтобы изменить условия stakingModuleId и nodeOperatorId:
    showLineNumbers
    if (stakingModuleId == 1 && nodeOperatorId == 14) {
      // Your custom logic here
    }
    

    Мониторинг и устранение неполадок

    Чтобы убедиться, что ваш Web3 Action работает корректно:
    • Отслеживайте выполнения Web3 Action в панели Tenderly
    • Проверяйте логи Tenderly на предмет сообщений об ошибках или деталей выполнения
    • Убедитесь, что у вашего Telegram-бота есть разрешение отправлять сообщения в указанный канал
    Эта настройка специально предназначена для мониторинга запросов на выход валидаторов Lido в Ethereum mainnet.

    Заключение

    Теперь вы настроили пользовательскую систему уведомлений с использованием Tenderly Web3 Actions для мониторинга запросов на выход валидаторов Lido.